Daily updates from Odoo
Navigate
Branch
Friday, October 10, 2025
257 changes
20 changes
Enhancements to existing features
UBL invoice exports now include the delivery party in the delivery information. This gives recipients clearer shipping details by using the shipping contact when available, or the customer name as a fallback, while keeping existing delivery location and date behavior unchanged.
Original PR description
Previously, the Peppol UBL export only covered the mandatory delivery fields and did not include the `delivery party`. This commit adds the `<cac:DeliveryParty>` element under `<cac:Delivery>` to improve the exported information. - Include `<cac:DeliveryParty>` in the `<cac:Delivery>` section of UBL invoices. - Use the shipping partner name if set; otherwise, fallback to the customer name - Keep existing `<cac:DeliveryLocation>` and delivery date logic unchanged. <img width="766" height="306" alt="image" src="https://github.com/user-attachments/assets/d07c1b37-4c6d-42d1-99b4-66c5abc8e298" /> ----- task-5022404 Forward-Port-Of: odoo/odoo#223756
Resolved issues and error corrections
The AI assistant now includes planned chatter activities alongside existing conversation messages when generating content. This helps produce responses that better reflect upcoming tasks and customer context.
Original PR description
Append any planned activities to the chatter messages to be sent as a part of the prompt's context with the rest of the messages. task-id-5079055 Forward-Port-Of: odoo/enterprise#95764
The time off request summary card has been adjusted so leave measured in hours displays clearly without overly long text. This improves readability for employees and managers reviewing time off requests.
Original PR description
On a time off request, there is a summary on the side. Problem: if we have time off in hours, the display is not adapted and the text is too long. This commit fixes the issue to display the hours correctly. task-5092855 Description of the issue/feature this PR addresses: 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#227631
This fix prevents Chrome on iOS from automatically changing certain text on Odoo pages in a way that could break the interface. It helps users on affected iPhones and iPads avoid rendering problems when using Odoo in Chrome.
Original PR description
Chrome iOS wraps some text nodes (like measures, email...) with a `<chrome_annotation>` tag, which breaks OWL rendering. This commit works around it by adding the (undocumented) `<meta name="chrome"…
Chrome iOS wraps some text nodes (like measures, email...) with a `<chrome_annotation>` tag, which breaks OWL rendering. This commit works around it by adding the (undocumented) `<meta name="chrome" content="nointentdetection">` tag to disable this Chrome behavior. The tag has to be set before the onDOMContentLoaded event to be taken into account. Note: Looks like this behavior was present in Chrome iOS 127 and disabled afterward (because it already had issues) but it appeared again in version 140-141. References: - https://issues.chromium.org/issues/353650041 - https://issues.chromium.org/issues/388718411 - https://stackoverflow.com/questions/78207646/how-do-i-disable-chrome-annotation-tags - https://stackoverflow.com/questions/78575970/prevent-auto-detection-of-phone-numbers-in-chrome-mobile - https://stackoverflow.com/questions/78725191/stop-chrome-ios-auto-detecting-numbers-followed-by-letter-m-as-metre-units-an - https://github.com/solidjs/solid/issues/2235 opw-4969197 Forward-Port-Of: odoo/odoo#230081
Adyen checkout now sends the extra order details required by certain payment methods, such as Klarna, including country information and line items. This helps customers complete payments that previously could fail because required information was missing.
Original PR description
Some payment methods eg. Klarna require 'country code' and 'line items' in order to process the transaction. opw-5077617 Forward-Port-Of: odoo/odoo#230292
This fixes how tables copied into the HTML editor are handled so they automatically receive the standard Odoo table styling. Users get more consistent, properly bordered tables after pasting content, reducing manual formatting work.
Original PR description
### Purpose of this PR: - Ensure that pasted table elements get the standard classes: `table, table-bordered, and o_table.` --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#230517 Forward-Port-Of: odoo/odoo#230208
Emails sent from Odoo could fail when they included an attached email file containing accented or other non-English characters. This fix makes Odoo handle those attached email files correctly, so messages can be sent reliably without serialization errors.
Original PR description
The previous fix for `message/rfc822` attachments forced binary encoding (`cte='binary'`) to comply with RFC 2046. However it also introduced a new issue: emails containing `.eml` attachments with…
The previous fix for `message/rfc822` attachments forced binary encoding (`cte='binary'`) to comply with RFC 2046. However it also introduced a new issue: emails containing `.eml` attachments with non-ASCII characters could not be serialized ### Steps to reproduce 1. Send an email via the chatter with a `.eml` file attached containing non-ASCII characters (e.g., "é") in its body. The sending of that email will fail with a `UnicodeEncodeError` error ### Cause Commit 6197233ef1611ddd974cfdb06ae2568e4af369de attempted to fix an issue where `.eml` (`message/rfc822`) attachments were not RFC-compliant. It did this by forcing the `Content-Transfer-Encoding` to `binary` for the raw byte content of the attachment. While this worked for simple ASCII attachments, it failed for attachments containing non-ASCII characters. When Python's `email` library later tried to serialize the entire message, it treated the attachment's content as an opaque binary blob. It did not understand the character encoding within that blob, leading to a `UnicodeEncodeError` during the final serialization process. ### Fix Instead of attaching the raw bytes, we now: * Parse `.eml` contents using `email.parser.BytesParser`, producing a proper `Message` object. * Attach the parsed message directly, letting the email library handle correct encoding and transfer settings automatically. opw-4655868 Forward-Port-Of: odoo/odoo#230384 Forward-Port-Of: odoo/odoo#223790
The Attendance app now correctly groups records by department after correcting a typo. This helps users get accurate department-based attendance views and reports without workarounds.
Original PR description
- Fixed typo in groupby for 'department' task-id - 5109185 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228334
Creating a goal from an employee appraisal now assigns the goal to the employee being appraised, rather than the current user. Creating a goal directly from the Goals menu no longer pre-fills employee or manager fields, reducing incorrect goal assignments.
Original PR description
If you go on _appraisals -> any employee -> goals smart button -> new_, it will populate the employee field with the current user. Instead, the field should be filled by the appraisal's user. If the goal is created from the "Goals" menu item directly, then no user / manager should be put by default in the goal's fields. I changed the field's default value to use the employee already passed in the context. I also added some tests to make sure the bug doesn't happen again. task-5048292 Forward-Port-Of: odoo/enterprise#93522
Subcontracted manufacturing orders can no longer be unbuilt, preventing incorrect accounting entries from being generated. This helps keep inventory valuation and financial records accurate for subcontracting workflows.
Original PR description
**Problem:** unbuilding a Manufactring order created through a subcontracting process gives the wrong account move lines **Steps to reproduce:** - create a storable product (the comp) and set a cost…
**Problem:** unbuilding a Manufactring order created through a subcontracting process gives the wrong account move lines **Steps to reproduce:** - create a storable product (the comp) and set a cost - create a storable product (the final product), set a cost and set a vendor - for the final product set the category as avco and automated - for the final product create a bill of materials subcontracted and set the same vendor - for the components add the comp for a quantity of 1 - create a Purchase order for the final product and the same vendor and confirm - validate the receipt - From the receipt click on the valuation smart button and click on the book widget of the line of the final product - notice how there is 3 journal items line including one crediting "stock interim (Received)" - unarchive the operation type "subcontracting" - open Manufacturing/Manufacturing Orders, delete the "to do" filter and search for a Manufacturing order with your final product - unbuild it - Open accounting/journal entries and select the journal entry for the unbuild **Current behavior:** There is only two account lines. There is no line balancing the "Stock Interim" line of the manufacturing order. **Cause of the issue:** The override of _generate_valuation_lines_data in mrp_subcontracted_account adds the stock interim line on the manufacturing order. However when unbuilding, the qty is negative so we exit the function https://github.com/odoo/odoo/blob/1358f93a4c73de5a28cda72ec78769625c863efd/addons/mrp_subcontracting_account/models/stock_move.py#L20 **fix** Because subcontracted Manufacturing orders are not meant to be unbuilt, we prevent it opw-4998137 Forward-Port-Of: odoo/odoo#230062
Quality checks on serial-numbered products now correctly keep a failed result when launched directly from a receipt. This prevents failed items from being incorrectly marked as passed, improving inventory quality control accuracy.
Original PR description
Serial number tracked product are marked as pass even when they fail a move_line type of check. ### Steps to reproduce: * Create a product tracked by serial number * For this product create a control…
Serial number tracked product are marked as pass even when they fail a move_line type of check. ### Steps to reproduce: * Create a product tracked by serial number * For this product create a control point: - Control per quantity - Operations : Receipts * Create a receipt for this product * Mark the receipt as Todo * Start the Quality check from the receipt, without using the smart button. * Fail the Quality check * The Quality check still passes ### Issue: When validating a quality check and it fails: https://github.com/odoo/enterprise/blob/d48228127c239e45938551d9bbac734afab8b31a/quality_control/wizard/quality_check_wizard.py#L84-L92 I will not go through the standard process with show_faillure_message where the user can select failed_qty, it directly goes to confirme_fail>_move_to_failure_location: https://github.com/odoo/enterprise/commit/49149580d34ec5583559fa0288356fec6cb2c514#diff-2ffdc2ffc25417076b580b772447514c7e9d8b3e2d2fff2d3100721eb5ccbaf4L455-R457 In our case since failed_qty is still at 0 this new condition transfer the quality check to pass. In the case of serial numbers, the quality check is done one by one, the failed_qty can be retrived from check.move_line_id.quantity opw-5015266 Forward-Port-Of: odoo/enterprise#92966
This fix prevents Odoo from recreating the default employee administrator record during updates when companies have already replaced it with their own setup. This helps avoid unwanted sample-like employee records reappearing in HR data after upgrades.
Original PR description
The `employee_admin` is a default admin option. Later when clients set up their work flow they set up their own admin employee. This record is not present, and it doesn't make sense recreate it with every update. Description of the issue/feature this PR addresses: 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#230250 Forward-Port-Of: odoo/odoo#228117
This update corrects how table cells are selected in the HTML editor. A single cell is now selected only when all of its content is selected, preventing confusing or accidental selections while editing text in tables.
Original PR description
Current behavior before PR: - Create an m x n table. - Write some text in a cell. - Put cursor at the end of text. - Try to select cell by moving mouse rightwards. Notice that the cell is selected although the cell content is not fully selected. Desired behavior after PR: This PR backports commit [1] to ensure that single cell is selected only if the cell content is fully selected. [1]: https://github.com/odoo/odoo/commit/09d369e118f622f30149f46702f58c656a3cee04 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#230133 Forward-Port-Of: odoo/odoo#230071
Videos added inside certain website layout blocks now expand to the full width available instead of appearing unexpectedly small. This improves the editing and viewing experience for website pages using Masonry or Quadrant-style sections.
Original PR description
To reproduce: ============= 1- In Website edit mode, drop the "Masonry" snippet. 2- Add a video in one of the text blocks. -> It will appear smaller than expected, with no way to make it larger Why: ==== The child iframe already had width: 100%, but it can only stretch to 100% of its parent container. If the parent container (.media_iframe_video) doesn't have an explicit width, it defaults to its minimum content size. This issue happens specifically in blocks where the columns are display: flex. As a result, the iframe ends up being too narrow despite having width: 100%. Solution: ========= By adding width: 100% to the container itself, it now fills the grid cell, and the iframe inside fills the container. opw-5104640 Forward-Port-Of: odoo/odoo#229001
Time off warning messages now appear in the right place with consistent spacing. This prevents the India-specific sandwich leave alert from appearing collapsed when creating a new time off request, making important guidance easier to notice.
Original PR description
Issue: The sandwich leave alert for l10n India was incorrectly shown folded when creating a new time off entry for Indian companies. Additionally, the leave_type_increases_duration alert lacked proper top margin, causing inconsistent spacing. Steps to Reproduce: - For the sandwich alert: When shown, it appears folded automatically when creating a new time off entry (only for Indian companies). - For leave_type_increases_duration: When displayed, it lacks top margin. Fixes: - Moved the sandwich leave alert to the header alongside other alerts for consistency. - Adapted margins for all alerts. Task ID: 5071899 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226229
The manufacturing Bill of Materials overview no longer fails when the system cannot schedule the maximum producible quantity within its planning horizon. Instead, it retries using the requested quantity, helping users view production details without being blocked by an availability error.
Original PR description
### Steps to reproduce: 1. Install mrp + purchase 2. Create a new product (A) 1. Add the Buy route on the product 2. Add a vendor line on the Purchase tab 3. Set the quantity on hands to 2000 3.…
### Steps to reproduce: 1. Install mrp + purchase 2. Create a new product (A) 1. Add the Buy route on the product 2. Add a vendor line on the Purchase tab 3. Set the quantity on hands to 2000 3. Create a second product (B) with manufacturing route 4. Create a BoM for this product (B) 1. Add the product (A) as the component with 1 quantity 2. Create a new operation with a duration of 600:00 5. On the product B's page, click Replenish 1. Put 10 quantities to replenish 2. Select the manufacturing route and confirm 6. Go to the BoM and open the BoM overview 7. 'Impossible to plan. Please check the workcenter availabilities.' https://github.com/user-attachments/assets/58697fd9-4e3e-4df6-98e1-5de7e8759715 ### Before this commit: When opening the BoM overview, if the producible quantity for this BoM exceed the quantity we can plan in the 700 following days, an error is displayed. ### After this commit: If the quantity producible cannot be planned, we retry automatically with the requested quantity. opw-5031724 Forward-Port-Of: odoo/odoo#229745 Forward-Port-Of: odoo/odoo#227433
This fix prevents the HTML editor from creating invalid page structure when users change the style of text inside certain inline elements displayed as blocks. It helps preserve the intended content layout and avoids unexpected browser rendering issues.
Original PR description
Before this commit we would insert a block inside of a phrasing content if it's displayed as a block and we change its font style. For example, if we tried to modify text inside of a `<small>` that has `display: block` style, it would insert a new block inside of it. Steps to see the issue: - Have an open editor with `<small>Text</small>` content, that has `display: block` style - Select "Text" and change the font style to paragraph => It will be `<small><p>Text</p></small>` which is not valid HTML, and it will be parsed by a browser as `<small></small><p>Text</p>`, which is not the expected behavior. task-5123274 Forward-Port-Of: odoo/odoo#229043
This fix ensures Indian HR leave rules calculate time off correctly when holidays or weekends surround a leave period. It also makes half-day leave requests count as 0.5 day instead of a full day, improving payroll and absence tracking accuracy.
Original PR description
**Steps to reproduce:** - Install l10n_in and l10n_in_hr_holidays module - Time off > configuration > Public holidays - Create a public holiday for Independence Day (15/08/2025) - Go to Time off >…
**Steps to reproduce:** - Install l10n_in and l10n_in_hr_holidays module - Time off > configuration > Public holidays - Create a public holiday for Independence Day (15/08/2025) - Go to Time off > configuration > 'Time off Types', - Create a Time off type with - 'Sandwich leave' ticked and `Take Time Off in` to half a day - Go to Time off > Management > Time off - Case 1: Create a paid time off leave for the employee from 13/08 to 17//08/2025 - Case 2: Create a paid time off with any date and mark it as a half-day **Observation:** - Case 1: You will see Duration 3 days with the sandwich leave policy. - Case 2: Half-day leave shows 1 day instead of 0.5 **Root Cause:** - Case 1: For the sandwich leave rule, here we checked only one day after and before, leave start and leave end, respectively. It will cause an issue if an employee applies leave that starts or ends with 3 non-working days. https://github.com/odoo/odoo/blob/5d2f1510c08d5570fc2c6c8de0cb4042bacf12d6/addons/l10n_in_hr_holidays/models/hr_leave.py#L39-L46 - Case 2: We forcefully added a 1-day leave, without checking if the leave is half day or not. https://github.com/odoo/odoo/blob/5d2f1510c08d5570fc2c6c8de0cb4042bacf12d6/addons/l10n_in_hr_holidays/models/hr_leave.py#L19 **Solution:** - Case 1: Extend the sandwich leave logic to check every day before and after until a working day is found. - Case 2: Fixed duration calculation to add 0.5 for half-day leaves. opw-5025766 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226883
This fix restores Indian accounting localization updates that were missed during a previous forward-port. It corrects tax naming and chart of accounts data so businesses using the India localization see the intended accounting configuration.
Original PR description
During the following [fw-port](https://github.com/odoo/odoo/pull/229757/) and resolving conflicts few changes such as Renaming of taxes and change of CoA was missed out in this commit we resolve the issue and add the missing changes that were unintentially missout during fw-port --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#230787
This fix prevents an error page when someone opens a course embed link that points to a course category instead of an individual lesson. Users are now redirected to the course homepage, keeping the learning experience stable and avoiding a confusing crash.
Original PR description
When users try to access a `slide ID` that is not included in `channel_slides_ids`, a traceback occurs. Steps to reproduce: --- - Install `website_slides` module - Go to the Website and click on the…
When users try to access a `slide ID` that is not included in `channel_slides_ids`, a traceback occurs. Steps to reproduce: --- - Install `website_slides` module - Go to the Website and click on the `Courses` menu. - Then go to `/slides/embed/<int:slide_id>` route. (http://localhost:8069/slides/embed/7) - The error will occur. Traceback: --- `ValueError: 7 is not in list` At [1], `slide_content_ids` contains the IDs of `channel content`. However, we are trying to access a slide from the `channel category` in URL. As a result, at [2], when attempting to find the index of the slide in `slide_content_ids`, an error occurs because the slide ID actually belongs to `slide_category_ids` and is not present in `slide_content_ids`. Solution: --- Added a special case for category slides — if the slide is a category, redirect to the channel homepage. [1]- https://github.com/odoo/odoo/blob/482bb19e103de9ddbe1b1942b94b33d3da38889b/addons/website_slides/controllers/main.py#L120 [2]- https://github.com/odoo/odoo/blob/482bb19e103de9ddbe1b1942b94b33d3da38889b/addons/website_slides/controllers/main.py#L121 sentry-6572999628 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225374
4 changes
Resolved issues and error corrections
Sale orders and invoices no longer crash when a customer contact has no name and sale warnings are enabled. This keeps sales and billing workflows running smoothly even when contact records are incomplete.
Original PR description
When creating a Sale Order or Invoice for a partner without a name, a traceback occurs. Steps to reproduce the error: - Install ``sale_management`` with demo data - Enable ``Sale Warnings`` from settings - Open ``Azure Interior`` Contact > In Contact, Add Contact > Type: invoice > Save & close - Create a sale order with the newly created partner AND - Create an invoice with the newly created partner Traceback: ``TypeError: unsupported operand type(s) for +: 'bool' and 'str'`` https://github.com/odoo/odoo/blob/7a1b27e5985b3b16768bea450c51226ae3659c76/addons/sale/models/sale_order.py#L822 https://github.com/odoo/odoo/blob/7a1b27e5985b3b16768bea450c51226ae3659c76/addons/sale/models/account_move.py#L59 Here, ``partner_id.name`` is ``False``, which leads to string concatenation with a boolean in sale warning messages and results in the above traceback. sentry-6912482256 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix ensures Indian HR leave records calculate durations correctly when sandwich leave rules include consecutive non-working days or public holidays. It also corrects half-day leave so it is counted as 0.5 days instead of a full day, helping payroll and time-off balances stay accurate.
Original PR description
**Steps to reproduce:** - Install l10n_in and l10n_in_hr_holidays module - Time off > configuration > Public holidays - Create a public holiday for Independence Day (15/08/2025) - Go to Time off >…
**Steps to reproduce:** - Install l10n_in and l10n_in_hr_holidays module - Time off > configuration > Public holidays - Create a public holiday for Independence Day (15/08/2025) - Go to Time off > configuration > 'Time off Types', - Create a Time off type with - 'Sandwich leave' ticked and `Take Time Off in` to half a day - Go to Time off > Management > Time off - Case 1: Create a paid time off leave for the employee from 13/08 to 17//08/2025 - Case 2: Create a paid time off with any date and mark it as a half-day **Observation:** - Case 1: You will see Duration 3 days with the sandwich leave policy. - Case 2: Half-day leave shows 1 day instead of 0.5 **Root Cause:** - Case 1: For the sandwich leave rule, here we checked only one day after and before, leave start and leave end, respectively. It will cause an issue if an employee applies leave that starts or ends with 3 non-working days. https://github.com/odoo/odoo/blob/5d2f1510c08d5570fc2c6c8de0cb4042bacf12d6/addons/l10n_in_hr_holidays/models/hr_leave.py#L39-L46 - Case 2: We forcefully added a 1-day leave, without checking if the leave is half day or not. https://github.com/odoo/odoo/blob/5d2f1510c08d5570fc2c6c8de0cb4042bacf12d6/addons/l10n_in_hr_holidays/models/hr_leave.py#L19 **Solution:** - Case 1: Extend the sandwich leave logic to check every day before and after until a working day is found. - Case 2: Fixed duration calculation to add 0.5 for half-day leaves. opw-5025766 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226883
Users visiting an embedded course link that points to a course category instead of a lesson no longer see an error page. The system now redirects them safely to the course homepage, improving reliability for website visitors.
Original PR description
When users try to access a `slide ID` that is not included in `channel_slides_ids`, a traceback occurs. Steps to reproduce: --- - Install `website_slides` module - Go to the Website and click on the…
When users try to access a `slide ID` that is not included in `channel_slides_ids`, a traceback occurs. Steps to reproduce: --- - Install `website_slides` module - Go to the Website and click on the `Courses` menu. - Then go to `/slides/embed/<int:slide_id>` route. (http://localhost:8069/slides/embed/7) - The error will occur. Traceback: --- `ValueError: 7 is not in list` At [1], `slide_content_ids` contains the IDs of `channel content`. However, we are trying to access a slide from the `channel category` in URL. As a result, at [2], when attempting to find the index of the slide in `slide_content_ids`, an error occurs because the slide ID actually belongs to `slide_category_ids` and is not present in `slide_content_ids`. Solution: --- Added a special case for category slides — if the slide is a category, redirect to the channel homepage. [1]- https://github.com/odoo/odoo/blob/482bb19e103de9ddbe1b1942b94b33d3da38889b/addons/website_slides/controllers/main.py#L120 [2]- https://github.com/odoo/odoo/blob/482bb19e103de9ddbe1b1942b94b33d3da38889b/addons/website_slides/controllers/main.py#L121 sentry-6572999628 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225374
This fixes a timing issue that could make a stock barcode test fail randomly when validating an operation right after saving changes. The validation step now waits for the right screen state, improving automated test reliability without changing day-to-day user behavior.
Original PR description
Sometime, the test `test_scrap_change_source_location` could fail randomly. The issue happens in last few steps of the tour. What we do is: - We edit a move line lot in the form view; - We save it; -…
Sometime, the test `test_scrap_change_source_location` could fail randomly. The issue happens in last few steps of the tour. What we do is: - We edit a move line lot in the form view; - We save it; - We validate the operation. The validation is done by a barcode scan (`OBTVALI`) but since [1](https://github.com/odoo-dev/enterprise/commit/b3a855a870d1861515abaff8683081a39f95558f), barcodes scanned when the user is somewhere else than in the barcode lines view are skipped. With a little bit of bad luck, the tour scans `OBTVALI` while the save from the form view is not finished yet and thus, the scanned barcode is ignored. To reproduce that, run the test `test_scrap_change_source_location` locally in debug mode and add a throttling (eg.: Fast 4G) before to run the tour. To solve the issue, finetune the `validateBarcodeOperation` default trigger, so the error won't happen in this tour and other similar contexts. Runbot build error: [232331](https://runbot.odoo.com/odoo/runbot.build.error/232331) Forward-Port-Of: odoo/enterprise#96542
3 changes
Resolved issues and error corrections
This update fixes an automated test failure by ensuring the test user has the required sales quotation template permission. It helps keep quality checks stable without changing day-to-day business functionality.
Original PR description
This particular test case was failing for multiple instances, whenever user do not have `sale_management.group_sale_order_template` group. This fix ensure user has proper group, so the needed field exists in view
traceback
```
test_sale_order_template_change_after_open
so.sale_order_template_id = quotation_templates[1]
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/odoo/tests/form.py", line 352, in __setattr__
self[field_name] = value
~~~~^^^^^^^^^^^^
File "/data/build/odoo/odoo/tests/form.py", line 357, in __setitem__
assert field_info is not None, f"{field_name!r} was not found in the view"
^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 'sale_order_template_id' was not found in the view
```
runbot error:232942
Forward-Port-Of: odoo/enterprise#96611This fixes a timing issue that could cause a stock barcode test to fail unpredictably when validating an operation after saving a form. The change makes automated validation wait for the right screen state, improving build stability without changing user-facing behavior.
Original PR description
Sometime, the test `test_scrap_change_source_location` could fail randomly. The issue happens in last few steps of the tour. What we do is: - We edit a move line lot in the form view; - We save it; -…
Sometime, the test `test_scrap_change_source_location` could fail randomly. The issue happens in last few steps of the tour. What we do is: - We edit a move line lot in the form view; - We save it; - We validate the operation. The validation is done by a barcode scan (`OBTVALI`) but since [1](https://github.com/odoo-dev/enterprise/commit/b3a855a870d1861515abaff8683081a39f95558f), barcodes scanned when the user is somewhere else than in the barcode lines view are skipped. With a little bit of bad luck, the tour scans `OBTVALI` while the save from the form view is not finished yet and thus, the scanned barcode is ignored. To reproduce that, run the test `test_scrap_change_source_location` locally in debug mode and add a throttling (eg.: Fast 4G) before to run the tour. To solve the issue, finetune the `validateBarcodeOperation` default trigger, so the error won't happen in this tour and other similar contexts. Runbot build error: [232331](https://runbot.odoo.com/odoo/runbot.build.error/232331) Forward-Port-Of: odoo/enterprise#96542
The Documents app no longer shows an unused tooltip field on document tags. This removes a confusing field from the interface while keeping the underlying data model stable for compatibility.
Original PR description
The 'tooltip' field was introduced on document tags categories, but after couple of refactors it ended up unused on document tag. As we cannot remove fields from the data model in stable, this commit removes tooltip from the view and marks it as deprecated in the code. opw-4567814 ## Stems from https://github.com/odoo/odoo/pull/210147 https://github.com/odoo/enterprise/pull/79496 # Merge plan - hide `tooltip` in stable - remove `tooltip` in master Forward-Port-Of: odoo/enterprise#86504
29 changes
New functionality added to Odoo
Adds support for Swedish companies to prepare and submit monthly VAT returns and EC sales list reports. This helps businesses meet local tax reporting requirements more efficiently within Odoo.
Original PR description
Companies in Sweden have to submit their VAT return and EC sales list report monthly. This commit adds the returns both. task-4893969 Forward-Port-Of: odoo/enterprise#92781
Enhancements to existing features
The Hong Kong payroll demo setup now includes richer sample employees, payslips, and pay runs. This makes it easier for users to evaluate payroll scenarios such as MPF and end-of-year pay without extensive manual configuration.
Original PR description
Currently, the demo data in the HK payroll modules are quite weak, and it requires a lot of configuration if a user wants to test the features (MPF, EOY pay, ...) In this PR, we are improving this by adding more payslips and payruns, updating some of the employees data and so on. task-5079595 Forward-Port-Of: odoo/enterprise#95122
This update adjusts a website helpdesk template so it continues to work correctly after related link text became translatable. It helps keep the Helpdesk, eLearning, and Forum website integration stable across languages without changing business workflows.
Original PR description
`href` cannot be used anymore as an xpath expression because it is now translatable. See PR https://github.com/odoo/odoo/pull/147698 task-3626918
The Documents folder action menu now opens immediately instead of waiting for all available actions to load. Users also get faster feedback when pinning actions, with loading indicators and fewer background refreshes to keep the experience smoother on slower connections.
Original PR description
The cogwheel which holds the folder actions was slow to open because it loads the actions at startup. To speedup it up, we backport the fix odoo/enterprise#90124 that allows the cogwheel to be open while loading the actions (instead of waiting that the actions are loaded). We also add a spinner while it is being loaded. When selecting action to embed for the folder, it was slow as well. To solve the problem, we toggle the action immediately (not waiting the answer of the server) and roll it back in case of failure. Finally, to limit the number of calls to the server, we only reload the search model if there are no pending toggle of action. So if you activate for example 5 actions in a row and the connection is slow enough, the search model will only be reloaded once instead of 5 times (when the 5 actions are toggled). Task-4828503 Forward-Port-Of: odoo/enterprise#96545 Forward-Port-Of: odoo/enterprise#94141
The bank configuration screen now uses a better background color when dark mode is enabled. This makes the setup card easier to view and provides a more polished experience for users working in dark mode.
Original PR description
This commit will change the background color of the dark mode of the configure bank cart. no task id Forward-Port-Of: odoo/enterprise#96513
Adds a test button on IoT Box records to help diagnose connection issues more quickly. The check highlights unavailable communication methods and asks the device to verify network quality, helping support teams troubleshoot client installations faster.
Original PR description
In order to ease debugging at client's, we introduce a test button on the IoT Box record that will first test communication protocols and display a notification for each non-working protocol, then request a network quality check on the IoT Box (ping to odoo.com + ping to gateway). Community PR: odoo/odoo#229655 Task: 5130809 Forward-Port-Of: odoo/enterprise#96298
The VoIP setup suggestions now include Telnyx as an available provider option. This gives businesses another recommended provider to consider when configuring internet-based calling in Odoo.
Original PR description
Task-5144121
The Salary Advice spreadsheet now presents payroll information more clearly with better alignment, company details in the header, and a more logical column order. This makes the report easier for payroll teams and banking stakeholders to read and verify.
Original PR description
Salary Advice Report: - Ensured salary amounts and totals are right-aligned - Left-aligned text and numeric fields - Added Company Name and Company Bank Account Number to header - Moved C/D column after Employee Name task-5076472
When users open planning from a payslip, it now starts on the month covered by that payslip. This makes it faster and easier for payroll teams to review the relevant schedule without manually navigating to the correct period.
Original PR description
By clicking on the planning smartbutton on a payslip, it will open by default the planning starting on the month of the date_from of the payslip. It was not the case before this commit. task-5116510
This update standardizes the internal naming of yes/no settings across several Point of Sale modules. It improves consistency and maintainability without changing expected business workflows or user-facing behavior.
Original PR description
pos_*: pos_enterprise, pos_iot, pos_blackbox_be, l10n_se_pos, l10n_in_reports_gstr_pos, pos_iot, pos_restaurant_preparation_display In this commit: ---------- - Standardized the naming of boolean fields in the pos.config model for better consistency and readability across the codebase. Related: - Community: https://github.com/odoo/odoo/pull/224423 - Upgrade: https://github.com/odoo/upgrade/pull/8300 task-5008370
This update removes a redundant internal setting used to identify chat window context. It helps keep the messaging code simpler and easier to maintain, with no expected change for users.
Original PR description
This is redundant with this.env.inChatWindow https://github.com/odoo/odoo/pull/231053
Resolved issues and error corrections
This update corrects how Swiss payroll payslip issues are recalculated, helping ensure warnings and payroll checks stay accurate after changes. It reduces the risk of outdated or incorrect payroll guidance appearing during payroll processing.
Original PR description
task-5150492 Forward-Port-Of: odoo/enterprise#96489
Manual bank account creation now assigns the new journal to the same company as the online account link. This prevents errors when users work across multiple companies and the system context points to a different company.
Original PR description
Before this commit, when a user does a manual bank account creation, we didn't pass the company id for the journal creation. It implies that we use the environment value which is problematic because it could be different from the one account online link one leading to an error. The aim of this commit is ensuring that we pass, as company_id the same value as the one we have on account online link. no task id Forward-Port-Of: odoo/enterprise#96715
Mexican electronic invoice cancellations could fail with an “invalid passphrase” error because certificate keys were sent in a format not accepted by cancellation providers. The fix restores the expected unencrypted key format for these cancellation requests, helping businesses cancel CFDI invoices reliably.
Original PR description
### Steps to reproduce 1. Install `l10n_mx_edi` with demo data 2. Switch to the ESCUELA KEMPER URGATE demo company 3. Create an invoice to the INMOBILARIA CVA demo partner 4. Send the invoice CFDI 5.…
### Steps to reproduce 1. Install `l10n_mx_edi` with demo data 2. Switch to the ESCUELA KEMPER URGATE demo company 3. Create an invoice to the INMOBILARIA CVA demo partner 4. Send the invoice CFDI 5. Request cancellation of the CFDI 6. The cancellation fails with the error 'invalid passphrase'. ### Analysis When calling `_finkok_cancel`, `_solfact_cancel`, or `_sw_cancel`, one of the API call parameters is the `pem_key` of the certificate given by the SAT. Before 19.0, the PEM key was in an unencrypted format. Since f88f8258ead, `env['certificate.key'].pem_key` is encrypted. According to Finkok's API documentation, the private key should be encrypted using DES when given as a SOAP parameter. https://wiki.finkok.com/home/webservices/ws_cancelacion/cancel However, in testing, encrypting the private key using DES seems to be rejected by Finkok. Solucion Factible and SwSapien don't indicate in their documentation whether and how the private key should be encrypted. ### Solution We send the private key unencrypted, as was already the case before 19.0. opw-5137549 Forward-Port-Of: odoo/enterprise#96562
This fix ensures receipts print with the correct order details after a fast validation payment flow. It prevents empty receipts and avoids a restaurant-mode printing error, improving checkout reliability for staff and customers.
Original PR description
pos*: pos_event_iot, l10n_it_pos Steps to reproduce: - Enable a one-click payment method. - Create and validate an order using fast validation. - On the receipt screen, print the order receipt. Issue: - The printed receipt is empty (no order details). - In restaurant mode, a traceback occurs when printing the receipt. Fix: - Use the receipt screen’s `currentOrder` reference instead of fetching the order directly from the POS instance. Task-5093060 Related: https://github.com/odoo/odoo/pull/227621 Forward-Port-Of: odoo/enterprise#96695
Payroll calculations now retrieve payslip line values through Odoo's standard data handling instead of forcing a broad system refresh. This reduces unnecessary cache invalidation, helping payroll computations run more reliably and efficiently without changing user workflows.
Original PR description
Before this commit, when a compute needed to fetch the payslip lines values, we need to flush all to be able to correctly get the values thanks to a sql query. The problem is the `flush_all` will invalidate all recordset in cache and will do more than expected. This commit converts the sql query made to fetch the payslip lines values into a read_group to be able to remove the flush_all and let the orm invalidates the recordset/fields needed to correctly get what we want. Forward-Port-Of: odoo/enterprise#96741
This fixes a timing issue that could cause a stock barcode test to fail unpredictably during automated checks. By waiting for the right screen state before validating, the change improves reliability of testing without changing business workflows.
Original PR description
Sometime, the test `test_scrap_change_source_location` could fail randomly. The issue happens in last few steps of the tour. What we do is: - We edit a move line lot in the form view; - We save it; -…
Sometime, the test `test_scrap_change_source_location` could fail randomly. The issue happens in last few steps of the tour. What we do is: - We edit a move line lot in the form view; - We save it; - We validate the operation. The validation is done by a barcode scan (`OBTVALI`) but since [1](https://github.com/odoo-dev/enterprise/commit/b3a855a870d1861515abaff8683081a39f95558f), barcodes scanned when the user is somewhere else than in the barcode lines view are skipped. With a little bit of bad luck, the tour scans `OBTVALI` while the save from the form view is not finished yet and thus, the scanned barcode is ignored. To reproduce that, run the test `test_scrap_change_source_location` locally in debug mode and add a throttling (eg.: Fast 4G) before to run the tour. To solve the issue, finetune the `validateBarcodeOperation` default trigger, so the error won't happen in this tour and other similar contexts. Runbot build error: [232331](https://runbot.odoo.com/odoo/runbot.build.error/232331) Forward-Port-Of: odoo/enterprise#96542
This fixes receipt printing for Italian fiscal printers when the point of sale is set to skip the receipt screen and print automatically. It also ensures the correct completed sale is sent to the printer, avoiding missed or incorrect fiscal receipts after checkout.
Original PR description
This PR fixes two related bugs happening when printing a receipt with the Italian Fiscal printer First, before this PR, if the option to skip the receipt screen was ticked, then the receipt would…
This PR fixes two related bugs happening when printing a receipt with the Italian Fiscal printer First, before this PR, if the option to skip the receipt screen was ticked, then the receipt would never print. This was caused by the printing logic being implemented on the receipt screen instead of on the pos itself. steps to reproduce: 1. install l10n_it_pos 2. configure one pos 3. configure the IT printer 4. select to skip the receipt screen (print automatically) 5. open the pos 6. make a sale => no ticket printed and the chrome console shows a printer error With this new verison the printing logic was moved to the pos so that printing of fiscal receipts with the italian fiscal printer works, even when receipt screen is skipped. This put to light another potential bug related to how the `order` variable was treated. Before this PR, the printReceipt logic in the module would not pass the order to be printed. This can become a problem upon context changes, where `pos.get_order()` does not return the completed order, but a newly created one. This can for example happen when skipping the receipt screen with the option to "print automatically" (iface_print_auto). After this PR, we keep order as an argument, so we always print the last completed order and not a newly created one. opw-4882480 Forward-Port-Of: odoo/enterprise#96346 Forward-Port-Of: odoo/enterprise#91412
The rental schedule once again shows product groupings correctly after they were lost when the schedule was made editable. This helps users review rental lines by product more easily and restores expected behavior without changing the broader workflow.
Original PR description
This commit restores the `group_expand` functionality for the product field in the rental schedule, which was inadvertently removed in [^1] when the schedule was made editable. [^1]: https://github.com/odoo/enterprise/pull/88689 Forward-Port-Of: odoo/enterprise#96558
Opening a reconciled statement line now shows only that line expanded, and clearing the filter restores the normal reconciliation view instead of expanding every line or hiding the summary. The statement creation button is also hidden when it is not useful, reducing confusion for accounting users.
Original PR description
When you open a statement line from a reconciled move, it opens the bank reconciliation widget with only the selected statement line, which is unfolded by default. However, there are a few issues with this behavior, which are fixed in this commit: 1 - When entering the bank reconciliation widget, the initial line is unfolded. If you remove the filter, all the other lines become unfolded as well. This should not be the case; only the original line should remain unfolded. 2 - By default, the statement summary line is hidden. When the filter is removed, the summary remains hidden. We now ensure the summary is displayed again when the filter is cleared. 3 - The Statement button on the statement line (which is meant to create a new statement) doesn't make any sense when there is only one line. It is now hidden in this case. task-5108118 Forward-Port-Of: odoo/enterprise#96670 Forward-Port-Of: odoo/enterprise#95558
Users who are allowed to print and send SEPA direct debit mandates can now generate and access the related PDF attachments without needing an extra accounting read-only permission. This prevents email sending failures and ensures users can retrieve documents they created through the mandate sending process.
Original PR description
Removing the groups restriction from the `mandate_pdf_file` field in model `sdd.mandate` because it was causing issues when using the `sdd.mandate.send` wizard. Any user who has access to the `sdd.mandate` model can use this wizard to print and send the record. During this process, the system generates a PDF and stores it in the `mandate_pdf_file` binary field, linking the resulting attachment to the record. The previous group restriction prevented users who were not part of the `account.group_account_readonly` group from sending the email with the attachment. Even if the email was somehow sent, those users still couldn’t access the attachments they themselves had generated and sent. With this change, any user who is allowed to send and print `sdd.mandate` records will also be able to generate and later access the corresponding attachments. Forward-Port-Of: odoo/enterprise#96463 Forward-Port-Of: odoo/enterprise#96119
The AI assistant now considers planned activities from the chatter alongside existing messages when preparing its response context. This helps produce more relevant answers by including upcoming tasks and follow-ups that were previously left out.
Original PR description
Append any planned activities to the chatter messages to be sent as a part of the prompt's context with the rest of the messages. task-id-5079055 Forward-Port-Of: odoo/enterprise#96668 Forward-Port-Of: odoo/enterprise#95764
Changing a quotation template on a sales order now removes the previously linked quote calculator spreadsheet. This prevents sales teams from accidentally using calculations from an old template and keeps the order aligned with the selected template.
Original PR description
Step to reproduce: - Create a new SO - Add a customer and quotation template to the order - Click on quote calculator smart button - Return to sale order (click on SO number in top left) - Change the quotation template - Result: it does not change the quote calculator that is linked to the new quotation template Cause: - Clicking on Quote Calculator creates a copy of the quotation template spreadsheet and links it to the SO. https://github.com/odoo/enterprise/blob/8bc6098335d283e6d210dc788463a8ef8c559b14/spreadsheet_sale_management/models/sale_order.py#L30-L35 - When the quotation template is later changed, the spreadsheet linked to the old template remains attached to the SO. Fix: - On changing the sale_order_template, the old spreadsheet should be unlinked from the SO. - Keeping it linked is inconsistent, as it does not matches the current template opw-4998587 Forward-Port-Of: odoo/enterprise#95861 Forward-Port-Of: odoo/enterprise#93970
Point-of-sale appointment bookings now use the right capacity values, making it possible again to add or remove resources reliably. The update also restores missing placeholder text in POS appointment fields and fixes appointment type names shown in planning popovers.
Original PR description
The waiting list capacity used to be set indirectly via the `total_capacity_reserved` field In [1] it was removed as it was not otherwise used. Meaning we should have set the default wishlist…
The waiting list capacity used to be set indirectly via the `total_capacity_reserved` field In [1] it was removed as it was not otherwise used. Meaning we should have set the default wishlist capacity instead. While doing that we also noticed a logical issue with only using the wishlist capacity, it does not allow adding or removing resources that don't correspond to the capacity that was originally set. Instead we now actually use total_capacity_reserved when the appointment type manages capacities. And let users use the wishlist capacity otherwise. Which allows them to again select resources freely in both contexts. -------------------------- Additionally we fix the missing placeholder in point-of-sale caused by the placeholder html editor plugin being missing from the minimal html editor used there. As well as an incorrect access to a record name in kanban popover. task-5103532 [1]: https://github.com/odoo/enterprise/commit/2aab4dcfbe8491968f0721741efbab894667aefe Forward-Port-Of: odoo/enterprise#95539
This fix prevents an error from appearing when users click the “Offers (new)” button for a Mexican employee without salary cost details filled in. It improves reliability during employee setup by safely handling missing wage or yearly cost information.
Original PR description
steps to reproduce:
--------------------
1. Install l10n_mx_hr_payroll and hr_contract_salary (load with demo data)
2. Switch to the Mexican company and create a new employee
3. Click on Offers(new)
issue:
-------
A traceback occurs:
`TypeError('cannot unpack non-iterable NoneType object')`
cause:
-------
https://github.com/odoo/enterprise/blob/71cc92c9526234dcd44ec756375647a67729029f/l10n_mx_hr_payroll/data/salary_rules/hr_salary_rule_regular_pay_data.xml#L531
Unpacking fails because **find_rates(gross, isr_table)** returns `None`
when the [gross amount](https://github.com/odoo/enterprise/blob/8b96c67d0555702e88127a77edb6e3b8ef5e58cc/hr_payroll/models/hr_payslip.py#L1157-L1167) is empty. This occurs if wage or yearly costs
are not defined.
solution:
----------
Check that the gross amount is exists before calling `find_rates`
and unpacking its result.
opw-5128275
Forward-Port-Of: odoo/enterprise#96525The referral app now uses the term "job opportunity" instead of "job offer" in related templates, emails, SMS messages, and wizard screens. This keeps recruitment referral wording consistent and clearer for users sharing open roles.
Features or functions removed from Odoo
The unused Dynamic Reports setting has been removed from Accounting configuration. This prevents users from accidentally disabling essential accounting reports and makes setup simpler.
Original PR description
Before PR: - The setting was available but never actively used. - Disabling it could uninstall 'account_reports', which are required for most accounting features. After PR: - The 'Dynamic reports' setting has been removed from the system. Impact: - Prevents accidental removal of essential accounting functionality. - Simplifies configuration by removing an unused option. Related community PR: https://github.com/odoo/odoo/pull/228598 Related upgrade PR: https://github.com/odoo/upgrade/pull/8501 task-5107465
Code cleanup and technical improvements
The accounting dashboard now uses one shared approach for bank synchronization actions such as connecting, reconnecting, refreshing, and extending access. This reduces inconsistencies and makes the bank connection experience easier to maintain and more reliable for users.
Original PR description
Refactor to centralize the different bank synchronization actions on the accounting dashboard (connect, reconnect, refresh, extend) into a single template. This removes redundancy and fixes inconsistencies that appeared because each action was handled separately. Task-5068208
Display orientation settings are now managed on the individual IoT device instead of the overall IoT Box. This makes it easier to apply the correct screen orientation to the intended display and makes the capability available natively in the IoT module.
Original PR description
In order to simplify the code/flow of setting display orientation, we moved it from the IoT Box record to the device one. This allows us to target the right display instead of the "default" one using the `iot_http` service. We also moved this logic from `pos_self_order_iot` to `iot` in order to make the setting native.
16 changes
Enhancements to existing features
Website users can now create pages with AI through a smoother, more guided flow. This helps teams launch website content faster and with less manual setup.
Website users get an improved experience when creating pages with AI, making it easier to start new website content. This helps teams build pages faster and with less manual setup.
Original PR description
Description of the issue/feature this PR addresses: 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
Resolved issues and error corrections
This fix prevents errors when generating Mexican CFDI or invoice documents if a related landed cost has not been validated and therefore has no date. It also blocks users from creating landed costs directly from the lot form, reducing the chance of incomplete landed cost records causing document generation failures.
Original PR description
Previous this commit you are able to create and set a landed cost through the lot form view without validating the landed cost. This caused a traceback later on when generating the CFDI or invoice document when trying to get the formatted dates. Since a non validated landed cost might not have a date, this raised an error. This commit targets to fix this issue by expecting that a landed cost might not have a date and also not allow through the form lot view to create a landed cost target: 19.0 -> master task-none (feedback from mial)
Fixes an issue where creating a new bank statement line from a copied bank journal could crash, especially when using a foreign currency. The system now keeps the transaction linked to the correct journal, helping accounting users enter bank transactions reliably.
Original PR description
The system will crash with error when user tries to create new bank statement line. **Steps to produce:** - Install `Invoicing` module without demo data. - Go to `Configuration > Journals` and…
The system will crash with error when user tries to create new bank statement line. **Steps to produce:** - Install `Invoicing` module without demo data. - Go to `Configuration > Journals` and duplicate the default Bank journal to create Bank (Copy). - Go to `Dashboard` and Click on 3 dots of Bank(Copy) and click on `Transactions`. - Create a new transaction and set the Statement also(Create new and assign it). - Go to that statements and Add a line and set the foreign currency as `USD`. **Error:** ```py ValueError: Wrong value for account.bank.statement.journal_id: account.journal(7, 6) ``` **Cause:** - When there are two Bank journals and the user is not in the default one, creating a new transaction in the statement sets the journal for that transaction to the default Bank journal. However, during computation, this causes an error from [here] because `statement.line_ids.journal_id` contains two different journals.. **Solution:** - Added `default_journal_id` to the context to ensure the correct journal is used when creating new transactions. [here]: https://github.com/odoo/odoo/blob/34409128de0bb84cdee309b031b307c46d8b07c7/addons/account/models/account_bank_statement.py#L178 **sentry-6928858335**
This fixes an issue where some deeply nested website content, such as product eCommerce descriptions, could not be translated when a second website language was enabled. Businesses can now reliably translate this content, improving multilingual storefront management.
Original PR description
Scenario: - enable second language on website - go to /shop/1 and try to translate description_ecommerce Result: this is not translatable Cause: Since at least…
Scenario:
- enable second language on website
- go to /shop/1 and try to translate description_ecommerce
Result: this is not translatable
Cause:
Since at least https://github.com/odoo/odoo/commit/b455ea85853dfc19ed01e33986ad270cf80ee5d6 the
contenteditable attribute in ContentEditablePlugin is not set on an
element if it has a contenteditable ancestor.
TranslationPlugin disable all editable nodes containing editable nodes.
So with this combination, if we had a node for example:
```
<div class="oe_editable" data-oe-model="product.template" data-oe-id="1"
data-oe-field="description_ecommerce" data-oe-type="html">
<div>
<span class="oe_editable" data-oe-model="product.template"
data-oe-id="1" data-oe-field="description_ecommerce">
test
</span>
</div>
</div>
```
the contenteditable was added to the parent div.oe_editable, but was
removed by TranslationPlugin so the "test" text was not translatable.
Fix: move the code that adds data-oe-readonly class in the
after_setup_editor_handlers so it is run before contenteditable
attributes are set.
opw-5128618
Forward-Port-Of: odoo/odoo#230169Accessing a course category through an embedded slide link no longer causes an error page. Users are redirected back to the course homepage instead, keeping the learning experience stable when an invalid or category-only slide link is opened.
Original PR description
When users try to access a `slide ID` that is not included in `channel_slides_ids`, a traceback occurs. Steps to reproduce: --- - Install `website_slides` module - Go to the Website and click on the…
When users try to access a `slide ID` that is not included in `channel_slides_ids`, a traceback occurs. Steps to reproduce: --- - Install `website_slides` module - Go to the Website and click on the `Courses` menu. - Then go to `/slides/embed/<int:slide_id>` route. (http://localhost:8069/slides/embed/7) - The error will occur. Traceback: --- `ValueError: 7 is not in list` At [1], `slide_content_ids` contains the IDs of `channel content`. However, we are trying to access a slide from the `channel category` in URL. As a result, at [2], when attempting to find the index of the slide in `slide_content_ids`, an error occurs because the slide ID actually belongs to `slide_category_ids` and is not present in `slide_content_ids`. Solution: --- Added a special case for category slides — if the slide is a category, redirect to the channel homepage. [1]- https://github.com/odoo/odoo/blob/482bb19e103de9ddbe1b1942b94b33d3da38889b/addons/website_slides/controllers/main.py#L120 [2]- https://github.com/odoo/odoo/blob/482bb19e103de9ddbe1b1942b94b33d3da38889b/addons/website_slides/controllers/main.py#L121 sentry-6572999628 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225374
This fixes a recent issue in the Adyen payment integration caused by an incorrect customization hook. It helps ensure payment provider behavior remains reliable for businesses using Adyen to process payments.
Original PR description
Commit [efc2788](https://github.com/odoo/odoo/commit/efc2788) introduced the bug by bad method override.
The time off request summary card now displays hourly leave amounts in a shorter, clearer format. This prevents overly long text and makes the side summary easier for employees and managers to read.
Original PR description
On a time off request, there is a summary on the side. Problem: if we have time off in hours, the display is not adapted and the text is too long. This commit fixes the issue to display the hours correctly. task-5092855 Description of the issue/feature this PR addresses: 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#230693 Forward-Port-Of: odoo/odoo#227631
Fixes the website announcement scrolling snippet so it restarts reliably after edits and previews correctly for keyboard users. Translation editing now uses a standard Odoo dialog instead of a browser prompt, making the website builder experience more consistent and accessible.
Original PR description
**[FIX] website: properly restart AnnouncementScroll interaction** Commit [e1cc670] introduced the `s_announcement_scroll` snippet, with an interaction and some options. The way the interaction was…
**[FIX] website: properly restart AnnouncementScroll interaction**
Commit [e1cc670] introduced the `s_announcement_scroll` snippet, with an
interaction and some options. The way the interaction was restarted
after each option change was hacky, which is what this commit intends to
fix.
We also make sure the preview is working both on hover and when focusing
with Tab.
**[FIX] website: use a dialog for AnnouncementScroll translation**
Commit [e1cc670] added the `s_announcement_scroll` snippet, using a
browser prompt to update the translation of its text. We would rather
use an Odoo dialog.
In the same time, we introduce a resource `mark_translatable_nodes`
called in the `TranslationPlugin`. This will allow a better separation
of concerns between what is the core translation setup and what is
specific to some snippets or elements on the page.
**[FIX] website: use `.preview.scss` pattern in add dialog bundle**
Commit [ad6e2d3] extracted preview-specific CSS styles from `.edit.scss`
files, in order to load the strict minimum with the bundle. We will use
the same kind of pattern for the preview styles, by suffixing files with
`.preview.scss`, like what is already the case with `.preview.js`
interactions.
[ad6e2d3]: https://github.com/odoo/odoo/commit/ad6e2d3857a87a0dfec93c2bcc597328ef21ba00
[e1cc670]: https://github.com/odoo/odoo/commit/e1cc6702a4416204e446d51fdfe047d4ebfd402c
task-5069849This fixes Italian fiscal receipt printing when the receipt screen is skipped in Point of Sale. Receipts now print for the completed sale instead of failing or using a newly created order, helping stores avoid missing fiscal tickets during checkout.
Original PR description
This PR fixes two related bugs happening when printing a receipt with the Italian Fiscal printer First, before this PR, if the option to skip the receipt screen was ticked, then the receipt would…
This PR fixes two related bugs happening when printing a receipt with the Italian Fiscal printer First, before this PR, if the option to skip the receipt screen was ticked, then the receipt would never print. This was caused by the printing logic being implemented on the receipt screen instead of on the pos itself. steps to reproduce: 1. install l10n_it_pos 2. configure one pos 3. configure the IT printer 4. select to skip the receipt screen (print automatically) 5. open the pos 6. make a sale => no ticket printed and the chrome console shows a printer error With this new verison the printing logic was moved to the pos so that printing of fiscal receipts with the italian fiscal printer works, even when receipt screen is skipped. This put to light another potential bug related to how the `order` variable was treated. Before this PR, the printReceipt logic in the module would not pass the order to be printed. This can become a problem upon context changes, where `pos.get_order()` does not return the completed order, but a newly created one. This can for example happen when skipping the receipt screen with the option to "print automatically" (iface_print_auto). After this PR, we keep order as an argument, so we always print the last completed order and not a newly created one. opw-4882480 Forward-Port-Of: odoo/enterprise#96346 Forward-Port-Of: odoo/enterprise#91412
This fixes a problem where sending an email with an attached .eml file could fail if the attachment contained accented or other non-ASCII characters. Odoo now handles these attached email files in a way that preserves their content and allows the outgoing message to be sent reliably.
Original PR description
The previous fix for `message/rfc822` attachments forced binary encoding (`cte='binary'`) to comply with RFC 2046. However it also introduced a new issue: emails containing `.eml` attachments with…
The previous fix for `message/rfc822` attachments forced binary encoding (`cte='binary'`) to comply with RFC 2046. However it also introduced a new issue: emails containing `.eml` attachments with non-ASCII characters could not be serialized ### Steps to reproduce 1. Send an email via the chatter with a `.eml` file attached containing non-ASCII characters (e.g., "é") in its body. The sending of that email will fail with a `UnicodeEncodeError` error ### Cause Commit 6197233ef1611ddd974cfdb06ae2568e4af369de attempted to fix an issue where `.eml` (`message/rfc822`) attachments were not RFC-compliant. It did this by forcing the `Content-Transfer-Encoding` to `binary` for the raw byte content of the attachment. While this worked for simple ASCII attachments, it failed for attachments containing non-ASCII characters. When Python's `email` library later tried to serialize the entire message, it treated the attachment's content as an opaque binary blob. It did not understand the character encoding within that blob, leading to a `UnicodeEncodeError` during the final serialization process. ### Fix Instead of attaching the raw bytes, we now: * Parse `.eml` contents using `email.parser.BytesParser`, producing a proper `Message` object. * Attach the parsed message directly, letting the email library handle correct encoding and transfer settings automatically. opw-4655868 Forward-Port-Of: odoo/odoo#230384 Forward-Port-Of: odoo/odoo#223790
Pasted tables now keep the expected Odoo table styling and handle content copied from external tools more reliably. This helps users paste tables from sources like Google Docs without losing formatting or creating empty table cells that behave incorrectly.
Original PR description
### Purpose of this PR: - Ensure that pasted table elements get the standard classes: `table, table-bordered, and o_table.` - When content is pasted from other source (e.g., Google Docs inside iframe), attribute nodes coming from another JavaScript context do not match the `Attr` prototype of the current context. Use `item.nodeType === Node.ATTRIBUTE_NODE` instead of `instanceof Attr` to detect attribute nodes. - Insert a base container into empty `<td>` elements when pasting tables from external sources. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#230723 Forward-Port-Of: odoo/odoo#230208
This fix prevents a stock barcode test from failing randomly when validation happens before a previous save is fully complete. It makes automated checks more reliable without changing normal user workflows.
Original PR description
Sometime, the test `test_scrap_change_source_location` could fail randomly. The issue happens in last few steps of the tour. What we do is: - We edit a move line lot in the form view; - We save it; -…
Sometime, the test `test_scrap_change_source_location` could fail randomly. The issue happens in last few steps of the tour. What we do is: - We edit a move line lot in the form view; - We save it; - We validate the operation. The validation is done by a barcode scan (`OBTVALI`) but since [1](https://github.com/odoo-dev/enterprise/commit/b3a855a870d1861515abaff8683081a39f95558f), barcodes scanned when the user is somewhere else than in the barcode lines view are skipped. With a little bit of bad luck, the tour scans `OBTVALI` while the save from the form view is not finished yet and thus, the scanned barcode is ignored. To reproduce that, run the test `test_scrap_change_source_location` locally in debug mode and add a throttling (eg.: Fast 4G) before to run the tour. To solve the issue, finetune the `validateBarcodeOperation` default trigger, so the error won't happen in this tour and other similar contexts. Runbot build error: [232331](https://runbot.odoo.com/odoo/runbot.build.error/232331) Forward-Port-Of: odoo/enterprise#96542
This fixes an issue in the HTML editor that could trigger a JavaScript error when inserting content. The change helps keep editing actions stable and prevents interruptions for users working with rich text content.
Original PR description
In `dom.insert`, the variable `container` was being redefined to a constant within a `while` loop, making it impossible to use the original variable within the loop. This caused an `Uncaught Javascript Error` ("Cannot access 'container' before initialization") whenever trying to access it within the loop but above the redefinition. This commit renames the constant to a previously unused name.
opw-5053872
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#230085Fixed an issue in bank reconciliation where choosing a write-off account with a default tax could remove an already matched bill or invoice. This helps accounting users keep their reconciliation work intact and avoid repeating matches.
Original PR description
In the Bank reconciliation widget, users can click a button to set the account to write off the remaining balance. However, if the chosen account has a default tax set, the widget will lose any existing matches with invoices. Steps to reproduce: - Have an account with a default tax - Create a bill with a total - Create a bank statement for a greater amount - Open the bank reconciliation widget - In the created statement, first add the bill, then click 'Set Account,' and choose the account with tax Issue: Bill matching will be lost. This occurs because we remove and recreate the matching line, but we don't keep the line to be reconciled. opw-5002624 Forward-Port-Of: odoo/enterprise#96006
The Documents app no longer shows an unused tooltip setting on document tags. This avoids confusion for users while keeping the underlying data model stable for compatibility.
Original PR description
The 'tooltip' field was introduced on document tags categories, but after couple of refactors it ended up unused on document tag. As we cannot remove fields from the data model in stable, this commit removes tooltip from the view and marks it as deprecated in the code. opw-4567814 ## Stems from https://github.com/odoo/odoo/pull/210147 https://github.com/odoo/enterprise/pull/79496 # Merge plan - hide `tooltip` in stable - remove `tooltip` in master Forward-Port-Of: odoo/enterprise#86504
25 changes
New functionality added to Odoo
Belgian companies can now connect Odoo to Codaclean through Odoo's IAP service to automatically import CODA bank statement files into bank journals. This reduces manual bank statement handling by fetching files twice daily or on demand, while keeping the external API key managed server-side.
Original PR description
This module adds support for "codaclean" integration. CODA files can be periodically (or on demand) fetched from codaclean and imported into bank journals. The module only connects to the IAP server.…
This module adds support for "codaclean" integration. CODA files can be periodically (or on demand) fetched from codaclean and imported into bank journals. The module only connects to the IAP server. The IAP side does the actual calls to codaclean (with a secret API key). To use the module you have to create a connection to IAP / codaclean and set up a bank journal: - To manage the connection to IAP / codaclean go to Settings -> Accounting -> Codaclean -> Manage Connection - To set up the bank journal you need to configure the following in the "Journal Entries" tab on the journal: - Put the IBAN in the "Bank Account Number" field - Select "Codaclean Synchronization" for the "Bank Feeds" field Coda files will be automatically fetched 2 times per day via the scheduled action called "Accounting: Sync Coda Files from Codaclean". They can also be manually fetched by clicking "Fetch from Codaclean" below the journal on the accounting dashboard (only available when the journal and connection are setup correctly). On an empty journal we start fetching from 1 year ago. When the journal is not empty we start fetching after the last bank statement / bank statement line in the journal. task-4844423 backport of commit 518ab9e Forward-Port-Of: odoo/enterprise#95747
Enhancements to existing features
The Spanish localization now separates Canary Islands purchase taxes for goods and services, aligning tax mappings with their business purpose. It also adds DUA-related Canary Islands tax data, helping companies apply more accurate tax treatment in this region.
Original PR description
We have splitted purchase taxes in goods and services because there are different mappings according to the scope. It has a similar functionality with spanish mainland taxes @jco-odoo There are doubts with the fiscal position `fp_nacional_canary_ns` as it is applied automatically to spanish non canarian partners but it should be similar to non-EU partners IMO. However, I think that the opinion fo some canary people would be nice to clarify it @Christian-RB --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
The course website now handles cases where someone opens an embed link for a course category instead of an individual lesson. Instead of showing an error page, visitors are redirected back to the course homepage, improving reliability and user experience.
Original PR description
When users try to access a `slide ID` that is not included in `channel_slides_ids`, a traceback occurs. Steps to reproduce: --- - Install `website_slides` module - Go to the Website and click on the…
When users try to access a `slide ID` that is not included in `channel_slides_ids`, a traceback occurs. Steps to reproduce: --- - Install `website_slides` module - Go to the Website and click on the `Courses` menu. - Then go to `/slides/embed/<int:slide_id>` route. (http://localhost:8069/slides/embed/7) - The error will occur. Traceback: --- `ValueError: 7 is not in list` At [1], `slide_content_ids` contains the IDs of `channel content`. However, we are trying to access a slide from the `channel category` in URL. As a result, at [2], when attempting to find the index of the slide in `slide_content_ids`, an error occurs because the slide ID actually belongs to `slide_category_ids` and is not present in `slide_content_ids`. Solution: --- Added a special case for category slides — if the slide is a category, redirect to the channel homepage. [1]- https://github.com/odoo/odoo/blob/482bb19e103de9ddbe1b1942b94b33d3da38889b/addons/website_slides/controllers/main.py#L120 [2]- https://github.com/odoo/odoo/blob/482bb19e103de9ddbe1b1942b94b33d3da38889b/addons/website_slides/controllers/main.py#L121 sentry-6572999628 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Dutch localization now uses the correct default accounts for deferred revenue and expenses. This helps Dutch companies record deferred items in the right accounting categories, improving accuracy in financial setup and reporting.
Original PR description
The default deferred accounts in the Dutch localization were incorrect. This commit sets the proper accounts and adjusts the `account_type` of the default deferred expense account from "Prepayments" to "Current Assets". task-5152529 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#230499
Coupon point balances now stay accurate when a reward is changed on an already confirmed sales order. This prevents customers from being charged the wrong number of coupon points, helping avoid incorrect remaining balances and related support issues.
Original PR description
Versions -------- - 17.0+ Steps ----- 1. Have a coupon program; 2. add a 10% discount on order reward for 1 point; 3. add a 50% discount on order reward for 5 points; 4. generate a coupon with 10…
Versions -------- - 17.0+ Steps ----- 1. Have a coupon program; 2. add a 10% discount on order reward for 1 point; 3. add a 50% discount on order reward for 5 points; 4. generate a coupon with 10 points; 5. use coupon code on a confirmed order; 6. select 10% discount reward; 7. change to a 50% discount reward; 8. check coupon point total. Issue ----- Even though the 5 point reward was used, only 4 out of 10 points remain. Cause ----- When updating the reward line of a confirmed order, it keeps track of point cost changes before & after a write. Its purpose is to restore back the point difference on the coupon record. The issue is that while point changes are stored, coupon changes are not. When updating reward lines, `_reset_loyalty` is used, which removes the `coupon_id` from the lines. As a consequence, attempting to restore the point difference on `line.coupon_id` after an update, it writes to an empty record. Solution -------- Store both coupons & their used points before write. After write, restore the previous points to the previous coupon, and subtract the current point cost from the current coupon. This way, any combination of coupon/point changes should have the points updated as expected. opw-4910922 Forward-Port-Of: odoo/odoo#222054
Survey respondents can now submit a written comment as their answer for roaming multiple-choice questions without seeing an incorrect “answer required” warning. The update also strengthens validation so single-choice questions cannot store multiple answers, improving survey data reliability.
Original PR description
Issue: When answering a question with a comment in multiple choice with roaming activated for the survey, the UI will display a warning message that says the question requires an answer. Cause: The backend creates a skipped record if none of the pre-created answers is chosen. Solution: Don't create a skipped record if a comment counts as an answer and a comment is provided. Added validation of input and unittests Task-5062984 Forward-Port-Of: odoo/odoo#226022
The HR setup data no longer recreates the default admin employee record during updates. This prevents customer-configured employee administration workflows from being disrupted by an unnecessary default record returning.
Original PR description
The `employee_admin` is a default admin option. Later when clients set up their work flow they set up their own admin employee. This record is not present, and it doesn't make sense recreate it with every update. Description of the issue/feature this PR addresses: 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#230250 Forward-Port-Of: odoo/odoo#228117
Invoices can no longer use SEPA direct debit mandates that have already been closed. This helps avoid invalid payment selections and ensures only currently active mandates are available for customer payments.
Original PR description
**The issue:** It's currently possible to create select SEPA payment for an invoice when the mandate is "closed" instead of "revoked". **Cause:** The search for usable mandates, is not taking into consideration the "closed" state and looking for non draft/revoked. **Fix:** Changed the query to look specifically for "active" mandate. opw-5048748 Forward-Port-Of: odoo/enterprise#96381
Appointment video call links now use the website linked to the appointment type, so customers are sent to the correct domain. This matters for businesses running multiple company websites because booking communications will no longer point to the wrong site.
Original PR description
**Steps to reproduce:** - Create 2 companies - Create a website for each company - Set a custom website domain on the second one - Create appointement type for each website - Create an appointement on both websites - The link created for the video call has the wrong base for one of them **Issue:** Appointment `get_base_url` finds its base_url without considering the current website. **Fix:** Compute the base_url according to the appointement type to ensure the current website is taken into account. opw-4880715
The Gelato sales integration now avoids creating duplicate print orders when a sale confirmation is retried during payment processing or other concurrent updates. Orders are first created as drafts and are only confirmed after the sale transaction succeeds, reducing the risk of duplicate fulfillment and customer service issues.
Original PR description
In case on a concurrent update happen in the same transaction as the sale order confirmation (was observed during payment transaction post-processing), we may currently create duplicate Gelato orders on each retry. This commit avoid duplicate order creation by splitting the Gelato order creation in two steps: - during the sale order confirmation we create a 'draft' order on Gelato - on post-commit/post-rollback we either try to confirm or delete the Gelato draft order. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Printing Kanban views with many records now handles page breaks more reliably. This prevents cards from being cut off at the top of later printed pages, making printed reports easier to read and use.
Original PR description
This commit fixes the kanban view print to better handle the page break. The issue was caused by the flex layout: when printing, heights often misbehave on the last row or at page breaks. task-4630646 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Cashiers can now enter their password using a physical keyboard when the password popup is shown in Point of Sale. This fixes a usability issue where staff had to rely only on on-screen number buttons, making cashier login faster and more convenient.
Original PR description
Before this commit, when the NumberPopup was open (for example, when entering the cashier password), the keyboard input was ignored because the overlay manager blocked all keyboard events while any popup was active. As a result, it was only possible to use the on-screen number buttons. After this commit, the keyboard input is allowed when a NumberPopup is open, enabling users to type the password directly using the keyboard. opw-5152235 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents pricelist rules from being saved when they refer to another pricelist but no source pricelist is selected. It avoids incorrect price calculations from records created outside the standard screens, such as through custom views or integrations.
Original PR description
Before this commit, only a view-level required attribute ensured that pricelist items with `base=='pricelist'` have a `base_pricelist_id` set. Creating pricelist items from a custom view or the API or the shell could result in missing values for this field, causing `_compute_base_price` to incorrectly assume that `base=='list_price'`` This commit introduces a new constraint ensuring any pricelist whose price is `base`d on an "Other Pricelist" has a value for `base_pricelist_id`. Note: in the views, `base_pricelist_id` is required if `compute_price == 'formula' and base == 'pricelist'` but the first condition is not neeeded because `_onchange_compute_price` sets `base` to `'list_price'` when `compute_price!='formula'` --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
An unstable automated test for the website shop was removed from Odoo 18 versions because it was causing random failures in the validation system. This helps keep release checks reliable without changing customer-facing website shop behavior.
Original PR description
Versions -------- - 18.0 - saas-18.2 - saas-18.3 - saas-18.4 Issue ----- The `test_toggle_contact_us_button_visibility` causes random errors in runbot. Cause ----- Unsure, but with commit 26d22fc975e3f removing jQuery from `VariantMixin`, the random error no longer seems to pop up. Solution -------- Remove the test for versions before 19.0. runbot-145473
Grouping records by Many2many fields now follows the same visibility rules as the field widget, including filters and archived-record settings. This prevents users from seeing unexpected groups for records that should be hidden, improving consistency in list and reporting views.
Original PR description
Previously, grouping by a Many2many field did not consider either the field's domain or the field's context (that often contains `'active_test': False`). This caused inconsistent behavior in the web client: users would see groups related to archived Many2many records, even though these records weren't visible in the Many2many widget itself. This commit resolves the inconsistency by ensuring that both the field's domain and the field's context are respected when grouping by Many2many fields. backport of b0f3850aab0578791535e8a802e0ffd7790f3b45 task-4808679
Scanning a package in the barcode app now follows the Delivery setting that blocks extra products, preventing unintended items from being added to an order. The update also lets users remove package lines when moving entire packages, reducing mistakes during warehouse operations.
Original PR description
## Issue 1: "Allow Extra Products" option ignored for packages ### Steps to reproduce: - In the settings enable "Packages" - Go to Inventory > Configuration > Warehouse Management > Operation Types -…
## Issue 1: "Allow Extra Products" option ignored for packages
### Steps to reproduce:
- In the settings enable "Packages"
- Go to Inventory > Configuration > Warehouse Management > Operation Types
- Disable "Allow Extra Products" on the "Delivery" operation type
- Create two storable product P1, P2 and add on hand quantities
- 10 x P1 in a package PACK01
- 10 x P2 in a package PACK02
- Create and confirm a delivery for 10 unit of P1
- Open your delivery from the barcode app
- Scan PACK02
#### > The content of PACK02 is added to the delivery even thought it contains extra products.
### Cause of the issue:
The check for extra products is only applied when scanning individual products but is bypassed by package scan. To be more precise, the `barcode_allow_extra_product` option is checked in the public method `createNewLine`:
https://github.com/odoo/enterprise/blob/331442fd9cbd59d542432b2237299df9497ce241/stock_barcode/static/src/models/barcode_picking_model.js#L59-L80
While this method is called at new line creation when a product is scanned, scanning a package will add new lines during the `_processPackage` adn bypasses the rest of the `_processBarcode`:
https://github.com/odoo/enterprise/blob/331442fd9cbd59d542432b2237299df9497ce241/stock_barcode/static/src/models/barcode_model.js#L1261-L1267
The issue being that the `__processPackage` does not check the `barcode_allow_extra_product` option and creates its new lines via the private `_createNewLine` call:
https://github.com/odoo/enterprise/blob/331442fd9cbd59d542432b2237299df9497ce241/stock_barcode/static/src/models/barcode_picking_model.js#L1564-L1565
https://github.com/odoo/enterprise/blob/331442fd9cbd59d542432b2237299df9497ce241/stock_barcode/static/src/models/barcode_picking_model.js#L1655-L1667
https://github.com/odoo/enterprise/blob/331442fd9cbd59d542432b2237299df9497ce241/stock_barcode/static/src/models/barcode_picking_model.js#L1671
### Fix:
Since scanning a package is expected to add all its content to the picking, and since a package can not be split among two locations, it is necessary to check in advance if any product of its content is extra and avoid any update in this case.
## Issue 2: impossibility of package line removal
### State of the art:
There is currently no option to remove a package line from the barcode. In particular, once the option `show_entire_packs`(Move Entire Packages) is enabled on a picking type, you can not remove the package line once generated by a scan.
#### Steps to reproduce:
- In the settings enable "Packages"
- Go to Inventory > Configuration > Warehoue Management > Operation Types
- Enable "Move Entire Packages" on the "Delivery" operation type
- Create a storable product and add on hand quanties:
- 10 units in package PACK01
- 10 units in package PACK02
- Create and confirm a delivery for PACK01 (in the package lines)
- Open your delivery from the barcode app
- Scan PACK02
#### > The new line associated to PACK02 can not be removed by any mean
opw-4863621
opw-5080637Fixes an accounting display issue where cash basis journal item lines could show '/' instead of the actual posted journal entry name. This ensures users see the correct journal entry reference in accounting lists, reducing confusion during reconciliation and review.
Original PR description
This is the backport of https://github.com/odoo/odoo/pull/225558/commits/2373808e9768afa5a1a56dbd1491ebd13da3f88a Issue: In the list view of Journal Items, cash basis lines show a `move_name` of '/'…
This is the backport of https://github.com/odoo/odoo/pull/225558/commits/2373808e9768afa5a1a56dbd1491ebd13da3f88a Issue: In the list view of Journal Items, cash basis lines show a `move_name` of '/' event if the move is posted and has a name. Steps to reproduce: - Activate Cash Basis in the accounting settings - Create a tax with "Tax Exigibility" set "Based on Payment" - Set the "Cash Basis Transition Account" to "Current Assets" - Activate reconciliation on "Current Assets" - Create an invoice with this tax, confirm - In the dashboard, click on Bank and new - Set the name of the invoice as the label, and the amount of the invoice as amount - Save & Close - Go in Accounting > Transactions > Journal Items - The lines created for the cah basis entry display '/' in the column "Journal Entry" Cause: This issue is linked to the order in which things are done in `_set_next_sequence`: the fields triggered by the sequence field are added in `self.env.transaction.tocompute` then the sequence is computed and assigned. When `_set_next_sequence()` is called from [`_create_tax_cash_basis_moves()`](https://github.com/odoo/odoo/blob/849e4a87178d8c8588b75e3f7d9073d6a78326f9/addons/account/models/account_partial_reconcile.py#L649-L654) this order is problematic as `account.move.line.move_name` will be computed and removed from `self.env.transaction.tocompute`. So it will not be updated when the sequence is assigned in `account.move.name`. The callstack is something like this: - `_set_next_sequence()` calls `_locked_increment()` to compute the sequence - `_locked_increment()` calls `flush_recordset()` which will call `_recompute_recordset()` to recompute all fields - `_compute_invoice_date_due()` needs the field `needed_terms` triggering `_compute_needed_terms()` - `_compute_needed_terms()` needs `invoice_line_ids` - the fetch on `account.move.line` is ordered by `move_name` - So `_compute_related()` is triggered for `move_name` and `account.move.line.move_name` is removed from `self.env.transaction.tocompute` Then `_locked_increment()` returns the sequence, it gets assigned as the move name and `move_name` is never updated because it's not in `self.env.transaction.tocompute`. This doesn't occur in other flows (like calling `action_post()`) because the value of `needed_terms` is read from the cache. Solution: Swap the order in which things are done in `_set_next_sequence()`: first compute and assign the sequence and then add the triggered fields in `self.env.transaction.tocompute` so that they are computed afterwards. It seems more logic that way: we change the `_sequence_field` then mark all fields that will be impacted in `tocompute`. Enterprise PR - https://github.com/odoo/enterprise/pull/96721 opw-4747878
Cash basis journal item lines now show the correct journal entry name instead of a placeholder slash after payments are reconciled. This improves accounting list accuracy and reduces confusion when reviewing posted cash basis entries.
Original PR description
This is the backport of https://github.com/odoo/enterprise/pull/94111/commits/e379cf04cc1aa97d28d73566daadad193310ae9a Issue: In the list view of Journal Items, cash basis lines show a `move_name` of…
This is the backport of https://github.com/odoo/enterprise/pull/94111/commits/e379cf04cc1aa97d28d73566daadad193310ae9a Issue: In the list view of Journal Items, cash basis lines show a `move_name` of '/' event if the move is posted and has a name. Steps to reproduce: - Activate Cash Basis in the accounting settings - Create a tax with "Tax Exigibility" set "Based on Payment" - Set the "Cash Basis Transition Account" to "Current Assets" - Activate reconciliation on "Current Assets" - Create an invoice with this tax, confirm - In the dashboard, click on Bank and new - Set the name of the invoice as the label, and the amount of the invoice as amount - Save & Close - Go in Accounting > Transactions > Journal Items - The lines created for the cah basis entry display '/' in the column "Journal Entry" Cause: This issue is linked to the order in which things are done in `_set_next_sequence`: the fields triggered by the sequence field are added in `self.env.transaction.tocompute` then the sequence is computed and assigned. When `_set_next_sequence()` is called from [`_create_tax_cash_basis_moves()`](https://github.com/odoo/odoo/blob/849e4a87178d8c8588b75e3f7d9073d6a78326f9/addons/account/models/account_partial_reconcile.py#L649-L654) this order is problematic as `account.move.line.move_name` will be computed and removed from `self.env.transaction.tocompute`. So it will not be updated when the sequence is assigned in `account.move.name`. The callstack is something like this: - `_set_next_sequence()` calls `_locked_increment()` to compute the sequence - `_locked_increment()` calls `flush_recordset()` which will call `_recompute_recordset()` to recompute all fields - `_compute_invoice_date_due()` needs the field `needed_terms` triggering `_compute_needed_terms()` - `_compute_needed_terms()` needs `invoice_line_ids` - the fetch on `account.move.line` is ordered by `move_name` - So `_compute_related()` is triggered for `move_name` and `account.move.line.move_name` is removed from `self.env.transaction.tocompute` Then `_locked_increment()` returns the sequence, it gets assigned as the move name and `move_name` is never updated because it's not in `self.env.transaction.tocompute`. This doesn't occur in other flows (like calling `action_post()`) because the value of `needed_terms` is read from the cache. Solution: Swap the order in which things are done in `_set_next_sequence()`: first compute and assign the sequence and then add the triggered fields in `self.env.transaction.tocompute` so that they are computed afterwards. It seems more logic that way: we change the `_sequence_field` then mark all fields that will be impacted in `tocompute`. Community PR - https://github.com/odoo/odoo/pull/230751 opw-4747878
This fix prevents an error that could occur when users hide a rich text field while newly added images are still being processed. It makes form editing more reliable and avoids interruptions before a record is saved.
Original PR description
**PROBLEM** When hiding a HtmlField field from a view with pending images in it, there is a traceback. **STEP TO REPRODUCE** 1. Using studio, create a HtmlField on the view of your choice. 2. Add a…
**PROBLEM** When hiding a HtmlField field from a view with pending images in it, there is a traceback. **STEP TO REPRODUCE** 1. Using studio, create a HtmlField on the view of your choice. 2. Add a checkbox next to it, and link the HtmlField visibility to the button. 3. Add a image to the HtmlField (don't save the record !) 4. Hide the HtmlField using the checkbox, there should be a traceback. (if not, try with a bigger image). **CAUSE** commitChanges() will try to retrieve the field value to commit by looking at the related element in the DOM. Before retrieving this value, we call savePendingImages() to save the new images added to the HtmlField. https://github.com/odoo/odoo/blob/1416aad902a97ce56aaecc2aadc4dd9f7814ee53/addons/html_editor/static/src/fields/html_field.js#L159-L162 This introduces a delay, during which the DOM element could be destroyed. **FIX** We don't call commitChanges() in OnBlur(). Instead, we cache the new value in a property of HtmlField called `newValue` when `OnChanges()` is called. Inside OnBlur(), we save the pending images by directly calling `savePendingImages()` and we commit the new value by calling `updateValue(this.newValue)` opw-5061820
This update prevents Chrome on iOS from automatically modifying page text in a way that could disrupt Odoo's web interface. It helps keep screens rendering reliably for users on affected Chrome iOS versions.
Original PR description
Chrome iOS wraps some text nodes (like measures, email...) with a `<chrome_annotation>` tag, which breaks OWL rendering. This commit works around it by adding the (undocumented) `<meta name="chrome"…
Chrome iOS wraps some text nodes (like measures, email...) with a `<chrome_annotation>` tag, which breaks OWL rendering. This commit works around it by adding the (undocumented) `<meta name="chrome" content="nointentdetection">` tag to disable this Chrome behavior. The tag has to be set before the onDOMContentLoaded event to be taken into account. Note: Looks like this behavior was present in Chrome iOS 127 and disabled afterward (because it already had issues) but it appeared again in version 140-141. References: - https://issues.chromium.org/issues/353650041 - https://issues.chromium.org/issues/388718411 - https://stackoverflow.com/questions/78207646/how-do-i-disable-chrome-annotation-tags - https://stackoverflow.com/questions/78575970/prevent-auto-detection-of-phone-numbers-in-chrome-mobile - https://stackoverflow.com/questions/78725191/stop-chrome-ios-auto-detecting-numbers-followed-by-letter-m-as-metre-units-an - https://github.com/solidjs/solid/issues/2235 opw-4969197 Forward-Port-Of: odoo/odoo#230081
Adyen payment processing now sends the extra order information required by some payment methods, such as Klarna. This helps customers complete transactions that previously could fail because required country and line item details were missing.
Original PR description
Some payment methods eg. Klarna require 'country code' and 'line items' in order to process the transaction. opw-5077617 Forward-Port-Of: odoo/odoo#230292
An unused section in the Swiss payroll ELM employee screen is now hidden. This keeps the interface cleaner and reduces confusion for payroll users without changing payroll processing behavior.
This fix prevents the page from crashing when users press Backspace after applying formatting inside a list. It keeps editing stable by correctly turning the list item into normal text content as expected.
Original PR description
### Steps to reproduce: - Open the To-Do app. - Create a list (e.g., using /list). - Write some text and press Enter. - Press Ctrl + B to bold the text. - Press Backspace. - Observe that the cursor moves to the previous list instead of creating a <p> tag, causing the page to crash. ### Description of the issue/feature this PR addresses: - The `<p>` tag contains content `<p><strong></strong></p>`. - The `isVisible` function returns false for this content, causing the `<p>` tag to not be inserted into the DOM. - When cursor is restored, traceback occurs because selection is not in editor. ### Desired behavior after PR is merged: - Backspace now converts the `<li>` element into a `<p>` tag without traceback. task-4397159
Fixes an issue in the HTML editor where power buttons could disappear after a user undid typed content. This keeps editing controls visible and reduces confusion while using undo in the editor.
Original PR description
Steps to Reproduce: 1. Insert some text into the editor (e.g., type "a"). 2. Press `Ctrl + Z` to undo the insertion. 3. Observe that the power buttons are not visible. Description of the issue/feature this PR addresses: Power buttons were not visible after pressing Ctrl+Z (undo). Desired behavior after PR is merged: Trigger `updatePowerButtons` when the `CONTENT_UPDATED` command is dispatched, ensuring that the power buttons are updated and made visible. task-4309762
Documentation and clarification updates
This update adds Tomasz Walter to Camptocamp's corporate contributor license agreement records. It confirms the contributor is covered for legal contribution purposes, with no effect on product functionality or users.
Original PR description
Please add me as a member of the Camptocamp organization. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
3 changes
Enhancements to existing features
Peruvian customer records no longer require a ZIP code. This makes customer data entry easier and better reflects local addressing practices, where ZIP codes are not commonly used.
Original PR description
As ZIP codes are not widely used in Peru, the requirement for a ZIP code to be provided for a Peruvian customer should not be present. task-5012593 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
This fixes an error that could prevent users from opening equipment records when a completed maintenance request had missing repair dates due to customization or manual override. The system now handles those unusual missing values gracefully and keeps the equipment view accessible.
Original PR description
Using standard Odoo, `maintenance.request.close_date` should never be `False` when its `stage_id == 'done'`, but customizations/manual overrides allow users to force it to be `False` and block them…
Using standard Odoo, `maintenance.request.close_date` should never be `False` when its `stage_id == 'done'`, but customizations/manual overrides allow users to force it to be `False` and block them from opening equipment views that displayed fields that depended on it. Steps to reproduce: - Create new maintenance request for an equipment - Put maintenance request into a `maintenance.stage` where `done=True` (e.g. "Repaired") - Force `close_date` to not be `readonly` in form view + set it to `False` - Try to open the assigned equipment's form view Expected result: Form view opens without issue Actual result: `unsupported operand type(s) for -: 'bool' and 'datetime.date'` Issue was due to `mttr` calculation in `_compute_maintenance_request` not expecting `close_date` to be `False`. Since we want the request to still be considered for the rest of the compute, we count its "Time to Repair" as 0 in this case since we cannot use infinity in this case. Additionally, we also gracefully fail in the same way in case `request_date` is also forced to be `False` since it is not a mandatory field and can cause the same issue. Description of the issue/feature this PR addresses: 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
This fixes an issue in the website/editor tools where text converted into a button-style link did not visually keep the selected font size. Users can now format larger or smaller text as a button and see the expected size, improving consistency when editing content.
Original PR description
### Steps to reproduce: - Go to To-Do. - Type some text and increase its font size to 80. - Select the text and convert it into a button. - The font size appears as 80 in the toolbar but is not visually reflected. ### Description of the issue/feature this PR addresses: - Links with `.btn` class inside elements styled with font-size classes (e.g., display-3-fs) did not inherit the parent's font size. - The `.btn` class's own font-size definition overrode the expected styling. ### Desired behavior after PR is merged: - `.btn` links now use `font-size: inherit`, allowing them to respect and adopt their parent element’s font size. task-4731416 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr