Daily updates from Odoo
Tuesday, May 5, 2026
33 changes · master
Resolved issues and error corrections
This update automatically generates a new offer link token each time an offer email is sent, eliminating the need for manual token changes. This improves security by invalidating compromised tokens and simplifies the process for users. Minor adjustments were made to related tours to account for the new token generation process.
Original PR description
In the case that an offer link is compromised, the access token needs to be changed to invalidate the old one. Right now it has to be done manually. This commit removes the ability to edit access…
In the case that an offer link is compromised, the access token needs to be changed to invalidate the old one. Right now it has to be done manually. This commit removes the ability to edit access tokens manually and instead generates a new access token whenever an offer email is sent. The reason why the access token is set in the "MailComposeMessage" class instead of directly inside the "HrContractSalaryOffer" class is that the "Send by Email" button on the offer form doesn't directly send the email, it instead opens a dialogue to edit it before sending. In this dialogue, the user can just discard the email. If the access token was set when the dialogue was opened, discarding the email would change the access token of the offer without sending the new link. Instead of this the access token is updated right before sending the offer email. The reason why some tours were modified is that since the access token is tracked, changing it will produce a new message in the chatter, the problem with this is that those tours have the assumption that the salary configurator link will be in the first message in the chatter which is no longer true as it is the second message now. Task-ID: 5172914
This update resolves an issue where printers connected as IoT devices were not being correctly loaded within the Point of Sale (PoS) system. This fix ensures that IoT printers are now functional and usable, improving the PoS experience for users. It addresses a previously unusable printer scenario.
Original PR description
preparation printers were not loaded in PoS as IoT devices making them unusable. Forward-Port-Of: odoo/enterprise#115826 Forward-Port-Of: odoo/enterprise#115768
This update eliminates a distracting popup message that appeared when opening the Point of Sale (PoS) module, specifically when reading scale weight data. The fix prevents a frustrating user experience and ensures smoother PoS operations. This resolves a minor usability issue.
Original PR description
This PR removes the unwanted popup "can't reach iot box on local network" before opening PoS when reading scale weight
This update prevents referral-only users from accessing the Reporting tab within the Referrals app. Access to this tab is now restricted to users with recruitment management permissions, streamlining the reporting process for authorized personnel. This change improves data security and usability.
Original PR description
This commit hides the Reporting tab in the Referrals app from users with referral only access rights, and only show it to users with recruitment access. TaskID-6133065
This update significantly speeds up the process of writing data to reconciliation models in the accounting system. By optimizing how the system retrieves and filters bank statement lines, the update reduces processing time and memory usage, particularly for large databases with many unreconciled transactions. This results in a faster and more efficient reconciliation workflow.
Original PR description
When writing on reconcile models, the ORM fetches all the unreconciled bank.statement.lines then calls filtered on `unreconciled_statement_lines.line_ids`. In databases with a lot of unreconciled…
When writing on reconcile models, the ORM fetches all the unreconciled bank.statement.lines then calls filtered on `unreconciled_statement_lines.line_ids`. In databases with a lot of unreconciled statement lines scattered across multiple models, this `filtered` can be heavy, both in memory (fetching all the amls fields) and in time. This commit fixes this by using a search to prefilter the amls using the reconcile models in self. Then we filter the result on `suspense_account_id`. This greatly reduces the number of lines loaded up in memory and speeds up writing on reconcile models. ### speedup In a customer database with 484 042 statement.lines, 141 000 unreconciled statement.lines, 37 account.reconcile.model. Time to write on a reconcile_model. | Nbr linked unreconciled lines| Before PR | After PR | |:----------------------------:|:---------:|:--------:| | 702 | 40s | 3s | | 2000 | 40s | 4.47s | | 10000 | 40s | 11.28s | Since most of the slowness comes from the `filtered` call, the number of unreconciled statement lines linked to the reconcile.model being updated has no impact on the timing before this patch. ### memory For the 702 unreconciled lines case, the memory consumption goes - 2.2 Gb -> 200Mb. Forward-Port-Of: odoo/enterprise#115583
This update restores a previous system for tracking changes made to employee payslips. Now, when a user edits a payslip line, a detailed log is created showing all affected lines. This enhances transparency and simplifies auditing of payroll adjustments.
Original PR description
purpose: We want to reintroduce the same way of logging payslip lines changes as previously done by the removed payslip edit wizard - changed the log in chat to include all affected lines by the user's change task-id: 6144266
This update enhances the accuracy of invoice imports by adding a crucial field – the 'partner' – to the query builder for move lines. This resolves issues with unsynchronized values during import, particularly related to invoices generated using UBL standards. It’s part of a larger effort to improve data consistency.
Original PR description
This commit is part of a bigger commit on the community side- to refactor the import code of BIS3 Invoice to fix various unsynchronized values issues. task-id: 5058687 Forward-Port-Of: odoo/enterprise#115517 Forward-Port-Of: odoo/enterprise#108356
This update fixes a technical issue that previously displayed confusing error messages when generating tax reports. Now, users will receive a helpful message guiding them to set up a certificate if one isn't already configured, preventing tracebacks and improving the user experience. This ensures reports can be successfully submitted to authorities.
Original PR description
Description of the issue this commit addresses: When sending the tax report or ec sales list xbrl file via the wizard to the authority, if no certificate has been set, a traceback shows up. This happens because some processes try to use the certificate without checking its existence. Desired behavior after the commit is merged: When sending via the xbrl wizard, if no certificate has been set up, an error offering the user to go to the certificate set up shows up and no traceback. task-6065382 Forward-Port-Of: odoo/enterprise#115907 Forward-Port-Of: odoo/enterprise#112951
A small typo in the quality module caused newly created quality alert records to be incorrectly grouped as 'None'. This fix replaces the incorrect '&' character with the correct '|' character, ensuring records are properly assigned to their intended stages. This resolves a potential data grouping error.
Original PR description
Issue: ------- While adapting the 'Domain' in the PR https://github.com/odoo/enterprise/commit/07b34a2e927347ca5c839ec632808adb02703e1f there occurred a typo where '|' got replaced with the '&' and causing the records getting grouped in 'None' when creating. Solution: ------------ To replace '&' with '|' to get the records grouped under the correct stage. Steps to reproduce: ----------------------- 1. In v19.0, in quality module try to create a quality alert record. 2. Just like that the newly created record will be under 'None'. Reference Image: <img width="1105" height="407" alt="image" src="https://github.com/user-attachments/assets/4c9c33be-ec06-4f06-8245-54dbe4473bc0" /> OPW - [6074016](https://www.odoo.com/odoo/project/70/tasks/6074016) Forward-Port-Of: odoo/enterprise#113108
This update ensures our accounting system accurately reflects the latest Ecuadorian withholding tax regulations (Resolución N.º NAC-DGERCGC26-00000009) for 2026. The changes involve updating unit tests to align with these new tax percentages, ensuring compliance and accurate reporting.
Original PR description
In accordance with the implementation of the new withholding tax percentages according to "Resolución N.º NAC-DGERCGC26-00000009" for Ecuador, following internal implementation guidelines by TRESCLOUD. Unit tests are updated to be based on the new withholding percentages. BP #110343 Forward-Port-Of: odoo/enterprise#112957 Forward-Port-Of: odoo/enterprise#110712
This update fixes a validation error that occurred when creating correction payslips in Odoo. It ensures that each correction payslip is correctly linked to a structure, allowing for accurate payroll processing. This improves the reliability of the payroll system when adjustments are made.
Original PR description
Ensure `structure_id` is set when creating correction payslips to avoid validation errors. Group payslips by structure before creating pay runs for corrections/reverts, and set the payrun period from the minimum to maximum payslip dates. Fix condition in "Payslip period does not match payrun" to exclude correction payslips (they may span multiple months). task: 6089082 Forward-Port-Of: odoo/enterprise#115405
This update fixes an issue where copying a user also duplicated their assigned tasks, leading to shared task assignments. The change ensures that tasks are uniquely associated with each user, preventing conflicts and simplifying task management. This improves data consistency and reduces potential errors.
Original PR description
Duplicating a user also duplicates all their task assignments because task_ids on res.users is missing copy=False. The new user ends up sharing the same tasks in project_task_user_rel, so removing a task from either user affects both. Forward-Port-Of: odoo/enterprise#114270 Forward-Port-Of: odoo/enterprise#114028
This update resolves an issue preventing the import of Winbooks tax data for Belgian companies. The fix re-enables a temporary workaround that allows the system to correctly handle a specific account type used in Winbooks, ensuring accurate data import. This avoids a previous error message related to receivable account selection.
Original PR description
Steps to reproduce: ------------------- 1. Install account_winbooks_import, and switch to a Belgian company 2. Open Accounting > Configuration > Settings and click "Import", then click "Import WBK"…
Steps to reproduce: ------------------- 1. Install account_winbooks_import, and switch to a Belgian company 2. Open Accounting > Configuration > Settings and click "Import", then click "Import WBK" 3. Upload a Winbooks zip whose chart of accounts uses 411000 typed as asset_current (Winbooks default for "VAT Recoverable") 4. Confirm the import The import fails with: "You must select a receivable account for 'Tax Receivable Account'." Why the issue ------------- In Winbooks, account 411000 is the V01 central account (tax receivable). In Odoo, 411000 comes from l10n_be (account "a411") with type "asset_current", not "asset_receivable". When the import wizard sets it on the existing tax groups via `manage_centralid` in import_wizard.py, the constraint `_constrains_payable_receivable_account` on account.tax.group rejects the write because the account is not "asset_receivable" + "non_trade". This case was already handled in 20804db6d87: we bypassed the constraints on accounts coming from Winbooks, as those are imported in draft anw and the user finishes the configuration after. However later, [2a38e771a826](https://github.com/odoo/odoo/commit/2a38e771a826) and ff5dee81080 removed the initial constraint and the code that bypassed it for account_winbooks_import. Finally, [746a06fab485](https://github.com/odoo/odoo/commit/746a06fab485) added back a similar constraint "_constrains_payable_receivable_account" to fix a NL issue (same account used as both payable and receivable on a tax group). The Winbooks bypass however was not added back, so the original Winbooks issue appeared again. The fix ------- Add back the same bypass originally introduced in 20804db6d87. opw-6092464 Forward-Port-Of: odoo/enterprise#115291
This update adds logging of Amazon's unique request IDs for SP-API responses. Previously, this information wasn't captured, making it harder for support teams to troubleshoot issues with Amazon orders. This enhancement streamlines support investigations and improves order processing efficiency.
Original PR description
Each response from Amazon's SP-API includes a request identifier used by their support team for debugging. This identifier was not previously logged, making support investigations more difficult. Forward-Port-Of: odoo/enterprise#115929 Forward-Port-Of: odoo/enterprise#114483
This update resolves a crash that occurred when users attempted to fetch device information in the HR Attendance module. The issue stemmed from a missing server URL configuration, which has now been addressed by displaying a user-friendly error message prompting them to set the correct URL.
Original PR description
Version: - saas-19.3 Steps to reproduce: - Install the hr_attendance_zkteco module - Go to Settings → Device/Terminal - Click on “Fetch Terminal” Issue: - A traceback error occurs. Cause: - The server URL is not set in settings, so the server value is empty and causes an error. Fix: - Show a user error if the server URL is not configured, asking the user to set it before fetching the terminal. Task-6144254 Forward-Port-Of: odoo/enterprise#114561
This update simplifies the process for Dutch companies to manage their digipoort certificates within the accounting settings. Previously, users had to navigate to a separate section to create a certificate before selecting it. Now, users can directly create and edit digipoort certificates within the main accounting settings, improving the user experience.
Original PR description
Description of the issue this commit addresses: In the Accounting settings on a Dutch company, the setting for the selection of the digipoort certificate only lets you choose amongst existing certificates so if you haven't created one yet, you need to go to the dedicated certificates menu to create one and then come back to the digipoort certificate setting to set it. This is poor UX. --- Desired behavior after this commit is merged: This is improved by letting the user Create and Edit inside the digipoort certificate setting directly. --- task-6065566 Forward-Port-Of: odoo/enterprise#115755 Forward-Port-Of: odoo/enterprise#114307
This update resolves an issue where users were unable to view equity holders associated with companies they didn't have access to. The change adds a company association to equity records, ensuring accurate reporting and access to all relevant shareholder information. This enhances the reliability of our equity management features.
Original PR description
Before this commit, if you had some holders only visible to a company you don't have access to, the cap table would show an access error. This commit introduces multi-company logic to equity models by adding a new company_id field related to the company_id of the partner_id. Other partners (holder, seller, subscriber) will have their companies checked against that company. task-6018771 Forward-Port-Of: odoo/enterprise#110724
This update resolves an issue preventing the system from correctly calculating overtime pay. The fix re-introduced a missing data file and corrected a reference, ensuring that overtime hours are now accurately considered when generating payslips. This improves payroll accuracy and compliance.
Original PR description
Issue: The issue here is that work_entry_type is not associated with the overtime ruleset. That's why when creating a payslip, it is not considering overtime hours. From this PR - https://github.com/odoo/enterprise/pull/98952 the data file is missing from the manifest file. Fix: Added back file to manifest and fixed reference for work_entry_type_id. task-6073921 Forward-Port-Of: odoo/enterprise#115981 Forward-Port-Of: odoo/enterprise#112934
This update ensures that 'Final Consumer' records are correctly created as individuals, not companies, within the Odoo system. The change was triggered by a recent update to how the 'is_company' field is calculated. The fix includes correcting test assertions to reflect this accurate creation process.
Original PR description
After changes on is_company field to be computed, Final Consumer was being created as a company. Although this is wrong, tests were not asserting correctly on how anonymous documents should be created. This commit fixes this by forcing the value to False and correcting the tests. task-6149751 Forward-Port-Of: odoo/enterprise#115560
This update resolves a minor issue in a test related to the HR payroll module's user interface. The change ensures the test accurately reflects updates made to the CSS styling, preventing potential errors in how the toggle field is displayed. This ensures consistent and reliable functionality for users.
Original PR description
Updates the `rule_selection_exclusive_toggle_boolean` test to account for the changes made in https://github.com/odoo/odoo/pull/262543. The test now correctly anticipates the widget sharing the same CSS rules as its base widget. task-3378044
A recent update to the Odoo Enterprise system introduced a new Dutch returns module (l10n_nl_returns) without the necessary translation files. This update corrects this issue, ensuring accurate and complete translations are available for users in the Netherlands. This prevents potential errors or confusion when using the module.
Original PR description
This [commit](a6a8d121bbf2044793df5211c5bdb18859a62152) introduced a new module in a stable version (19.0) without the required key in the `.weblate.json` file. This commit aims at fixing that to ensure translations are handled correctly. Forward-Port-Of: odoo/enterprise#115753
This update resolves a problem where payroll exports to the Mexican SAT were being rejected due to incorrect data formatting. Specifically, when a payslip only includes non-taxable payments, the system was including a 'TotalPercepciones' field that the SAT requires to be absent. This change ensures compliance with Mexican tax regulations.
Original PR description
When a payslip contains only OtrosPagos (no perceptions), the SAT rejects with NOM36 because TotalPercepciones must not exist per the nomina12 XSD. This is a valid scenario under LISR articles 93 and 94, where certain payments (e.g., viáticos, becas, fondo de ahorro patronal) do not constitute taxable salary income. Apply the same 'or None' pattern already used for TotalDeducciones, so format_float(None) returns None and the attribute is omitted from the XML. Forward-Port-Of: odoo/enterprise#115923
This update allows users to automatically reconcile bank statements from a branch with payments and invoices from the parent company. Previously, reconciliation was limited to matching companies only. This change streamlines the bank reconciliation process by recognizing parent-child relationships.
Original PR description
The aim of this commit is allowing in the automatic reconciliation of bank reconciliation widget the possibility to reconcile statement lines from a parent company with moves (payments and invoices) from a branch. To do that, we are not only checking that the company between the AML and the statement line is the same, we are checking that there is a parent relation between the company of the AML and the statement line. opw-6056320 Forward-Port-Of: odoo/enterprise#115267 Forward-Port-Of: odoo/enterprise#114850
This update ensures that EC Sales Reports generated for Swedish companies are exported to KVR in whole numbers, as required by Swedish tax regulations. Previously, the reports included decimal values, which were incorrect for reporting purposes. This fix corrects the export process to guarantee accurate data transfer.
Original PR description
**PROBLEM** EC Sales Report in Sweden needs to be reported with integer values. **STEP TO REPRODUCE** 1. Install l10n_se 2. On the se company, create a invoice with lines with EU tax and confirm it. 3. Go to Accounting/Reporting/EC Sale List and export to KVR. 4. Notices the KVR uses numbers with decimals places. opw-6045289 Forward-Port-Of: odoo/enterprise#116056 Forward-Port-Of: odoo/enterprise#114292
This update resolves an issue that occurred when manually creating vendor bills and DIAN commercial events were rejected due to missing information. The fix ensures that the system correctly handles these rejections, preventing a traceback error and improving the reliability of the DIAN integration. This change is crucial for accurate vendor bill processing.
Original PR description
This commit fixes an error when retrying a rejected DIAN commercial event on manually created Vendor Bills. This is a tricky error as it only happens when the vendor bill is manually created and the…
This commit fixes an error when retrying a rejected DIAN commercial event on manually created Vendor Bills. This is a tricky error as it only happens when the vendor bill is manually created and the event is rejected (missing/incomplete info or servers down which is common). To add more to this, this error can only be reproduced without demo mode as it forces the acceptance, forcing the need of valid testing or production DIAN credentials How to reproduce it: - Install l10n_co_dian module - On CO company with all required DIAN configuration set - Create a vendor bill manually with enough information to send to the DIAN but causing it to be rejected. - Click on acknowledge receipt, it should be rejected - Complete information to be accepted and again click on acknowledge receipt - A traceback appear Code expects the last document to be the most current one created when triggering commercial event, but this is not true when a rejected document exists since this is unlinked and cache invalidated causing the recordset to be invalidated and retrieved again by ORM with default order, so now the last document is the oldest one without an attachment causing the traceback opw-6104541 Forward-Port-Of: odoo/enterprise#115914 Forward-Port-Of: odoo/enterprise#114758
This update resolves a technical issue preventing the IoT printer test button from functioning correctly. The fix corrects a coding error that was preventing the system from properly identifying the printer, ensuring the test print functionality now operates as intended.
Original PR description
In the refactoring in odoo/enterprise#113545, a mistake was made where the `printer.iot_device_id` was used instead of `printer.iot_device_id.id`, causing an error when calling `searchRead`. This commit fixes the issue by restoring `.id`. Forward-Port-Of: odoo/enterprise#115039
This update corrects a bug where closed Helpdesk tickets were sending out emails with the ticket's database ID instead of its reference number. Previously, the 'Ticket Closed' email template used the wrong identifier, leading to inconsistent references for customers. This change ensures all email communications accurately reflect the ticket reference.
Original PR description
Steps to reproduce: ------------------------ 1. Install the Helpdesk. 2. Go to Settings → Technical → Sequences and set the next number to 100. 3. Create a ticket and send a message using the…
Steps to reproduce: ------------------------ 1. Install the Helpdesk. 2. Go to Settings → Technical → Sequences and set the next number to 100. 3. Create a ticket and send a message using the "Helpdesk: Ticket Received" mail template; Observe that the correct reference (100) is used. (Open the full composer to use "Load template") 4. Now send a message using the "Helpdesk: Ticket Closed" mail template and Observe that it displays the database ID (e.g., 1) instead of the reference. Cause: ------ `new_ticket_request_email_template` uses the ticket reference(`object.ticket_ref`) correctly. https://github.com/odoo/enterprise/blob/d39e291ba89ad018ba6f5f9591d280a834822f27/helpdesk/data/mail_template_data.xml#L18-L19 However, the `solved_ticket_request_email_template` uses the database ID (`object.id`) instead of the actual ticket reference (`object.ticket_ref`), leading to inconsistent references in customer communications. related commit: 3ed5273 Solution: --------- Update `solved_ticket_request_email_template` to use `object.ticket_ref` instead of `object.id` opw-6087466 Forward-Port-Of: odoo/enterprise#115946 Forward-Port-Of: odoo/enterprise#113932
This update resolves an issue where the ECO list incorrectly showed related ECOs from child BoMs. The change ensures that the ECO smart button only displays ECOs directly linked to the current BoM, improving the user experience and data accuracy for BOM management.
Original PR description
Steps to reproduce the bug:
- Create a storable product “P1”:
- Create a BoM (id=1):
- Create an ECO → This creates an archived BoM (id=2)
- Access BoM (id=2)
- Create another ECO → This creates an archived BoM (id=3)
- Go back to the original BoM (id=1)
→ The ECO smart button count is 1 (correct)
Click on it
Problem:
It loads all ECOs linked to both the parent and child BoMs. It should only display the ECOs directly linked to the current (parent) BoM.
opw-4653598This update fixes an issue where the Shopee account authorization process was failing when a shop already existed. Now, the system correctly reuses authorization tokens to fetch access tokens for multiple shops associated with an account, streamlining the onboarding experience for users connecting to multiple Shopee shops.
Original PR description
When authorizing a Shopee shop, a user has the choice to either connect to a Shopee Shop, or connect to a Shopee Account and grant access to multiple shops of the account. In the later scenario, the authorization code returned by Shopee OAuth should be used once to fetch the access tokens, and the tokens should be copied to all shops authorized by the account. However, when the shop already existed, the access token was fetched again, raising an error because the authorization code had already been used. opw-6166585 Forward-Port-Of: odoo/enterprise#116000
This update fixes an issue where the Belgian payroll system incorrectly parsed birthdates due to a 'numéros bis' format in the NISS number. The change normalizes the month value by using a modulo 20 calculation, ensuring accurate date recognition and preventing errors in employee records.
Original PR description
The NISS month field can be increased by 20 or 40 for "numéros bis". This caused invalid date parsing. Use modulo 20 to normalize the month before constructing the birthday. task-6144297 Forward-Port-Of: odoo/enterprise#114485
This update resolves a visual design problem in the Documents and Spreadsheet modules, specifically related to copy-paste functionality. The issue was caused by a change in the Odoo system (m3) that removed certain styling rules. This commit manually re-added the necessary Bootstrap classes to restore the original design appearance.
Original PR description
…h BS Because of m3, some rules have been deleted. This commit restores them by manually adding Bootstrap classes. Steps to reproduce: Here is a way to trigger a traceback - Open the browser console - Type: "odoo.__WOWL_DEBUG__.root.notification.add(new Set())" Forward-Port-Of: odoo/enterprise#116118
A recent update allowing report searching on the homepage caused a technical error (traceback) for users on the Indian Company setup. This fix addresses a problem with how the system retrieves report information, ensuring a smooth search experience. The change improves stability and usability for all users.
Original PR description
Steps to reproduce: 1. Install l10n_in_reports and switch to Indian Company. 2. Go to homepage and try to type something and search on the search box. A traceback will appear. Cause: In recent updates, it is now possible to search report varients through the search menu, so while fetching varients while preparing search results, this leads us to `_is_available_for` method. The cause lies in how `.get()` is being used. `_get_external_ids` returns `id: []` if no external id is linked to it, and here we do `external_ids.get(report.id, [None])[0]` and this will always give us [] if no external id is there. hence trying to access the 0th element causes traceback. This commit fixes that by safely evaluating to `[None]`. Forward-Port-Of: odoo/enterprise#114342
This update fixes an issue where the softphone tour wasn't functioning properly after a new user opened the softphone. The team adjusted the demo data to simulate a missed call, which now correctly triggers the tour to display the keypad tab as intended. This ensures new users have a smooth onboarding experience with the softphone.
Original PR description
Commit [1] made the softphone to show recent tab when there are missed calls. Commit [2] changed the demo data to contain 1 missed call. As a result, now when you open the softphone for the first time, you will see recent tab instead of the keypad tab before. This breaks the country_selector_tour which assumes you will see keypad tab when open softphone. [1]: c995b7df3fc6ff541dc65d8b28661ab03f4a8c08 [2]: f16faa029220ca7152289180c4de78783bab03be Forward-Port-Of: odoo/enterprise#116180