Wednesday, December 24, 2025
13 changes · saas-19.1
Enhancements to existing features
This update enhances Odoo's stock management capabilities by adding support for reading data from RFID devices. Instead of needing a dedicated mobile app, users can now scan RFID tags directly, streamlining inventory processes. A related code refactoring is planned for the main Odoo branch.
Original PR description
Now, we have an EPC decoder, we can add support for reading values from an RFID device without requiring a specific mobile app. To achieve this, we use the same entry point as the one used for barcode scanning. As a result, a refactoring of the naming is planned on the master branch.
Resolved issues and error corrections
This update resolves a crash in the Point of Sale mobile view when editing payments and viewing customer information. The fix ensures that necessary data related to customer activity is loaded, preventing the POS from freezing. This improves overall stability and user experience for our POS users.
Original PR description
Steps to reproduce: =================== - Use the POS in mobile view - Complete a payment - Click on "Edit Payment" - Select customer or Edit customer Issue: ====== - POS crashes when rendering the partner kanban view - Frontend error occurs because `activity_state` is missing in the record Cause: ====== - The partner kanban view references activity-related fields - `activity_state` was not loaded when the view is rendered in POS Fix: ==== - Explicitly load `activity_state` in the kanban view (invisible) Task:5406890
This update speeds up the calculation of product quantities, particularly for databases with many products where most have zero stock. By optimizing the computation process, the system now runs significantly faster – reducing processing time by over 50% when dealing with a large number of products. This improves overall system responsiveness and efficiency.
Original PR description
In databases with a large number of products, most of them will have 0 quantities on hand. This commit fast-tracks the computation of 0 qty products, skipping unnecessary `uom_id` and `float_round()` computations in _compute_quantities_dict and skipping unnecessary `__set_item__` in _compute_quantities. Benchmark | `product.product` count | Before this PR | After this PR | | ----------------------- | -------------- | ------------- | | 700,000 | 52.84s | 28.33s | opw-4930856 Forward-Port-Of: odoo/odoo#241017 Forward-Port-Of: odoo/odoo#239687
This update fixes a problem where taxes weren't correctly applied to Point of Sale transactions, specifically down payments and full settlements. Now, taxes set on Sale Orders are consistently applied to POS transactions, ensuring accurate tax calculations for all sales. Additionally, the color styling of buttons has been updated for a more consistent user experience.
Original PR description
Before this commit: ------------------- - If a tax was set on the Sale Order line, it was not applied on the down payment created from the POS. - If no tax was set on the Sale Order line, the POS settlement incorrectly applied the product’s default tax when settling the order. After this commit: --------------------- - The tax defined on the Sale Order line is now consistently applied to both down payments (partial settlements) and full settlements from the POS. - If the Sale Order line has no tax, then no tax is applied on either partial or full settlements and if have tax the tax will be applied. - Added consistent color styling to all buttons. task: 5269354 Forward-Port-Of: odoo/odoo#238051
This update resolves a restriction preventing users without the 'hr' group from accessing bank account information. Previously, a technical requirement limited access to a related field, causing errors. This fix ensures all users can manage bank accounts correctly.
Original PR description
The field `employee_salary_amount_is_percentage` is computed, but the computation[^1] relies on `hr_employee.salary_distribution`, a field restricted[^2] to members of `hr.group_hr_user`. If you try…
The field `employee_salary_amount_is_percentage` is computed, but the computation[^1] relies on `hr_employee.salary_distribution`, a field restricted[^2] to members of `hr.group_hr_user`. If you try to check a bank account without an hr group, you will get an access error: ``` odoo.exceptions.AccessError: You do not have enough rights to access the field "salary_distribution" on Employee (hr.employee). Please contact your system administrator. Operation: read User: 21 Groups: allowed for groups 'Employees / Officer: Manage all employees' ``` This also happens during the mock crawl test of upgrades if the admin lacks the group. To reproduce in standard: - Install contacts and hr. - Use a user without hr permissions. - Try to create a new bank account. [^1]:https://github.com/odoo/odoo/blob/57573994313988837d89329d77ab1def63a8cfdd/addons/hr/models/res_partner_bank.py#L26 [^2]:https://github.com/odoo/odoo/blob/57573994313988837d89329d77ab1def63a8cfdd/addons/hr/models/hr_employee.py#L147 --- I've also added another commit to make the percentage symbol stick to the salary amount. Before: <img width="366" height="38" alt="image" src="https://github.com/user-attachments/assets/ef890852-50ca-40b1-8c09-07c4aa2d330d" /> After: <img width="219" height="35" alt="image" src="https://github.com/user-attachments/assets/88e4a6c4-bc3f-483e-97f9-3080c6aa85c9" /> I know the number is not formated correctly but I don't think I can do more just from the view. Forward-Port-Of: odoo/odoo#239298
This update adds a field to the salary configuration to allow users to specify the correct bank account holder name. This is a security enhancement to prevent payment delays caused by incorrect account holder information, ensuring timely and accurate payroll processing. Related tests and documentation have also been updated.
Original PR description
Law is now more secure and you need to have the correct name on the bank account holder otherwise payment need to be manually confirmed everytime. Therefore a field is added to the salary config to allow the user to set his account holder name separately from his actual name in case it is different. Task-5222712 [Related PR](https://github.com/odoo/odoo/pull/233965) Forward-Port-Of: odoo/enterprise#98572
This pull request resolves a bug in the Salary Calculator that prevented it from displaying correctly when an employee had a resource calendar assigned. The fix ensures the calculator functions properly regardless of whether an employee is linked to a calendar, improving payroll accuracy. This impacts all users who utilize the Salary Calculator feature.
Original PR description
This commit fixes an issue in the Salary Calculator where all fields were displayed as empty when selecting an employee with a resource_calendar_id set. Steps to Reproduce : First Change to either…
This commit fixes an issue in the Salary Calculator where all fields were displayed as empty when selecting an employee with a resource_calendar_id set. Steps to Reproduce : First Change to either the default company (MyCompany) or Demo Belgian company Payroll -> Employee -> Salary Calculator -> choose an employee. Bug : All fields in the Salary Calculator view are empty (evaluated as False). Root Cause : Inside _compute_salary, the method _generate_salary_simulation_payslip writes on payslip.version_id using: payslip.version_id.write(new_payslip_vals) Because the is_simulation_offer key was missing from the context, this write triggered a full payslip computation, generating payslip lines. During this computation, compute_sheet() performs an unlink() on existing payslip lines. Since the Salary Calculator view fields are only cached at that point, the unlink causes the cached values to be lost, resulting in all fields being evaluated as False. Fix : Ensure that is_simulation_offer is present in the context when writing to payslip.version_id, preventing payslip line generation and avoiding the unintended unlink() during salary simulation. Task - 5387155
This update fixes an issue where multiple loyalty programs on a product could cause incorrect discount application during POS orders. By adding a 'mutex' to control program updates, the system now reliably applies all discounts, ensuring accurate order totals. This improves the customer experience and prevents revenue loss.
Original PR description
When adding a lot of loyalty programs with discounts to an order the updatePrograms method could be called multiple times in parallel, that would cause an issue where some of the programs were not…
When adding a lot of loyalty programs with discounts to an order the updatePrograms method could be called multiple times in parallel, that would cause an issue where some of the programs were not applied correctly. Steps to reproduce: ------------------- * Create 7 loyalty programs that apply on the same product, each with a discount reward of 10%. (Give them different name) * Create a POS order with 1 unit of that product. > Observation: Only the 6 first programs are applied. Why the fix: ------------ The issue is happening because the updatePrograms is called multiple times in parallel, and when coming to this block of code : https://github.com/odoo/odoo/blob/f3e74f9b840efef7c567ba31acd6ac61c79b5d6d/addons/pos_loyalty/static/src/overrides/models/pos_store.js#L182-L188 The last program has 2 coupons in the `couponPointChanges`, so it will proceed to delete all the coupons of the concerned program. To avoid this we use a mutex to ensure that only one call to updatePrograms is happening at a time. opw-4974788 Forward-Port-Of: odoo/odoo#241023 Forward-Port-Of: odoo/odoo#239662
This update resolves an issue where tax mappings weren't properly set when upgrading to version 19.1, leading to errors during session closing with Fiskaly. The fix ensures accurate data transmission by automatically correcting missing mappings and handling company names with hyphens, preventing transaction failures.
Original PR description
Steps to reproduce: ------------------------- - Upgrade from lower version to 19.0 or higher. - Start a fiskaly registered company's session. - Close the session after transactions. Issue: ------- -…
Steps to reproduce:
-------------------------
- Upgrade from lower version to 19.0 or higher.
- Start a fiskaly registered company's session.
- Close the session after transactions.
Issue:
-------
- Tax mapping used to send data to fiskaly is not set.
- If have `-` in company name or cash move reason and try to do cash move will give a tb.
Cause:
---------
- When the user's database is upgraded, the taxes already exist and the company is already registered. As a result, `l10n_de_vat_export_data` is never set, and since no tax changes occur, `l10n_de_vat_definition_export_identifier` is also not generated. This leads to incorrect values being sent to Fiskaly during the session closing request, causing errors.
- The cash statement name uses - as a separator, the current structure is `{session_name}-{move_type}-{statement_type}-{move_reason}` set from `_prepare_account_bank_statement_line_vals()` If move_reason or company name contains additional `-` splitting the whole name breaks the expected structure.
Fix:
-----
- We have added a check to identify any taxes that are missing their tax mapping If such taxes are found, we filter them and trigger the logic to set their mappings. However, if the main mapping reference value l10n_de_vat_export_data is not set, we first retrieve and update it. Once this reference is available, we update all taxes that were previously unset and then prepare the correct tax data.
As a result, the first session closing after the upgrade will automatically correct all issues both for customers who have already upgraded and for those who upgrade in the future.
- We first remove the `{session_name}-` prefix, then split the rest. Since move_type and statement_type never contain -, we take them directly not user inputs, and then rejoin everything from index 2 onward to reconstruct the correct move_reason.
Additional fixes:
--------------------
- Some places the limit of characters may exceed than what fiskaly is asking than it can give us an error so restricted all places where needed.
- We don't have check if the settlement is present if not getting id directly may cause error.
help ticket: 5362897, 5367425
Forward-Port-Of: odoo/enterprise#101468This update fixes an issue where pasted content in the website builder's translation mode wasn't correctly styled, leading to inconsistent appearance and reset spans. It now ensures translated content is properly formatted and avoids unexpected HTML elements being inserted, improving the translation experience.
Original PR description
### [FIX] html_editor: unwrap blocks when inserting in editable span When the ancestors of the selection are not elements supposed to contain blocks when pasting, nothing was done to remove those…
### [FIX] html_editor: unwrap blocks when inserting in editable span When the ancestors of the selection are not elements supposed to contain blocks when pasting, nothing was done to remove those blocks. This could lead to `span` elements containing `p` elements for example. This commit unwraps the blocks in the pasted content if the block containing the selection is outside of the `contenteditable` element that contains the selection. It also fixes the function `makeContentsInline` that was not robust to containing some nodes structures. Steps to reproduce: - Open `example.com`, and copy "Example" from the first block - Open website builder in translate mode - Paste - Bug: The appearance is weird because the pasted title is not styled as translation - Save - Bug: The span of translation where the text was pasted has been reset #### - Open `example.com`, and copy the whole content - Open website builder - Move cursor to the bottom of the footer, with the company name - Paste - Bug: it inserted a `p` element in the `span` (non deterministic, depends on the mood of the AI) - Open website builder in translate mode - Select some text (more likely to trigger the bug if it includes a line break, for example the description in the footer) - Use the "Translate with AI" tool from the toolbar - Bug: The appearance is weird because the inserted translation is not styled as translation - Save - Bug: The span of translation where the text was changed has been reset opw-5053872 opw-5109137 opw-5136337 task-5222402 ### [FIX] website: restrict inserted content in translate mode to whitelist The translate mode of the website builder should only ever insert nodes with a tag in the `TRANSLATED_ELEMENTS` whitelist or with `o_translate_inline` class inside a translation span. Doing otherwise makes the translation span "invalid" according to the server, which discards the translation. Blocks are already unwrapped when inserting in translations (by the previous commit), but some other nodes are not in the whitelist, for example `img`. This commit adds the class `o_translate_inline` on `a` elements when inserted and unwraps nodes that are not in the whitelist and do not have that class. Steps to reproduce: - Open `example.com`, and copy the link "Learn More" - Open website builder in translate mode - Paste - Save - Bug: The span of translation where the link was pasted has been reset #### - Copy an image (or a piece of html containing an image) - Open website builder in translate mode - Paste - Save - Bug: The span of translation where the image was pasted has been reset opw-5053872 opw-5109137 opw-5136337 task-5222402 Forward-Port-Of: odoo/odoo#240421 Forward-Port-Of: odoo/odoo#237969
This update expands the functionality of the 'sign' module to align with the official itsme service's coverage, now supporting countries beyond Belgium and the Netherlands. This ensures our business users can utilize itsme for identity verification, improving accessibility and compliance with current regulations.
Original PR description
Extend itsme availability beyond BE and NL to match the official itsme coverage: https://www.itsme-id.com/en-BE/business/coverage task-5424818 Forward-Port-Of: odoo/enterprise#102823 Forward-Port-Of: odoo/enterprise#102423
This update fixes an issue where invoices with 0% taxes incorrectly displayed "Not subject to VAT" in XML reports. By mapping appropriate exemption codes and ensuring UBL compliance, the change guarantees accurate VAT data representation and full compliance with ZATCA standards, preventing misinterpretations of sales.
Original PR description
Issue: - The field `l10n_sa_exemption_reason_code` was not mapped for zero-rated, zero-rated export, and exempt taxes. - As a result, invoices using 0% taxes incorrectly showed "Not subject to VAT" in the XML, which misrepresented the actual nature of the supply. Imp: - Mapped appropriate exemption reason codes to 0% and exempt taxes based on the official ZATCA/UN CEFACT mapping. - Updated tax definitions and ensured UBL compliance with business rules BR-Z, BR-E, and BR-O. - It also makes the exemption reason text visible on the invoice. - Improved error spacing and removed redundant comma text. Impact: - Ensures full compliance with ZATCA XML standards. - Prevents misleading VAT data representation. Task: 5151903 Forward-Port-Of: odoo/odoo#234096
This update resolves an issue where overlays disappear after refreshing the website editor. The problem stemmed from how the editor was being reset, leading to the removal of necessary elements. This fix ensures overlays are correctly displayed after editor refreshes, improving the user experience within the website builder.
Original PR description
The bug is only observable after 18.4, after the website refactoring, but the root cause has been present since 18.0, so we fix it there in case there are other use cases. Since [1], overlays are no longer visible after an operation that executes `reloadEditor`. Steps to reproduce (observable after 18.4): - On website, go into edit mode - Change header template - After reload, overlays are missing Reason: `WebsiteBuilderClientAction.reloadEditor` sets up the new `Editor` before the old one is destroyed. Consequently, `LocalOverlayPlugin.destroy` removes the newest overlays as well. This commit ensures the plugin only cleans up its specific DOM elements. The order of operations bug will be fixed in a later PR. task-5438306 [1]: https://github.com/odoo/odoo/commit/3cd29fbac2b06566bfff40b5e7ed310cb0ce12c1 Forward-Port-Of: odoo/odoo#241161