Daily updates from Odoo
Friday, October 3, 2025
37 changes · master
Security fixes and vulnerability patches
Sensitive Saudi payroll fields are now only visible to authorized payroll users. This helps protect employee compensation-related information and restores the expected access controls.
Original PR description
Some payroll-related fields in the Saudi HR localization (hr.version form view) were missing group restrictions. As a result, non-payroll users could see sensitive fields such as: - l10n_sa_iqama_annual_amount - l10n_sa_medical_insurance_annual_amount - l10n_sa_work_permit_annual_amount This broke the payroll access test (test_payroll_fields_access), which ensures sensitive payroll information is only visible to users in the Payroll group. We add the missing groups="hr_payroll.group_hr_payroll_user" restriction on these fields in the form view so that only authorized users can access them. build_error-231290
Enhancements to existing features
Equity notice and UBO request emails now use a more consistent Odoo-style layout and keep important action buttons fixed so links are not accidentally changed. Users can also send equity transaction emails to both subscribers and sellers at the same time, reducing manual work.
Original PR description
This commit improves the emails sent for equity notice and UBO form request. The following improvements are applied: 1. Make the equity/UBO button fixed at the top of the email without being editable for the user (to not mess up the token) 2. Make the rendered email look more odooish (used mail_notification_light) 3. Allow for sending to subscriber and seller at the same time in an equity transaction task-5123366
Updates the Uruguay electronic invoicing flow to provide clearer notifications when sending invoices. This helps users better understand the status of their electronic documents and any follow-up actions needed.
Original PR description
see https://github.com/odoo/odoo/pull/224267 Forward-Port-Of: odoo/enterprise#95366
Odoo now skips creating a return when an existing return already covers the full reporting period. This reduces duplicate filings and unnecessary work across accounting and localization reports.
Original PR description
Now, we dont generate returns if they already cover the entire period task-5066017
The signing app's automated checks were updated to match a refreshed error dialog design. This helps ensure the signing flow continues to be reliably tested after the interface change, with no direct change for end users.
Original PR description
The look and feel inspired by commit [1]. Task-5049469 [1]: https://github.com/odoo/odoo/commit/3916020e131008f3d529df61ad88f603874fd7d0
Product categories generated for the website can now include their available cover images. This helps create richer, more visually appealing online shop pages with better category presentation.
Original PR description
Also add the cover_image for the product category if available Forward-Port-Of: odoo/enterprise#96135
The trial balance audit PDF now uses its own dedicated layout instead of modifying a shared reporting template. This keeps standard reports stable while ensuring audit exports include the required account status and last comment details.
Original PR description
Refactor trial balance audit export to use a custom PDF template. Previously, this [commit](https://github.com/odoo/enterprise/commit/7a240345088942773b5b81937dca8275ee0a2d07) introduced audit export in PDF by writing directly into the generic report template. This approach is problematic, as the generic template should remain untouched. This change introduces a dedicated PDF template for the trial balance audit, overriding the generic one and adding the audit-specific requirements (account statuses and a “last comment” column). task-5114211
This update improves the generic chart of accounts by clarifying account names, correcting small wording issues, and making key financial report sections easier to understand. It also improves reporting accuracy by adding credit card liabilities to the balance sheet and ensuring other expenses are properly included in profit and loss reporting.
Original PR description
Improvements:
- Add a space before parentheses in the "Accounting Import" block in settings.
- Change the domain of the Accounting Setting "Deferred expense" to accept not only
type = Current Assets but also type = asset_prepayment.
- Fix typos in 101300, 121000, and 211000 Accounts Receivable and Payable
(add missing "s").
- Rename accounts for clarity:
- "101701 Liquidity Transfer" → "101701 Funds in Transit"
- "110100 Stock Valuation" → "110100 Inventory Valuation"
- "151000 Fixed Asset" → "151000 Fixed Assets"
- Remove "Plus" and "Less" from the P&L and Balance Sheet section titles.
- Add a "Credit Card" section (type = liability_credit_card) inside the
"Current Liabilities" section in the Balance Sheet.
- In the Generic Profit and Loss report, ensure the "Other Expenses" section
includes accounts of type "Other Expenses" and "Depreciation"
(currently only includes "Depreciation").
task: 5048333This update improves Belgian Dimona payroll declarations by adding better status handling, automation support, and compatibility with updated government API requirements. It reduces manual follow-up and helps HR teams submit more accurate employee declarations based on contract dates and required employee data.
Original PR description
Forward-Port-Of: odoo/enterprise#95533
Messaging features in AI, WhatsApp, live chat, and helpdesk now rely on the channel information already provided by the conversation model. This makes behavior more consistent across chat windows, message actions, thread controls, and composer tools, reducing the risk of mismatched chat behavior for users.
When bills are created from multiple employee expenses, every related receipt is now synchronized with Documents. This makes expense records more complete and avoids missing receipts that could make the workflow appear unreliable.
Original PR description
When several expenses are posted, one bill is created per employee. Previously, only the main bill attachment was synchronized with Documents, leaving many expense receipts unsynced and making the feature look buggy. With this change, all relevant expense attachments are now synchronized when the bill is created from expenses, ensuring that receipts appear properly in Documents. task-4954622
This update makes service-related documentation text compatible with the new documentation page, so it can be shown clearly and consistently. It also removes an unused internal method, reducing maintenance overhead without changing day-to-day user workflows.
Original PR description
With the introduction of the /doc endpoint, we should ensure that our docstrings are ReST (ReStructuredText) compliant, so that they can be displayed properly in the documentation. Task-5139767
Resolved issues and error corrections
When warehouse staff split a reserved package into multiple destination packages in the Barcode app, the new split line now retains the original source package. This prevents package information from being lost during partial deliveries, reducing picking errors and improving traceability.
Original PR description
### Before this PR: - Put a package in WH/Stock with quantity 100 - Create delivery for partial quantity for example 50 - Go to app barcode - Try to split the package into two different packages scanning another destination Package - The splitted line will be created with empty package instead of the package already reserved before ### After this PR: Scanning another destination package , the new line created splitting the old one will have the package_id Forward-Port-Of: odoo/enterprise#96071 Forward-Port-Of: odoo/enterprise#81170
The ESG app now retrieves the correct IPCC database table information before downloading data, preventing intermittent empty downloads. It also handles measurement units correctly, avoiding server errors during the download process.
Original PR description
## [FIX] esg: fetch ipcc database Before this commit, sometimes the download button for IPCC database does not work because the request made to IPCC database to fetch data, does not return any data. The reason is because the table name used in parameter changed after a certain time. This commit gathers the table_name when we do extra rpc to fetch all parameters to use to correctly export the data. ## [FIX] esg: check unit fetched to correctly process data gathered Before this commit, when the user downloads the IPCC database, an error is raised in server log because an uom recordset is compared to a string instead of checking the unit gathered with the expected string. This commit alters the check to correctly check the right things. Forward-Port-Of: odoo/enterprise#95879
The Turkish localization reports had a bug that could produce blank General Ledger CSV exports after a recent report change. This fix restores the missing data retrieval so exported files contain the expected accounting lines.
Original PR description
## Before this commit: After the refactor of the General Ledger in the referenced commit, `l10n_tr_reports` no longer able to fetch the `aml_ids`. This caused the CSV export of the General Ledger to be generated as blank. Ref commit: https://github.com/odoo/enterprise/commit/235a5160d13296328b79e4092a8b88a733628268 ## After this commit: Ensured that `aml_ids` are properly retrieved, so that the General Ledger CSV export contains the expected data. Forward-Port-Of: odoo/enterprise#95577
This fix prevents crashes in the Belgian POS certification flow when several employees are clocked in on the same point of sale. Sales and session closing can now proceed reliably in that scenario, reducing disruption for store staff.
Original PR description
- Fix traceback when trying to sell a product with multiple employees clocked in on the same POS. - Fix traceback when trying to close a session with multiple employees clocked in. task-id: 4902090 Forward-Port-Of: odoo/enterprise#95966 Forward-Port-Of: odoo/enterprise#93273
The Helpdesk community support link now sends customers to the correct forum page instead of showing a page-not-found error. This ensures users can reach community help from a Helpdesk team when the forum option is enabled.
Original PR description
Scenario:
- create a helpdesk team
- enable community forum on it
- go to the team and click on "Ask the community"
Result: 404 error, this page does not exist
Cause: we are using helpdesk.team ID in route needing a forum.forum ID
Fix: uses /helpdesk/{team ID}/forums route instead of /forum/{team ID}
opw-5027193
Forward-Port-Of: odoo/enterprise#96026Report exports now retrieve account annotations in the correct date order, reducing extra processing and improving consistency. Audit balance views also now show the latest message only when it belongs to the audit period, preventing out-of-period notes from appearing in the wrong audit context.
Original PR description
Previously when exporting a report, we would sort the annotation based on their create_date or to get the last annotation we would need to use max to find the latest one. Now, when exporting the report we order them directly so we dont need to bother with it. It's not needed to sort them when simply viewing the report as they are displayed in the chatter already in the right order Also fix a bug where the last_message displayed on the balance view of the audits isn't filtered on the period of the audit. To replicate: - Create an Audit for any year. - Post an annotation on an account on a period outside of the period of the audit. - Go to the balance view and check the account, it now has the new message even though it's outside the audit period. Forward-Port-Of: odoo/enterprise#95307
Payslip correction guidance now appears in the payslip issues area instead of as a banner at the top of the form. This keeps the form cleaner while still helping payroll users review corrections and choose to keep a payslip unchanged from the correction wizard.
Original PR description
Move the correction banner from the top of the payslip form view to issues. Add a `keep as it is` button inside the wizard to keep a single button. task-5074163
Customers can no longer accidentally combine one-time purchases with subscription products in the same cart. The checkout flow now warns shoppers and blocks the conflicting item, helping avoid confusion about whether an order is recurring or one-off.
Original PR description
**Version:** - saas-18.4 **Steps to reproduce:** - Create a one-time product. - Add the one-time product to the cart. - Add a subscription (recurring) product. - The one-time product is incorrectly shown as a subscription. **Issue:** - When a customer adds a one-time product to the cart and then adds a subscription product, the one-time product incorrectly gets treated as a subscription. **Solution:** - If the cart already contains a one-time product, the system will show a warning and block adding subscription products (and vice versa). **Impact:** - Customers can clearly understand whether they are buying a one-time product or a recurring subscription, without mixing them by mistake. Task-5046146 Forward-Port-Of: odoo/enterprise#93282
Helpdesk ticket lists now sort ticket references in a more natural order, even after ticket numbers pass 100. This helps users quickly find the oldest or newest tickets without confusing text-based ordering.
Original PR description
**Issue** With the default `helpdesk.ticket` sequence, once users reach 100 tickets, ordering tickets by `ticket_ref` in the list view is unintuitive as it is a Char field (so '11' > '100') and the results are not useful if the user wants to see the oldest/newest tickets. opw-4891916 Forward-Port-Of: odoo/enterprise#95971 Forward-Port-Of: odoo/enterprise#93058
Barcode scanning now correctly converts quantities when a package uses a different unit of measure than the delivery line. This prevents warehouse users from seeing incorrect picked quantities, such as 10 g instead of 10,000 g, and helps ensure deliveries are processed accurately.
Original PR description
Manual forward port of https://github.com/odoo/enterprise/pull/90878 **Problem:** When scanning a package with a different UoM than the barcode line, the conversion is not made. **Steps to…
Manual forward port of https://github.com/odoo/enterprise/pull/90878 **Problem:** When scanning a package with a different UoM than the barcode line, the conversion is not made. **Steps to reproduce:** - Enable the "Packages" setting; - Create a new storable product and set kg as its UoM; - In the inventory tab, add "g" in the packagings - Click on the on hand smart button and select update quantity - Add a new line; - In the package column create a new package; - Set a quantity of 10 kg; - Create a delivery and select your product; - Set a demand on 10000 and select g as the UoM; - Mark as todo; - Open the delivery in the Barcode app; - Scan the package. **Current behavior:** The quantity on the line is now 10 / 10000 g **Expected behavior:** It should be 10000 / 10000 g **Cause of the issue:** https://github.com/odoo/enterprise/blob/4c9fa9dc010958710d848fbcb3241b17ea7205ca/stock_barcode/static/src/models/barcode_picking_model.js#L1500-L1505 remaining_qty is expressed in the uom of the quant so it will be 10 but qty_needed is expressed in the uom of the line is it will be 10000. qty_used beeing the minimum of those two it will be 10. **Fix:** To define how much quantity to take from the package, we convert the line's quantity by using the package's UoM. Then, when we add this quantity to the line's quantity, we re-convert it by using the line's UoM. opw-4860064 Forward-Port-Of: odoo/enterprise#95892 Forward-Port-Of: odoo/enterprise#93693
Creating a new payroll run now opens the employee selection correctly by avoiding an empty reference that was being passed unnecessarily. This helps payroll users start new payruns more reliably without being blocked by a technical form issue.
Original PR description
When creating a new payrun, we were passing the res_id as an argument for self, but it was always falsy. This commit removes the argument such that it uses an empty recordset. task-5130462
Fixed an issue where some action buttons in the payslip list were hidden unless their action was defined in a specific controller. Payroll users can now see the correct available actions, reducing confusion and helping them complete payslip tasks without workarounds.
Original PR description
This commit fixes the display of conditional buttons in the payslips list view. The issue was that only buttons with actions defined in the list controller were displayed. This commit fixes the issue by displaying any button if the action is not specified in the list controller. Forward-Port-Of: odoo/enterprise#96050 Forward-Port-Of: odoo/enterprise#95527
This update prevents completed signature requests from being deleted after they have been signed. It helps preserve important signed records and reduces the risk of losing legally or operationally significant documents.
Original PR description
backport of https://github.com/odoo/enterprise/commit/b2d32811877cdf1649095435ce16274ae96421f3 opw-5111568 Forward-Port-Of: odoo/enterprise#96081 Forward-Port-Of: odoo/enterprise#95922
This fix adjusts an accounting test so it no longer fails when account merging takes longer than expected in databases with many companies. It improves test stability without changing how users work with accounting features.
Original PR description
In test_account_merge_wizard_tour, the actual merging of the accounts can take more than 10 seconds if there are a lot of companies. It causes sometimes timeout of the step and so a fail of the tour. runbot-error-233162
This fix corrects the visual styling of the Belgian payroll holiday attest after a recent user experience update used the wrong layout classes. Employees and payroll teams will see the intended presentation, reducing confusion when viewing this document.
Original PR description
We recently fixed the UX of holiday attest but the classes used in xml were wrong. We fix this in this task. Task: 5109176 Forward-Port-Of: odoo/enterprise#95430
The Sign app guided tour was updated so it no longer fails when users drag signature fields onto documents or when an existing saved signature changes the signing flow. This helps teams and testers complete the guided workflow consistently without duplicate signature fields or stalled steps.
Original PR description
Fix `sign_tour`. How to reproduce: 1. Go to tours in Odoo 2. Look up sign_tour 3. Click testing ( If testing stops at Sign App, change search filters or archive sign all .request records so that the…
Fix `sign_tour`.
How to reproduce:
1. Go to tours in Odoo
2. Look up sign_tour
3. Click testing ( If testing stops at Sign App, change search filters or archive sign all .request records so that the following screen displays )
<img width="780" height="591" alt="image" src="https://github.com/user-attachments/assets/b164c224-0e3e-4dce-97e6-89848263e59e" />
4. tour fails!
---
First commit
The `sign_tour` was failing after the conversion of the `sign.Template` client action to OWL. The standard `drag_and_drop` tour helper can no longer be used for automatic tour testing because the drop target is inside an iframe whose content is managed by PDF.js.
This commit fixes the tour by utilizing the custom helper function, `dragAndDropSignItemAtHeight`, to programmatically simulate the drag and drop action.
---
Second commit
The step "footer.modal-footer button.btn-primary:enabled" assumes that the Signature Dialog opened from its previous step ("Sign It" navigation button).
However, the "Sign It" navigation button does not always open the dialog.
If signing user (res.users) already has "sign_signature" data, the data will be automatically filled in to the Signature input.
Otherwise, the navigation button will open the Signature Dialog.
Luckily, we can see whether user has "sign_signature" data or not by checking if the <input data-item_type='signature'/> node has "data-auto_value" attribute or not.
We now skip the step if data-auto_value is set for signature.
---
Third commit
If `sign.template_sign_tour` has sign request, it means that the template might have a sign item because the `sign_tour` tour adds the Signature sign item to the template. (If user followed the tour)
When we're copying the sign template to trigger the template tour, we should not copy the sign item. User will be guided to add the sign item during the tour.
---
Note:
ci/security needs to be overriden as it was done for https://github.com/odoo/odoo/pull/134793#issuecomment-1711440188
---
opw-4752794
Forward-Port-Of: odoo/enterprise#93601
Forward-Port-Of: odoo/enterprise#91565Fixes an issue where closing or reopening a rental subscription for a kit product could incorrectly reset delivered quantities to zero. This prevents false return errors and helps rental subscriptions with bundled products close reliably after delivery.
Original PR description
Versions -------- - 18.0+ Steps ----- 1. Enable rental transfers; 2. have a rental product with a kit BoM; 3. create a subscription order in the Rental app; 4. add the rental product; 5. confirm…
Versions -------- - 18.0+ Steps ----- 1. Enable rental transfers; 2. have a rental product with a kit BoM; 3. create a subscription order in the Rental app; 4. add the rental product; 5. confirm order; 6. validate deliveries; 7. close the subscription. Issue ----- Invalid SQL command, cannot return more than was delivered. Cause ----- When closing or reopening a subscription, the `_compute_qty_delivered` method gets triggered. By default, these methods required the relevant moves to have the same `product_id` as the sale order line. For products with kit BoMs, the move's `product_id` is tied to the BoM instead of the final product, leading to `qty_delivered` getting reset reset to 0 on recompute. This causes an error, as `qty_returned` is non-zero. Solution -------- The `qty_delivered` for these lines was set in the `_action_done` method of `stock.move`. By instead moving this logic into a `_compute_qty_delivered` override, any recompute should have the same result, instead of getting reset to 0. opw-4833280 Forward-Port-Of: odoo/enterprise#96179 Forward-Port-Of: odoo/enterprise#88691
Consolidated billing for Mexican Point of Sale orders now checks that required localization invoice fields match before creating an invoice. If orders are incompatible, users receive a clear validation error instead of an unexpected system error, helping avoid incorrect consolidated invoices.
Original PR description
Issue: Currently when we consolidate billing for PoS orders we receive an error because some l10n fields expect a single record and not a recordset. This can be solved by looping over the PoS orders instead and preparing the invoice values per order (this is how the sale orders handles consolidated billing) however, we run into an issue if not all PoS orders have the same l10n fields. Ideally PoS orders with different l10n fields should not be consolidated. Purpose of this PR: check to make sure that the three l10n_mx_edi fields are the same among PoS orders before creating consolidated invoice. raise a validation error if the fields are not the same. Steps to reproduce on Runbot: install pos and l10n_mx* create pos orders for same contact try to create invoices with consolidated billing enabled singleton error is raised Note: main discussion about consolidated billing with l10n_mx localization: #86255 opw-4802180 Forward-Port-Of: odoo/enterprise#86579
Discarding a quality worksheet wizard no longer creates a worksheet record or makes the quality check appear completed. This prevents incorrect completion status when users open a worksheet and cancel without entering results.
Original PR description
**Problem:** Opening the worksheet wizard and discarding it makes the worksheet "completed" **Steps to reproduce:** - create a quality check - set a product - in type select worksheet - select the "quality issues" template - select a team - click on the worksheet smart button - discard **Current behavior:** the worksheet is marked has completed **Cause of the issue:** when discarding, this line causes the creation of an instance of worksheet.template linked to the quality.check via its worksheet_template_id https://github.com/odoo/enterprise/blob/a1dd58f2b59ecd2d22efd29eb0aace7bdca64f66/quality_control_worksheet/static/src/views/quality_worksheet_fromview.js#L35 which will make the worksheet_count field of the quality check worth 1 after discarding https://github.com/odoo/enterprise/blob/1c5e547b59a57c840ef72b2e76c6a6a627f1f18e/quality_control_worksheet/models/quality.py#L37-L39 opw-4980945 Forward-Port-Of: odoo/enterprise#95219
DHL delivery quotes and shipments now include insurance when an insurance percentage is configured. This helps businesses charge accurate shipping rates and ensures eligible DHL shipments are actually insured.
Original PR description
**PROBLEM** Insuring a delivery using the dhl carrier don't work. It doesn't affect the estimated rate of the delivery, and the shipment created when validating the delivery order isn't insured.…
**PROBLEM** Insuring a delivery using the dhl carrier don't work. It doesn't affect the estimated rate of the delivery, and the shipment created when validating the delivery order isn't insured. **STEP TO REPRODUCE** 1. Install the `delivery_dhl_rest` and the `l10n_be` modules (we will use the be demo company). 2. Set the insurance percentage of the dhl be delivery method to 100%, and set the region to Europe (the demo data is incorrect), and activate the debug (click the "No Debug" smart button to activate the log of requests). 3. Switch to the be company. 5. Create a sale order, with a customer located in Belgium, and add shipping using the dhl method. 6. Go to the delivery order, and validate it. 7. Go to settings/Technical/Logging and look at the rating_request and shipment_request, notice there is no information about insurance. **CAUSE** We don't send any info about insurance in the api requests. **FIX** Computing and sending the insured amount, only if the insurance percentage is not null. If the package can't be insured between the origin and the destination, a error message will be displayed when updating the delivery price. **TESTS PROBLEM/FIX** The localization of `your_company` was not recognized by DHL, leading to the DHL api returning a 0 delivery price. Switching the localization to Eghezee, Rue du Laid Burniat 5 fixes this. Assertion regarding the delivery price were restored. The picking date could sometimes be refused by DHL (stop working after arround 4/5 PM). Changing the picking date to, two day after, at noon works. `test_01_dhl_basic_be_domestic_flow` was modified to also test domestic shipment insurance in addition of the basic flow. Some code in it was refactor into inner function to avoid boilerplate. Adding `INSURED_RATE_MOCK_RESPONSE` to mock response in test_01. opw-4989281 Forward-Port-Of: odoo/enterprise#93105
Bank account selection fields now show clearer visual indicators for trusted and untrusted accounts. Trusted accounts display a green shield, while untrusted accounts show a red warning icon, helping users identify payment account status more confidently.
Original PR description
This commit fixes the UI indicator of trusted/untrusted bank accounts in many2one widget. For trusted bank accounts, they are indicated with a green shield. Untrusted bank accounts are indicated with a red exclamation circle. This is a followup of the work done in this PR: https://github.com/odoo/odoo/pull/229298 task-5117800
This change updates an automated test for SEPA payment processing so it follows the current rules for bank account data handling. It helps keep the accounting payment flow reliably tested without changing day-to-day user functionality.
Original PR description
Direct update sanitized_acc_number is not allowed. Forward-Port-Of: odoo/enterprise#95477 Forward-Port-Of: odoo/enterprise#72508
This fixes an automated walkthrough used to verify the bank reconciliation screen. The correction helps avoid occasional false failures during testing, improving release confidence without changing user-facing functionality.
Original PR description
The step checks the non presence of `o_bank_rec_quick_create`. But this element does not exist, as it should be `o_bank_reconciliation_quick_create`. This causes the tour to sometimes fail as we click on unfold before the interface updates from the creation of the line. runbot-error-230727 Forward-Port-Of: odoo/enterprise#95359
Code cleanup and technical improvements
The organizational chart functionality is being folded into the main HR app, simplifying how employee hierarchy features are delivered and maintained. This is an internal restructuring, so users should see the same capabilities with a more consolidated HR setup.
Original PR description
This commit merges the hr_org_chart module into hr. task-4925995
The Planning app’s contract-related Gantt chart code has been moved into the main Planning Gantt area. This keeps related scheduling code together, making future maintenance easier without changing the user-facing planning experience.
Original PR description
After the HR refactoring, `planning_hr_contract` was merged into the `planning` module. However, its JS customizations remained in a separate `planning_contract_gantt` folder. This commit moves that code into the `planning_gantt` folder to centralize all Gantt logic. task-4926655