Monday, September 29, 2025
31 changes · 19.0
Enhancements to existing features
The tax search screen now includes the configured tax amount in search results. This makes it easier for users to quickly find taxes by their percentage rate or fixed amount directly from the search bar.
Original PR description
This commit improves the usability of the tax search view by including the `amount` field. Users can filter taxes based on their configured percentage or amount directly from the search bar. task-5088050 Forward-Port-Of: odoo/odoo#227131
The point of sale closing process has been reorganized so order cancellation is handled in a separate, reusable step. This does not change the cashier experience, but it makes future customizations easier for businesses with specialized closing workflows.
Original PR description
In this commit: =============== - Extract the order cancellation logic during session closing into a new method `cancelOrders`. - This makes it possible to override the method in other modules if needed. Task: 4966693 Related Enterprise PR: https://github.com/odoo/enterprise/pull/95074
New tables added on the restaurant floor screen now receive a number after the highest existing table number instead of reusing gaps from deleted tables. This makes table numbering more predictable for staff and avoids confusion when tables have been removed.
Original PR description
Before this commit: ------------- - When adding a new table in the floor screen, the system reused missing number. - For example, if table 2 was deleted, the next added table would again be number 2. - Logic: find the minimum missing number starting from 1. After this commit: -------------------- - A new table in the floor screen always gets the next number after the biggest existing one. - For example, with tables [1, 3, 4], the next table becomes 5 (not 2). Task-5056800
Payroll payslip line and worked days reports have been adjusted so users can no longer edit report data directly. This helps preserve payroll data accuracy while making the reports easier to navigate and search.
Original PR description
-In payslip line report, some fields can be edited, which should not be allowed. -Views have been adjusted to prevent the navigation from pivot to list view. -Search view has been modified for easier data reaching. Forward-Port-Of: odoo/enterprise#94284
The Documents screen can now show a larger fixed list of related items in its selector, so users can see all relevant options without needing an unavailable “Search more” action. This keeps existing behavior unchanged elsewhere while improving visibility in Documents.
Original PR description
In Documents, we have a static list of 9 items to show with this widget. As there is no "Search more" available, and we're in stable, this is the minimal change to not change behavior. Task-5075200 See related ENT PR (includes an integration test). Forward-Port-Of: odoo/odoo#227509 Forward-Port-Of: odoo/odoo#226608
The Documents details panel now shows the full list of available model labels instead of a shortened static list. This makes it easier for users to see their options immediately without guessing whether more choices exist.
Original PR description
As the list is static and there are only a few and searching for more is not supported, this enables to show all labels so that users don't have to guess what is available or not. Task-5075200 Forward-Port-Of: odoo/enterprise#94934 Forward-Port-Of: odoo/enterprise#94180
Resolved issues and error corrections
UAE invoice reports no longer show the amount column twice when tax-inclusive pricing is enabled. This makes printed proforma and tax invoices clearer and avoids confusing duplicate totals for customers and staff.
Original PR description
**Step to reproduce:** - install account module with localization "UAE" - go to Settings > Tax Included - create a invoice (make sure a tax is applied) - print any invoice (Proforma or Tax)…
**Step to reproduce:**
- install account module with localization "UAE"
- go to Settings > Tax Included
- create a invoice (make sure a tax is applied)
- print any invoice (Proforma or Tax)
**Observation:**
- the amount is being displayed twice in the Amount column.
**Cause:**
- A change was introduced in 18.0 to add additional column right after Amount
column, [1] in l10n_ae module
- Another commit [2] in saas-18.3 introduces same column in main account module
- hence we have two columns printing same information
**Fix:**
- Removed and fixed a faulty xpath from view, as after commit [2]
base layout provides same logic
[1] https://github.com/odoo/odoo/commit/fe68fa30b18f90411043fc6e2314fd376ddaed0c
[2] https://github.com/odoo/odoo/commit/1bf232c22f430d282aaadd858c5e61fed12f4da6
**Before:**
<img width="774" height="146" alt="image" src="https://github.com/user-attachments/assets/a9eb6af2-81b3-4989-bf6e-6676eafe10f8" />
**After:**
<img width="813" height="143" alt="image" src="https://github.com/user-attachments/assets/fb019516-de7d-4dd3-b7dd-3fd14322b031" />
opw-4976410
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#223382The self-ordering test now cancels only orders that are still in draft status, instead of trying to cancel every order. This prevents test failures when finalized or paid demo orders are present, helping keep validation runs stable.
Original PR description
Before this commit: = - Previously, `test_self_order_mobile` set all orders to cancel, causing errors with finalized orders (e.g., paid orders from demo data). After this commit: = - Only draft orders are cancelled, preventing errors and ensuring correct test behavior. Runboat Error: 224197 Forward-Port-Of: odoo/odoo#214935
A redundant navigation step was removed from a Point of Sale test flow to prevent intermittent test failures. This improves reliability of automated checks without changing business functionality or user workflows.
Original PR description
Before this commit: ================= The `test_draft_pos_order_linked_sale_order` test fails intermittently with a `psycopg2.ProgrammingError: no results to fetch`. This failure occurs when the…
Before this commit:
=================
The `test_draft_pos_order_linked_sale_order` test fails intermittently with a
`psycopg2.ProgrammingError: no results to fetch`. This failure occurs when the
browser tour navigates back to the backend.
After this commit:
=====================
The problematic navigation step is removed from the `PosSettleOrder5` tour,
stabilizing the test and preventing the runbot error.
Cause:
========
The `Chrome.clickMenuOption("Backend", { expectUnloadPage: true })` step
forces an immediate database flush (`self.cr.flush()`) during the test's
authentication phase.
This forced flush happens when the records are in an intermediate state (after
loading the Sale Order but before payment/validation). This specific
intermediate state, combined with the subsequent recomputation of computed
fields (like `qty_delivered` through `sale_mrp` and `sale_margin`), exposes an
underlying bug in Odoo's ORM cursor management, leading to the
`psycopg2.ProgrammingError`.
Since the backend navigation is not necessary for the test's assertion logic,
removing this step prevents the premature flush and resolves the failure.
Runbot Error: 226521
Task: 4974084
Forward-Port-Of: odoo/odoo#228799
Forward-Port-Of: odoo/odoo#228193Failed webpage scraping in the AI module is now recorded as a warning instead of an error. This avoids unnecessary error alerts while still informing users when a webpage cannot be processed.
Original PR description
Currently, an error can occur on unsuccessful scrapping of URL.
**Error:**
`Error scraping URL https://agenciavirtualpy.com: HTTPError('403 Client Error: Forbidden for url: https://agenciavirtualpy.com/')`
- Instead of logging an error, we log only warning during unsuccessful URL
scraping because it is not a blocking point in the code.
- On unsuccessful scraping, we log warnings [1] and raise a UserError [2] to
inform the user about the failed URL scraping. Therefore, we should log a
warning as the UserError is already present.
[1]: https://github.com/odoo/enterprise/blob/1930d045a5f40f33b0a391b90d5adaed0eb90083/ai/models/ai_agent.py#L258
[2]: https://github.com/odoo/enterprise/blob/1930d045a5f40f33b0a391b90d5adaed0eb90083/ai/models/ai_agent.py#L283-L285
sentry-6634525990
Forward-Port-Of: odoo/enterprise#94002This fix swaps the placement of the “exempt” and “exempt imports” fields in the Mexican DIOT report so each value appears in the legally expected column. The amounts were already calculated correctly, but the corrected layout helps avoid confusion and reporting mistakes.
Original PR description
Description of the issue/feature this PR addresses: The description of the columns “exempt imports” and “exempt” is somewhat ambiguous, so when developing the diot, there was a small error in the order of the columns. The values are calculated correctly, but columns 49 and 50 were inadvertently swapped. Current behavior before PR: “exempt” is column 49 “exempt imports” is column 50 Desired behavior after PR is merged: “exempt” is column 50 “exempt imports” is column 49 Task-id: 5096808 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228882 Forward-Port-Of: odoo/odoo#228303
Dark mode display issues were corrected in Point of Sale and appointment screens. Icons and text now use colors that remain readable across light and dark themes, making the interface easier to use for staff.
Original PR description
In this commit: ------------------- - Added a dark mode color for the star icon. - Changed the text color to white in light mode, which is reflected as black in dark mode. This fixes the issue of the text not being properly visible in dark mode. task:4943078 Forward-Port-Of: odoo/enterprise#93993
The Mexican DIOT report export now places the “exempt imports” and “exempt” values in the correct columns. This prevents confusion when businesses submit or review the downloaded TXT file, while the underlying calculated amounts remain unchanged.
Original PR description
The description of the columns “exempt imports” and “exempt” is somewhat ambiguous, so when developing the diot, there was a small error in the order of the columns. The values are calculated correctly, but columns 49 and 50 were inadvertently swapped. This Pr changes the order of the columns in the downloadable file (txt) and corrects the tests due to the change. Task-id: 5096808 I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/enterprise#95679 Forward-Port-Of: odoo/enterprise#95383
Fixes an issue where website tab image descriptions could disappear when a slide title was formatted as a paragraph or placed inside another text style. This ensures editors can use the “Active only” description setting without losing visible content on the page.
Original PR description
After the new options for s_tabs_images were added in [1], it wouldn't display the active description if the title was inside of another tag. Steps to see the issue: - Open website and start editing - Drop the s_tabs_images snippet and click on the first slide title - Change the Descriptions option from "All items" to "Active only" - Select the title and change the font style from "Normal" to "Paragraph" => Observe that the description isn't displayed [1]: https://github.com/odoo/odoo/commit/e2e26bb8ad239fe13c504f0f811eab9cae1fb376
This fixes an issue where email signature image styling could be damaged when preparing messages for Outlook. Signatures and formatted email content should now appear more consistently for recipients, especially when resized images are used.
Original PR description
Problem: `_hideForOutlook` breaks the last style when appending `mso-hide: all;` if the style string does not end with `;`. Example: `width: 100%` → `width: 100% mso-hide: all;` Solution: Ensure the new attribute is appended correctly at the end of the styles, regardless of whether the last style ends with `;`. Note: The problem might be only observed on `18.4` because the composer doesn't use the user signature before `18.4`. Steps to reproduce in 18.4: 1. Open "My Profile". 2. Add an image to "email signature" with reduced scaling (25%, 50%). 3. Open any record with chatter (task, SO, invoice, etc.). 4. Type a message in chatter and click "Send". 5. Click "Open Full Compositor" and send a message from the email compositor. 6. Open the runbot's MailHog and observe the differences between the two emails. opw-5046573 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#224985
Payment terminal messages printed at the bottom of POS receipts now use the correct font sizing. This makes the printed text larger and more consistent with what staff see on screen, improving receipt readability for customers and cashiers.
Original PR description
When you pay with a payment terminal, it can produce some text which gets appended to the bottom of the POS receipt. Before this commit, this text appears too small to be legible when printed on a…
When you pay with a payment terminal, it can produce some text which gets appended to the bottom of the POS receipt. Before this commit, this text appears too small to be legible when printed on a receipt printer. This is because the font size styling was in the wrong place, and in the UI it fell back to bootstrap's CSS which makes it fairly large, but html2canvas renders it very small. After this commit, the problem is fixed by moving the font size styling to the correct place to apply to the text. In the UI, the text is actually slightly smaller than before, but when printed it is bigger and consistent with the UI. Before/After (UI): <img width="346" height="325" alt="image" src="https://github.com/user-attachments/assets/0a9dceb3-e224-473f-b02f-ff94b81b0a8d" /> <img width="349" height="319" alt="image" src="https://github.com/user-attachments/assets/b096172a-4a98-4249-a5d4-00c8a46ab4d0" /> Before/After (Receipt): <img width="513" height="503" alt="image" src="https://github.com/user-attachments/assets/e1d6ba27-1ff6-4853-b617-1c010857f1eb" /> <img width="516" height="528" alt="image" src="https://github.com/user-attachments/assets/82cb2431-707f-40c7-a9a5-f439d3934e16" /> task-5116506 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228775
The Time Off calendar now shows the selected employee's working schedule instead of the schedule of the person viewing it. This helps managers and HR staff accurately review availability and days off when checking another employee's time off.
Original PR description
Steps to reproduce: - In the Employee app, select an employee with a different working schedule than yours - Click on the "Time Off" smartbutton - Switch from Kanban to Calendar view - The displayed working schedule is yours and not the employee's (easier to see if you and the employee have different days off) Reason: The employee_id field in the context used by the Python method was null instead of an ID, which caused the Python method to default to not use the employee's working schedule but the working schedule of the user viewing it. How it was fixed: By using a different field already present in the context, the employee's ID is correctly retrieved and used to display the calendar. Task ID: 4987732 Forward-Port-Of: odoo/odoo#225839
The barcode kanban view now only displays existing inventory quantity records instead of allowing new ones to be created from that screen. This prevents accidental stock record creation and keeps inventory data cleaner when users scan or enter product barcodes.
Original PR description
Steps to reproduce: - Scan or type product barcode - Navigate to Kanban View Problem: - New `stock.quants` are not supposed to be created from `stock.quant.kanban.barcode`, its only to supposed to show existing ones. Forward-Port-Of: odoo/enterprise#95487 Forward-Port-Of: odoo/enterprise#94802
Point of Sale receipts for delivery orders no longer show the customer's name and address twice. This keeps printed receipts cleaner and avoids confusion for staff and customers.
Original PR description
Steps to reproduce: - Open the restaurant configuration. - Select the preset as Delivery and choose a customer with an address. - Validate the order and print the receipt. Issue: - The customer’s name and address appear twice on the receipt. Fix: - Removed the duplicate name and address from the receipt header. task-5097764
This fixes an issue in Sales Commission reporting so grouped report results can be formatted as needed instead of being blocked by a read-only setting. It helps ensure commission and achievement reports display reliable grouped information for business review.
Original PR description
runbot-89585061
Rating records now hide placeholder words like “by” and “on” when there is no publisher comment or related information to show. This removes confusing leftover text and makes rating screens clearer for users reviewing feedback.
Original PR description
Steps to Reproduce: 1. Navigate to a rating record form view 2. View ratings without publisher comments 3. Notice confusing 'by on' text fragments appearing Current Behavior: - 'by on' text shows even when there's no comment or publisher information - Text fragments remain visible after comments are removed Expected Behavior: - 'by' and 'on' text should only appear when there's actual content to display - Proper conditional visibility based on comment presence Changes Made: - Added conditional visibility to rating form view text elements - Improved XML structure for better maintainability - Fixed persistent text display issues when comments are removed --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225300
Manufacturing planning now handles extremely small operation or work order durations safely. This prevents scheduling failures that could block production planning when durations are entered below the expected minimum precision.
Original PR description
Operation & Workorder duration is a float with 2 decimal digits to be expressed in minutes, meaning minimal duration is 1sec. However one can encounter numbers like 0.001, 0.00001, ... This can lead to : AttributeError: 'NoneType' object has no attribute 'astimezone' in function _get_first_available_slot task: 5090338 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228760 Forward-Port-Of: odoo/odoo#227253
The ESG Database menu no longer offers a direct create option, reducing the chance that users expect unsupported automatic data imports. Users can still create database entries from within emission factors when they need to manually classify emission factors.
Original PR description
Before this commit, when the user goes to Database menu inside ESG app, the user can create a database if he wants. However, when he creates a database, he might think it can add the link of the database to automatically fetch the data, but this system is not implemented because each database has its own formatting. This commit disables the create action inside that menu to avoid confusing the user. However, he can still create a database inside a emission factor if he wants to classify his emission factors manually created. task-5117594
Event registration confirmation emails now keep QR codes at the correct height when templates are previewed or edited. This prevents distorted QR codes, helping attendees reliably scan their event tickets.
Original PR description
### Steps to reproduce: 1. Set up an event registration with atleast 1 attendee. 2. Go to email templates and search for "Event: Registration Confirmation". (or any with QR code in it) 3. Check the preview of the email template. 4. Edit any text inside the template and check the Preview again. (QR code stop taking the proper height) ### Issue: During the rendering of the email template, the QR code image html is changing provoking the QR to not have the proper aspect ratio and look stretched. ### Fix: We can make sure we're always taking the 100% height of the container by adding a style attribute to the image tag, thus not losing the aspect ratio of the QR code. opw-4976893 Forward-Port-Of: odoo/odoo#223774
Planning views now show a valid allocated percentage for employees on flexible or fully flexible work schedules when grouped by resource and role. This avoids confusing display errors and gives managers clearer staffing information.
Original PR description
Steps to reproduce: ==== - Install the Planning module. - Go to Planning and apply two level group by: Resources ⇒ Role. - Ensure some employees (e.g., AKA Foster) are assigned a 'Flexible Hours'…
Steps to reproduce: ==== - Install the Planning module. - Go to Planning and apply two level group by: Resources ⇒ Role. - Ensure some employees (e.g., AKA Foster) are assigned a 'Flexible Hours' work schedule. Issue: === When grouping by Resource ⇒ Role, employees with flexible hours display 'NaN' instead of a valid allocated percentage. Cause: ==== Flexible and fully flexible resources do not have predefined work intervals in their schedules. The calculation previously relied on work_intervals to compute 'workHours', which is undefined for flexible users, resulting in 'NaN' in the UI. Fix: === The issue is resolved by using avg_hours instead of work_intervals for flexible and fully flexible resources. Additionally, the necessary change has been added to handle fully flexible schedules as well. Since both flexible and fully flexible resources lack scheduled intervals, their avg_hours serve as a reliable value for computing 'workHours', preventing the display of NaN. task-4968436
This fix ensures product carousel indicators on website shop pages are correctly centered when a mobile page first loads. It prevents a visual alignment issue that could make the storefront look less polished to shoppers.
Original PR description
Since the introduction of interactions with [22e777c] in 18.2, the indicators on the CarouselProduct interaction were wrongly computed on mobile: on page load, the indicators appeared on the left instead of centered. This is because an explicit `updateContent()` has to be done at the end of the `updateJustifyContent` method, since it modifies a parameter that impacts the `dynamicContent`. We also take the opportunity to simplify the code of `updateJustifyContent`, which became needlessly complicated after [22e777c]. [22e777c]: https://github.com/odoo/odoo/commit/22e777c046521f3f89b62caa5876680beb7f5aba task-5080057 Forward-Port-Of: odoo/odoo#226632
This fix makes an automated test for free shipping discounts in the online shop more reliable. It helps prevent random test failures, supporting smoother maintenance and more dependable releases without changing customer-facing behavior.
Original PR description
This commit fixes non-deterministic `website_sale_loyalty` tour, which was randomly failing because of the interaction's life cycle behavior where our tour runs too fast before even handlers are attached in interaction. error-229963 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The website SEO tool now handles redirected icon links, such as social media links, more accurately and avoids showing blank spaces where link icons should appear. This reduces false broken-link warnings while still detecting real missing or invalid links, helping users trust SEO checks and maintain cleaner pages.
Original PR description
In SEO, check for broken links there are some empty spaces before the link for icon links (e.g. social media snippet). <hr/> Before this commit, the SEO dialog flagged the "social media" snippet as a broken link because it followed the redirect to the "YouTube consent" page and the browser stopped the call. After this commit, we first run a "normal fetch" so internal redirects still reach their final page, then we try a "manual" redirect only when the browser blocks the call, counting "opaqueredirect" answers as valid. This keeps "controller proxies" green while we still report the real "4xx" errors. This commit also slightly improves the performance of broken link detection.
This fixes Swedish localization tax setup so non-EU goods purchase VAT with a non-zero amount is marked as deductible input VAT. It helps Swedish companies report VAT more accurately and reduces the risk of incorrect tax declarations.
Original PR description
The taxes "EX G" (VAT Purchase of goods outside EU) with a non-zero amount should have the tag se_48 (Input VAT to be deducted). opw-4916405
This fix ensures certain Swedish purchase taxes for goods bought outside the EU are correctly marked as deductible input VAT when the tax amount is not zero. It helps keep Swedish VAT reporting accurate and restores related automated checks.
Original PR description
The taxes "EX G" (VAT Purchase of goods outside EU) with a non-zero amount should have the tag se_48 (Input VAT to be deducted). This PR fixes the tests that were broken because of it: odoo/odoo#227513 opw-4916405
When a signer is no longer assigned to a person, their previous profile picture is now removed from the signing template sidebar. This prevents outdated avatars from appearing and keeps signer information accurate for users preparing documents.
Original PR description
Issue: - In the template iframe view, when editing a signer’s settings, removing the "Assign To" field did not clear the profile picture. - As a result, the previous avatar remained visible in the sidebar even though no user was assigned. Fix: - Updated `updateRoleNameAndAvatar` to reset the `profilePic` state to an empty string when `assignTo` is removed. Impact: - The profile picture is now correctly hidden when no signer is assigned, ensuring the sidebar always reflects the current state of the signer. Steps to reproduce: 1. Open the signer settings dialog in the template view. 2. Clear the `Assign To` field. 3. Save the dialog.