Wednesday, April 15, 2026
14 changes · saas-18.4
Resolved issues and error corrections
This fixes an access issue so Point of Sale users in Vietnam can use the required SInvoice symbol information when issuing Viettel e-invoices. It helps prevent blocked or failed PoS invoicing caused by missing permissions.
Original PR description
Add access right for sinvoice symbol so that PoS user can access to it. Forward-Port-Of: odoo/odoo#259045
This fixes an automated test for the HTML editor color picker so it works consistently across Odoo editions. It matters because it reduces false test failures and helps keep editor updates moving reliably.
Original PR description
Purpose of this PR: Color picker opens different tabs by default because inline code uses a custom color `-900`. In community it opens the custom tab, while in enterprise it opens the solid tab. This caused the test to fail in community when selecting a color from the solid tab. runbot-242556 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#259169
The website eLearning tests now wait for a clear empty-conversation message before continuing. This reduces false test results during fast automated checks, helping keep course review features more stable.
Original PR description
The previous negative assertion could pass prematurely during fast tour execution. Switching to a specific text based assertion ensures the step only proceeds once the empty conversation is explicitly confirmed. Forward-Port-Of: odoo/odoo#258921
This update adjusts an automated test for the HTML editor so it is less likely to fail randomly when the test environment is running slowly. It helps keep validation builds stable without changing how users interact with the editor.
Original PR description
Purpose of this PR: - This is a desperate attempt to fix this test that I have already tried to fix multiple times. The timeout is okay because, in most cases, the system will not have to wait that long so it will not slow down the test suite. Only when the runbot is very slow will the timeout be relevant, but in that case it is better to wait a bit than to have the build fail non-deterministically. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258566
Product images on the self-order combo screen now display without distortion. This keeps menu visuals consistent and more professional, especially for items with non-square photos.
Original PR description
Before this commit, the product image shown in the header of the combo screen in the self order interface was squished to fit the container, resulting in distortion for non-square images. After this commit, we add the `object-fit: cover` style to match the how the images are displayed elsewhere in self order. Before the change: <img width="595" height="536" alt="image" src="https://github.com/user-attachments/assets/fb90167c-8c28-46c9-9ab5-3ac472299c67" /> After the change: <img width="597" height="538" alt="image" src="https://github.com/user-attachments/assets/44d5c5a6-037b-46e2-8a28-5ef9df4d5e58" /> Product screen for reference (no change): <img width="561" height="143" alt="image" src="https://github.com/user-attachments/assets/4ee20d8c-9cde-4cc8-bcf1-8179f878a517" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#257489
Company digest reports now count connected users based on the companies they are allowed to access, not just their default company. This helps businesses with multi-company users receive more accurate KPI figures in digest emails.
Original PR description
**Problem:** Currently, the digest KPI for connected users checks the "company_id" field (as with all other models), but this field corresponds to "Default Company" on res.users, meaning a user can only be considered for one company when computing the digest KPI. This can cause misleading digest KPIs if users work in multiple companies, or mainly in a company that isn't their default company. **Solution:** Instead of always using the "company_id" field, we use the "company_ids" field if present on the model. opw-5404940 Forward-Port-Of: odoo/odoo#247806
This fix prevents Odoo from trying to run cleanup timing code after Python has already cleared some internal functions during shutdown. It helps avoid harmless but confusing errors when the system is stopping, improving reliability of shutdown behavior.
Original PR description
Odoo registers a callback function to track how much time is spent in garbage collection. But while the Python interpreter is shutting down and clearing out global modules and variables to free up memory and the Garbage Collector triggers one last time, the callback function `_timing_gc_callback` tries to run, but the function it depends on (like time.thread_time_ns) have already been set to None by the interpreter.
The portal invoice “Back to edit mode” link now opens invoices in the Invoicing app instead of potentially landing in another app such as Website. This gives users a more predictable navigation experience when editing invoices from the portal.
Original PR description
The "Back to edit mode" link used action_move_out_invoice_type, which isn't bound to any menu, so the backend fell back to whichever app happened to match (e.g. Website when installed) instead of Invoicing. Switch to action_move_out_invoice (the one referenced by the Invoicing menu) so the webclient resolves the correct app automatically. task-5882256 Forward-Port-Of: odoo/odoo#257841
The accounting dashboard now counts receipts in the To Pay totals, matching the records users see when they click through. This prevents misleading payment counts and amounts in purchase and sales dashboard views.
Original PR description
- The "To Pay" section in the purchase/sales dashboard was only considering invoices(`in_invoice` and out_invoice) and refunds(`in_refund` and `out_refund`) when computing the number and amounts to pay. - However, the corresponding action view includes receipts (`in_receipt` and `out_receipt`), leading to an inconsistency where the dashboard count and amount did not match the records shown after clicking. - This commit updates the dashboard query to also include receipts, ensuring consistency between the displayed metrics of the coreesponding purchase/sales dashboard and the action view. Related PR: https://github.com/odoo/enterprise/pull/111142 taskID-6040828 Forward-Port-Of: odoo/odoo#254295
Invoice imports through Peppol no longer fail outright when an incoming attachment is empty or missing. The system now uses safe defaults so the invoice can still be created and the issue can be logged for follow-up.
Original PR description
Empty attachments (ex: False/None) 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-6113211 Forward-Port-Of: odoo/odoo#259294
This update corrects a minor issue in the Batch Payment reports. Previously, the report would incorrectly display default 'demo' values (like 'ABC Holder Name') when a customer's name wasn't provided. Now, the report correctly leaves these fields blank, ensuring accurate and professional-looking payment documents.
Original PR description
**Steps to reproduce:**
- Install the `account_batch_payment` module.
- Navigate to Invoicing > Customers > Payments.
- Create a new payment with `Payment Type: Send` and
select a customer without setting an `Account Holder Name`.
- Create a batch payment including this payment.
- From the gear icon, click `Print Batch Payment`.
**Observation:**
In the generated report:
- `Account Holder Name` shows `ABC Holder Name`.
- `Memo` shows `Demo Ref`.
**Root Cause:**
At [1], the default demo values ("ABC Holder Name", "Demo Ref") are rendered
when the fields are empty, instead of being left blank.
**Fix:**
This commit ensures that the `Account Holder Name` and `Memo` are `blank`
in the printed Batch Payment report when their values are not set.
[1]:
https://github.com/odoo/enterprise/blob/327d4478128f33fb2e0c477533bd4983178abf17/account_batch_payment/report/account_batch_payment_report_templates.xml#L36-L38
opw-6092595
Forward-Port-Of: odoo/enterprise#113515This update corrects a discrepancy in the sale and purchase journal dashboards. Previously, receipt data wasn't included, leading to inaccurate counts. Now, receipts are incorporated, ensuring dashboard metrics align with actual sales and purchase records for a more reliable view of business activity.
Original PR description
- The sale and purchase journal dashboards excluded receipts while the action view included them, causing a mismatch between counts and displayed records. Include receipts in the dashboard query to ensure consistency. Related PR:https://github.com/odoo/odoo/pull/254295 taskID-6040828 Forward-Port-Of: odoo/enterprise#111142
This update fixes a previous error that prevented invoice settlement when the associated customer information wasn't fully loaded. The change streamlines the process by directly using the customer's ID, ensuring smoother invoice processing and preventing disruptions to the payment workflow. This improves reliability and efficiency.
Original PR description
Before this commit, it was possible that commercial_partner_id was not loaded, which caused an error when settling an invoice. This commit fixes the issue by avoiding the need to load the full partner record. Since only the partner ID is required to load the account move, it is now read directly from the raw data, which already includes the ID. opw-6023150 Forward-Port-Of: odoo/enterprise#111957
This update resolves an issue where the 'Create a Payslip' button was unresponsive when no payslips existed in the W2 report. The fix corrects a technical error in the system's data handling, ensuring the button now functions as intended and allows users to create new payslips when needed. This improves the usability of the W2 report generation process.
Original PR description
1.Install l10n_us_hr_payroll 2 Navigate to Payroll>Reporting>W2 Report. 3.Open/Create W2 form and try to add payslip by clicking "Add a line". 4."Create a payslip" button appears if their are no valid payslips. 5.Click it, it won't work! Root cause: - `onAdd` bind was missing in the controller - Renderer applied an additional `.bind(...)`, breaking the callback Fix: - Pass a dedicated `createNewPayslip` action from controller - Remove double binding in renderer - Forward callback directly to helper component task-[5928770](https://www.odoo.com/odoo/project/1251/tasks/5928770)