Daily updates from Odoo
Navigate
Branch
Tuesday, April 21, 2026
211 changes
20 changes
Enhancements to existing features
This change speeds up the validation of stock transfers that involve many move lines by grouping database actions instead of processing them one by one. It reduces delays and helps avoid timeouts on very large deliveries, improving reliability for busy operations.
Original PR description
Before this PR, `button_validate` was using a `write()` call per matched stock move. On every `write()` there is a Command.create and Command.delete which is resulting in N database round-trips for…
Before this PR, `button_validate` was using a `write()` call per matched stock move. On every `write()` there is a Command.create and Command.delete which is resulting in N database round-trips for the unlinks and N for the creates, followed by N separate `_apply_putaway_strategy()` calls. This is problematic for pickings with many move_ids. This PR attempts to accumulates all move lines to delete and to create. Then performs a single `unlink()` and `create()`, followed by a single `_apply_putaway_strategy()` for all pickings. Unlink is done using `.sudo()` to preserve the superuser context that was previously inherited implicitly through the `purchase_order.sudo().search` that produced the recordset used to obtain the `receipt_move`(s). Benchmarks: | No. move lines in delivery | Before | After | | -------------------------- | ------- | ----- | | 7579 | Timeout | < 200 s | opw-5826905 Forward-Port-Of: odoo/enterprise#110587 Forward-Port-Of: odoo/enterprise#110153
Resolved issues and error corrections
Imported invoices could show the wrong tax amount when an electronic invoice contained multiple tax subtotal sections. The fix ensures Odoo only uses the tax total tied to the invoice’s own currency, which keeps imported amounts accurate and avoids reporting errors.
Original PR description
When the EDI document has multiple document-level TaxSubtotal nodes (which can happen under Japanese PINT rules), `_correct_invoice_tax_amount` erroneously amends the tax total, and the imported invoice gets the wrong value. In BIS3 EDI, two TaxTotal nodes are created if the document currency and the company currency are different. The TaxTotal node in the company currency is generally for tax reporting purposes. Up until now, `_correct_invoice_tax_amount` worked correctly because base BIS3 EDI requires TaxTotal nodes with the document currency to have a TaxSubtotal node. This commit fixes the bug by only correcting the taxes based on the TaxTotal node that has a currency ID equal to the document currency. Note 1: This fix is targeting 19.0 and above because `l10n_jp_ubl_pint` and other PINT modules are available starting from 19.0. Forward-Port-Of: odoo/odoo#258301
Searching for people to invite to a channel is now much faster. The system avoids extra work behind the scenes and shows only as many results as can fit on screen, improving responsiveness for users.
Original PR description
Since [1], the check in `search_for_channel_invite` that restricted the search to internal users was removed. As a result, the dataset to process has exploded and the query is very slow. Moreover,…
Since [1], the check in `search_for_channel_invite` that restricted the search to internal users was removed. As a result, the dataset to process has exploded and the query is very slow. Moreover, the method is ordering on `LOWER(name)` which is not indexed, and another query is done to count the total results, which slows down the process even more. This PR fixes those issues by: - Removing the `LOWER` ordering. Ordering in a case sensitive fashion is not that big of a deal anyway. - Removing the count query, fetching one more partner in the search is enough to know if there are more results, executing the same query twice is overkill. - Reducing the number of partner returned: currently 30, but there isn't enough space to display them anyway. task-4526176 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 change prevents an error when opening a BoM Overview for a company that does not yet have a warehouse configured. Instead of failing, the overview now shows product availability as unavailable until a warehouse is set up. This makes the feature safer to use in newly created companies and avoids a blocking error.
Original PR description
**Steps to Reproduce:** - Install MRP module. - Create a new company and switch to it. - Create a new BoM. - Click on the "BoM Overview" smart button. **Error:** `IndexError - list index out of range` **Cause:** When a new company is created, no warehouse is automatically generated for it. If no warehouse is configured for the company, the list is empty, causing an error. **Fix:** This commit raises a redirection warning if no warehouse is linked with the company. sentry-7286332859 Forward-Port-Of: odoo/odoo#250602
This update prevents an error that could appear when users remove an attachment from a scheduled chat message. It makes the scheduled message editor behave correctly and avoids an unexpected traceback during message editing.
Original PR description
scheduled message editor Problem: When editing a scheduled chatter message, removing an attachment raises a traceback. Cause: `fullComposerBus` is available in the `Composer` environment but not in `ScheduledMessage`. The code assumed its presence and attempted to use it unconditionally. Solution: Check whether `fullComposerBus` exists in `env` before using it. Steps to reproduce: - Add a log note. - Open the full Composer. - Add an attachment. - Schedule the message. - Save. - Edit the scheduled message. - Remove the attachment from the attachments list. - Observe a traceback. opw-6098302 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258839
When users change fields in the holiday request pop-up, those updated values are now saved correctly. This prevents users from losing edits and makes request handling more reliable.
When sending invoices by email, extra attached reports now use the name configured on the report instead of being renamed with a default pattern. This makes emailed documents easier to recognize and ensures customer-facing PDFs match the business’s chosen naming.
Original PR description
When sending an invoice by email template, dynamic report attachments do not use their configured Printed Report Name. Instead, they fall back to a default naming pattern (e.g. report name + invoice…
When sending an invoice by email template, dynamic report attachments do not use their configured Printed Report Name. Instead, they fall back to a default naming pattern (e.g. report name + invoice number). This is due to a difference in flow: sales use the standard mail.compose.message wizard, which correctly applies each report’s print_report_name, while invoices use the dedicated account.move.send flow. In this flow, dynamic report filenames are not computed from the report itself. To fix this, the send flow is updated so _get_placeholder_mail_template_dynamic_attachments_data computes the filename from each dynamic report. When a print_report_name is defined, it is used. Otherwise, the previous fallback behavior is preserved. The fix will ensure extra dynamic reports follow their configured printed name. Steps to reproduce: 1. Go to Settings > Technical > Reporting > Reports and duplicate the standard Invoice report. 2. In the duplicated report, set a custom value in Printed Report Name (e.g. 'CUSTOM_NAME_TEST'). 3. Go to Settings > Technical > Email > Templates and open “Invoice: Sending”. 4. Add the duplicated report under Dynamic Reports. 5. Create a customer invoice and confirm it. 3. Click Send (or Send & Print) to open the email preview. Related Ticket: opw-6058716 Forward-Port-Of: odoo/odoo#259975 Forward-Port-Of: odoo/odoo#259267
This update makes sure retried tests keep track of the latest test instance instead of reusing an older one. That helps avoid issues when the system opens a test cursor, improving the reliability of automated test runs.
Original PR description
When a test is retried, the current_test variable was not updated to the new test instance, which could lead to issues when opening a test cursor. This commit ensures that current_test is updated on each retry attempt. While there update the condition to have a stronger check in this specific case since test equality only uses test name Forward-Port-Of: odoo/odoo#260148
Preparation tickets now show the selected product variant for instant variants included in combo choices, instead of only showing the base product name. This helps kitchen and fulfillment teams identify the exact item ordered and reduces preparation mistakes.
Original PR description
Before this commit, the preparation printer did not display the attribute value for an instant variant added inside a combo choice. This occurred because the attribute value was not properly set on the variant order line. Steps to reproduce: * Create a PoS product with multiple variants. * Create a combo product with a choice containing the variants. * Configure a preparation printer. * Open a PoS session and order the combo. * The printer displays only the base product name. opw-5949132 Forward-Port-Of: odoo/odoo#256981
The Barcode app no longer shows a location confirmation warning when users add a product that is not meant to be stored in inventory. This makes the workflow smoother and prevents unnecessary prompts during picking operations.
Original PR description
### Steps to reproduce: - In the settings: Enable Multi-Steps Routes - Create a non-storable product P - Go to the barcode app > Operations > Delivery Order > New - Click on "Add Product" > select P…
### Steps to reproduce: - In the settings: Enable Multi-Steps Routes - Create a non-storable product P - Go to the barcode app > Operations > Delivery Order > New - Click on "Add Product" > select P as product > Confirm #### > A confirmation dialog appears: Oops! It seems that this product is not located in WH/Stock. Do you confirm you picked from there? ### Expected behavior: Since the product is not storable it should not trigger the dialog ### Cause of the issue: The `is_storable` value of the `product.product` is not part of the data that can be used to check if we should check the quantity available in location since only the product id and name are directly available: https://github.com/odoo/enterprise/blob/77d3cc81be8aeb9f2e8bf57fb561fcae80f23b04/stock_barcode/static/src/js/stock_barcode_sml_form.js#L40-L70 However, since an rpc is already performed in order to determine the `qty_available` of the product, we might as well use that same rpc to recover the information and also avoid the dialog in case it is irrelevant. opw-6110655 Forward-Port-Of: odoo/enterprise#114173
This update prevents custom fields from being duplicated when the system reloads model definitions. It helps keep the application registry clean and avoids inconsistent behavior caused by leftover field entries.
Original PR description
When a custom (manual) field is related to a base field, it is added to `registry.field_setup_dependents`. However, these custom fields were not being cleaned up correctly, causing them to duplicate and leak during each model setup. This fix explicitly cleans these manual fields from `field_setup_dependents` inside `_add_manual_models()` when manual models are removed from the registry and the registry is being reloaded. Similar to https://github.com/odoo/odoo/pull/253377. Forward-Port-Of: odoo/odoo#259819
The editor now avoids showing formatting tools on parts of a page that cannot be edited. This prevents errors and unexpected changes when users work with locked content, while still allowing the toolbar for special editable elements like QWeb and icons.
Original PR description
Current behavior before PR: - Removing formatting on a contenteditable false element infinite loop when removing format. - The toolbar could appear even when the target element had contenteditable false Desired behavior after PR is merged: - Now,the toolbar no longer opens when the selected element is contenteditable false - The toolbar is now only shown for elements with contenteditable true, except for QWeb and icon elements, where it remains accessible. task-5265416 Forward-Port-Of: odoo/odoo#259453 Forward-Port-Of: odoo/odoo#231613
This change prevents a checkout failure that could happen when paying for a cart created with a company account whose contacts are linked to active users. Odoo now checks for active users on related contacts before archiving them, so payments can complete normally instead of stopping with an error.
Original PR description
Use case: - considering a database where `website_event_booth_sale` is installed - considering a company (ACME Corp., email: info@acme.example.net) and it's contact `Roger` (which have a valid user). then: - As an anonymous user, go to an event with some booth to register - register a booth and enter the company information (important: use the company email: info@acme.example.net, this way the cart is created the company as the `partner_id` !!!) - you are redirected to the cart - try to pay it, and upon payment you have the following error: ``` You cannot archive contacts linked to an active user. You first need to archive their associated user. ``` This commit ensure we also check if any contact of the commercial partner have any user before trying to archive them all. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#259451
When users click “View Profile” from a partner mention, the contact form now opens and the avatar popover closes at the same time. This avoids having two overlapping windows on screen and makes the experience cleaner and less confusing.
Original PR description
**Current behavior before PR:** Clicking on a partner mention opens the avatar card popover. When the **View Profile** button is clicked, the partner form view opens, but the popover remains visible. This happens because the popover opened via `onClickPartnerMention` uses the popover service directly, instead of the `usePopover` hook, which automatically closes the popover when the component is unmounted. **Desired behavior after PR is merged:** Clicking the **View Profile** button opens the partner form view and closes the avatar card popover. task-[6063906](https://www.odoo.com/odoo/project/1519/tasks/6063906) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#259959 Forward-Port-Of: odoo/odoo#256283
This fix prevents an error when users add multiple tags to a blog post cover and one of the tags has not been fully created yet. It improves the editing experience by avoiding a traceback and letting users continue selecting tags normally.
Original PR description
# How to reproduce - Go to a blog page and edit the Blog Post Cover - Add a tag - Try to add another one # The problem A traceback is shown # Why When adding a new record for a many 2 many relation, the framework ensure the user cannot create a record with a name that already exists via a name search. This commit (https://github.com/odoo/odoo/commit/3631757a4766bc59378bb975e01e115c92ef1dd4) changed the way the name search is done to add this domain to the request : ```py domain.push(["id", "not in", selectedIds]); ``` But selectedIds can contain strings in the case of uncreated records, which causes the SQL query to throw an error trying to match the model id with strings opw-5978305 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258451 Forward-Port-Of: odoo/odoo#251469
Access error messages now better identify the real reason a record is blocked. This prevents users from being misled into thinking a company access issue is the cause when another rule is actually responsible.
Original PR description
When accessing an archived record directly, if access is prevented by a record rule other than a multi-company global rule, the error message incorrectly reports that all rules are failing, suggesting a company issue even though it is not the actual cause. The problem is that when access is denied, the diagnostic method `_get_failing` is used to determine which rules are failing. This method performs several count queries with different rule domains. However, `active_test` is True by default, excluding archived records from the count, causing the rule evaluation to miss some records and incorrectly mark rules as failing. With this commit, `_get_failing` evaluates rules with `active_test=False`, ensuring that only actually failing rules are reported. Forward-Port-Of: odoo/odoo#259592 Forward-Port-Of: odoo/odoo#259344
When editing Arabic or other right-to-left content, the editor now matches the direction of the site being edited instead of the logged-in user’s interface language. This prevents text from appearing in the wrong alignment while writing and makes the editing experience consistent with the published page.
Original PR description
Steps to reproduce: ==================== 1. Install Arabic and set it as a website language 2. Log in as a user whose UI language is English 3. Edit a page / article in Arabic and type some text =>…
Steps to reproduce: ==================== 1. Install Arabic and set it as a website language 2. Log in as a user whose UI language is English 3. Edit a page / article in Arabic and type some text => Text rendered left-to-right in the editor Cause: ======= this was introduced after this change [1] When editing a website/article in a language whose direction differs from the logged-in user's UI language, text entered in the builder appeared in the wrong direction (e.g. writing in Arabic showed the caret/text aligned to the left instead of the right). Saving reverted the content to the correct direction, but the authoring experience was broken. The builder was initializing the editor's `direction` config from `localization.direction`, i.e. the *user's* UI locale, instead of the direction of the document being edited. As a result, an LTR admin editing an RTL site (or the reverse) got an editable whose `dir` attribute did not match the site. Solution: ========= Use the editable itself as the source of truth: if it carries the `.o_rtl` class (already used to set `isEditableRTL`), set `direction = "rtl"`, otherwise `"ltr"`. => Text now renders right-to-left, matching the site [1]:https://github.com/odoo/odoo/pull/256045/changes/0490b2229dba7e0cb4a58e5cf4d68772e5640697 opw-6109987 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#259541
The domain selector and expression editor now show numbers using the user’s local formatting, including the correct decimal and thousands separators. This makes values easier to read and reduces confusion, while keeping the underlying expression unchanged.
Original PR description
Before this commit, the domain selector (and expression editor) did not format numbers according to the localization parameters (decimal and thousands separators), while the parsing step did. After this commit, the value is displayed in the correct format to the user, while the expression remains unchanged. 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#259732 Forward-Port-Of: odoo/odoo#258287
Employee search in Attendance kiosk mode now handles certain department filters correctly and no longer crashes with an error. This makes it easier for staff to find employees at the kiosk without interruption.
Original PR description
**Steps to Reproduce:**
1. Install `hr_attendance` module with demo data.
2. Go to Attendances > Kiosk Mode > Identify Manually.
3. Select any department.
4. Try searching for an employee.
**Error:**
`ValueError - not enough values to unpack (expected 3, got 1)`
**Cause:**
The `employees_infos()` controller assumes that every item in the domain is a valid triplet (field, operator, value). However, the domain may also contain logical operators ('&'), which are not triplets. And then trying to unpack such entries leads to a ValueError.
**Fix:**
Add a validation to ensure the condition is a proper triplet before unpacking. Non-conforming entries (logical operators) are skipped.
sentry-7401444075
opw-6113268
Forward-Port-Of: odoo/odoo#258825This change fixes an issue where the color picker would close immediately after hovering a color on selected icons. It restores the intended behavior so users can change icon colors normally in the editor.
Original PR description
Commit [1] did already fix this problem, but commit [2] broke it again. This commit restores the condition that was removed by [2] but adapts it slightly in order to only take into account the direct children of the node, instead of any sub-node when checking for the presence of icons. Steps to reproduce: - Go to a "To do" note - Insert an icon with /media - Select the icon - Open the color picker - Hover a color => Color picker closed right away [1]: https://github.com/odoo/odoo/commit/1adfd9b9daf09c26ad642faf411574123110b9be [2]: https://github.com/odoo/odoo/commit/85688ffd11a3a988bf32c8c923a4628a89b57f87 task-6128069 Forward-Port-Of: odoo/odoo#260014 Forward-Port-Of: odoo/odoo#259644
7 changes
Resolved issues and error corrections
This fix prevents imported invoices from getting the wrong tax amount when an EDI document contains multiple tax subtotal sections. It now uses the tax totals linked to the invoice’s own currency, which avoids incorrect adjustments in supported international invoice formats.
Original PR description
When the EDI document has multiple document-level TaxSubtotal nodes (which can happen under Japanese PINT rules), `_correct_invoice_tax_amount` erroneously amends the tax total, and the imported invoice gets the wrong value. In BIS3 EDI, two TaxTotal nodes are created if the document currency and the company currency are different. The TaxTotal node in the company currency is generally for tax reporting purposes. Up until now, `_correct_invoice_tax_amount` worked correctly because base BIS3 EDI requires TaxTotal nodes with the document currency to have a TaxSubtotal node. This commit fixes the bug by only correcting the taxes based on the TaxTotal node that has a currency ID equal to the document currency. Note 1: This fix is targeting 19.0 and above because `l10n_jp_ubl_pint` and other PINT modules are available starting from 19.0. Forward-Port-Of: odoo/odoo#258301
Removing an attachment from a scheduled chatter message no longer causes an error. This makes editing scheduled messages more reliable and prevents users from losing time on an unexpected traceback.
Original PR description
scheduled message editor Problem: When editing a scheduled chatter message, removing an attachment raises a traceback. Cause: `fullComposerBus` is available in the `Composer` environment but not in `ScheduledMessage`. The code assumed its presence and attempted to use it unconditionally. Solution: Check whether `fullComposerBus` exists in `env` before using it. Steps to reproduce: - Add a log note. - Open the full Composer. - Add an attachment. - Schedule the message. - Save. - Edit the scheduled message. - Remove the attachment from the attachments list. - Observe a traceback. opw-6098302 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258839
This update prevents a crash that could happen when searching for an employee in Attendance kiosk mode. It makes the search logic ignore invalid internal conditions, so the kiosk stays usable instead of showing an error.
Original PR description
**Steps to Reproduce:**
1. Install `hr_attendance` module with demo data.
2. Go to Attendances > Kiosk Mode > Identify Manually.
3. Select any department.
4. Try searching for an employee.
**Error:**
`ValueError - not enough values to unpack (expected 3, got 1)`
**Cause:**
The `employees_infos()` controller assumes that every item in the domain is a valid triplet (field, operator, value). However, the domain may also contain logical operators ('&'), which are not triplets. And then trying to unpack such entries leads to a ValueError.
**Fix:**
Add a validation to ensure the condition is a proper triplet before unpacking. Non-conforming entries (logical operators) are skipped.
sentry-7401444075
opw-6113268
Forward-Port-Of: odoo/odoo#258825When customers receive invoices by email, any extra report attachments now keep the filename set in the report configuration. This avoids confusing default names and makes the emailed documents easier to identify.
Original PR description
When sending an invoice by email template, dynamic report attachments do not use their configured Printed Report Name. Instead, they fall back to a default naming pattern (e.g. report name + invoice…
When sending an invoice by email template, dynamic report attachments do not use their configured Printed Report Name. Instead, they fall back to a default naming pattern (e.g. report name + invoice number). This is due to a difference in flow: sales use the standard mail.compose.message wizard, which correctly applies each report’s print_report_name, while invoices use the dedicated account.move.send flow. In this flow, dynamic report filenames are not computed from the report itself. To fix this, the send flow is updated so _get_placeholder_mail_template_dynamic_attachments_data computes the filename from each dynamic report. When a print_report_name is defined, it is used. Otherwise, the previous fallback behavior is preserved. The fix will ensure extra dynamic reports follow their configured printed name. Steps to reproduce: 1. Go to Settings > Technical > Reporting > Reports and duplicate the standard Invoice report. 2. In the duplicated report, set a custom value in Printed Report Name (e.g. 'CUSTOM_NAME_TEST'). 3. Go to Settings > Technical > Email > Templates and open “Invoice: Sending”. 4. Add the duplicated report under Dynamic Reports. 5. Create a customer invoice and confirm it. 3. Click Send (or Send & Print) to open the email preview. Related Ticket: opw-6058716 Forward-Port-Of: odoo/odoo#259975 Forward-Port-Of: odoo/odoo#259267
Preparation printers now show the selected variant’s attribute value when a combo item uses an instant variant. This ensures kitchen or prep tickets display the correct product details instead of only the base product name, reducing confusion and order mistakes.
Original PR description
Before this commit, the preparation printer did not display the attribute value for an instant variant added inside a combo choice. This occurred because the attribute value was not properly set on the variant order line. Steps to reproduce: * Create a PoS product with multiple variants. * Create a combo product with a choice containing the variants. * Configure a preparation printer. * Open a PoS session and order the combo. * The printer displays only the base product name. opw-5949132 Forward-Port-Of: odoo/odoo#256981
The barcode app no longer shows a stock-location confirmation warning when adding products that are not meant to be stored in inventory. This prevents confusing prompts for users and makes delivery operations smoother.
Original PR description
### Steps to reproduce: - In the settings: Enable Multi-Steps Routes - Create a non-storable product P - Go to the barcode app > Operations > Delivery Order > New - Click on "Add Product" > select P…
### Steps to reproduce: - In the settings: Enable Multi-Steps Routes - Create a non-storable product P - Go to the barcode app > Operations > Delivery Order > New - Click on "Add Product" > select P as product > Confirm #### > A confirmation dialog appears: Oops! It seems that this product is not located in WH/Stock. Do you confirm you picked from there? ### Expected behavior: Since the product is not storable it should not trigger the dialog ### Cause of the issue: The `is_storable` value of the `product.product` is not part of the data that can be used to check if we should check the quantity available in location since only the product id and name are directly available: https://github.com/odoo/enterprise/blob/77d3cc81be8aeb9f2e8bf57fb561fcae80f23b04/stock_barcode/static/src/js/stock_barcode_sml_form.js#L40-L70 However, since an rpc is already performed in order to determine the `qty_available` of the product, we might as well use that same rpc to recover the information and also avoid the dialog in case it is irrelevant. opw-6110655 Forward-Port-Of: odoo/enterprise#114173
The domain selector and expression editor now display numbers using the user’s language and regional settings, such as decimal and thousands separators. This makes values easier to read and avoids confusion, while keeping the underlying expression unchanged.
Original PR description
Before this commit, the domain selector (and expression editor) did not format numbers according to the localization parameters (decimal and thousands separators), while the parsing step did. After this commit, the value is displayed in the correct format to the user, while the expression remains unchanged. 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#259732 Forward-Port-Of: odoo/odoo#258287
3 changes
Enhancements to existing features
This change speeds up the validation of pickings that contain many stock move lines by processing deletions and creations in batches instead of one by one. It reduces database round-trips and repeated follow-up work, which helps avoid timeouts on large deliveries and makes the process much faster for users.
Original PR description
Before this PR, `button_validate` was using a `write()` call per matched stock move. On every `write()` there is a Command.create and Command.delete which is resulting in N database round-trips for…
Before this PR, `button_validate` was using a `write()` call per matched stock move. On every `write()` there is a Command.create and Command.delete which is resulting in N database round-trips for the unlinks and N for the creates, followed by N separate `_apply_putaway_strategy()` calls. This is problematic for pickings with many move_ids. This PR attempts to accumulates all move lines to delete and to create. Then performs a single `unlink()` and `create()`, followed by a single `_apply_putaway_strategy()` for all pickings. Unlink is done using `.sudo()` to preserve the superuser context that was previously inherited implicitly through the `purchase_order.sudo().search` that produced the recordset used to obtain the `receipt_move`(s). Benchmarks: | No. move lines in delivery | Before | After | | -------------------------- | ------- | ----- | | 7579 | Timeout | < 200 s | opw-5826905 Forward-Port-Of: odoo/enterprise#110587 Forward-Port-Of: odoo/enterprise#110153
Resolved issues and error corrections
This update prevents an error when generating a W-2 CSV if the End Date field is left blank. If no end date is provided, the system now uses the current year so the file can still be created normally.
Original PR description
Currently, an error occurs when user tries to create a csv for w2 form with no end date defined. Steps to replicate: - Install `l10n_us_hr_payroll`. - Open Payroll > Reporting > W2 Report. - Click…
Currently, an error occurs when user tries to create a csv for w2 form with no end date defined.
Steps to replicate:
- Install `l10n_us_hr_payroll`.
- Open Payroll > Reporting > W2 Report.
- Click `New` > Remove value from `End Date` and click Generate.
Error:
```
File '/home/odoo/odoo19/enterprise/l10n_us_hr_payroll/models/l10n_us_w2.py', line 249, in action_generate_csv
self.csv_filename = f'form_w2_{self.date_end.year or date.today().year}.csv'
^^^^^^^^^^^^^^^^^^
AttributeError: 'bool' object has no attribute 'year'
```
Cause:
- As the user did not give any value for `End Date`, False was passed and when the execution flow reached [here] `self.end_date` is False and attempting to access `self.end_date.year` results in this error.
Solution:
- If we do not receive the `self.end_date` while generating the CSV, we will use the current year to generate the CSV file name.
[here]: https://github.com/odoo/enterprise/blob/01be8d6e9384bcb340559847d529b4887e073519/l10n_us_hr_payroll/models/l10n_us_w2.py#L248
No ID
Forward-Port-Of: odoo/enterprise#113408The Philippine SLSP report now places the 12% I tax amount under the correct category for purchases of other than capital goods. This fixes a reporting error so the figures shown in the tax report are more accurate for business filing.
Original PR description
Before this commit: - The amount of tax '12% I' is shown under 'Purchase of Capital Goods'. After this commit: - The amount of tax '12% I' is shown under 'Purchase of Other than Capital Goods'. task-6092566 Forward-Port-Of: odoo/enterprise#114242 Forward-Port-Of: odoo/enterprise#113810
10 changes
Enhancements to existing features
This change makes validating large stock movements much faster by processing move line removals and additions in batches instead of one by one. It reduces database calls and avoids repeated recalculations, which helps prevent timeouts on very large pickings.
Original PR description
Before this PR, `button_validate` was using a `write()` call per matched stock move. On every `write()` there is a Command.create and Command.delete which is resulting in N database round-trips for…
Before this PR, `button_validate` was using a `write()` call per matched stock move. On every `write()` there is a Command.create and Command.delete which is resulting in N database round-trips for the unlinks and N for the creates, followed by N separate `_apply_putaway_strategy()` calls. This is problematic for pickings with many move_ids. This PR attempts to accumulates all move lines to delete and to create. Then performs a single `unlink()` and `create()`, followed by a single `_apply_putaway_strategy()` for all pickings. Unlink is done using `.sudo()` to preserve the superuser context that was previously inherited implicitly through the `purchase_order.sudo().search` that produced the recordset used to obtain the `receipt_move`(s). Benchmarks: | No. move lines in delivery | Before | After | | -------------------------- | ------- | ----- | | 7579 | Timeout | < 200 s | opw-5826905 Forward-Port-Of: odoo/enterprise#110587 Forward-Port-Of: odoo/enterprise#110153
Resolved issues and error corrections
This update preserves the visual link styling in frozen and shared spreadsheets while keeping those links inactive for public viewers. It fixes a layout regression so dashboards continue to look consistent without exposing clickable internal links.
Original PR description
Since https://github.com/odoo/odoo/pull/166843, we remove the odoo links entirely from the spreadsheet on `freeze and share`. While it is true that the link is not usable from a public page (and that…
Since https://github.com/odoo/odoo/pull/166843, we remove the odoo links entirely from the spreadsheet on `freeze and share`. While it is true that the link is not usable from a public page (and that we'd somehow leak internal views information in the links), cells with links benefit from a specific style that is not hardcoded on the cell but rather computed based on their content. By removing the links from teh cells altogether, the greenish link style is lost on those cells and we actually rely on that style for our dashboards layout. To preserve the intension of https://github.com/odoo/odoo/pull/166843, we introduce a new type of links `neutralized` which allows the cell to be recognized as a link (and benefit from the style) while disabling their behaviour (no click). Task-6063301 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#260099 Forward-Port-Of: odoo/odoo#256357
The salary package test no longer depends on sample/demo records being present. It now creates its own test data, which makes the test more reliable in environments where demo data is disabled.
Original PR description
### Issue: - We were referring an existing XML ID in our test case, but that record is only created in demo data. ### Fix: - No need to use the demo record Id, instead, create a new record. Task: 6115762 Forward-Port-Of: odoo/enterprise#114312 Forward-Port-Of: odoo/enterprise#113622
Opening a shared helpdesk ticket link will no longer fail if the original message author has been deleted. The system now safely skips missing author details, preventing an error and keeping the ticket accessible to users.
Original PR description
Currently, an error occurs when opening a shared helpdesk ticket link if the message author has been deleted. **Steps to Reproduce:(v19.2)** - Install Contacts and Helpdesk modules (with demo data). - Log in as "**Marc Demo**". - Create a helpdesk ticket and send a message via the chatter. - Log in as **Admin**. - Delete the demo user and the related partner from Contacts. - Go to Helpdesk > All Tickets and open the created ticket. - Click "**Share Ticket**" and open the generated link in another browser. Error: `ValueError - Expected singleton: res.partner()` **Cause:** When the partner linked to `message.author_id` is deleted, the recordset becomes empty, which raises a singleton error. Fix: This commit ensures that the author details are only included when the message author exists. sentry-7337698605 Forward-Port-Of: odoo/odoo#259680 Forward-Port-Of: odoo/odoo#254175
Generating a W-2 CSV now works even when the report’s end date is left blank. If no end date is provided, the system uses the current year for the file name instead of failing, making the report more reliable for users.
Original PR description
Currently, an error occurs when user tries to create a csv for w2 form with no end date defined. Steps to replicate: - Install `l10n_us_hr_payroll`. - Open Payroll > Reporting > W2 Report. - Click…
Currently, an error occurs when user tries to create a csv for w2 form with no end date defined.
Steps to replicate:
- Install `l10n_us_hr_payroll`.
- Open Payroll > Reporting > W2 Report.
- Click `New` > Remove value from `End Date` and click Generate.
Error:
```
File '/home/odoo/odoo19/enterprise/l10n_us_hr_payroll/models/l10n_us_w2.py', line 249, in action_generate_csv
self.csv_filename = f'form_w2_{self.date_end.year or date.today().year}.csv'
^^^^^^^^^^^^^^^^^^
AttributeError: 'bool' object has no attribute 'year'
```
Cause:
- As the user did not give any value for `End Date`, False was passed and when the execution flow reached [here] `self.end_date` is False and attempting to access `self.end_date.year` results in this error.
Solution:
- If we do not receive the `self.end_date` while generating the CSV, we will use the current year to generate the CSV file name.
[here]: https://github.com/odoo/enterprise/blob/01be8d6e9384bcb340559847d529b4887e073519/l10n_us_hr_payroll/models/l10n_us_w2.py#L248
No ID
Forward-Port-Of: odoo/enterprise#113408This change prevents a crash when searching for an employee in Attendance kiosk mode. It makes the search more resilient by ignoring invalid filter items, so users can complete the lookup without encountering an error.
Original PR description
**Steps to Reproduce:**
1. Install `hr_attendance` module with demo data.
2. Go to Attendances > Kiosk Mode > Identify Manually.
3. Select any department.
4. Try searching for an employee.
**Error:**
`ValueError - not enough values to unpack (expected 3, got 1)`
**Cause:**
The `employees_infos()` controller assumes that every item in the domain is a valid triplet (field, operator, value). However, the domain may also contain logical operators ('&'), which are not triplets. And then trying to unpack such entries leads to a ValueError.
**Fix:**
Add a validation to ensure the condition is a proper triplet before unpacking. Non-conforming entries (logical operators) are skipped.
sentry-7401444075
opw-6113268
Forward-Port-Of: odoo/odoo#258825This change prevents the website cookie banner from saving an outdated value when it is closed indirectly, such as when opening the search panel. It helps avoid repeated cookie updates behind the scenes, which can otherwise cause server header size issues on some setups.
Original PR description
Steps to reproduce: - Set the cookies bar - Do not accept nor reject it - On the website homepage, click on the search button => Check the cookies: website_cookies_bar=true is set. `Popup`…
Steps to reproduce: - Set the cookies bar - Do not accept nor reject it - On the website homepage, click on the search button => Check the cookies: website_cookies_bar=true is set. `Popup` initializes `cookieValue` to `true` and writes it in `onHideModal()`. If the cookies bar is closed before any explicit consent choice, it can therefore recreate the legacy invalid value `website_cookies_bar=true`. This happens because the search button uses `data-bs-toggle="modal"`, which is controlled by Bootstrap: if it is opened while another bootstrap modal is already open on the page, the latter is hidden. This in turn calls the popup interaction's `onHideModal()`, which sets `website_cookies_bar=true` as `cookieValue` hasn't been changed. That value is later treated as invalid and cleared repeatedly during website rendering, which can accumulate duplicate `Set-Cookie` headers in the same response and lead to `upstream sent too big header` behind nginx. Avoid persisting that legacy value by returning early from `CookiesBar.onHideModal()` while `cookieValue` is still the inherited default `true`. opw-6037573 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Backport of: https://github.com/odoo/odoo/pull/258938 Forward-Port-Of: odoo/odoo#259717 Forward-Port-Of: odoo/odoo#259585
This fix makes sure attachments keep their originally provided file type information when they are uploaded to cloud storage. It prevents the system from re-detecting or changing the file type, which helps keep documents classified correctly and avoids inconsistencies for users.
Original PR description
When uploading an attachment to cloud storage via `_post_add_create(cloud_storage=True)`, the attachment's original `mimetype` is guessed even if we specify it. With this commit we explicitly preserve given mimetype Discovered during task-5153790 Forward-Port-Of: odoo/odoo#257979
This change blocks combo products from being selected directly in the mobile sales order line form. It prevents lines from being created with no price and no linked components, avoiding confusing and incomplete orders.
Original PR description
Combo products bypasses the configurator in mobile view, resulting in a 0-price line with no child lines. Exclude them via domain on the field. opw-5999935 Forward-Port-Of: odoo/odoo#256790
Access errors now point to the real rule blocking a record, instead of incorrectly implying a company-related problem. This makes troubleshooting clearer for users and reduces confusion when archived records are involved.
Original PR description
When accessing an archived record directly, if access is prevented by a record rule other than a multi-company global rule, the error message incorrectly reports that all rules are failing, suggesting a company issue even though it is not the actual cause. The problem is that when access is denied, the diagnostic method `_get_failing` is used to determine which rules are failing. This method performs several count queries with different rule domains. However, `active_test` is True by default, excluding archived records from the count, causing the rule evaluation to miss some records and incorrectly mark rules as failing. With this commit, `_get_failing` evaluates rules with `active_test=False`, ensuring that only actually failing rules are reported. Forward-Port-Of: odoo/odoo#259592 Forward-Port-Of: odoo/odoo#259344
2 changes
Resolved issues and error corrections
This fix ensures that when a manufacturing order is completed, the lot or batch manually chosen on component lines is kept instead of being replaced automatically. It prevents incorrect inventory consumption and helps users maintain traceability and accuracy in production records.
Original PR description
**Issue** Lots manually indicated on stock move lines can be overridden when producing a Manufacturing Order. **Steps to reproduce** - Create a storable product P tracked by lot - Create two lots for…
**Issue** Lots manually indicated on stock move lines can be overridden when producing a Manufacturing Order. **Steps to reproduce** - Create a storable product P tracked by lot - Create two lots for product P with 2 units each - Create a MO for a product consuming two units P and confirm it - On the raw move, manually set 1 unit for each lot - Click on "Produce All" - Check the move line associated to the product P -> 2 units associated to the first lot consumed instead of 1 unit each **Cause** While producing: https://github.com/odoo/odoo/blob/0fe2023dc57b6cc02bd399d3c8fc5d6c8ed6e833/addons/mrp/models/mrp_production.py#L2109-L2110 It sets the quantities: https://github.com/odoo/odoo/blob/0fe2023dc57b6cc02bd399d3c8fc5d6c8ed6e833/addons/mrp/models/mrp_production.py#L2246 This calls `_set_quantity_done_prepare_vals` with a qty of 2: https://github.com/odoo/odoo/blob/0fe2023dc57b6cc02bd399d3c8fc5d6c8ed6e833/addons/stock/models/stock_move.py#L2264 which will, for each move line: - Take the quantity indicated by move line: https://github.com/odoo/odoo/blob/0fe2023dc57b6cc02bd399d3c8fc5d6c8ed6e833/addons/stock/models/stock_move.py#L2274 https://github.com/odoo/odoo/blob/0fe2023dc57b6cc02bd399d3c8fc5d6c8ed6e833/addons/stock/models/stock_move.py#L2296-L2297 - Then take all the available quantity left for the lot associated to the move line: https://github.com/odoo/odoo/blob/0fe2023dc57b6cc02bd399d3c8fc5d6c8ed6e833/addons/stock/models/stock_move.py#L2302-L2309 https://github.com/odoo/odoo/blob/0fe2023dc57b6cc02bd399d3c8fc5d6c8ed6e833/addons/stock/models/stock_move.py#L2326-L2327 Instead of first taking all the quantity indicated by the move line, before checking available quantity **Solution** Assume that raw move lines being created in mrp without changing the producing quantity are manually created opw-5946439 Forward-Port-Of: odoo/enterprise#112837
The automatic reset of the user on subscription orders has been moved into a separate step so it can be overridden by customizations. This makes it easier for businesses to adapt subscription behavior without modifying core logic directly.
Original PR description
After this commit, the auto resetting of subscription user is overridable. Doing business logic in CRUD methods makes them impossible to bypass, by encapsulating the logic in another method, it would be easily overridable. Forward-Port-Of: odoo/enterprise#114055
43 changes
Enhancements to existing features
German point-of-sale certification now processes order changes one at a time, helping keep transactions consistent when items are updated or removed. The checkout experience is also less restrictive because missing ZIP or address details are handled automatically in the backend.
Original PR description
In this commit: ------------------- - We have added logic to execute API calls using a mutex for order updates (such as line updates and removals). This ensures that each update is processed (sequentially), allowing us to properly track and maintain order consistency. - We removed the ZIP and address validation on the UI since the backend already assigns default values if they are missing. So, there’s no need to restrict the user on the UI. task:5941742 Forward-Port-Of: odoo/enterprise#114090 Forward-Port-Of: odoo/enterprise#108694
Spreadsheet documents can now display large numbers using locale-specific digit grouping, such as the Indian numbering format. This makes numeric data easier to read and more familiar for users in regions that do not use standard thousands separators.
Original PR description
Some locales (eg. India) do not use standard international thousand grouping for large numbers, but group the first 3 numbers, then group the next numbers by 2. This commit adds the `digitGrouping` parameter to the locale to handle that behaviour. Task: [4829185](https://www.odoo.com/web#id=4829185&cids=1&menu_id=4720&action=333&active_id=2328&model=project.task&view_type=form)
Documents now shows a promotional Auto-Sort option in its cog menu so users can discover the feature even before the required AI Documents setup is available. Selecting it opens a Studio promotion dialog, clarifying that Auto-Sort is available when Studio is installed.
Original PR description
Purpose: ===================== Many users miss the Auto-Sort feature because it depends on the `ai_documents` module and is not visible when only the Documents module is installed. Specifications: ===================== - Add an Auto-Sort promo in the Documents cog menu. - The promo entry opens the Studio promotion dialog. - Auto-Sort is now available only when Studio is installed, as `ai_documents` depends on `web_studio`. Task-6004348
This update makes small improvements to the customer payment follow-up process, including cleaner reminder handling and minor efficiency updates. It should help accounting teams manage overdue invoice follow-ups more smoothly without changing the overall workflow.
Original PR description
As part of https://github.com/odoo/enterprise/commit/105d3bff49d486b8ecd943e77d635fe011b5e361, this commit introduces a few minor improvements in the follow-up logic and some small optimizations/cleanups. task-5241209
Signing templates can now let information entered by signers update the original Odoo records automatically. This reduces manual re-entry while protecting existing data by handling dates, HTML text, blank answers, and duplicate-field conflicts more safely.
Original PR description
Add an "Update values in Odoo" option that allows values entered during the signing process to update the original Odoo records. The sync process handles different data types and potential input issues. It parses localized date formats, formats text for HTML fields, and prevents data loss by ignoring blank fields or conflicting inputs if the document has duplicate fields. task-5951903
Users can now refresh deduplication, recycling, and field cleaning data for all rules from one cog menu action. This saves time by removing the need to open and update each rule individually.
Original PR description
Before: - User was not able to refresh deduplication, recycle, and field cleaning data for all rules at once. - To refresh data, user had to open each rule and update records manually. After: - Added a button in the cog menu to refresh deduplication, recycle, and field cleaning data for all rules at once. task-5864554
The POS printer setup screens have been adjusted so printer-specific information appears more appropriately for IoT and Italian fiscal printer use cases. This makes the configuration view clearer for users and helps avoid showing irrelevant fields in the wrong context.
Original PR description
In this commit: =============== * Adapted the main POS printer kanban view * Adjusted LNA field visibility using xpath in respective modules * Applied module-specific conditions for IoT and fiscal printers Task: https://github.com/odoo-dev/enterprise/commit/59461111fa18da8f84bfec4254dd00ccbe16e2d3 Related Comm. PR: https://github.com/odoo/odoo/pull/249447
The accounting reports module was updated to stop using an old tax return configuration check that has been removed from the system. This keeps enterprise reporting aligned with the main Odoo accounting changes and reduces the risk of errors from obsolete logic.
Original PR description
- In this commit, the _check_tax_return_configuration method is removed, so the usage of that method is removed See this pr for more info: https://github.com/odoo/odoo/pull/247216 Related Com PR: https://github.com/odoo/odoo/pull/260115 no-task
Manufacturing users can now view work order planning grouped by assigned employee, in addition to the existing production and work order views. This makes it easier for teams to balance workloads and understand who is scheduled for which tasks.
Original PR description
Right now the user has the options to plan by grouping by manufacturing order ('Planning by Production') and by work order ('Planning by Workorder'). Here we add a third option that groups work orders by assigned employees ('Planning by Employee').
Task ID: [4789893](https://www.odoo.com/odoo/project/966/tasks/4789893)Large inter-company delivery validations now process related stock move lines in batches instead of one by one. This reduces database work and prevents timeouts for deliveries with many lines, improving reliability for high-volume operations.
Original PR description
Before this PR, `button_validate` was using a `write()` call per matched stock move. On every `write()` there is a Command.create and Command.delete which is resulting in N database round-trips for…
Before this PR, `button_validate` was using a `write()` call per matched stock move. On every `write()` there is a Command.create and Command.delete which is resulting in N database round-trips for the unlinks and N for the creates, followed by N separate `_apply_putaway_strategy()` calls. This is problematic for pickings with many move_ids. This PR attempts to accumulates all move lines to delete and to create. Then performs a single `unlink()` and `create()`, followed by a single `_apply_putaway_strategy()` for all pickings. Unlink is done using `.sudo()` to preserve the superuser context that was previously inherited implicitly through the `purchase_order.sudo().search` that produced the recordset used to obtain the `receipt_move`(s). Benchmarks: | No. move lines in delivery | Before | After | | -------------------------- | ------- | ----- | | 7579 | Timeout | < 200 s | opw-5826905 Forward-Port-Of: odoo/enterprise#110587 Forward-Port-Of: odoo/enterprise#110153
Asset depreciation can now be configured by rate as well as by duration, giving businesses more flexibility to match accounting policies. Duration values can also include decimals, supporting more precise depreciation periods such as 27.5 or 31.5 years.
Original PR description
This commit extends the depreciation model to support depreciation calculation based on rate in addition to duration. Users can now configure depreciation using: - Duration-based depreciation - Rate-based depreciation on a yearly or monthly basis As the rate and duration are mutually exclusive and can be derived from each other, the system computes and stores the corresponding value based on the user input. Additionally, depreciation duration fields now support floating-point values instead of integers, allowing more precise configurations such as 27.5 or 31.5 years. task-5388816
The manufacturing barcode test coverage was updated to match the new default behavior where consumption warning prompts appear more broadly. This helps ensure production barcode workflows continue to be validated correctly as warning handling changes.
Original PR description
Consumption warning wizard now trigger by default for all manufacturing warnings, as `flexible` is no longer the default setting. We adapt some tests to explicitly create MOs with `flexible` consumption, make one use the `warning` default now that it's unaffected by the wizard under the new behaviour, and make a tour test the wizard through underconsumption. Task ID: [4603609](https://www.odoo.com/odoo/my-tasks/4603609), [4441090](https://www.odoo.com/odoo/my-tasks/4441090)
Project users can now print task schedules directly from the Gantt and Calendar views using the existing planning-style report. This makes it easier to share project timelines offline or in meetings without manually recreating schedule information.
Original PR description
In this commit, an action is added to print tasks. task-5139517
Spreadsheet documents now support regional digit grouping rules, such as the Indian numbering format. This makes large numbers display in a way that better matches local business expectations and reduces confusion for users in affected locales.
Original PR description
Some locales (eg. India) do not use standard international thousand grouping for large numbers, but group the first 3 numbers, then group the next numbers by 2. This commit adds the `digitGrouping` parameter to the locale to handle that behaviour. Task: 4829185
Shift templates can now include worksheet templates, so field service interventions created from a template automatically get the right worksheet. Shift templates also now carry their own company setting, improving consistency when projects and worksheet templates involve company-specific data.
Original PR description
This PR adds the possibility to set a worksheet template to a shift template.
This allows to automatically link a worksheet to the intervention when the intervention is created from a template.
We add this new field in the form, list, kanban and search views of the shift template.
We also add a company_id field to the shift template so it does not rely solely on the project's company, since the worksheet template also has a company.
task-5265153The order details popup now shows the delivery provider as the order origin for online food delivery orders. This makes it easier for staff to identify where an order came from and handle it correctly.
Original PR description
In this commit we extend the order details popup to display the delivery provider name as the origin for online food delivery orders. Task: 6143526
The Documents search panel now highlights the full header when the fold toggle is not shown, making the current focus clearer. Keyboard use of the fold control now only expands or collapses a category instead of also selecting it, reducing accidental actions.
Original PR description
Review the focus state when the `o_toggle_fold` is not visible so the entire header is highlighted. The `onKeyDown` on the toggle should just fold the category, not activate the entry followup task-6090140
Engineering Change Order updates for components and operations are now shown together in one printable report instead of two separate lists. This makes reviewing, sharing, and printing ECO changes easier for manufacturing and PLM users without changing the underlying data model.
Original PR description
Currently the ECO changes are in two different o2m. One for the components and the other for the operations. It would be great to have everything in a single place and easy to print. So the report is a good alternative. Instead of the 2 o2m fields, we add a stat button that redirect to this new report. There is no update on the model
Test coverage was updated to match recent behavior changes in partner commission and inter-company sales/purchase flows. This helps keep automated checks reliable and reduces the risk of future regressions, with no direct change expected for end users.
Original PR description
With this commit: --------------------------- Update the test cases to align with recent changes and ensure compatibility. Task ID: 5249083
When a rental order is created or updated from a planning shift, users will now be prompted to configure product options when the rental service has variants or optional products. This helps sales and rental teams complete orders more accurately without needing to manually find configuration steps later.
Original PR description
This commit allows to automatically open the product configuration when the Rental order is generated and open from a planning slot with a role set and linked to a rental service product. It also allows the same behavior when the user adds a shift to the last order and a new SOL is generated inside that rental order. Of course, this product configuration modal will only be opened if the new SOL added by planning.slot related has at least one product variant and/or one optional product. task-5000253
Belgian payroll now supports paid time off that employees could not take in the current year and need to carry into future years. Payroll teams can allocate, review, report, and pay these postponed days through the December payroll process, helping comply with Belgian rules from 2024 onward.
Original PR description
purpose: Since 2024, if you are unable to take a paid time off (your legal rights to time off), you can have them back for next year. - added fields for postponed paid time off in the paid time off…
purpose: Since 2024, if you are unable to take a paid time off (your legal rights to time off), you can have them back for next year. - added fields for postponed paid time off in the paid time off allocation wizard and allowed to generate them along with the main time off type - made postponed paid time off types unpaid in all belgian salary structures - added postponed paid time off (N-1, N-2) to the salary inputs in the holiday attest and added coresponding values in the report - made `alloc_employee_ids` stored in the paid time off allocation wizard so the values of time off to allocate and to postpone presist when changed. - added fields for postponed paid time off (N-1, N-2) to the holiday attests tab to be changed manually for new employees when they sign a new contract - moved the paid time off wizard to be accessible from the payrun of december (and made the reference period readonly that takes it's value from the year of the current payrun) - made the paid time off wizard consider allocations already existing and not fully create them again - added a salary rule to pay the allocated postponed N-1 time off in the december payslip task-id: 5429948
The pick up button now stays visible whenever products are linked to a field service shift, instead of disappearing when no immediate action is required. It also shows progress so users can easily see completed deliveries versus the total, helping them keep track of shift-related products at a glance.
Original PR description
The purpose of this commit is to modify the logic of the pick up button. Instead of hiding the button when no action is needed, we always display it if there is a move.line linked to the shift and we use a color code to indicate the state of the shift. That way, the user never lose sight of the total of products linked to the shift. task - 6063536
This update adjusts project and timesheet forecasting behavior so sales orders can be connected to projects more flexibly. Users can create multiple projects from the same sales order and attach projects even before the order is confirmed, while sales order lines are only filled once confirmation happens.
Original PR description
## Behavior Before Commit: - When a user selected "Create Project" on an SO that was not confirmed or already had a project, Odoo did not create the project and showed a warning. ## Expected Behavior After Commit: - Users can create multiple projects for the same SO. - Users can create a project regardless of the SO state. - Project SOLs remain empty when the SO is in draft. - Project SOLs are auto-filled when the SO is confirmed. - SO are no longer auto confirmed once the are connected to a project to make it possible for a draft SO tro be attached to a project. ## Task [5872486](https://www.odoo.com/odoo/project/4105/tasks/5872486) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Mexican localization now supports generating supplementary SAT trial balance reports in the format required by the tax authority. This helps businesses submit corrected or complementary balance sheets with the required reporting type, date information, and file naming.
Original PR description
This commit adds support for generating SAT (Mexican tax authority) trial balance reports in supplementary (complementary) format, as required by SAT specifications. Changes: - Add default value for…
This commit adds support for generating SAT (Mexican tax authority) trial balance reports in supplementary (complementary) format, as required by SAT specifications. Changes: - Add default value for submit_type in SAT XML generation to fix tests that call the method directly without going through the wizard - Add new tests for normal (TipoEnvio=N) and supplementary (TipoEnvio=C) formats - Verify that FechaModBal attribute is correctly included only for supplementary reports - Verify that filenames correctly use BN (normal) or BC (complementary) suffixes The SAT technical specification requires: - TipoEnvio="C" (complementary) for supplementary balance sheets - FechaModBal attribute (date of last accounting modification) when tipo is C - File naming convention: RFC+Year+Month+BN (normal) or BC (complementary) SAT technical specification: https://wwwmat.sat.gob.mx/cs/Satellite?blobcol=urldata&blobkey=id&blobtable=MungoBlobs&blobwhere=1461173762094&ssbinary=true In reference of PR https://github.com/odoo/enterprise/pull/111775 Ticket : https://www.odoo.com/es_ES/my/tasks/6025590 @mial-odoo @fmvt-odoo @moduon MT-14181
Payroll issue checks now skip records linked to archived employees, avoiding unnecessary or misleading warnings. This keeps payroll follow-up focused on active employees and improves accuracy in both standard and Belgian payroll workflows.
Original PR description
before we computed issues on employees, now it's moved to versions. we don't archive versions for archived employees, so we skip versions for archived employees task: 6128338
This update aligns several manufacturing, PLM, and rental sales components with the ministock approach. It removes an unnecessary sales-related demo setting, renames a product view for consistency, and adjusts rental test data so stock behavior is handled correctly.
Original PR description
- removing sale_delay from demo data since mrp_workorder is not dependent on the sale app. - renaming `view_template_property_form` to `product_template_form_view` - adapt a test product to ministock by making it storable task 5418128
Resolved issues and error corrections
This change reverses a previous update so payment tolerance is managed from each journal's settings again. This matters for accounting teams because tolerance behavior can be configured where journal-related payment and reconciliation options are handled, supporting clearer setup and upgrade consistency.
Original PR description
This reverts commit https://github.com/odoo/enterprise/commit/db1240d56f0311531bc01a68582f135221214cee see: https://github.com/odoo/upgrade/pull/9995
Belgian payroll contract templates now include the Dimona category, helping ensure the right reporting information is carried into employee contract versions. This reduces manual corrections and supports more accurate payroll administration for Belgian employers.
Original PR description
Forward-Port-Of: odoo/enterprise#114072
This fixes an issue where certain Gemini AI models could accidentally discard existing response settings when adding thinking-related options. The change helps keep AI outputs consistent and prevents configuration choices from being lost.
Original PR description
When using gemini-3-flash or gemini-3.1-pro models, the generationConfig dict is completely replaced by a new one that only contains the 'thinkingConfig'. This commit fixes the issue.
Fixed an issue where Timesheets Assistant suggestions from activity rules could appear as unmatched when a project was set without a specific task. These suggestions now stay linked to the configured project, making time entry recommendations clearer and easier to use.
Original PR description
Steps to Reproduce --- - Define an aw.rule with a project set without a task (false) - The rule regex matches a desktop app event (e.g. Discord window) - Open the Timesheets Assistant for the current…
Steps to Reproduce --- - Define an aw.rule with a project set without a task (false) - The rule regex matches a desktop app event (e.g. Discord window) - Open the Timesheets Assistant for the current day Current Behavior --- - The matched event has _res_model set to "project.task" and _res_id set to undefined, despite no task being configured on the rule - The suggestion appears as "Unmatched" in the assistant even though a project was correctly defined on the rule Expected Behavior --- - The matched event should have _res_model set to "project.project" and _res_id set to the rule's project_id - The suggestion should appear under the configured project Issue --- - In extractWatcherActivity(), both project_id and task_id blocks used != null as the guard condition - When task_id is false, false[0] is undefined, overwriting the correctly set _res_model i.e. "project.project" and _res_id from the project_id block with "project.task" and undefined _res_id Fix --- - Replace with a truthy check task - 6089410 Forward-Port-Of: odoo/enterprise#114172
This fix prevents time off calendar entries from appearing as suggested timesheet items, reducing confusion for employees recording work. It also makes Belgian payroll warning tests more stable by avoiding fixed dates that can cause false failures over time.
Original PR description
runbot error:- . https://runbot.odoo.com/odoo/runbot.build.error/242427/runbot.build.error/242427 . https://runbot.odoo.com/runbot/build/107183635 . Adjust the seniority and age below-scale warning tests to use relative dates instead of absolute ones task-6117457
The Timesheet Assistant now excludes calendar entries created by approved time off requests. This prevents employees from seeing vacation or leave records suggested as billable or work-related timesheet entries.
Original PR description
Steps to Reproduce:
---
1. Book a time off for any day via the Time Off app.
2. Open the Timesheets app for that same day.
3. Open the Timesheet Assistant suggestions panel.
Current Behavior:
---
The assistant surfaces the calendar event generated by the Time Off app as a
timesheet suggestion, e.g."Calendar Event - Mitchell Admin on Time Off : 1 days"
Expected Behavior:
---
Calendar events created by time off requests should not appear as
timesheet suggestions.
Issue:
---
The get_calendar_events getter in timesheet_grid_calendar fetched all calendar event
for the user without filtering by res_model, so time off meetings were included.
Fix:
---
Add ("res_model", "!=", "hr.leave") to the calendar.event search
domain.
task-6117932
Forward-Port-Of: odoo/enterprise#113789Fixed an issue where users could no longer reopen a document after changing its name from the full-screen document view. This prevents an error screen and keeps document access working smoothly after edits.
Original PR description
Steps to reproduce: 1. Install `documents` 2. Open a document in full screen and click on info icon on top right 3. Edit the name and close full screen document and chatter 4. Try to open the same document Issue: - Traceback occures `TypeError: Cannot read properties of undefined (reading 'insert')` Cause: - In file document_service `this.store.Attachment` was used instead of `this.store["ir.attachment"]` After this commit https://github.com/odoo/odoo/commit/70153559c34ffd18c67b83c39ee397ecb0a90b4a we renamed the Attachment model opw-5483625 Forward-Port-Of: odoo/enterprise#110315 Forward-Port-Of: odoo/enterprise#105602
A Helpdesk filter was corrected so ticket priorities are compared using the right value type. This prevents an error that could interrupt ticket searches or views involving priority filters, helping support teams access their work reliably.
Original PR description
Use correct selection value. ``` psycopg2.errors.UndefinedFunction: operator does not exist: character varying = integer LINE 1: ..."active" IS TRUE AND "helpdesk_ticket"."priority" IN (3) AND... ```
This change removes duplicate payroll-related method definitions and keeps the intended salary contract behavior in one place. It helps reduce the risk of inconsistent payroll calculations or maintenance errors without changing the visible user workflow.
Original PR description
Some methods are defined two times without call to super. Methods defined in hr_contract_salary are moved to payroll (to replace payroll one)
Validating product receipts in the Barcode app no longer causes an error when label printing is configured. This ensures warehouse users can complete receipts and print labels without interruption.
Original PR description
Given a printer is configured to print a label for product receipts, when the receipt is validated from the barcode app, then a traceback appears. A filter on action.context.active_ids was introduced in https://github.com/odoo/enterprise/pull/106277. When validating the receipt from the purchase app, active_ids is set to the id of the purchase order and the behavior is as expected. When validating the receipt in the barcode app , it is not set (nor was it set in 17.0). The filter therefore crashes because it cannot work on undefined. An optional chaining operator is added to apply the filter only if active_ids is set. The barcode app does not raise a traceback anymore when validating a receipt and the label can be printed. Forward-Port-Of: odoo/enterprise#113146
Fixes an issue in Planning where clicking an empty schedule cell for a field service resource could fail because duplicate role information was being requested. This keeps the resource avatar selector working reliably without changing user-facing workflows.
Original PR description
Steps to reproduce: - Open Planning (with field service activated) - Click on an empty cell for Anita's resource This commit removes the uneccessary related field `role_ids` on the new widgets introduced in odoo/enterprise#109060, as it is already added to the field specification [here](https://github.com/odoo/enterprise/blob/master/planning/static/src/views/fields/many2many_avatar_resource/many2many_avatar_resource_field.js#L21-L29)
This fix updates Helpdesk priority filters so they use the expected value format during upgrades. It prevents upgrade failures and keeps Helpdesk ticket filtering working consistently after recent platform validation changes.
Original PR description
- After the recent changes in `fields_selection.py`, selection values are now validated strictly as strings instead of allowing integers to be converted automatically. - Because of that, domains still using integer values such as `3` can fail during upgrade and now need to use string values like `'3'`. - This works fine directly on the master branch, but it fails during the upgrade from saas-19.2 to master. - Runbot link: https://runbot.odoo.com/runbot/build/107991687 - I think it may be related to this PR: [255901](https://github.com/odoo/odoo/pull/255091) - Am I missing something here?
The Luxembourg FAIA XML export now reports invoice line debit and credit amounts as positive values while keeping their correct debit or credit classification. This prevents validation errors when totals are checked against individual invoice lines, improving reliability for compliance reporting.
Original PR description
This is one of several commits fixing the FAIA xml export: - #113452 - #113455 - #113846 - #113720 When an invoice line has a negative `price_unit`, the `Invoice/Line/InvoiceLineAmount/Amount` element has a negative value. This causes validation errors when comparing the total debit or credit values (such as `SalesInvoices/TotalDebit`) to the individual amounts, as the sum of individual "debit" lines will include some credit amounts and vice versa. Solution: record if the line is actually a debit or a credit, then use the absolute value of the balance in the Amount element. opw-5427296 [Link](https://www.odoo.com/odoo/unassigned-tasks/5427296) Forward-Port-Of: odoo/enterprise#113606 Forward-Port-Of: odoo/enterprise#113316
This fix updates the French DAS2 report sending process so attached files use the expected internal format. It helps ensure DAS2 report attachments are generated and sent reliably after a recent platform change.
Original PR description
Since 0b50021bdae54779396d75d3cddbd9eb42571553 the we should use `BinaryBytes` instead of base64 for binary attachments. This commit handles that. No task ID
This update corrects test reference files for Peruvian electronic invoicing after a rounding change in related invoice calculations. It helps keep automated checks reliable so future updates do not get blocked by outdated expected results.
Original PR description
https://github.com/odoo/odoo/commit/e79136d04c844f9a0a8c6d0532c65e0cc3a68b8f fixes unit price rounding in peppol. This PR fixes a broken test in l10n_pe_edi opw-6009771 Forward-Port-Of: odoo/enterprise#114377 Forward-Port-Of: odoo/enterprise#114159
Features or functions removed from Odoo
The pull request reverts a previous change to how the Documents Auto-Sort promotion is handled. This supports a revised approach where the AI document sorting feature can be customized without requiring Studio as a core dependency.
Original PR description
Purpose ======= This reverts commit 76071bd110c2dd0f73dd3972db944ee751f20686. After discussion, we will to it with a customization (ai_documents doesn't really need studio to work). Task-6004348
Code cleanup and technical improvements
This update simplifies the AI image generation flow and makes it more reliable when users create or enhance images. It also preserves product image actions after form refreshes, so users can continue working with AI image tools without losing available options.
Original PR description
- The renderAndSaveMedia function was only a wrapper around 2 function calls renderMedia and saveFunction which made it not very useful. So, renderAndSaveMedia function is removed and renderMedia and…
- The renderAndSaveMedia function was only a wrapper around 2 function calls renderMedia and saveFunction which made it not very useful. So, renderAndSaveMedia function is removed and renderMedia and saveFunction are used directly. - In the original image generation PR, a closeParams dict was introduced to store the closeReason of the MediaDialog such as "save", "discard" or "ai" and the id of the ai chat channel opened from the MediaDialog if any. This was mainly introduced to handle the following case: 1. Go to the website. 2. Insert an 'Image' snippet from the 'Inner Content' section. 3. Click on the AI button from the media dialog. 4. The media dialog will be closed and the snippet placeholder will be removed. Clicking on 'UseThis' button under AI generated images will do nothing because the snippet placeholder was removed. Extra logic was introduced when the closeReason is "ai" to keep the snippet placeholder. However, this complicated the close logic because the logic needs to take into account the newly introduced "ai" state in addition to the other 2 states of "save" and "discard". This commit removes the closeParams dict and introduces aiBeforeCloseHandler logic that will replace the snippet placeholder by a dummy image before closing the media dialog and which can then be replaced by the AI. See also: Community PR: https://github.com/odoo/odoo/pull/259148 Image generation original commits: - Enterprise commit 99f76c1c - Community commit 63c0b17e Image generation original PRs: - Enterprise https://github.com/odoo/enterprise/pull/104712 - Community https://github.com/odoo/odoo/pull/244419
3 changes
Resolved issues and error corrections
Opening a Peppol XML file that contains an embedded PDF now displays the PDF preview instead of showing raw XML or an error. This makes invoice documents easier to review in Documents and prevents the thumbnail generation from failing for this common file type.
Original PR description
**Steps To Reproduce** - Go to Documents app - Upload a Peppol XML file containing an embedded PDF (e.g., invoice with attached PDF) - Open the document **Issue** Opening a Peppol XML document with…
**Steps To Reproduce** - Go to Documents app - Upload a Peppol XML file containing an embedded PDF (e.g., invoice with attached PDF) - Open the document **Issue** Opening a Peppol XML document with an embedded PDF causes: `UserError: Only PDF files can have a thumbnail` The kanban view also shows raw XML code instead of the PDF preview. **Cause** Since this commit: https://github.com/odoo/odoo/commit/37e38b8cd34e The mail module's `mail_attachement_update_thumbnail` route has a strict mimetype check that rejects thumbnail updates for XML files: https://github.com/odoo/odoo/blob/c350592b85001b5f36ea6aaf803ee3974e5ebfc1/addons/mail/controllers/attachment.py#L146-L147 Additionally, the documents thumbnail service only generates thumbnails for files where `isPdf()` returns true: https://github.com/odoo/enterprise/blob/60881b65991cbd2594492b25900ab4bb8c166250/documents/static/src/views/helper/documents_client_thumbnail_service.js#L27-L35 **Solution** Add `_allow_thumbnail()` hook to allow overriding the mimetype check And from this PR, I see that a proper thumbnail is the proper behavior: https://github.com/odoo/enterprise/pull/49111 Which required the thumbnail generation flow multiple overrides: 1. **`isPdf()` check**: The documents thumbnail service only generates thumbnails for files where `isPdf()` returns true. XML files return false, so thumbnail generation is never triggered: https://github.com/odoo/enterprise/blob/60881b65991cbd2594492b25900ab4bb8c166250/documents/static/src/views/helper/documents_client_thumbnail_service.js#L28-L35 2. **`pdf_first_page`**: When thumbnail generation runs, it fetches the first page of the PDF via these routes. For XML with embedded PDFs, the routes must extract and return the embedded PDF bytes instead of the raw XML content: https://github.com/odoo/odoo/blob/c350592b85001b5f36ea6aaf803ee3974e5ebfc1/addons/mail/controllers/attachment.py#L120-L127 https://github.com/odoo/enterprise/blob/60881b65991cbd2594492b25900ab4bb8c166250/documents/controllers/documents.py#L515-L528 3. **`isTextualDocument` in kanban**: XML files are treated as textual documents and displayed showing raw XML code, even when they contain an embedded PDF that should be previewed instead: https://github.com/odoo/enterprise/blob/60881b65991cbd2594492b25900ab4bb8c166250/documents/views/documents_document_views.xml#L106 opw-5252946 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Generating a W-2 CSV now works even when the report’s end date is left blank. If no end date is provided, the system will use the current year for the file name instead of stopping with an error. This prevents a frustrating interruption when users create payroll reports.
Original PR description
Currently, an error occurs when user tries to create a csv for w2 form with no end date defined. Steps to replicate: - Install `l10n_us_hr_payroll`. - Open Payroll > Reporting > W2 Report. - Click…
Currently, an error occurs when user tries to create a csv for w2 form with no end date defined.
Steps to replicate:
- Install `l10n_us_hr_payroll`.
- Open Payroll > Reporting > W2 Report.
- Click `New` > Remove value from `End Date` and click Generate.
Error:
```
File '/home/odoo/odoo19/enterprise/l10n_us_hr_payroll/models/l10n_us_w2.py', line 249, in action_generate_csv
self.csv_filename = f'form_w2_{self.date_end.year or date.today().year}.csv'
^^^^^^^^^^^^^^^^^^
AttributeError: 'bool' object has no attribute 'year'
```
Cause:
- As the user did not give any value for `End Date`, False was passed and when the execution flow reached [here] `self.end_date` is False and attempting to access `self.end_date.year` results in this error.
Solution:
- If we do not receive the `self.end_date` while generating the CSV, we will use the current year to generate the CSV file name.
[here]: https://github.com/odoo/enterprise/blob/01be8d6e9384bcb340559847d529b4887e073519/l10n_us_hr_payroll/models/l10n_us_w2.py#L248
No ID
Forward-Port-Of: odoo/enterprise#113408A typo in the quality module prevented newly created quality alerts from being assigned to the correct stage, causing them to appear under "None". This fix restores the proper grouping so records are shown where users expect them.
Original PR description
Issue: ------- While adapting the 'Domain' in the PR https://github.com/odoo/enterprise/commit/07b34a2e927347ca5c839ec632808adb02703e1f there occurred a typo where '|' got replaced with the '&' and causing the records getting grouped in 'None' when creating. Solution: ------------ To replace '&' with '|' to get the records grouped under the correct stage. Steps to reproduce: ----------------------- 1. In v19.0, in quality module try to create a quality alert record. 2. Just like that the newly created record will be under 'None'. Reference Image: <img width="1105" height="407" alt="image" src="https://github.com/user-attachments/assets/4c9c33be-ec06-4f06-8245-54dbe4473bc0" /> OPW - [6074016](https://www.odoo.com/odoo/project/70/tasks/6074016)
8 changes
Resolved issues and error corrections
This fix prevents a manufacturing order from automatically reserving tracked components when the reservation method is set to Manual. It keeps the reservation behavior aligned with the user’s chosen process, avoiding unexpected stock allocation when work begins.
Original PR description
on a MO when we have a component tracked by lot and reservation methode set as manual, when we start an operation, the component is automatically reserved. **Steps to reproduce** * Set Manufacturing…
on a MO when we have a component tracked by lot and reservation methode set as manual, when we start an operation, the component is automatically reserved. **Steps to reproduce** * Set Manufacturing operation type reservation methode to "Manually" * Create a bom with a component tracked by "lot" * Add an operation to this bom * Create an MO with this bom and confirm it * Start the operation -> the component get reserved. **Observation** When starting the operation it will call button_start, where we will set the ```qty_producing```: https://github.com/odoo/odoo/blob/6aa9147eef3212b5a4ebf374e617caba198ad7b5/addons/mrp/models/mrp_workorder.py#L617-L618 When setting ```qty_producing```, we will write it and from the inverse, it will call ```_set_qty_producing``` to synchronizes the value of the linked mo. https://github.com/odoo/odoo/blob/ca01e606928a7704c6b2e4f430710f895be2653d/addons/mrp/models/mrp_workorder.py#L52-L53 https://github.com/odoo/odoo/blob/6aa9147eef3212b5a4ebf374e617caba198ad7b5/addons/mrp/models/mrp_workorder.py#L237-L238 In the ```_set_qty_producing``` in the mo, the system assumes that because production has started, the linked stock moves must be updated to reflect consumption: https://github.com/odoo/odoo/blob/ca01e606928a7704c6b2e4f430710f895be2653d/addons/mrp/models/mrp_production.py#L1338-L1346 When these stock moves are updated, the stock.move logic prepares values by reserving available quants and generating new move lines: https://github.com/odoo/odoo/blob/67df9b5cf4bc277c17b49ef70782a76f5ca6d760/addons/stock/models/stock_move.py#L2328-L2331 https://github.com/odoo/odoo/blob/67df9b5cf4bc277c17b49ef70782a76f5ca6d760/addons/stock/models/stock_move.py#L2337 opw-5938176
This change lets Odoo start even when the configured addons path points to an empty repository with no modules yet. It removes a blocker for users and automation that create new Odoo projects from scratch, so they can begin work without hitting a startup error.
Original PR description
Initialize a new empty git repository where you are going to vide-code some new Odoo modules. Because the repository is empty (no addon yet) the CLI fails with an "option --addons-path: the path <path> is not a valid addons directory". This makes vide-coder sad, and bigrams want vide-coders to be happy, so drop the sanity-check and also accept empty addons. Forward-Port-Of: odoo/odoo#256913
This change fixes a flaky test in the web editor so it behaves more consistently across fast and slow test runs. It better matches how a real user clicks a link, reducing false failures in automated testing.
Original PR description
The popover opening is triggered through click, but there is a selectionchange handler on click that checks if the selection is outside of the link and, if it is, closes the popover. In this case, the click method didn't set the selection inside the link properly because of the presence of \ufeff around the link. The test actually passes by mistake when the runbot was fast, but failed when the runbot was slow, as the selectionchange handler had the time to execute and close the popover. This commit forces the selection to be inside the link after calling click, to be closer to what actually happens when a user click on a link, as opposed to a programmatic click. runbot-161423 Forward-Port-Of: odoo/odoo#259688
This change prevents template tags from overlapping the Template Properties button in the Sign app. It improves the display in wider languages like German so the header stays readable and easier to use.
Original PR description
## Issue In the Sign app, the list of tags of a template can overlap with the *Template Properties* button when using a language that makes those components slightly wider than expected (e.g.…
## Issue
In the Sign app, the list of tags of a template can overlap with the *Template Properties* button when using a language that makes those components slightly wider than expected (e.g. German).
## Steps to reproduce
1. Install Sign (`sign`)
2. Set the language to German
3. Open a template
4. **In the header, the list of tags overlap the _Template Properties_ button**
## Cause
The list of tags uses `col-lg-12`, which is design for Bootstrap's grid system and prevents the div from shrinking properly.
```css
.col-lg-12 {
flex: 0 0 auto; /* flex-shrink set to 0 */
width: 100%;
}
```
## Before
<img width="726" height="67" alt="6023834-1" src="https://github.com/user-attachments/assets/fd49c8d5-4ca0-4de4-8f0c-f03f78f4b7ab" />
<img width="432" height="75" alt="6023834-2" src="https://github.com/user-attachments/assets/d595e8a3-c3ab-4ae2-89dd-652371de9604" />
## After
https://github.com/user-attachments/assets/3a00fc5f-260d-465d-8e12-96d8e6e1aa4c
opw-6023834
Forward-Port-Of: odoo/enterprise#113116This change fixes an issue where already scanned packages could reappear with the wrong quantity when a delivery was reopened in the barcode app. Users will now see the expected quantity of 1 for picked package lines, avoiding confusing or misleading information during warehouse operations.
Original PR description
Issue ----- When using full packaging in barcode, leaving the operation and opening it again shows incorrect quantity for already scanned packages. Steps to reproduce ----- - Enable packages - Create…
Issue ----- When using full packaging in barcode, leaving the operation and opening it again shows incorrect quantity for already scanned packages. Steps to reproduce ----- - Enable packages - Create a product with one package in stock - Operation Types > Delivery Orders, set Move Entire Packages to true - Create a delivery for a package - Scan the package barcode - Exit the delivery - Re-enter the delivery > Quantity for the line is 1/false Cause ----- The line is picked, so it is considered as not reserved https://github.com/odoo/enterprise/blob/02f957b600bac3d86411091fd762d88e372db7c5/stock_barcode/static/src/models/barcode_picking_model.js#L288-L289 when doing https://github.com/odoo/enterprise/blob/02f957b600bac3d86411091fd762d88e372db7c5/stock_barcode/static/src/models/barcode_picking_model.js#L812-L813 This leads to `qtyDemand` returning false instead of 1 https://github.com/odoo/enterprise/blob/02f957b600bac3d86411091fd762d88e372db7c5/stock_barcode/static/src/components/package_line.js#L17-L18 ----- Ticket: opw-5960629
This update fixes two issues in the Manufacturing Order flow in the Barcode app. It now keeps the unit of measure locked after confirmation, and it preserves any entered quantity when opening and closing the quantity change window, preventing lost edits.
Original PR description
### Issue Two bugs reported in the Barcode app / Manufacturing Order flow: **1. UoM change after confirm leaves MO inconsistent** Changing the UoM on a confirmed MO via the Barcode app does not…
### Issue Two bugs reported in the Barcode app / Manufacturing Order flow: **1. UoM change after confirm leaves MO inconsistent** Changing the UoM on a confirmed MO via the Barcode app does not recalculate `product_qty` / `qty_producing`. The backend locks the UoM after confirm — the Barcode view did not. **2. `qty_producing` reset on wizard open/close** Typing a value in `qty_producing` then opening the "Change Qty to Produce" widget (even closing without saving) caused the typed value to vanish. Root cause: the widget's `onClose` calls `env.model.load()`, which refetches from DB and discards any unsaved form edits. ### Fix - `product_uom_id` in the Barcode MO form is now readonly once `state != 'draft'`, matching the backend. - `openChangeQtyWizard` now saves the record before opening the wizard, so pending edits survive the reload. ### Steps to reproduce **UoM bug** 1. Create an MO, confirm it. 2. Open it in the Barcode app. 3. Try to change the UoM → it was editable (bug). **Qty reset bug** 1. Open a confirmed MO in the Barcode app, go to the header product page. 2. Type a value in `qty_producing` (e.g. `3`). 3. Click the `/ X` button next to it (opens the Change Qty wizard) then close it without clicking "Set Quantity". 4. `qty_producing` reverts to its previous value (bug). ### After the fix - UoM field is greyed out once the MO is confirmed. - Typed value in `qty_producing` is preserved after opening and closing the wizard. opw-5809178
Fixed an issue where printed approval requests could lose their translation when no contact was linked to the request. The report now falls back to the request owner’s language, or the system default if needed, so documents print in the expected language more reliably.
Original PR description
Steps to reproduce: ------------------ 1. Install Approvals. 2. Select an approval type from Approvals > Configuration and ensure the 'Contact' field is not required. 3. Install a second language (e.g., Arabic) and switch the user's language. 4. Create a new approval request with this approval type and set user as the request owner. 5. Try to print the approval request. Current behavior: ----------------- The report is only translated when partner is present because it translates using `partner_id.lang`. Since the partner is not required in all cases, `lang` can evaluate to False when it is missing, causing the report to bypass translations. Expected behavior: ------------------ The report should fall back to the request owner's language or the system's default language if the partner is not available. opw-6010222
Code cleanup and technical improvements
This change renames an internal method so its name better matches what it actually does. It should reduce confusion for developers maintaining the system, while keeping the existing behavior for users the same.
Original PR description
The method `get_formview_action` in `ir_ui_view.py` is primarily used by M2O UI fields to open views of a linked record. However, because it is frequently overridden across the codebase to open various other view types (such as kanban and list views), the original name is misleading. Rename the method to `get_defaultview_action` to better reflect its actual behavior and prevent developer confusion. task-6068437
4 changes
Resolved issues and error corrections
When users create a new vendor bill by auto-completing from a previous one, the Intrastat transaction details are now preserved on the invoice lines. This avoids missing reporting information and helps keep cross-border billing records complete and accurate.
Original PR description
Currently, Intrastat transaction values are not set when creating a vendor bill using the `Auto-complete` feature based on a previously created vendor bill for an `EU customer`. **Steps to…
Currently, Intrastat transaction values are not set when creating a vendor bill using the `Auto-complete` feature based on a previously created vendor bill for an `EU customer`. **Steps to reproduce:** - Install `account_intrastat` and `l10n_de` modules and switch to a `DE company`. - Create a vendor bill for an `EU partner`, add a product, and set an `Intrastat` (enable from the optional column if needed). - `Confirm` the bill and note its number. - Create a new vendor bill for the `same partner`. - Use the `Auto-complete` feature by selecting the previous bill. - Check the invoice lines. **Observation:** The `Intrastat` is missing from the generated invoice lines. **Root Cause:** - On using `Auto-Complete`, `_onchange_invoice_vendor_bill` at [1] copies invoice lines using `copy_data()`. - However, in `account_intrastat`, `copy_data()` at [2] removes `intrastat_transaction_id`. **Fix:** This commit ensures that `Intrastat` is properly set when creating a vendor bill using the auto-complete feature based on a previously created vendor bill for an EU customer. Related Enterprise PR: https://github.com/odoo/enterprise/pull/112857 [1]: https://github.com/odoo/odoo/blob/07b72963c665f2fe5b741b8815f2351129a2271c/addons/account/models/account_move.py#L1808-L1820 [2]: https://github.com/odoo/enterprise/blob/4da85b58a28837379e4839327ea914bd6aa70bf9/account_intrastat/models/account_move.py#L77-L83 opw-5936869
This change lets Odoo start even when a project has no addons yet, which is common in a brand-new repository. It removes an overly strict check so setup and early development workflows no longer fail before the first module is added.
Original PR description
Initialize a new empty git repository where you are going to vide-code some new Odoo modules. Because the repository is empty (no addon yet) the CLI fails with an "option --addons-path: the path <path> is not a valid addons directory". This makes vide-coder sad, and bigrams want vide-coders to be happy, so drop the sanity-check and also accept empty addons. Forward-Port-Of: odoo/odoo#256913
Vendor bills created with Auto-complete will now keep the Intrastat information from the original bill. This prevents missing trade declaration data and helps ensure reports remain accurate for EU transactions.
Original PR description
Currently, Intrastat transaction values are not set when creating a vendor bill using the `Auto-complete` feature based on a previously created vendor bill for an `EU customer`. **Steps to…
Currently, Intrastat transaction values are not set when creating a vendor bill using the `Auto-complete` feature based on a previously created vendor bill for an `EU customer`. **Steps to reproduce:** - Install `account_intrastat` and `l10n_de` modules and switch to a `DE company`. - Create a vendor bill for an `EU partner`, add a product, and set an `Intrastat` (enable from the optional column if needed). - `Confirm` the bill and note its number. - Create a new vendor bill for the `same partner`. - Use the `Auto-complete` feature by selecting the previous bill. - Check the invoice lines. **Observation:** The `Intrastat` is missing from the generated invoice lines. **Root Cause:** - On using `Auto-Complete`, `_onchange_invoice_vendor_bill` at [1] copies invoice lines using `copy_data()`. - However, in `account_intrastat`, `copy_data()` at [2] removes `intrastat_transaction_id`. **Fix:** This commit ensures that `Intrastat` is properly set when creating a vendor bill using the auto-complete feature based on a previously created vendor bill for an EU customer. [1]: https://github.com/odoo/odoo/blob/07b72963c665f2fe5b741b8815f2351129a2271c/addons/account/models/account_move.py#L1808-L1820 [2]: https://github.com/odoo/enterprise/blob/4da85b58a28837379e4839327ea914bd6aa70bf9/account_intrastat/models/account_move.py#L77-L83 opw-5936869
The timesheet planning report now correctly excludes public holidays even when they are not tied to a specific work calendar. It also handles time zone differences more accurately, so leave days are shown consistently for users in distant time zones.
Original PR description
### Steps to reproduce: - Install project_timesheet_forecast module - Configure your database to have a far timezone (Montevideo/Uruguay in my case) - Create a public holiday starts from 12AM to…
### Steps to reproduce: - Install project_timesheet_forecast module - Configure your database to have a far timezone (Montevideo/Uruguay in my case) - Create a public holiday starts from 12AM to 11:59PM with a calendar - Create a planning slot for a resource that overlap with the public holiday - Check the Timesheets / Planning analysis report - Group by employees > day **- Check the date of the public holiday and notice there are still planned hours shown** - Remove the calendar from the public holidays that we created previously - Check the report once again **- Notice the day of the public holiday and the day after has no planned hours** ### Cause: In the query we are using to exclude the leave days from the report we only exclude the ones that has calendar_id assigned, not taking into consideration that some of the public holiday are general and is not applied to just one working schedule. Also if we have a leave starting midnight to 11:59PM since we store dates in database as UTC for timezone like Uruguay's one it will shift the end with one day which will introduce inconsistencies ### Fix: We check if the calendar_id is null on the resource_calendar_leaves and make sure we take timezone of the resource into account when checking the dates of the leaves. opw-5027070