Thursday, April 9, 2026
27 changes · saas-18.3
Resolved issues and error corrections
This update fixes an issue where sending letters with more than 8 pages would result in a generic error. The change provides a more specific error message to users, helping them quickly identify and resolve the problem when sending larger letters via snailmail. This improves the user experience and reduces support requests.
Original PR description
When a user attempted to send a letter with snailmail that had more than 8 pages, sending would fail, and a generic error message is logged on the letter. This commit makes the error message generated in that flow more specific to help users better understand the root cause of sending failure. task-5883011 Forward-Port-Of: odoo/odoo#257867
This update resolves an issue where duplicate checks were being generated during tax return creation, preventing users from generating returns. The fix ensures that only one check is performed for each return type, streamlining the accounting process and avoiding error messages.
Original PR description
Steps to reproduce:
- Go to Accounting → Configuration → Accounting → Return Types.
- Open the standard Annual Closing: Corporate Tax return type.
- Select Generic Tax Report as a report in the Report field.
- Navigate to Accounting → Accounting → Closing → Tax Returns.
- Generate the tax return for the selected period.
Issue:
- Duplicate checks with code check_draft_entries are created for the same return, raising:
'You can only have a unique check code for each return.'
This happens because:
- `_check_suite_common_vat_report` adds a Draft entries check.
- `_check_suite_annual_closing` also adds a similar check (No draft entries) with the same code.
- Both run together, causing duplication.
Solution:
- Added `check_codes_to_ignore.add('check_draft_entries')`
in _check_suite_common_vat_report to ensure the check is not generated twice.
opw-6066030This update resolves a technical issue that prevented the requirements-check script from correctly parsing package version numbers, specifically those with letters like 'post1'. This fix ensures accurate dependency checks, improving the stability and reliability of the Odoo system.
Original PR description
This commit fixes a crash in the parse_version() function where it doesn't support non-integer castable version parts (i.e. 5.4.2.post1). Forward-Port-Of: odoo/odoo#257946
This update resolves an issue where attendance records were incorrectly flagged as 'already checked-in' due to a timezone calculation error. The fix ensures accurate attendance tracking by correctly applying employee timezones during the absence detection process, preventing these erroneous alerts.
Original PR description
### Steps to reproduce: - Have a database in timezone America/Asuncion for example - Create an employee - Create an attendance for the day before yesterday from 13h to 19h - Run the absence detection cron - An error will be raised saying the user is already checked-in on that day ### Cause: When trying to create an absence attendance we localized yesterday's midnight into UTC and then apply the employee timezone. Which cause a one-day shift when having a timezone behind UTC as at that point we try to create an attendance on the day before yesterday not yesterday ### Fix: We use the timezone of the employee to localize midnight then get this time in UTC. opw-5930309 Forward-Port-Of: odoo/odoo#257932
This update fixes a problem where users weren't receiving clear error messages when the delivery service failed. A helpful hint has been added to the delivery process, guiding users to resolve the issue and ensuring smoother delivery operations. This change improves the user experience and reduces potential delays.
Original PR description
Add hint with error message. ----- Ticket: opw-6072855 Forward-Port-Of: odoo/enterprise#112463
This update resolves an issue where closing a session was blocked when generating the DSFinV-K export if the order's user information was missing. The change ensures that a fallback user ID is used, allowing sessions to be closed correctly. This improves session management stability.
Original PR description
Before this commit, closing a session was blocked if an order was missing the user_id field during DSFinV-K export generation. opw-6067382 Forward-Port-Of: odoo/enterprise#112119
This update fixes a potential issue where invoicing a Point of Sale order multiple times could create unnecessary stock pickings. Previously, clicking 'Invoice' repeatedly would generate extra stock movements, especially with our 'Anglo-Saxon' accounting settings. This change ensures that pickings are only created once, streamlining inventory management.
Original PR description
Calling `action_pos_order_invoice` on an already-invoiced POS order (e.g. a backend user clicking "Invoice" more than once) would unconditionally invoke `_create_order_picking`, producing one extra `stock.picking` per click under anglo-saxon + update_stock_at_closing configurations. opw-6092999 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#257509
This update corrects a technical issue preventing SEPA payments from being correctly exported to XML files. The fix replaces problematic '&' characters in payment references with '+' to ensure compliance with SEPA/SIX standards and avoid rejection by banks. This ensures smooth processing of international payments.
Original PR description
Steps to reproduce: 1. Install modules `account_batch_payment` and `l10n_ch`. 2. Configure SEPA Credit Transfer for a CH company. 3. Create a vendor bill with a reference containing `&` (e.g. "Net &…
Steps to reproduce: 1. Install modules `account_batch_payment` and `l10n_ch`. 2. Configure SEPA Credit Transfer for a CH company. 3. Create a vendor bill with a reference containing `&` (e.g. "Net & Cost"), confirm it and register a payment using SEPA Credit Transfer. 4. Create a batch payment with the SEPA payment and validate it. Issue: The `&` character is exported as `&` in the generated PAIN XML, while according to the SIX specification it should be replaced with `+` Cause: The payment reference is inserted into the PAIN XML file without replacing the '&' character. During XML generation this produces an invalid entity (`&`) which results in an `XMLSyntaxError` and prevents the payment file from being processed. Solution: Replace the `&` character with `+` when sanitizing the payment communication so that the generated value complies with the SEPA/SIX character set and produces valid XML. Reference[Pg: 9]: https://www.europeanpaymentscouncil.eu/sites/default/files/KB/files/EPC217-08%20Draft%20Best%20Practices%20SEPA%20Requirements%20for%20Character%20Set%20v1.1.pdf opw-5941724 Co-authored by @bhra-odoo Forward-Port-Of: odoo/enterprise#110809
This update resolves an issue where empty attachments in PEPPOL invoices could cause import failures. The fix automatically uses default journal and move type information if an attachment is missing, ensuring invoices are created and any errors are logged. The underlying cause of the empty attachments is still being investigated.
Original PR description
Empty attachments could crash parsing during import, this commit falls back on default journal and move type in case of error, allowing the invoice to be created and the issue logged properly. Root cause of empty XML remains unclear, likely a 3rd party error. opw-6060739 opw-6018364 Forward-Port-Of: odoo/odoo#256011
This update fixes an issue where the formatting toolbar would unexpectedly open when working with inline code. Now, formatting commands are correctly applied only to the text surrounding inline code, and pasted HTML is properly converted to plain text within inline code blocks. This ensures a smoother and more reliable editing experience.
Original PR description
### Purpose of this commit: - Prevent the powerbox and toolbar from opening when the selection is fully inside inline code. When the selection spans inline code and regular text, keep the toolbar visible but ensure formatting commands are applied only to the non-inline-code content. - Ensure that pasted external and editor HTML is converted to plain text when inserted inside inline code. task-5502939 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258039 Forward-Port-Of: odoo/odoo#250911
This update fixes a display issue in delivery reports where backorder lines were missing their unit of measure. The fix removes a technical restriction that previously hid this information, ensuring all line items, including backorders, accurately show their units. This improves clarity and accuracy for users reviewing delivery reports.
Original PR description
**Steps to reproduce:** * Install the **Stock** module with demo data. * Create a delivery with quantity **N** and click **Mark as To Do**. * Set the delivered quantity to less than the demanded…
**Steps to reproduce:**
* Install the **Stock** module with demo data.
* Create a delivery with quantity **N** and click **Mark as To Do**.
* Set the delivered quantity to less than the demanded quantity .
* Validate the delivery, with the creation of a **backorder**.
* Print the **Delivery Slip** report.
**Observed behavior:**
* Backorder lines appear **without units of measure**, while
other lines correctly display their units.
**Cause:**
* The backorder line includes a **group restriction** that hides
the unit unless the *Unit of Measure* setting is enabled.
**Fix:**
* Remove the group restriction so units of measure are
always visible on backorder lines same as others.
<details>
<summary>Click here to see the results:</summary>
Before:
<img src="https://github.com/user-attachments/assets/5f21139a-a4ab-4c39-8b16-3c68c94a163e" />
After:
<img src="https://github.com/user-attachments/assets/dd4de18b-dc2e-4686-8435-30864fe40aa4" />
</details>
---
> NOTE - This fix done after receiving confirmation from PO(dala)
---
opw-5265051
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#257108
Forward-Port-Of: odoo/odoo#238470This update ensures CSV files are now correctly recognized as viewable within Odoo's list views, mirroring the behavior in the Kanban view. This change provides a more consistent user experience and allows users to easily access and work with CSV data directly from list views.
Original PR description
Current behavior before PR: - CSV files were viewable from the Kanban view, and opened the spreadsheet conversion dialog - In list view, CSV files were not considered viewable - Same issue for trashed CSV files in list view Desired behavior after PR is merged: - Consider CSV files as viewable in list view - Align behavior with the Kanban view Task: 6052134 Forward-Port-Of: odoo/enterprise#112869
This update resolves an issue where the 'Export XML' button was incorrectly disabled in the account management interface. Following a recent UBL export refactor, the button was removed from the list view. This change ensures the button appears only when an export is actually possible, improving usability and accuracy.
Original PR description
Problem --------- Since the UBL export refactor, it was not possible to export the XML of non-imported bills and not self-bills. The Export XML option had been removed from the list view in odoo/odoo#255289. The Form view was omitted. Solution --------- Show the button "Export XML" only if the move can actually be exported. opw-6083344 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a technical glitch that prevented the automated tour generation feature from working correctly. The fix, identified by runbot issue 242264, ensures that the tour consistently runs as expected, improving the user experience. This change primarily impacts the industry_fsm module.
Original PR description
runbot issue-242264
This update resolves an issue where FSM users couldn't access the Bill of Materials (BOM) when managing stock moves within service tasks. The fix grants necessary BOM access to project users, ensuring FSM staff can correctly handle stock movements related to service orders. This improves the efficiency of service operations.
Original PR description
**Steps to reproduce:**
- Install mrp, industry_fsm_repair, and industry_fsm_sale
- Create a user with only fsm access rights
- Create a sale order with both service and goods products using the above user
- Confirm the sale
- Log in as the fsm user
- Go to fsm app > open task > open pickup > open stock move
**Issue:**
fsm users with no BOM access encounter errors when opening stock moves from fsm tasks.
**Cause:**
lack of bom access for fsm-only user.
**Fix:**
This commit grants bom and bom line access to the project user.
task-5077522This update resolves a test failure within the Odoo Enterprise accounting module. The issue stemmed from incorrect data values during testing, specifically related to payment processing and multi-bill statements. This fix ensures the test runs successfully, maintaining the stability of the accounting functionality.
Original PR description
Fixup for test test_early_payment_discount_multi_bill_statement that will fail when accountant is not installed due to mismatched amls values opw-5881976
This update resolves an issue where the department dropdown was empty in the demo activity plan, even when departments existed. The fix corrects a configuration error that was preventing the system from correctly associating departments with the demo plan. This ensures users can properly assign departments when setting up onboarding or offboarding activity plans.
Original PR description
# How to reproduce - Be in a single company environment - Employees app > Configuration > Activity Plan > Either demo plan (Onboarding or Offboarding) - Try to select a department # The problem The…
# How to reproduce - Be in a single company environment - Employees app > Configuration > Activity Plan > Either demo plan (Onboarding or Offboarding) - Try to select a department # The problem The dropdown is empty even if department exists. This can be check by creating a new plan and trying to assign departments to it. # Cause The demo data for thoses two plan explicitely sets the company_id to false : https://github.com/odoo/odoo/blob/2c14ce9f655a1eea3d7b1cb0e0ce8108cf9da0df/addons/hr/data/hr_data.xml#L21 https://github.com/odoo/odoo/blob/2c14ce9f655a1eea3d7b1cb0e0ce8108cf9da0df/addons/hr/data/hr_data.xml#L48 But the department_id has check_company set to true : https://github.com/odoo/odoo/blob/2c14ce9f655a1eea3d7b1cb0e0ce8108cf9da0df/addons/hr/models/mail_activity_plan.py#L12 # Proposed solution Backport of this commit : https://github.com/odoo/odoo/pull/240167 opw-6058697 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#255842
This update fixes an issue where users couldn't insert snippets into website forums by clicking on snippet groups. The fix allows snippet group clicks, treating them as a fallback option when other dropzones are unavailable, ensuring snippet insertion remains functional. This improves the user experience for forum content creation.
Original PR description
Steps to reproduce the issue: - Go to Forum, then go to the Help page - Enter Edit mode - Try to drag and drop a snippet => The dropzone in the s_cover at the top of the page are available - Try to click on a snippet group => Nothing happen, because all dropzones are filtered The s_cover element has the [data-snippet] attribute. When clicking on a snippet group, the editor filters out dropzones inside other snippets. Since s_cover is treated as a snippet, its dropzones are excluded, even though they are the only ones available on the page. The solution is to treat dropzones inside snippets as low priority instead of strictly forbidden. If no other valid dropzones exist, we allow these as a fallback to ensure snippet insertion remains possible. task-5938138 Forward-Port-Of: odoo/odoo#256078
This update resolves an issue where users could encounter access rights errors when creating email campaigns with dynamic fields. The fix prevents a style attribute from being added to `<t>` nodes during the inlining process, addressing a conflict with permission checks. This ensures smoother campaign creation for all users.
Original PR description
This commit fixes an unexpected access rights error when users try to add simple dynamic fields allowed by mail_allowed_qweb_expressions to mass_mailing emails. During the convert_inline process, the…
This commit fixes an unexpected access rights error when users
try to add simple dynamic fields allowed by mail_allowed_qweb_expressions
to mass_mailing emails.
During the convert_inline process, the <t t-out=""/> placeholder element
has its style inlined, and attributed to its style attribute.
This style attribute was not filtered out during the safety
check process, resulting in the templating engine believing a disallowed
directive was used.
Steps to reproduce:
- On a fresh 18.0+ install with demo data, login as Marc Demo
- Access the Email Marketing app
- Create a new mailing campaign
- Set sending to Newsletter or Mailing Contact
- Type /field to add a dynamic value
- Set it to Name
- Save the mailing
- An access rights error is raised due to the user not having
group_mail_template_editor permissions and the dynamic placeholder
node having a style attribute
Fix:
T nodes are no longer granted a style attribute during style inlining.
Forward-Port-Of: odoo/odoo#226111This update fixes an issue where pressing 'Enter' in a toggle list would create a duplicate list instead of removing the existing one. Now, when a toggle block with formatting is entered, it correctly removes the block and exits the list. Additionally, a fix was implemented to preserve the direction attribute when entering a toggle block, ensuring RTL formatting is maintained.
Original PR description
**Current behavior before PR:** Steps to reproduce issue: - Create a toggle list. - Apply some formattings e.g. bold and italic to title. - Press Enter. Instead of removing the toggle, another toggle list is created. **Desired behavior after PR is merged:** Now, if there is a empty toggle block title having some formattings in it, pressing enter removes the empty toggle and exit the list. task-6075014 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#256355
This update fixes a problem where sale orders for partners with SEZ GST treatment incorrectly defaulted to the 'Export' fiscal position. The change ensures the correct 'Foreign State' fiscal position is selected, accurately reflecting the partner's location and GST requirements. This improves the accuracy of sales reporting and compliance.
Original PR description
Before this commit: When creating a sale order, if the GST Treatment of partner is SEZ, then the Fiscal position is set as Export instead of SEZ. Reason: The default `foreign_state` obtained currently is searched on base of state whose country is not India, so any random state is fetched. But in the fiscal position of SEZ, we want "Foreign State", so while selecting fiscal position from `_get_fiscal_position` method, the Export fiscal gets higher ranking and gets selected. This commit fixes this issue by returning the correct Foreign State if fiscal position is set to SEZ. task-5958903 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#254887
This update resolves an issue where the employee sick leave warning incorrectly flagged employees with long absences before 31 days. The fix now accurately identifies employees who have been on sick leave for at least the past 31 days, ensuring more accurate reporting and compliance. This improves the reliability of HR data.
Original PR description
-**Issue**: The warning shows employees who had a long sick leaves before 31 days, which is incorrect. -**Fix**: Adjust the logic to include employees who have been on a sick leave for the past 31 days (at least). Forward-Port-Of: odoo/enterprise#113249 Forward-Port-Of: odoo/enterprise#112985
This update fixes a minor issue within the HTML editor that prevented proper handling of textareas. The change backports a previously developed fix from another Odoo version, ensuring textareas within the editor function correctly. This improves the overall stability and usability of the HTML editor.
Original PR description
Before this commit: in #253638 we override the focus function of the editable to focusEditable. A patch for textarea and resetting the focus function at destroy is introduced at the forward port 19.0. After this commit: we backport the patch from c9c2325a966db5abf61810000234042f45ef1728 task-6034339 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#257481
This update ensures that refused time off requests are now clearly marked on the calendar view within the Overview menu. Previously, these requests weren't visually distinguished. This change improves clarity and accuracy for HR staff when reviewing employee time off schedules.
Original PR description
Before this commit, the calendar view in Overview menu does not strike the time off refused. The reason is because `is_strike` field is not fetched inside that view. This commit adds the field in the view to make sure the time off refused are striked as it is the case in the other menus. Closes #248868 Forward-Port-Of: odoo/odoo#256723 Forward-Port-Of: odoo/odoo#256579
A bug was preventing users from deleting timesheets when a confirmation dialog was open. Pressing the Enter key would incorrectly start/stop the timer instead. This update ensures the Enter key correctly triggers the delete confirmation, resolving a frustrating user experience.
Original PR description
When a delete confirmation dialog is open in the timesheet list view, pressing Enter starts/stops the timer instead of confirming the dialog. This happens because the timer's window keydown handler does not check for active modals before intercepting the Enter key. Add a `.modal` check consistent with the grid renderer's onKeyDown. Steps to reproduce: 1) Open timesheet list view 2) Select a record and delete it 3) When the confirmation dialog opens, hit ENTER key Current behavior: The Timer starts recording timesheet Expected behavior: The record should be deleted For ref: https://youtu.be/tzm_3RNe1ig Forward-Port-Of: odoo/enterprise#112583
This update ensures that new purchase orders, repairs, and stock picking batches display translations correctly, matching the standard 'SO' logic. Previously, these records showed 'New' in English, which could confuse users. This change improves the user experience and consistency across Odoo.
Original PR description
New POs, repairs, and batch pickings always showed "New" in English for the name of a new (not saved) record. We now make it match the SO logic to show up as translated so as to not confuse users (even though it will automatically change to another name once saved) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258156
Features or functions removed from Odoo
This pull request removes a mistakenly added translation file for the website_twitter module. The translation was previously introduced in a different pull request and has now been corrected. This ensures the website's internationalization is accurate and consistent.
Original PR description
Wrongly added in https://github.com/odoo/odoo/pull/172269. Module was deleted in https://github.com/odoo/odoo/pull/172755. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#257859