Daily updates from Odoo
Monday, September 29, 2025
124 changes
26 changes
Enhancements to existing features
The tax search view now includes the tax amount field, so users can find taxes by entering their configured percentage or fixed amount in the search bar. This makes tax setup easier to navigate and reduces time spent locating the right tax records.
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
Resolved issues and error corrections
This fixes test coverage for product barcode lookup so product weight is validated when available and the correct product variant permissions are used. It helps ensure barcode lookup product data is handled reliably without changing day-to-day user workflows.
Original PR description
Before this commit: ------------------------- - The weight and volume fields were not present in the main product form, so we can't set them. - The variant rights were not passed correctly for the first basic test. After this commit: ----------------------- - We have updated the test and checked that weight is correctly set when present in the view. - Now we have passed the correct variant right for the test. Runbot error: https://runbot.odoo.com/odoo/runbot.build.error/231155 Forward-Port-Of: odoo/enterprise#95590 Forward-Port-Of: odoo/enterprise#93075
This fix prevents a self-ordering test from trying to cancel orders that are already finalized, such as paid demo orders. By limiting cancellations to draft orders, the test runs more reliably and avoids false failures in validation environments.
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
Dark mode styling was adjusted so key icons and text remain easy to read in Point of Sale and appointment views. This improves usability for staff working with dark mode by preventing low-contrast or hard-to-see interface elements.
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
UAE invoice printouts have been corrected so the amount column is no longer shown twice when taxes are included. This makes Proforma and Tax invoice reports clearer and avoids confusion for customers and accounting teams.
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#223382This fix prevents manufacturing planning from failing when an operation or work order has an extremely small duration value. It ensures schedules can still be calculated reliably instead of triggering an error during availability checks.
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#227253
This fix prevents email signature formatting, such as resized images, from being damaged when messages are prepared for Outlook compatibility. Users should see more consistent email appearance between chatter messages and the full email composer.
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
The AI field picker now prevents users from selecting the same field more than once and clearly marks fields that are already selected. Long field paths also wrap correctly, making them easier to remove and reducing user frustration when configuring AI prompts.
Original PR description
before this commit: When you press Enter in the field picker, it will always pick the same field again, even if it is not visible. After this commit: A field can only be selected once, and it stays visible in the list. Added a visual check to show that the field is already selected. Forward-Port-Of: odoo/enterprise#93890
Importing certain electronic invoice files could fail when a quantity field was set to zero. This fix prevents that error so affected UBL/CII invoices can be imported more reliably in Accounting.
Original PR description
**Steps to reproduce:** - Install Accounting - Go to "Accounting / Customers / Invoices" - Import a UBL file having a value of 0 for a `<cbc:BaseQuantity>` element **Issue:** The import fails due to a division by 0 at: `price_unit = (net_price_unit + rebate) / basis_qty` **Cause:** "basis_qty" is retrieved as followed: `basis_qty = float(self._find_value(xpath_dict['basis_qty'], tree) or 1)` If the element is not defined, it will fall back on 1. But if the element exists with a value of 0, the "_find_value" method will retrieve the string "0" which is not False and will not fall back on 1. Then it will become `0.0` once converted to float. opw-5062985 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#227446
Payment terminal messages printed at the bottom of POS receipts now use the correct text size. This makes receipt details easier for customers and staff to read while keeping the on-screen receipt display consistent.
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
This fixes an issue where reinstalling the Danish Nemhandel module could leave it broken. Businesses using Danish electronic invoicing can reinstall or recover the module without disrupting its setup.
Original PR description
**Description of the issue/feature this PR addresses:** Reinstalling the module breaks it. Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228747
This fix makes an automated website test wait more reliably when the test environment is running slowly. It reduces false test failures, helping keep development and release validation smoother without changing user-facing website behavior.
Original PR description
__Current behavior before commit:__ The timeout in `waitForReposition` is sometimes reached if runbot is on heavy load making the test fail. __Description of the fix:__ Remove `waitForReposition` and use `waitUntil` instead. This should wait more time if runbot is on heavy load. The timeout has been increased for security. Runbot error: https://runbot.odoo.com/odoo/runbot.build.error/232802
The barcode kanban view now only displays existing inventory quantities instead of allowing new ones to be created by mistake. This helps avoid inaccurate stock records when users scan or type product barcodes and switch to the kanban view.
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
The website builder now opens the edit dialog for the specific submenu a user selected, instead of defaulting to the top-level menu. This prevents confusion and helps website editors update event or nested navigation menus more accurately.
Original PR description
With the initial [website builder refactor], when user wanted to edit sub-menu with "Edit Menu", it opened the dialog to edit the top-level menu. This commit fixes that behavior by looking up the id of the containing menu (if any) Steps to reproduce: - On `/event/<some-event>`, open website builder - Click on a link in the menu of the event (not the top menu) - Click on "Edit Menu" button in the link popover - Bug: the edit menu dialog opens for the top level menu [website builder refactor]: 9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 task-4367641
Website editors can now use the "On Hover" animation option on images even after applying a shape. The option is only hidden when the chosen shape already includes its own animation, preventing conflicts while preserving more design flexibility.
Original PR description
Applying a shape to an image unintentionally disabled the "On Hover" animation option. This commit restores the option with proper checks, ensuring it remains disabled only when the applied shape includes an animation. The related code was also refactored slightly for improved readability. Steps to reproduce: 1. Enter edit mode in Website. 2. Add an image and apply a shape. 3. Notice that the "On Hover" animation option is incorrectly hidden.
The rating form now hides placeholder words like “by” and “on” when there is no related comment or publisher information to show. This removes confusing leftover text and makes rating records easier for users to read.
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
This fixes an automated website menu test that could fail in smaller single-app test builds because the menu did not contain enough items. The change helps keep website test results reliable without affecting end users.
Original PR description
Following this [commit], this tour would fail whenever it is run in single-app test builds. This happened because there were not enough items in the nav for the tour to function properly. Also, removed the "@odoo/hoot-dom" dependency. Build error-231699 [commit]: https://github.com/odoo/odoo/commit/7279c92fcb999f621fd9725c2339247c620ed378
This fix replaces a technical crash with a clearer, user-friendly message when users or customizations try to search unsupported non-stored many-to-many relationship fields. It helps administrators and developers understand the issue faster without exposing confusing internal errors.
Original PR description
When searching non-stored many2many fields, fail with a user-friendly message.
`self.env['account.payment'].search([('reconciled_invoice_ids', '=', 1)])` today results in an AttributeError when trying to get the SQL for the bridge table name.
task-5061329
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThe event registration email template now keeps QR codes at the correct size after template edits or previews. This prevents distorted QR codes, helping attendees reliably scan their registration details.
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
The website SEO dialog now excludes dynamic template images that users cannot edit. This prevents broken image warnings from appearing on pages such as appointments and courses, making SEO optimization guidance clearer and more useful.
Original PR description
**Issue:** In the SEO dialog, under the `Images Optimization` section, broken images are displayed due to the inclusion of non-editable dynamic template images. This issue has been observed on the appointment and course pages. **Steps to reproduce:** 1. Go to the `Appointment` page on the website. 2. Go to `Site` settings present in the header > `Optimize SEO`. 3. Notice under the `Images Optimization` section, the broken image icon. See [screencast](https://drive.google.com/file/d/1EZTF2FY1ljj6S2PLwwt42Vht1IdVC3aK/view) Exclude non-editable dynamic template images from the SEO dialog's `Images Optimization` section. Users cannot modify their `alt` attributes, so including them serves no purpose. Forward-Port-Of: odoo/odoo#227702
Fixed a mobile display issue where product carousel indicators could appear left-aligned when a page first loaded. This keeps storefront product carousels looking polished and correctly aligned for shoppers on smaller screens.
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 prevents Google Calendar account reset actions from failing because of event permission checks. It helps ensure users can reset their calendar connection smoothly without unexpected validation errors.
Original PR description
This commit adds the last context key "skip_event_permission" to the remaining writes done to `calendar.event` records at the reset of google_calendar account, created at odoo/odoo#227991. By adding it, we'll no longer face any possibility of triggering a ValidationError during account resets of google_calendar. task-5103918 Forward-Port-Of: odoo/odoo#228520
Inventory transfers with no valid quantities will now show a clear error instead of opening a backorder step that cannot do anything. This prevents confusing warehouse workflows and helps users correct the transfer before validating it.
Original PR description
### Steps to reproduce: - Create and confirm a delivery with 2 moves: - 1 x product 1 - 1 x product 2 - Set the quantity of product 2 to 0 and mark it as picked - Validate the transfer #### > The…
### Steps to reproduce:
- Create and confirm a delivery with 2 moves:
- 1 x product 1
- 1 x product 2
- Set the quantity of product 2 to 0 and mark it as picked
- Validate the transfer
#### > The backorder wizard open's even though there is nothing to validate. Creating a backorder does nothing.
#### Cause of the issue:
Since there is a picked move, the picking validation does not pick every moves in the `pre_action_done` hook keeping only moves with empty qty as picked:
https://github.com/odoo/odoo/blob/9b41eb38403e64091b74e1ae53c79488aa48b499/addons/stock/models/stock_picking.py#L1208-L1209 Then, only the picked moves are processed in there `_action_done`: https://github.com/odoo/odoo/blob/9b41eb38403e64091b74e1ae53c79488aa48b499/addons/stock/models/stock_move.py#L1914 https://github.com/odoo/odoo/blob/9b41eb38403e64091b74e1ae53c79488aa48b499/addons/stock/models/stock_move.py#L1929-L1937 Which leads to an empty picking validation.
opw-5076640
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#227995Spanish Mod 349 tax report audits now show the relevant transaction details for the intra-community operations summary line. This helps accounting users verify reported EU invoice amounts instead of seeing an empty audit result.
Original PR description
Steps to reproduce: - With an ES company setup - Create 1 invoice to an EU partner - Make sure Mod349 Invoice Type is set - Go to Accounting / Reporting / Statement Reports / Tax Report - Select Tax Report (Mod 349) (ES) - Audit line 'Importe de las operaciones intracomunitarias' Issue: No line will be shown This occurs because the system will allow auditing the line, since the report line is defined as aggregation of sublines, however those sublines are all custom so we should provide a custom domain to retrieve the relevant lines opw-4752813 Forward-Port-Of: odoo/enterprise#84633
A failing automated test for PayPal button rendering was removed because it depended on real PayPal credentials that cannot be safely used in the test environment. This keeps automated validation stable while the affected PayPal button scenario is handled through manual testing.
Original PR description
## Versions 18.4 ## Issue An error is raised after PayPal SDK call for button rendering in a test introduced by 1b8f26611a1a349a92075720cb95cb17b00c2b21. ## Cause PayPal SDK cannot render a button with dummy credentials. ## Fix As the button requires real (production or sandbox) credentials we cannot safely provide in runbot environment, we accept a manual testing for this specific use case. runbot-232965
The website editor no longer shows ineffective quality controls for WebP images in Safari and iOS webviews, where compression is not supported. This prevents users from expecting image size or quality changes that the browser cannot apply and keeps the editor options consistent when switching image formats.
Original PR description
Scenario: - select a WebP image in the editor - change the quality with the slider Result: - the size and the image quality doesn't change Cause: Safari doesn't support HTMLCanvasElement.toDataURL() with WebP, so the image is exported in PNG instead which is lossless and doesn't support compression. Other issue: If we select in formats a WebP, then a PNG, we still see the quality option that are meant for the WebP, and inversely if we start with a PNG the quality option is hidden. Fix: Disable the quality for WebP images if this is not supported (in safari + iOS webview), and move the code to ImageTools._computeWidgetVisibility so it is updated when we change image type from/to WebP. opw-4979378 Forward-Port-Of: odoo/odoo#223707 Forward-Port-Of: odoo/odoo#223268
18 changes
Enhancements to existing features
Tax records can now be found by entering their configured percentage or fixed amount in the search bar. This makes it faster for accounting users to locate the right tax setup without browsing through tax lists manually.
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
Resolved issues and error corrections
This fix updates checks around product barcode lookup so product weight is correctly handled when available on the product form. It also corrects test permissions for product variants, helping prevent false failures in automated validation.
Original PR description
Before this commit: ------------------------- - The weight and volume fields were not present in the main product form, so we can't set them. - The variant rights were not passed correctly for the first basic test. After this commit: ----------------------- - We have updated the test and checked that weight is correctly set when present in the view. - Now we have passed the correct variant right for the test. Runbot error: https://runbot.odoo.com/odoo/runbot.build.error/231155 Forward-Port-Of: odoo/enterprise#95590 Forward-Port-Of: odoo/enterprise#93075
The bank reconciliation widget now avoids repeating the same date on every transaction line when several entries share a date. This makes the list easier to scan and reduces visual clutter while still showing the date at the start of each date group or statement.
Original PR description
When you have several transactions on the same date, it's not really necessary to repeat the date on each line. It bloats the widget. We will now only show it if it's the first transaction at that date or if it's the first of a statement. task-4749339
Greek VAT numbers that start with the common 'EL' prefix are now treated as Greek VAT numbers during validation. This ensures customer country information is filled correctly in exports such as DATEV accounting files, reducing manual corrections and reporting errors.
Original PR description
**Issue** When a VAT number starts with EL, it is not recognised as a valid country code, and therefore Greece is not properly identified in exports. **Steps to Reproduce** 1. Create a new customer…
**Issue** When a VAT number starts with EL, it is not recognised as a valid country code, and therefore Greece is not properly identified in exports. **Steps to Reproduce** 1. Create a new customer from Greece with VAT number EL033910442 2. Create an invoice for that customer 3. Navigate to Accounting > Reporting > General Ledger 4. Download Datev Data through the gear icon 5. Open EXTF_Customer_accounts.csv 6. Notice that EL was not recognised as the country code **Root Cause** The VAT validation logic `simple_vat_check` first tries to find a country-specific check function `check_vat_EL`, but such a function does not exist. For Greece, the correct function is `check_vat_GR` (since the ISO country code is `GR`). When `EL` is passed directly, no check function is found, validation fails, and the VAT country is left empty. **Fix** Normalize the VAT prefix before validation by mapping EL → GR, ensuring Greek VAT numbers prefixed with EL are validated with the existing check_vat_GR logic. Opw-4982164 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225422
This fixes an issue where email signature formatting could be damaged when messages were prepared for Outlook, especially for resized images. Users should see more consistent email appearance between the chatter composer and full email composer.
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
This fix prevents UBL invoice imports from failing when an imported file contains a zero value for the base quantity. Businesses can now import affected customer invoices without interruption, improving reliability for electronic invoicing workflows.
Original PR description
**Steps to reproduce:** - Install Accounting - Go to "Accounting / Customers / Invoices" - Import a UBL file having a value of 0 for a `<cbc:BaseQuantity>` element **Issue:** The import fails due to a division by 0 at: `price_unit = (net_price_unit + rebate) / basis_qty` **Cause:** "basis_qty" is retrieved as followed: `basis_qty = float(self._find_value(xpath_dict['basis_qty'], tree) or 1)` If the element is not defined, it will fall back on 1. But if the element exists with a value of 0, the "_find_value" method will retrieve the string "0" which is not False and will not fall back on 1. Then it will become `0.0` once converted to float. opw-5062985 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#227446
This fix prevents the website preview from briefly showing old page styling when a page reloads after theme changes. Business users get a smoother editing experience with less visual flicker when updating layouts or background colors.
Original PR description
In this [commit], fallback iframe was added to avoid flickering between iframe reloads. But the flicker still happens if we change page's style, since we do not apply the new styles to the fallback iframe. To reproduce the issue: - Open Website and start editing - Move to the 'Theme' tab - Change page layout to 'Boxed' - Set background color to a non-transparent color, e.g. red - Save, and do any action to reload the iframe, e.g. go to /contactus => The iframe flickers from the previous color to red, which shouldn't be the case. Task-4985472 [commit]: https://github.com/odoo/odoo/commit/7b19831e1c624b483008feb526ba773ec8b23009 Forward-Port-Of: odoo/odoo#221391
Payment terminal messages printed at the bottom of POS receipts now use the correct font size. This makes important payment information easier to read on printed receipts while keeping the on-screen receipt display consistent.
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
A test for financial reports now targets the exact report being checked instead of potentially switching to a related variant. This improves confidence in report validation without changing day-to-day product behavior.
Original PR description
the test test_custom_engines_related_groupby needs a slight improvement to target the report it is called with, rather than possible variants of the report. This can be achieved using the key 'no_report_reroute'.
This update fixes a problem where reinstalling the Danish Nemhandel module could leave it broken. It helps businesses using Danish electronic invoicing keep the module reliable during maintenance or reinstallation.
Original PR description
**Description of the issue/feature this PR addresses:** Reinstalling the module breaks it. Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228747
The barcode Kanban view now only displays existing inventory quantities instead of allowing new ones to be created. This prevents accidental inventory records and helps keep stock data accurate 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
The web testing tool now distinguishes between different levels of errors and warnings, so issues are reported with the right urgency. This helps developers see important problems earlier while preventing expected or lower-priority test issues from disrupting test runs unnecessarily.
Original PR description
This commit associates separate "issue levels" to the test runner's internal logger. These affect the logging and reporting of issues, i.e. errors and warnings: - suppressed (by 'test.todo'): issues are traced in the console but not reported in test results; - trace (default in test runs): issues are traced in the console and reported in test results; - global: issues are warned/errored in the console with "HOOT" prefix (i.e. won't interrupt the test run); - critical (default outside of test runs): issues are warned/errored in the console without "HOOT" prefix, thus interrupting the whole test run. This fix should hopefully solve errors that were too quiet before test run, or too "important" during the run. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228674
Event registration confirmation emails now keep QR codes at the correct size and proportions after the template is edited or previewed. This prevents stretched QR codes, helping attendees reliably scan their tickets or registration details.
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
The employee form now shows the full count of documents stored in an employee’s folder and all related subfolders, while excluding folders themselves from the total. This gives HR users a more accurate view of available employee documents at a glance.
Original PR description
Before this commit, the documents count on the employee form view showed only the count of documents (folders included) inside the employee folder but not the ones in subfolders. This commit fix that by showing the count of every documents (folders excluded) included in the employee folder or its subfolders. Task-4944895
This fixes a display issue where product carousel indicators could appear left-aligned on mobile when a page first loaded. The change keeps the carousel controls centered immediately, improving the shopping page experience for mobile visitors.
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
Printed invoices now show the early payment discount amount after applying cash rounding. This prevents customers from seeing a slightly incorrect amount due when both early payment discounts and cash rounding are used.
Original PR description
**Steps to reproduce** - Create a tax of 8.1% - Activate and create a cash rounding with rounding precision 0.05 - Use the existing '2/7 Net 30' payment term (or create a new 2% early discount one) - Create a new invoice: - Add payment terms - Add cash rounding method - Add line with price 50, 8.1% tax - Invoice total will be 54.05 **Issue** Print the invoice: The invoice will show "$ 52.97 due if paid before 09/12/2025" However 52.97 is the amount with just the 2% early payment discount applied With cash rounding applied, it should display 52.95 This occurs because when retrieving the amount from the invoice template the system applies only the early payment discount opw-4914545 [Ticket link](https://www.odoo.com/odoo/project/49/tasks/4914545) Forward-Port-Of: odoo/odoo#228677 Forward-Port-Of: odoo/odoo#225759
Google Calendar account resets now apply the same safeguard to all related calendar event updates. This prevents reset operations from failing unexpectedly because of event permission checks, making account reconnection and cleanup more reliable for users.
Original PR description
This commit adds the last context key "skip_event_permission" to the remaining writes done to `calendar.event` records at the reset of google_calendar account, created at odoo/odoo#227991. By adding it, we'll no longer face any possibility of triggering a ValidationError during account resets of google_calendar. task-5103918 Forward-Port-Of: odoo/odoo#228520
The Spanish Mod 349 tax report now correctly displays the underlying invoice details when users audit the summary line for intra-EU operations. This helps accounting teams verify reported amounts more easily and avoid confusion during tax report review.
Original PR description
Steps to reproduce: - With an ES company setup - Create 1 invoice to an EU partner - Make sure Mod349 Invoice Type is set - Go to Accounting / Reporting / Statement Reports / Tax Report - Select Tax Report (Mod 349) (ES) - Audit line 'Importe de las operaciones intracomunitarias' Issue: No line will be shown This occurs because the system will allow auditing the line, since the report line is defined as aggregation of sublines, however those sublines are all custom so we should provide a custom domain to retrieve the relevant lines opw-4752813 Forward-Port-Of: odoo/enterprise#84633
3 changes
Resolved issues and error corrections
Helpdesk team settings now only show internal users when assigning team members for tag-based ticket dispatching. This prevents portal users from being selected by mistake, keeping automatic ticket assignment limited to the right staff.
Original PR description
**Steps to Reproduce:** 1. Go to Helpdesk → Overview. 2. Open a team (e.g., 'Customer Care') and click on 'Settings'. 3. In the team settings, enable 'Automatic Assignment' → 'Dispatch tickets based on tags'. 4. Configure tags handled by team members. 5. In the 'Team Members' field, try to assign users. **Issue:** Portal users are displayed in the 'Team Members' selection list, even though they should not be assignable to helpdesk team tags. **Current behaviour:** - The 'Team Members' field shows all users, including portal users. **Expected behaviour:** - Only internal users should be selectable as 'Team Members'. - Portal users should not appear in the many2many list. **Fix:** Added a domain on the 'user_ids' field to exclude portal users from the 'Team Members' selection. **task-5093188**
Internal agents who preview WhatsApp conversations without joining them can now translate messages. This removes an unnecessary limitation and helps support teams understand customer conversations more reliably.
Original PR description
Before this commit, when an agent that is not member of whatsapp but is peeking the conversation, the agent could not translate the message. This happens because the translation feature is limited to internal users, but this was determined based on the self member relational field. This works when the agent is a member but when not a member this was arbitrarily disabling the feature. This commit fixes the issue by looking at whether the user is internal or not, based on self persona independently on whether the agent is member or not of the conversation. Task-5111383
The Spanish Mod 349 tax report audit view now correctly shows the underlying EU invoice transactions for the intracommunity operations total. This helps accounting users verify reported amounts instead of seeing an empty audit result.
Original PR description
Steps to reproduce: - With an ES company setup - Create 1 invoice to an EU partner - Make sure Mod349 Invoice Type is set - Go to Accounting / Reporting / Statement Reports / Tax Report - Select Tax Report (Mod 349) (ES) - Audit line 'Importe de las operaciones intracomunitarias' Issue: No line will be shown This occurs because the system will allow auditing the line, since the report line is defined as aggregation of sublines, however those sublines are all custom so we should provide a custom domain to retrieve the relevant lines opw-4752813 Forward-Port-Of: odoo/enterprise#84633
12 changes
Enhancements to existing features
The Belgian payroll accounting test was updated to reflect that a work entry type is now required. This keeps internal validation aligned with the latest payroll requirements and helps prevent test failures during future changes.
Original PR description
Adjusted the test in order to follow the new requirement of work entry type Task-5075308
The Helpdesk demo data now includes realistic message exchanges for three sample tickets, helping users better understand response time metrics in demo environments. The update also ensures ticket acknowledgment emails appear before the customer conversation, making the sample ticket history clearer and more accurate.
Original PR description
[IMP] helpdesk: add demo data in helpdesk module - Added messages in 3 tickets for demo data of the first hour to respond and the average hour to respond. - ticket 1: Warranty (Sent 2 hours later,…
[IMP] helpdesk: add demo data in helpdesk module - Added messages in 3 tickets for demo data of the first hour to respond and the average hour to respond. - ticket 1: Warranty (Sent 2 hours later, ticket creation) User: Thank you for your inquiry. Our products typically come with a one-year limited warranty. For more details, could you specify which product you're interested in? (Sent 30 minutes later) Customer: I'm interested in purchasing a desk. Does the warranty cover assembly-related issues? (Sent 1.5 hours later) User: Yes, our warranty covers any defects related to assembly or materials. Please let us know if you need assistance with your purchase. (Sent 2 hours later) Customer: That's great to hear. Could you also provide information on extended warranty options? (Sent 1 hour later) User: We offer extended warranty options for up to three years. Feel free to contact us for more details and pricing. (Sent 1 hour later) Customer: Thank you for the information. I'll consider the extended warranty option for my desk purchase. - same as the above ticket added messages in the below two tickets: 1. Lost key 2. Table legs are unbalanced task-3566757
The Indian reports module now shows the IRN number in a more appropriate location on vendor bill forms instead of disrupting the title area. This keeps the bill layout consistent with standard Odoo forms and makes the number easier to copy when needed.
Original PR description
During testing in 19, I saw that the IRN field was in the title and that totally disturbs the standard layout of how a vendor bill form should look like in Odoo. In order to easily copy paste we add a class text-break (l10n_ec_edi has the same case for the authorization number) Forward-Port-Of: odoo/enterprise#95454
Resolved issues and error corrections
VAT payment instructions sent through the mail composer now display more neatly in the chatter. This prevents awkward word breaks and misaligned fields, making the information easier to read and more professional for Belgian and Dutch reporting workflows.
Original PR description
Issue: -VAT payment instructions sent via mail composer were shown in the chatter with poor formatting. -Words could be split in half and fields were misaligned. Fix: -Updated the layout to improve text wrapping and field alignment in the chatter. Impact: -Ensures VAT payment instructions are displayed clearly and professionally in the chatter. task-5065873 Forward-Port-Of: odoo/enterprise#93986
This fixes Swedish tax reporting so non-EU goods purchases with VAT are correctly marked as deductible input VAT. It helps ensure VAT reports reflect the right amounts for Swedish compliance and avoids related reporting test failures.
Original PR description
The Swedish 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
New users can now load demo data in the Appraisal module without running into an access-related error. This makes onboarding and trial setup smoother for users who do not have administrator rights.
Original PR description
Currently, an error occurs when a new user tries to load demo data in the `Appraisal` module. Steps to reproduce: --- - Install `hr_appraisal` module (without demo data) - Create NEW user > Login…
Currently, an error occurs when a new user tries to load demo data in the `Appraisal` module.
Steps to reproduce:
---
- Install `hr_appraisal` module (without demo data)
- Create NEW user > Login with new user
- Open `Appraisal` and Click `Load Demo Data`
Traceback:
---
```py
ParseError: <record id="calendar_event_appraisal_1" model="calendar.event" forcecreate="1">
<field name="user_id" ref="base.user_admin"/>
<field name="name">Appraisal of Emma Granger</field>
<field name="partner_ids" eval="[(6,0,[ref('hr.work_contact_sj'), ref('hr.work_contact_mw'), ref('hr.work_contact_eg')])]"/>
<field name="start" eval="(DateTime.now() + relativedelta(months=1)).strftime('%Y-%m-%d 07:00:00')"/>
<field name="stop" eval="(DateTime.now() + relativedelta(months=1)).strftime('%Y-%m-%d 09:00:00')"/>
<field name="res_model_id" ref="hr_appraisal.model_hr_appraisal"/>
<field name="res_model">hr.appraisal</field>
<field name="res_id" ref="hr_appraisal.hr_appraisal_1"/>
</record>
ValueError: ParseError('while parsing /home/odoo/odoo/enterprise/hr_appraisal/data/scenarios/hr_appraisal_scenario.xml:561, somewhere inside\n<record id="calendar_event_appraisal_1" model="calendar.event" forcecreate="1">\n <field name="user_id" ref="base.user_admin"/>\n <field name="name">Appraisal of Emma Granger</field>\n <field name="partner_ids" eval="[(6,0,[ref(\'hr.work_contact_sj\'), ref(\'hr.work_contact_mw\'), ref(\'hr.work_contact_eg\')])]"/>\n <field name="start" eval="(DateTime.now() + relativedelta(months=1)).strftime(\'%Y-%m-%d 07:00:00\')"/>\n <field name="stop" eval="(DateTime.now() + relativedelta(months=1)).strftime(\'%Y-%m-%d 09:00:00\')"/>\n <field name="res_model_id" ref="hr_appraisal.model_hr_appraisal"/>\n <field name="res_model">hr.appraisal</field>\n <field name="res_id" ref="hr_appraisal.hr_appraisal_1"/>\n </record>') while evaluating
'action = model._load_demo_data()'
```
This error occurs because the new user has not been granted administrative rights.
This commit resolves the issue by granting the user superuser rights.
sentry-6110523247
Forward-Port-Of: odoo/enterprise#95622
Forward-Port-Of: odoo/enterprise#93461The AI field picker now prevents the same field from being selected more than once and clearly marks fields that are already chosen. Long field names also wrap correctly, making them easier to review and remove when needed.
Original PR description
before this commit: When you press Enter in the field picker, it will always pick the same field again, even if it is not visible. After this commit: A field can only be selected once, and it stays visible in the list. Added a visual check to show that the field is already selected. Forward-Port-Of: odoo/enterprise#93890
The Mexican DIOT report download now places the “exempt imports” and “exempt” values in the correct columns. This prevents confusion or filing issues caused by the two correctly calculated values appearing in the wrong positions.
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
The barcode kanban view now only shows existing inventory records instead of allowing new stock quantity records to be created. This prevents accidental inventory entries and helps keep stock data accurate when users scan or type 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
This fix prevents an error that could occur when a currency rate filter is closed after the accounting report view has already been left or removed. It helps keep financial reports stable during navigation and avoids disruptive crashes for users.
Original PR description
For the currency rate filter, applyFilters is called when the dropdown is closed. It might heppen that we have the dropdown open then we click on something that trigger the destruction of the report view but that still trigger applyFilters which try to apply filter on a destroyed component which is illegal. To prevent this we check if the component is destroyed before reloading the controller. Forward-Port-Of: odoo/enterprise#94530 Forward-Port-Of: odoo/enterprise#94313
This update stabilizes an automated test in the equity module by checking each cap table record individually instead of depending on record order. It reduces false test failures and helps keep development and release validation more dependable without changing user-facing behavior.
Original PR description
The test `test_option_into_share` was failing because `assertRecordValues` compares lists in order, and the records returned by the `cap.table` search were not in the same sequence as the expected values in the test. This commit makes the test deterministic by replacing list-based `assertRecordValues` calls with individual assertions per record. [RB-232585](https://runbot.odoo.com/odoo/error/232585) Forward-Port-Of: odoo/enterprise#95187
Code cleanup and technical improvements
This change removes unnecessary internal setup steps from automated test cases. It helps keep the test suite simpler and easier to maintain without changing how users experience Odoo.
28 changes
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.
5 changes
Enhancements to existing features
The tax search now includes the configured tax amount, so users can quickly find taxes by entering a percentage or fixed amount in the search bar. This makes tax setup and review faster, especially for companies with many tax records.
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 update aligns enterprise localization tests with a recent change that adds delivery party information to UBL electronic documents. This helps ensure electronic invoice and related document checks remain reliable for affected localizations, especially Peru.
Original PR description
The community commit introduced the `<cac:DeliveryParty>` element under `<cac:Delivery>` in UBL XML. This enterprise commit improves test coverage for the element and updates existing UBL tests that were failing due to the additional tag. ---- Community PR: odoo/odoo#223756 task-5022404
Resolved issues and error corrections
Applicants who schedule their own interview through the Appointment app are now correctly linked to their recruitment record. This ensures the applicant profile shows the right meeting count, helping recruiters track interviews accurately.
Original PR description
In this bug, the number of interview meeting of applicant is not shown correctly. The meetings which are scheduled by applicant in appointment app, are not take into account. To reproduce: 1- Create a db with appointment and recruitment installed. 2- Create a new job position, with email template to let applicant schedule a meeting. 3- Move forward the applicant to interviewing stage, and use the link provided to the applicant to set an appointment. 4- Open applicant. As you see, the smart button is showing: `No Meeting` This bug, is result of not setting `applicant_id` in the `calender.event` when the event is set by the applicant. When db user schedules the event, the context has a default value `default_applicant_id`, but this is missing for the case when applicant sets the interview themsevles resulting `applicant_id` to be empty. opw-4784349
Payment terminal messages added to Point of Sale receipts now print at a readable size. This improves receipt clarity for customers and staff while keeping the on-screen receipt display consistent.
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
Fixes an issue in subscriptions where invoice section information for combo products could be overwritten or filled with unnecessary values. This helps keep generated invoices accurate and clearly organized for customers.
Original PR description
This commit improve fix of PR https://github.com/odoo/enterprise/pull/90989 to avoid overriding right combo section values and avoid setting unnecessary values on the section. opw-5069278
8 changes
Enhancements to existing features
This update restructures how product stock valuation fields are calculated so custom modules can adapt the behavior more easily. It mainly benefits implementations that need tailored inventory accounting logic without changing core code.
Original PR description
FWP of https://github.com/odoo/odoo/pull/160201 cc @pfertyk @svs-odoo --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Link tracking redirects now encode certain repeated dot characters that some web server setups may block as suspicious. This helps ensure tracked links continue to open reliably for users behind stricter nginx configurations.
Original PR description
Purpose ======= It has been reported that some nginx configuration detect '...' as malicious. When testing, encoding the '...' solve the issue, and so we force the encoding for the redirection URL. Task-4920533
Resolved issues and error corrections
This update fixes an automated test so it selects the correct first available option when barcode manufacturing flows are checked. It helps keep validation stable after related purchase lookup behavior changed, reducing false test failures without changing day-to-day user functionality.
Original PR description
## Versions 17.0+ ## Issue Test wants to click the first dropped down element which changes because of Purchase lookup behavior opw-5025352
Purchase order lines now find matching products regardless of letter casing, aligning their behavior with sales orders. This helps buyers see all relevant product matches when creating RFQs or purchase orders, reducing missed selections caused by case-sensitive internal references.
Original PR description
## Versions 17.0+ ## Issue Inconsistent product lookup behavior between Sales Orders and Purchase Orders. When searching for a product in a Sales Order line, all matching products are suggested,…
## Versions
17.0+
## Issue
Inconsistent product lookup behavior between Sales Orders and Purchase Orders.
When searching for a product in a Sales Order line, all matching products are suggested, regardless of letter casing.
However, in Purchase Orders, the same search behaves differently. If "Variant Grid Entry" is **unchecked**, only an exact (case-sensitive) match is returned.
## Steps to reproduce
*Ensure Sales app is installed*
- Create 2 products:
- Product 1:
- Name: TEST;
- Internal Reference: Aa1.
- Product 2:
- Name: TEST;
- Internal Reference: aA1.
- Create a SO for any customer:
- Add product by looking for "Aa1", and see both "TEST" products.
- Go to Purchase's settings:
- Uncheck "Variant Grid Entry" if checked.
- Create a RFQ for any customer:
- Add product by looking for "Aa1", and see only one "TEST" product.
## Cause
POs use `product_id` while SOs use `product_template_id`:
https://github.com/odoo/odoo/blob/777f4e8e716db0cdc30c7d7c593e1cbf4a7ae12c/addons/purchase/views/purchase_views.xml#L276
https://github.com/odoo/odoo/blob/777f4e8e716db0cdc30c7d7c593e1cbf4a7ae12c/addons/sale/views/sale_order_views.xml#L492
This means a PO calls `ProductTemplate`'s `_name_search` method while an SO calls `ProductProduct`'s `_name_search` method:
https://github.com/odoo/odoo/blob/777f4e8e716db0cdc30c7d7c593e1cbf4a7ae12c/addons/product/models/product_template.py#L549-L599
https://github.com/odoo/odoo/blob/777f4e8e716db0cdc30c7d7c593e1cbf4a7ae12c/addons/product/models/product_product.py#L543-L591
## Fix
These 2 methods are acting differently but are used in complex flows (like for Barcode app). Adding a more open domain only on Purchase's `ProductProduct` model allows to target specific spots to apply the `ilike` search.
opw-5025352The update ensures DATEV main account settings are applied only to companies based in Germany, preventing incorrect accounting behavior for companies in other countries. It also improves how debit and credit lines are gathered, making the process more efficient for larger accounting entries.
Original PR description
The main datev account should only be set for German companies (check for country code) Also fix the complexity of gathering the debit and credit lines: `+=` has a complexity of `O(n²)` whereas `filtered` has a complexity of `O(n)`.
The CRM Periodic Digest tip now shows the correct number of free credits for targeted lead generation. This avoids misleading users by stating 20 credits instead of the incorrect 200 credits.
Original PR description
## Versions 17.0+ ## Issue The Periodic Digest contains wrong information in a tip. 20 credits are given for specific target lead generation, not 200. opw-5114252
The partner ledger now keeps partner names and expand arrows properly aligned on phones and tablets. This makes the report easier to read and use on smaller screens without changing its functionality.
Original PR description
Problem: On smaller screens (phone or tablet) the center alignment between the partner name and the little arrow is broken. Cause: This happened because the little arrow has btn class, which gets larger on smaller screens (to make it easier to click). The larger button causes the center alignment to be lost, as it grows alone inside the table row. Fix: This commit fixes this issue by ensuring that the content of line_name and line_cell are vertically aligned to the middle, and that items in their sub-containers are aligned to the center. task-5106889
The Planning app walkthrough has been adjusted so its guided steps work properly on mobile devices. This helps users complete onboarding or training flows more reliably when using Planning from a phone or tablet.
Original PR description
In this added tour steps to work in mobile. Also made changes with some steps to better accommodate mobile tour steps task-3709542 Forward-Port-Of: odoo/enterprise#65261