Daily updates from Odoo
Monday, January 12, 2026
14 changes · 17.0
Resolved issues and error corrections
This update prevents a bug where clicking on list view group headers while in edit mode would trigger incorrect 'required field' error messages. The fix ensures that edit mode calls complete before other actions are taken, eliminating data inconsistencies and improving the user experience.
Original PR description
Steps to reproduce: - Have a record where modifying a field triggers another field to be required in the frontend only - Apply a group by on a list view of this record - Edit a record and modify that field - While still in edit mode, click on another group header Before: Clicking on the group header triggers both `onGroupHeaderClicked` and `onGlobalClick` simultaneously, causing `leaveEditMode` to call `save` twice. The `save` mutex prevents duplicate API calls, but the second call then runs `checkValidity` with stale data, raising a false "required field" error. After: While clicking on the group header still triggers both `onGroupHeaderClicked` and `onGlobalClick` simultaneously, each `leaveEditMode` call waits for any ongoing call to complete before executing. No "required field" error is raised. opw-5388825
This update corrects a validation error within Odoo Studio that occurred when users attempted to add help tooltips to fields in the Contacts list view. The issue stemmed from a missing 'help' attribute in the field definition, which Odoo Studio was incorrectly interpreting. This fix ensures proper functionality and compatibility with Odoo Studio customizations.
Original PR description
Steps to reproduce ================== - Install web_studio,contacts - Go to Contacts - Open the list view - Click on a field - Set a "Help tooltip" => Validation Error Invalid view Odoo Studio: res.partner.tree customization Cause of the issue ================== The help attribute is missing from the field definition opw-5379357
This update corrects a bug in the purchase stock module that was causing incorrect journal entries when returning items with different currency values. The fix ensures that compensation account moves are only triggered when necessary, preventing inaccurate accounting records. This improves the reliability of financial reporting.
Original PR description
**Steps to reproduce:** - enable automatic accounting - set dollars as the main currency - activate euro and set a rate of 10 euro -> 1$ - create a storable product with category fifo/ automated -…
**Steps to reproduce:** - enable automatic accounting - set dollars as the main currency - activate euro and set a rate of 10 euro -> 1$ - create a storable product with category fifo/ automated - create and confirm a PO for 1 unit for 10 euros (no tax) - validate the receipt - return the product and validate return - return the return and validate - open journal items and search your product **Current behavior:** - there is 6 correct lines (those with credit or debit of 1$) - there is two incorrect extra lines one with credit 9$ and one with debit 9$ **Expected behavior:** those two extra lines should not be there **Cause of the issue:** those lines are compensation account move lines for the case where the price of the product returned is different than the price of the product initially received, in the cases of: - a return: compensate the difference. - the return of a return (our case): de-compensate the difference. (see PR https://github.com/odoo/odoo/pull/162697 and more specifically test test_fifo_return_twice_and_bill). But in this case, the compensation is wrongly triggered because the difference comes from the fact that the currency is not taken into account. https://github.com/odoo/odoo/blob/c89d109c460d51fc90b6b13d5f6bc114c7316e42/addons/purchase_stock/models/stock_move.py#L208 **Fix:** we use the original svl instead of the PO because it avoids currency problem. If we wanted to convert the currency of the PO, we would need to find the date that was used to convert the value at the creation of the first svl. And that date came from _get_currency_convert-date() https://github.com/odoo/odoo/blob/d3599e70973e27ed17e403cf498f76bd31e9c236/addons/purchase_stock/models/stock_move.py#L97 which can take the date of the last invoice (if product was invoiced before the move was validated). https://github.com/odoo/odoo/blob/57c1c510425dcd491c794a0262063db398348640/addons/purchase_stock/models/stock_move.py#L123-L125 We can not use this method because we're doing the return of a return and if the first return also has an invoice, the return value of the method could be the date of this invoice (which is not the date we're looking for). Furthermore there is no way to know if the date returned by _get_currency_convert_date() at the time of the creation of the first svl is the date of the time of the creation of the svl or the date of an invoice previously confirmed. opw-5179239
This fix prevents the 'Update Prices' button from appearing on sales orders when a pricelist hasn't been configured. Previously, the button was incorrectly displayed, potentially leading to users manually adjusting prices without using the standard pricelist system. This change ensures a cleaner user experience and enforces the correct pricelist workflow.
Original PR description
**Steps to produce:** - Install the `Sales` module. - Enable `Pricelists` in settings and set the `default quotation template`. - Create a new Sales Order. **Issue:** - The `Update Prices` button is…
**Steps to produce:** - Install the `Sales` module. - Enable `Pricelists` in settings and set the `default quotation template`. - Create a new Sales Order. **Issue:** - The `Update Prices` button is visible even when no pricelist is set on the sales order. **Root cause:** - In the onchange logic (see [1]), show_update_pricelist is set to True based solely on the presence of order lines, without checking whether a pricelist is defined. **Solution**: - Update the condition so that button is shown only when sale order line is present and the current pricelist value is not the previous one. [1]: https://github.com/odoo/odoo/blob/849ec71acbaea0061fd4b13888a486e4aebb6463/addons/sale/models/sale_order.py#L801-L803 Before: <img width="1215" height="466" alt="image" src="https://github.com/user-attachments/assets/f29b1ccf-eec8-4114-b4c9-a8083947ad28" /> After: <img width="1207" height="428" alt="image" src="https://github.com/user-attachments/assets/e358b633-d11b-413d-94c4-3837c430eac4" /> opw-5414897 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This pull request addresses a small error in the French tax reporting (l10n_fr) module. Specifically, a mistake was identified and corrected within a specific tax box (15_2). This ensures accurate tax calculations and reporting for French businesses using Odoo.
Original PR description
During this commit: 869f80b we made a mistake in the box 15_2. no task id --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects minor errors in the 2026 balance sheet and profit & loss reports for the Danish localization. These changes involve adjusting formulas and text within the reports, likely due to an oversight during development. This ensures accurate financial reporting for Danish businesses using Odoo Enterprise.
Original PR description
In this commit: https://github.com/odoo/enterprise/commit/0d431fe2cc6556a040888ecc5d6a71be4a435447 we introduce a new balance sheet report for 2026 but there was a mistake in the sign of a formula and in the text of a line. Same for the profit and loss, some errors in sign of accounts and naming. The errors don't come from a ticket but more of a logical fix, those errors were probably an oversight during development. no task id
This update fixes a bug in the payroll system that incorrectly reversed employee first and last names when generating legal name reports. The change ensures that employee names are consistently formatted as 'FirstName LastName' for SwissDEC reporting, aligning with legal requirements and improving data accuracy. This ensures accurate reporting for payroll and tax compliance.
Original PR description
* Fix _compute_l10n_ch_legal_name method to correctly assign first_name and last_name from employee name (was previously reversed) * Update all SwissDEC test data to use correct "FirstName LastName" format instead of "LastName FirstName" to match the corrected computation logic task-5102851
This update resolves an issue where the 'Validate' button in the barcode app became disabled after an error occurred during barcode scanning. The fix reverts a previous attempt to manage concurrency, relying instead on the framework's mutex mechanism for reliable validation processing. This ensures the button remains functional and prevents duplicate validation attempts.
Original PR description
### Steps to reproduce: - In the settings enable: Multi-Steps route - Create a product tracked by SN - In the barcode app > Operations > Internal transfers > New - Scan you tracked product - Click on…
### Steps to reproduce: - In the settings enable: Multi-Steps route - Create a product tracked by SN - In the barcode app > Operations > Internal transfers > New - Scan you tracked product - Click on Validate > Invalid operation - Scan a Serial number #### > You can not click on validate anymore ### Cause of the issue: The issue has been introduced in 41c6e7a90fd4f0cf84e74cf0ed036f4da0ec6112 in a try to avoid concurrency issue when calling the barcode validation too quickly. To be more precise, this commit added a `isValidating` property to the barcode model that is set prior to the rpc call and suppose to remove after in order tobypass subsequence calls of the `validate` method when a call is already in progress: https://github.com/odoo/enterprise/blob/099c7b94ad08f83873c05ec528e16fbf806f47f2/stock_barcode/static/src/models/barcode_model.js#L477-L494 However, in the present case and since orm call returns an error the the call the validate method is interupted at this orm call and the line https://github.com/odoo/enterprise/blob/099c7b94ad08f83873c05ec528e16fbf806f47f2/stock_barcode/static/src/models/barcode_model.js#L494 is not executed so that the this.Validating stays true and the button can not be clicked nor executed anymore: https://github.com/odoo/enterprise/blob/099c7b94ad08f83873c05ec528e16fbf806f47f2/stock_barcode/static/src/models/barcode_model.js#L131-L133 ### Fix: We revert the incorrect fix: 42d77e751cb5e049ea1e81b44fca0d07e8f45b32 and we rather rely on the Mutex class of the JS framework just as done in the `_processBarcode`: https://github.com/odoo/enterprise/blob/099c7b94ad08f83873c05ec528e16fbf806f47f2/stock_barcode/static/src/models/barcode_model.js#L505-L507 This will ensure that the validation calls will be processed sequentially and since the `button_validate` of stock pickings is ignored on done pickings because of the first soft fix https://github.com/odoo/odoo/pull/204790 : https://github.com/odoo/odoo/blob/1664daf894ec878b64af8ab75c0d10f05e00df80/addons/stock/models/stock_picking.py#L1134-L1135 we have the guarantee that the records will not be validated twice. opw-5388297
This update resolves an issue where the serial number from a scanned barcode isn't automatically populated when registering components for subcontracting receipts. It also corrects the handling of expiration dates, ensuring they are correctly taken from the barcode instead of defaulting to today's date. This improves accuracy and reduces manual data entry for users.
Original PR description
… not being registered **PROBLEM** When scanning a barcode for a subcontracting receipt, the lot/serial number field of the "register component" pop-over isn't populated with the serial number of the…
… not being registered **PROBLEM** When scanning a barcode for a subcontracting receipt, the lot/serial number field of the "register component" pop-over isn't populated with the serial number of the barcode. This forces the user to enter the serial number by hand. Also if the barcode contains an expiration date, when confirming the pop-over, the expiration date will not be taken into account and will be computed using today's date. **STEPS** 1. Create a product, with barcode 42248387498744, tracked by SN 2. Create a subcontracting BOM for this product 3. Select the GS1 nomenclature and activate expiration date. 3. Create a SO with this product 4. Go to the barcode app, select the receipt for the SO, scan the barcode 01422483874987441725102321122345. 5. A pop-over should appear to register the component of the product, notice the Lot/Serial number field is empty, forcing the user to enter the number manually. 6. Enter the SN manually and click on "record component", the expiration date will be set to today, instead of taking the expiration date in the GS1 barcode (oct 23 2025). **CAUSES** 1. In `stock_barcode_mrp_subcontracting/static/src/models/barcode_picking_model.js`, we try to save the line before presenting the pop-over to register component. But because the line is not marked as dirty, the line isn't saved. 2. Subcontracting receipt spawn a pop-over (on the `mrp.production` of the origin move of the receipt) to register the component of the received product when scanning a barcode. The `lot_producing_id` of this `mrp.production` isn't set. opw-5033444
This update fixes an issue where events were sometimes duplicated in Odoo and Outlook due to a short timeout when syncing with Microsoft Graph. Increasing the timeout to 10 seconds resolves this problem, ensuring events are created only once and improving data consistency.
Original PR description
Before this fix, the timeout was only 3 seconds when syncing from Microsoft Graph API. Sometimes, we would not receive a response in time, and the event would be created twice in Odoo and then in Outlook. This change increases the timeout to 10 seconds, selected from opw-4164679. opw-5300061 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a problem where Odoo invoices for exports were being rejected by the SII system due to incorrect decimal formatting in the TotClauVenta tag. The fix ensures this tag always uses exactly two decimal places, aligning with SII requirements and preventing validation errors. This ensures accurate export invoices.
Original PR description
Before this PR: Everything works fine, but if the user change the decimal precision for foreign currency (i.e. USD, usually needed for export invoices, for example to three decimals), the SII system…
Before this PR: Everything works fine, but if the user change the decimal precision for foreign currency (i.e. USD, usually needed for export invoices, for example to three decimals), the SII system rejects the invoice. The rejectment cause is cryptic, and difficult to undertand, since it says: That is expecting a `<Documento>` tag, while this tag is not used in Exports invoices (the correct tag is `<Exportaciones>`. The real cause of the error is that if the `<TotClauVenta>` tag has more than 2 decimals is ignored, and if it is ignored, the SII system assumes that the invoice is not an export invoice, and that's why an incorrect tag is expected by the validator. After this PR: We simply forced the decimals of the tag `<TotClauVenta>`to 2. This definitely solves the issue. Source: https://www.sii.cl/factura_electronica/formato_dte.pdf Capture of this portion of the normative: <img width="626" height="118" alt="Captura de pantalla 2026-01-07 a la(s) 18 21 06" src="https://github.com/user-attachments/assets/3b9ec8f0-d343-4819-8589-67afeeeba807" />
This update fixes a potential issue with how Odoo tours mock Clipboard API calls, particularly in headless environments. By delaying cleanup until the action's listener has finished, the system avoids delays and ensures accurate mocking, preventing browser wait states or permission errors. This change was prompted by a new Chrome policy.
Original PR description
Reliably mocking Clipboard API calls in tours should be done in two steps: - the step that will actually do the call should do the patching, followed by the actual action. - the cleanup should only be done in the following step to ensure the action's listener has actually finished. This commit applies this principle to avoid the "cleanup" to be executed before the action's listener has actually reached the call to the Clipboard API (because of slower processing, slower network...), which would defeat the mocking purpose (and either get the browser to indefinitely wait for the user's clipboard usage approval or a permission error depending on the browser's default behavior). Note: this was mainly brought to light by the new Chrome 143+ default policy which revoke all permissions in headless mode.
This update fixes a potential issue with how Odoo tours mock the Clipboard API, particularly in headless environments. By delaying cleanup steps, the system now ensures the API call is fully processed before attempting to clean up, preventing browser waits or permission errors. This improves tour reliability and performance.
Original PR description
Reliably mocking Clipboard API calls in tours should be done in two steps: - the step that will actually do the call should do the patching, followed by the actual action. - the cleanup should only be done in the following step to ensure the action's listener has actually finished. This commit applies this principle to avoid the "cleanup" to be executed before the action's listener has actually reached the call to the Clipboard API (because of slower processing, slower network...), which would defeat the mocking purpose (and either get the browser to indefinitely wait for the user's clipboard usage approval or a permission error depending on the browser's default behavior). Note: this was mainly brought to light by the new Chrome 143+ default policy which revoke all permissions in headless mode.
This update fixes a bug where journal entries could be posted even when referencing inactive analytic accounts. The change adds a validation step during posting to ensure all referenced accounts are active, preventing incorrect financial postings. This improves data accuracy and reliability within the accounting system.
Original PR description
**Steps to produce:** - Install the `Accounting` module. - Enable analytic accounting in settings. - Create an analytic account (e.g., "test"). - Create a journal entry and assign the analytic…
**Steps to produce:** - Install the `Accounting` module. - Enable analytic accounting in settings. - Create an analytic account (e.g., "test"). - Create a journal entry and assign the analytic account in the analytic distribution. - Post the entry and export it(Make sure `journal items/account` and `journal items/analytic distribution` are also included). - `Archive` the analytic account. - Import the exported entry `OR` Duplicate the previous created entry. - Try to post the imported entry. **Issue:** - The entry is posted even if the analytic account used in the analytic distribution is inactive. **Root cause:** - The `analytic_distribution` field is stored as JSON. - At [1], the `_str_to_json` method only attempts `json.loads(value)`, and if parsing fails, it raises an error. **Solution:** - Add a validation when posting journal entries to ensure that all analytic accounts referenced in the analytic distribution are active. [1]: https://github.com/odoo/odoo/blob/13e8b462e74f144e085492857bfaa7b0d1f88f93/odoo/addons/base/models/ir_fields.py#L196-L202 opw-5350980 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr