Daily updates from Odoo
Monday, March 9, 2026
21 changes · saas-18.3
Enhancements to existing features
This update simplifies how the geolocation module retrieves its API keys. The change moves key retrieval to a separate method, enhancing the system's organization and stability. This improves the overall reliability of the geolocation service.
Original PR description
Move the api key retrieval to another method. Forward-Port-Of: odoo/odoo#252342 Forward-Port-Of: odoo/odoo#243496
Resolved issues and error corrections
This update fixes an error in how project budgets are calculated, ensuring accurate spending and remaining amounts. Previously, the system incorrectly displayed negative percentages and inflated remaining balances. The fix ensures that negative budget amounts are handled correctly, providing reliable budget tracking.
Original PR description
Steps to reproduce: --------------------------- 1. Install the `project_account_budget` and `account_accountant` modules. 2. Create a new project and add an Analytic Account for it from the settings…
Steps to reproduce: --------------------------- 1. Install the `project_account_budget` and `account_accountant` modules. 2. Create a new project and add an Analytic Account for it from the settings page 3. Open the Project Kanban, click the three dots on the project card, and select Project's Updates. 4. Click Add Budget button and open the budget wizard. 5. Add a budget line in the wizard with a planned amount expressed as a negative value for an expense (for example: -10000). 6. Create a Vendor Bill using the same analytic account with an amount of 1000. 5. Confirm the bill. 6. Go back to Project's Updates and click New button to view the budget summary. Observation: --------------------------- The budget summary displays incorrect signs and percentages in Activities summary, for example: ``` -10.0% (-1,000.00) of the -10,000.00 budget has been spent. 110.0% (-11,000.00) of the budget is remaining. ``` This incorrectly shows -10% spent and 110% remaining instead of 10% spent and 90% remaining (-9,000). Issue: --------------------------- The project cost (already negative) was negated again when computing the spent amount in https://github.com/odoo/enterprise/blob/ac3f333d97eda5c86a0813490ac6204d4ec5721f/project_account_budget/models/project_update.py#L16 Double-negating the cost makes it positive, which then gets added to the expense budget instead of reducing it, producing inverted percentages and signs. Solution: --------------------------- For expense budgets (negative budgets), do not apply an extra negative sign when calculating the project cost so the spent, remaining, and percentage values are computed correctly. After the fix: ``` 10.0% ($ 1,000.00) of the $ -10,000.00 budget has been spent. 90.0% ($ -9,000.00) of the budget is remaining. ``` opw-5357854 Forward-Port-Of: odoo/enterprise#109638 Forward-Port-Of: odoo/enterprise#102126
This update fixes a bug that prevented users from reconciling batch payments with bank statements when exchange rates changed between the payment creation and reconciliation. The fix ensures accurate currency conversion, resolving the 'unbalanced move' error and allowing for successful reconciliation.
Original PR description
…tion Currently, under certain conditions, reconciling a batch payment with a bank statement may not be possible as the system tries to create an unbalanced move. Steps to reproduce: - Have the main…
…tion Currently, under certain conditions, reconciling a batch payment with a bank statement may not be possible as the system tries to create an unbalanced move. Steps to reproduce: - Have the main company in USD and EUR as foreign currency - Have a bank journal with currency EUR (Bank EUR) - Create an xchange rate for today (1.1) - Make a Payment (EUR), it should not have an associated move - Put the payment in a batch - Update the exchange rate for today (1.2) - Create a Bank transaction in the journal Bank EUR matching the payment amount - Open the bank reconciliation screen and reconcile the transaction with the batch Expected result: Everything is reconciled. Actual result: User gets an error message saying that the account move is not balanced. Analysis: The issue occurs because the reconciled payment amount is converted to the company currency using the date provided in the payment. However the rate was changed in the meanwhile, so it does not match the amount that was used to create the exchange entry values. opw-5164405 Forward-Port-Of: odoo/enterprise#98495
This update resolves an issue where payments with outstanding receipt accounts weren't automatically matched to bank transactions. The fix allows the system to correctly match payments based on amount, ensuring accurate reconciliation and streamlining financial processes. This improves the reliability of our accounting system.
Original PR description
Steps to reproduce - Have a Bank journal with Outstanding Receipts accounts set - Create and confirm an invoice with a payment reference - Create the payment - Create a bank transaction with: - Label: any label - Partner: invoice partner - Amount: invoice full amount Issue: Transaction won't be matched automatically Analysis: Transaction will be automatically matched if the outstanding receipts account is not set. It occurs because in case it is set, the sytem will only try to match the communication pattern against the journal item of the payment, without trying amount matching Note: another solution could be to relax the communication matching. In the user case the invoice payment reference is something like `TEST-12345` and the payment communication `AAAAAAAAAAA /BBBBBBBBBBB TEST 12345` opw-5872387
This update corrects a display issue in the website editor where the 'Custom URL' field incorrectly appeared on certain pages. Previously, this field was misleadingly presented even when the URL didn't support customization. Now, the field only appears when a page's URL is editable, ensuring a cleaner and more accurate SEO experience.
Original PR description
This PR hides the "Custom Url" field in the "Search Engine Optimization" when the URL of the current page do not contain any editable slug. Previously, this field could be filled when the URL did not…
This PR hides the "Custom Url" field in the "Search Engine Optimization" when the URL of the current page do not contain any editable slug. Previously, this field could be filled when the URL did not contain any modifiable slug. However, the value was not take into account since the route of the page did not expect slug. Reproduce: With an admin user, activate the website editor on an appointment page. Clicking on "Optimize SEO" in the "Site" dropdown menu, a form containing the "Cutsom Url" field is displayed. This field should represent the current page's URL but with fillable field instead of the editable URL part. In this case, this is not correct as the URL is repeated before and after the fillable field, which does not represent the current URL. Also, the URL is not modified with the value entered in the fillable field. After the fix: The "Custom Url" field must not be displayed when URL does not contain a customisable slug. Task-5114394 Forward-Port-Of: odoo/odoo#231609
This update resolves an issue where ZATCA invoicing was incorrectly applied to Settle Due orders in Point of Sale with ZATCA enabled. The change ensures that Settle Due orders are correctly identified and excluded from ZATCA reporting, preventing duplicate invoices and ensuring accurate financial reporting. Mixed settlement and sale orders are now blocked to avoid complex reporting requirements.
Original PR description
# Description of the issue/feature this PR addresses In Point of Sale with ZATCA enabled (l10n_sa_edi_pos), invoicing is enforced on all orders. In 18.0, settlement and deposit flows were both…
# Description of the issue/feature this PR addresses In Point of Sale with ZATCA enabled (l10n_sa_edi_pos), invoicing is enforced on all orders. In 18.0, settlement and deposit flows were both correctly excluded from mandatory ZATCA invoicing using the is_settling_account flag. From saas-18.2, the Settle Due flow was refactored to include a dedicated settlement product line. As a result, is_settling_account now only covers account deposit flows, and is no longer sufficient to identify Settle Due orders. # Current behavior before PR With ZATCA enabled on saas-18.2: - Account deposit flows are still correctly excluded from mandatory invoicing using is_settling_account. - Settle Due orders are no longer detected by this flag and are treated as standard sales because they now contain order lines. - This causes ZATCA invoice enforcement to be applied to Settle Due orders, even though the original invoice was already reported. - Additionally, mixed orders combining settlement lines and new sale items would require partial ZATCA reporting, which is not supported. # Desired behavior after PR is merged After this fix: - ZATCA invoice enforcement is skipped for account deposit flows using the existing is_settling_account flag. - Even if invoice is checked, the invoice is not sent to ZATCA - Settle Due orders are correctly identified using the isSettleDueLine() check on order lines and excluded from mandatory ZATCA invoicing. - Mixed settlement and sale orders are explicitly blocked for ZATCA to avoid inconsistent or partial reporting. This restores the intended settlement behavior from 18.0 while adapting it to the refactored Settle Due flow in saas-18.2. task-5144679 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244712
This update resolves an issue where the system couldn't access files shared within Google Shared Drives. The fix adds a setting to the API request, allowing the system to properly search across all Google Drive locations. This ensures users can seamlessly embed content from Shared Drives into courses.
Original PR description
Step to reproduce: 1. Install `website_slides` 2. Go to eLearning > Courses > select a course > Add Content 3. Paste a public link that belongs to a file located in a Google `Shared Drive` Issue: - The system shows a warning `Your file could not be found on Google Drive, please check the link and/or privacy settings` even if the link is accessible via a browser in incognito mode. Cause: - The Google Drive API restricts the search scope to the user's personal `My Drive` by default It filters out items located in Shared Drives unless the client explicitly signals Solution: - Add `params['supportsAllDrives'] = 'true'` to the API request opw-5424413 Forward-Port-Of: odoo/odoo#241037
This update resolves an issue where Dutch tax returns appeared to be submitted in Odoo, but the actual XBRL data wasn't being transmitted to the Dutch tax authorities. The fix ensures that the necessary XBRL export process is triggered when a Dutch tax return is submitted, aligning the UI with the actual submission status.
Original PR description
Commit 647699eeb4b8a1cc37ca074fa57844871c5086c1 introduced account returns to the Dutch localization. However, the "Submit" action only updated the internal record state without triggering the actual XBRL export to the Dutch tax authorities. This led to a mismatch where the UI displayed "Submitted" despite no data being transmitted. This commit fixes the flow by: - Overriding `action_submit` on the account return to launch the XBRL wizard when the return type is a Dutch tax return. - Ensuring the SBR tax report wizard calls `_proceed_with_submission` on the associated account return to correctly finalize the process (including locking the period and generating the closing entry). opw-5974711
This update fixes a server error that occurred when merging tables in the restaurant POS system. Specifically, the system now waits for order synchronization before merging tables, preventing errors when a table has an empty order. This ensures a smoother and more reliable table management experience.
Original PR description
Steps to reproduce: - On an empty table, change the guest count - Create an order and send it to the kitchen - Open another table without an order - Merge the first table with the second one Issue: - A server error occurs during table merge Fix: - Wait for the merge order to sync before returning the result Task-5502511 Related: https://github.com/odoo/enterprise/pull/104577
This update fixes a server error that occurred when merging tables in the Point of Sale (POS) system, specifically when a table had no associated order. The fix ensures the system waits for order synchronization before merging, preventing the error and improving table management functionality. This enhances the reliability of the POS experience.
Original PR description
Steps to reproduce: - On an empty table, change the guest count - Create an order and send it to the kitchen - Open another table without an order - Merge the first table with the second one Issue: - A server error occurs while merging the tables Fix: - Wait for the merge order to sync before returning the result Task-5502511 Related PR - https://github.com/odoo/odoo/pull/245162
This update resolves an issue that prevented users from properly closing the mail composer when sending emails to a large number of leads (over 500). The fix avoids a technical error related to data payload sizes, ensuring the composer functions correctly regardless of the number of records selected.
Original PR description
Steps to reproduce: 1. Install `crm` 2. Create leads more than 500. 3. Select all and try to send email 4. Not close the wizard by "X" Issue: - Traceback occurs: `Uncaught Promise > Unexpected end of JSON input` Cause: - res_ids is not set on the composer when more than 500 records are selected. This is expected, as the compute method `_compute_res_ids()` does not write `res_ids` when the number of `active_ids` exceeds 500 (to avoid storing large payloads on the field). Because of this, the code trying to JSON.parse(res_ids) fails while dismissing the wizard at `onCloseWizardModal` Solution: - Fallback to context.active_ids when res_ids is not available opw-5891862 Forward-Port-Of: odoo/odoo#248406
This update resolves an issue where users without project access rights would encounter errors when modifying work orders linked to private projects. The fix ensures that workers can successfully update these work orders, improving workflow efficiency and preventing disruptions.
Original PR description
When working on a MO that is linked to a project in private, it will trigger a access error if the worker is does not have project access right Steps to reproduce: ------------------- * Install Project, MRP, Accouting * Create a private project * Create a MO and link it to this project * confirm this MO with a user that has no project access right Observation: ------------- When modifying the MO, we will pass through the write that has been overwritten: https://github.com/odoo/enterprise/blob/b332af45a46b2295797a5096f68b7953554a495b/project_mrp_workorder_account/models/mrp_production.py#L6-L10 we will call _get_analytic_distribution on project.project and since _get_analytic_distribution will [read fields from self](https://github.com/odoo/odoo/blob/436921c24a531eba6bf57ffe3f7c3b4978139d83/addons/analytic/models/analytic_line.py#L59-L64) we need project.project read rights. opw-4919576 Forward-Port-Of: odoo/enterprise#108148
This update resolves an issue that prevented basic receipts from printing correctly when the point-of-sale (POS) name exceeded a certain length. The fix limits the maximum POS name length to prevent a technical error that caused the printing process to fail. This ensures all receipts, regardless of POS name length, can be printed successfully.
Original PR description
When printing a basic receipt, if the pos name is too long a traceback will occurs when printing the basic receipt. Steps to reproduce: * Create a pos with a name of 46 character or more * Setup the italian fiscal printer * Enable Basic Receipt printing * Open point of sale * Create an order and validate it * Try "Print Basic receipt" Traceback: RangeError: Invalid count value: -15 at String.repeat () If the data being printed is longer than the maximum number of character in a line (MAX_CHARS = 46), paddingLeft becomes negative which cause an error in repeat(). [Similar solution](https://github.com/odoo/enterprise/blob/18.0/l10n_it_pos/static/src/app/fiscal_printer/commands/print_rec_message/print_rec_message.js#L35) [opw-5270697](https://www.odoo.com/odoo/project/49/tasks/5270697) Forward-Port-Of: odoo/enterprise#109527
This update ensures that timesheets are only generated for employees associated with the companies that have public holidays defined. Previously, timesheets were incorrectly created for employees in companies without a relevant holiday, leading to inaccurate time tracking. This change improves data accuracy and reporting.
Original PR description
**Steps to reproduce** - Have 2 companies A and B - Use a single working schedule (needs to have no company on it) for both companies and their employees - Create a public holiday with company A, while having company B in the selected companies - There's a timesheet for the public holiday created for employees of company B, even though the public holiday will not apply for them. **Change** Only generate the timesheets for employees belonging to the companies of the public holidays. opw-5498462 Forward-Port-Of: odoo/odoo#245743
This update fixes a minor issue in the Gantt chart where date selections in the scale selector didn't immediately update. The change ensures that date selections in the dropdown update instantly, providing a smoother and more responsive user experience when setting the chart's timeframe.
Original PR description
Steps to reproduce: - Open any Gantt view (e.g., Planning). - Open the scale selector dropdown and select a custom start or end date. Observation: The dates displayed in the dropdown do not update until the 'Apply' button is clicked. Cause: The XML template was referencing dates from the 'scales' prop, which is managed by the parent Gantt controller. This prop only updates after 'selectCustomRange' is called and the entire view reloads. Consequently, local changes in the date picker were not reflected in the UI during the selection phase. Solution: Modify 'web_gantt.GanttScaleSelector' to display dates directly from the local 'pickerValues' state. Since 'pickerValues' is a reactive 'useState' object, the UI now re-renders immediately when a date is picked, providing instant visual feedback before the user commits the change via the 'Apply' button. opw-5911253
This update fixes a minor issue where the HTML Editor module was incorrectly displaying 'odoo' (lowercase) as the author. The change ensures the correct Odoo S.A. author is listed, maintaining accurate attribution within the Odoo system. This aligns with previous author settings and ensures consistency.
Original PR description
Author was set as "odoo" (lowercase). This commit removes the author key so it fallbacks to the default one, i.e. Odoo S.A. This also aligns keys with previous commits like 42bad1a6 and ef7005f5. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#190655
This update fixes an error in the Romanian localization module that incorrectly mapped CPV codes. The system now correctly uses 'STI' as the ItemClassificationCode/listID for CPV classifications, aligning with European regulations and PEPPOL standards. This ensures accurate invoice processing and compliance for Romanian businesses using Odoo.
Original PR description
The value of `ItemClassificationCode/listID` that corresponds to `CPV` classification is `STI` not `CPV`. See https://docs.peppol.eu/poacc/billing/3.0/codelist/UNCL7143/ task-5416833 Forward-Port-Of: odoo/odoo#251017 Forward-Port-Of: odoo/odoo#250045
This update ensures that stock availability emails sent during testing correctly use the website's partner information. Previously, runbots would encounter errors because the website partner lacked an email address. The fix now provides a default email for the website partner in tests and prevents errors by explicitly failing if no email is available, ensuring reliable email delivery.
Original PR description
This commit (https://github.com/odoo/odoo/pull/249299/changes) backported some changes concerning stock availability mails. The mail is now sent from the partner associated to the website. However, in nightly runbots, the partner associated to the website does not have any email, so an error is thrown This fix does two things : - Make sure the website's partner has an email when running the tests - Prevent the mails being sent with the current user's email as a last ressort, and let an error be thrown instead runbot-102934954 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251951
This update resolves an issue where German addresses submitted to Amazon were being incorrectly formatted, causing delivery validation failures. The fix swaps the order of address fields to match Amazon's requirements, ensuring accurate address data and successful deliveries for German customers. This improves the overall customer experience and prevents shipping delays.
Original PR description
When filling in a German address on Amazon, customers are presented with two fields: - Street, and - Building or company name. The street is sent as AddressLine2, while the building/company name is sent as AddressLine1. However, delivery providers validate address existence, which fails when address line 1 is not a street name. To resolve this, we swap these two fields for German addresses. opw-4668178 Forward-Port-Of: odoo/enterprise#109215
This update resolves an issue preventing users with multiple companies from successfully setting up their Amazon accounts. The fix allows access to all company data during the onboarding process, eliminating a mismatch error. This ensures a smoother and more reliable experience for all users.
Original PR description
The onboarding return route is a website route with access restricted to the website company only. This causes an error when the company doesn't match the Amazon account being connected. This commit allows users to access all their companies during Amazon account setup to avoid this mismatch error. opw-5944078 Forward-Port-Of: odoo/enterprise#109740 Forward-Port-Of: odoo/enterprise#109590
This update resolves an issue where documents couldn't be opened after their names were changed. The problem stemmed from an outdated reference within the documents module, which has now been corrected. This ensures documents can be reliably opened and accessed after being renamed, improving user workflow.
Original PR description
Steps to reproduce: 1. Install `documents` 2. Open a document in full screen and click on info icon on top right 3. Edit the name and close full screen document and chatter 4. Try to open the same document Issue: - Traceback occures `TypeError: Cannot read properties of undefined (reading 'insert')` Cause: - In file document_service `this.store.Attachment` was used instead of `this.store["ir.attachment"]` After this commit https://github.com/odoo/odoo/commit/70153559c34ffd18c67b83c39ee397ecb0a90b4a we renamed the Attachment model opw-5483625 Forward-Port-Of: odoo/enterprise#105602