Daily updates from Odoo
Thursday, February 5, 2026
53 changes · saas-19.1
Resolved issues and error corrections
A performance issue impacting the Odoo.com website forum search has been resolved. The fix prevents the search from incorrectly indexing forum post content, leading to faster and more reliable search results. This enhancement improves the user experience for forum visitors.
Original PR description
Improve the performance of the website forum search. Issue: There is a significant performance issue with a large number of forum posts impacting odoo.com. This is due to the use of the `<%` operator…
Improve the performance of the website forum search. Issue: There is a significant performance issue with a large number of forum posts impacting odoo.com. This is due to the use of the `<%` operator on the content field of forum posts. It occurs when using the javascript search which autocompletes results in a dropdown on the search bar. To deactivate the search on the `content` column, displayDescription needs to be set to false. but this was not possible due to the data attribute which contains text. setting it to 'false' was still truthy and therefore enabled the fuzzy search in the content column. Fix: - fix a js bug to properly cast the value to a boolean - this was done for other data attributes at the same time. - set the display_description value to false to disable search on the content field. This is aligned with the python post search settings defined in: https://github.com/odoo/odoo/blob/7abd7ba2f38fdb1953c39fd3693f012c2ad1b497/addons/website_forum/controllers/website_forum.py#L95 Forward-Port-Of: odoo/odoo#246581
This update resolves a bug where custom mixins added fields to `res.partner` records caused errors due to incorrect data synchronization. The fix ensures that changes made by mixins are consistently included during the `write()` process, regardless of the order mixins are applied, preventing data inconsistencies.
Original PR description
Description of the issue/feature this PR addresses: When `res.partner` is inherited together with a custom mixin that adds additional values to `vals` inside the `write()` method, the behavior…
Description of the issue/feature this PR addresses:
When `res.partner` is inherited together with a custom mixin that adds additional values to `vals` inside the `write()` method, the behavior depends on the inheritance order. If the mixin is inherited after `res.partner`, the values added by the mixin are not included in the data collected by `res.partner.write()` for later synchronization, which can lead to runtime errors.
Current behavior before PR:
If the inheritance order is:
```python
_inherit = ['res.partner', 'custom.mixin']
```
the custom mixin’s `write()` method is executed after `res.partner.write()`.
As a result, any values added by the mixin are missing from `pre_values_list`, which is built by `res.partner.write()` and later accessed by `_fields_sync()`, causing failures when those fields are expected to be present.
This issue does not occur when the inheritance order is:
```python
_inherit = ['custom.mixin', 'res.partner']
```
because the mixin modifies `vals` before `res.partner.write()` is executed.
Steps to reproduce:
1. Create a mixin model with a new field, then add this field into `vals` inside the `write()` method so it is included in the update flow.
```python
class CustomMixin(models.AbstractModel):
_name = "custom.mixin"
custom_field = fields.Char()
def write(self, vals):
vals['custom_field'] = "foo"
return super().write(vals)
```
2. Inherit the mixin in `res.partner`
```python
class ResPartner(models.Model):
_name = "res.partner"
_inherit = ["res.partner", "custom.mixin"]
```
3. Update a `res.partner` record, an error will be raised
```bash
Traceback (most recent call last):
...
File "/opt/odoo/code/projects/odoo/odoo/orm/fields.py", line 1845, in __set__
records.write({self.name: write_value})
~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/odoo/code/projects/odoo/odoo/addons/base/models/res_partner.py", line 907, in write
updated = {fname: fvalue for fname, fvalue in vals.items() if partner[fname] != pre_values[fname]}
~~~~~~~~~~^^^^^^^
KeyError: 'custom_field'
```
Desired behavior after PR is merged:
Values added to vals by a custom mixin during `write()` are consistently available to `res.partner` internal synchronization logic, regardless of the inheritance order.
`res.partner.write()` and `_fields_sync()` should behave correctly even when mixins extend vals and are inherited after `res.partner`.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#246927This update prevents users from selecting payment method lines associated with archived journals when managing contacts. Previously, users could inadvertently choose outdated payment methods, leading to configuration issues. Now, archiving a journal automatically removes it from the selectable options, simplifying the process and preventing data duplication.
Original PR description
**Description of the issue/feature this PR addresses:** When selecting a payment method line on a contact, lines related to journals still appear even if the journal has been archived. This can lead…
**Description of the issue/feature this PR addresses:**
When selecting a payment method line on a contact, lines related to journals still appear even if the journal has been archived. This can lead to the accidental use of payment method lines that should no longer be available. There should be no need to delete payment method lines when archiving a journal; doing so causes a loss of configuration if the journal is reactivated later, and leads to data duplication when having to recreate them.
**Current behavior before PR:**
When selecting a payment method line on a contact, lines from archived journals are still visible. Currently, payment method lines must be manually deleted from archived journals to prevent them from appearing in the selection list.
Payment Method Line domain doesn't include `('journal_id.active', '=', True)` domain part.
**Desired behavior after PR is merged:**
Archiving a journal is now sufficient to stop its payment method lines from appearing as selectable options on contacts.
https://www.loom.com/share/05981419c7dd4584b67d27d84e27892a
OPW-5413309 MT-13011 @moduon @rafaelbn @EmilioPascual @Gelojr @yajo please review if you want 😄
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#245947
Forward-Port-Of: odoo/odoo#240369This update enhances the clarity of accounting entries related to company-account expense payments. By leveraging the 'payment_reference' field, the payment term line now displays user notes, providing better context and traceability for financial records. This aligns with standard invoice practices and improves overall accounting accuracy.
Original PR description
Currently, when creating a bill from an expense with payment_mode='company_account', the payment term line's name is set to an empty string because expenses are immediate payment expenses. However, users may enter notes in the payment_reference field. The account.move.line's `_compute_name` ([1](https://github.com/odoo/odoo/blob/3f4e45ecaca46a98c904536658728a1f1571bdbd/addons/account/models/account_move_line.py#L520)) method uses payment_reference to compute the name for payment term lines. By setting the name in needed_terms from payment_reference, the payment term line will display the user's notes, providing better context and traceability in the accounting entries. This change ensures consistency with the standard invoice behavior where payment_reference is used to populate the payment term line name. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244392 Forward-Port-Of: odoo/odoo#241353
This update fixes a security vulnerability where scheduled actions could continue running even with archived or unauthorized users. Previously, any user could trigger a server action, regardless of their access rights. Now, actions will only run with valid, active users (excluding system accounts), improving security and preventing unintended actions.
Original PR description
Any user can be used to run a server action, even if archived or without corresponding access right. Steps: - Create a scheduled action running with an administrator (code: empty) - Archive the used administrator - Do the same steps with random user Actual result: - Action continue to run with an archived user - Action continue to run with a user without corresponding access right Expected result: - Action should not run on a archived user (except System) - Action can run if user has corresponding access right opw-5475805 Forward-Port-Of: odoo/odoo#244416
This update fixes an issue where multiple overtime rules were incorrectly adding undertime amounts, leading to inaccurate overtime calculations. The change ensures that only the largest undertime value is considered, providing a more accurate reflection of actual overtime hours. This improves the reliability of overtime reporting.
Original PR description
### Issue:
When having a ruleset with multiple rules, their undertime amounts are added.
### Steps to reproduce:
- Create an overtime ruleset with two rules:
- Based on quantity, worked hours on a Day differs from a specific duration of 8h
- Based on quantity, worked hours on a Day differs from a specific duration of 10h
- Assign this ruleset to an employee
- On a day with no attendance, create one for this employee from 1pm to 6pm
- The computed overtime hours is -8 hours
### Cause:
The undertimes from each rule are added. The first rule computes 3 hours of undertime (8 - 5), the second 5 hours (10 - 5), resulting in 8 hours of undertime.
### Solution:
Instead of adding them, we only keep the greatest undertime.
This ensures that the undertime amount is technically the opposite of the overtime amount.
We only take the undertime value into consideration, whatever the period type of the rule.
opw-5452854
Forward-Port-Of: odoo/odoo#244462This update fixes an issue where the Avco audit report was missing certain stock moves. Previously, the report incorrectly filtered out moves based on company settings. Now, the report accurately includes all relevant stock moves, ensuring more reliable cost reporting for products.
Original PR description
When looking at the Unit Cost History we should ignore moves for standard cost method. Before this fix, we also ignore moves for FIFO or AVCO when the property_cost_method of the product category is not NULL (because is set to a company Y), but it is not set to the current company X. After this fix, we check if the property_cost_method is set to the specific company so that we don't ignore them. OPW-5434503 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244495
This update resolves an issue preventing duplex printing on the Windows IoT device. We've replaced Ghostscript with SumatraPDF, a simpler PDF viewer that natively supports duplex printing. This ensures users can now print PDFs double-sided, improving workflow efficiency.
Original PR description
When printing a PDF using the Windows IoT, first the PDF file is temporarily saved, and then it is printed using Ghostscript which handles parsing the PDF and saving it to the printer. Unfortunately, Ghostscript is unable to print using duplex (double-sided) no matter what settings are provided. To fix this, we replace Ghostscript with [SumatraPDF](https://github.com/sumatrapdfreader/sumatrapdf), which is an open source PDF viewer for Windows, but it is also capable of being used from the command line to print. We simply provide the duplex printing option in the command to SumatraPDF, and it works as expected. [1]: https://github.com/sumatrapdfreader/sumatrapdf task-5149706 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#242307
This update resolves a validation error that occurred when installing modules in companies with branches. The fix ensures the parent company's chart of accounts is loaded first, preventing the creation of duplicate accounts within the branch. This improves module installation stability and functionality.
Original PR description
Issue: Validation Error on installing some modules in companies with branches Step to reproduce: - Create a company in UK - Create a branch to this company - install l10n_uk - install l10n_uk_reports_csi Current behavior: - raise validation error Solution: In AccountChartTemplate, `ref()` function allow searching object from company and parents company. https://github.com/odoo/odoo/blob/468c25b924979f4614705fe43f909af13f83c6a3/addons/account/models/chart_template.py#L1262-L1266 In `_load_data`, it tries to load existing record before creating new account. Loading the parent company first prevent creating a second account in the branch which raise the error. opw-5443912 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a technical error that prevented users from opening the cashbox when using the payment screen. The fix ensures the system correctly handles the 'Open Cashbox' click event, preventing a traceback error and ensuring the necessary context is available. This improves the reliability of the payment process.
Original PR description
In this commit: - Fixes a Traceback error when clicking "Open Cashbox" on the payment screen. - Ensures the correct context by using an arrow function. - Prevents `iface_cashdrawer` being undefined during the click event. Task:5890341
This update corrects a technical issue where API documentation wasn't accurately reflecting the types of list parameters in Odoo. The fix ensures that the documentation now correctly displays parameter types like 'list[int]' instead of just 'list', leading to more precise and reliable API documentation for developers.
Original PR description
In python 3.10; When the type of a method parameter is a container (eg: `list[T]`), `stringify_signature` was not getting the full type but only the origin of it (eg: `list` instead of `list[int]`). This commit fixes the issue by stringifiying the container types separately. runbot-237782 Forward-Port-Of: odoo/odoo#247149
Previously, removing or reordering images in the website gallery would lose all associated links. This fix ensures that image links are preserved when the gallery is updated, improving the user experience and preventing broken links. The change involved updating how image links are handled during gallery rebuilding.
Original PR description
Before this change, using the website editor with image galleries, removing or reordering an image caused all image links to be lost. This happened because the gallery was rebuilt using image nodes only, dropping anchor wrappers during the process. ### How to reproduce: * Open the website editor. * Add an Image Gallery block. * Add links to some of the images. * Remove or reorder an image. * All image links are lost. ### Solution: Pass image holders instead of raw images to setImages and handle the different gallery modes. opw-5422081 Forward-Port-Of: odoo/odoo#244417
This update fixes a minor issue where some onboarding tours weren't properly waiting for the portal chatter to load, leading to potential delays for users. The fix ensures tours wait for the chatter to be ready before proceeding, improving the overall user experience and preventing a warning related to DOM updates during selection. A minor typo in a file name was also corrected.
Original PR description
### Before commit Some tours did not wait for the portal chatter to load when needed: - `portal_chatter_bundle`: the `run` function creates a promise but the tour finishes before it resolves. - `fullscreen_slide_text_highlights`: `PortalChatterService` adds an element in the DOM while the selection is updated in the `selectText` tour step. This caused the following warning to show: ``` should not have any "characterData", "remove" or "add" mutations in current step when you update the selection ``` ### Fix Properly wait for `portalChatterReady` to resolve before proceeding with the rest of the tour steps. (Also fixed the typo in the filename `slide_portal_chatter_bundle.js`) runbot-229803 Forward-Port-Of: odoo/odoo#247203
This update resolves a problem where the Open Graph image URL in website configurations was incorrectly set to absolute URLs, causing errors when viewing pages on different domains. The fix ensures that the image URL is relative, preventing this issue and improving website SEO and compatibility with custom domains. This was initially addressed in 19.0 and further refined in this release.
Original PR description
In 17.0 up to master, website_meta_og_img for newly added cover image should be a relative URL instead of an absolute URL since 27th september 2025 commit 4c5d9861e389534f9ca684b9faa1ce6289df5639. In…
In 17.0 up to master, website_meta_og_img for newly added cover image should be a relative URL instead of an absolute URL since 27th september 2025 commit 4c5d9861e389534f9ca684b9faa1ce6289df5639. In combination with: - [1] python fix in 19.0: accept absolute URL in website_meta_og_img - [2] upgrade script in saas-19.1: removes absolute URL that existed in 19.0 when upgrading to saas-19.1 We wanted to removed the error that happened in 19.0 when configuring a cover image (in Optimize SEO) and also using a custom domain These fixes worked up to 19.0, but there is still a possible issue in saas-19.1: - open "Optimize SEO" wizard of a page - click on save without changing the image - set a domain on the website - go to the page with the cover image => result an absolute URL is saved and we get a traceback error when visiting on wrong domain. Cause: The 4c5d9861e389534f9ca684b9faa1ce6289df5639 was only getting relative URL when an image was selected. This didn't work if we open and saved the modal when there was no website_meta_og_img and the image was gotten from the META og:image element. In 19.0, since there was a python fix for existing errors [1] this case was hidden and didn't cause an issue. Fix: Forward-port cdffe8ab905068a3947ea62562c7209d216b2b8d in upper versions. A fix should also be done after to ensure we don't save absolute URL: for example if the image we save matches the og:image in DOM, don't save it. [1]: cdffe8ab905068a3947ea62562c7209d216b2b8d [2]: odoo/upgrade@5408746b110d660901645b9c7b9aa9cee7aaf235 opw-5867113 opw-5874045 opw-5874931 opw-5875254 opw-5884536 opw-5885941 opw-5887081 opw-5888627 opw-5889050 opw-5891942 opw-5897982 opw-5898621 opw-5898731 opw-5899722 opw-5900450 opw-5906008
This update resolves a technical issue where the user ID (UID) was incorrectly set during the MFA process. A recent code change inadvertently caused this, which was preventing proper MFA functionality. This fix ensures the UID remains correctly set to 'None' during MFA, improving system stability and security.
Original PR description
Before this fix the uid was set in the environment even when the MFA was not yet complete. The uid is set in finalize function and was accidentally set before due to a refactor of DLE. This was indeed a bug since the code expects the uid to be set to None. Task-5910537 Forward-Port-Of: odoo/odoo#247230
This update corrects a visual bug where highlights on RTL websites (like Arabic) were incorrectly positioned. The fix adjusts how the highlight element and its associated SVG are positioned, ensuring the highlight appears correctly regardless of the website's language direction. This improves the user experience for international visitors.
Original PR description
Scenario: - add a RTL language to website (eg. arabic) - go to the website and add a highlight to part of a line - switch to RTL language Result: the highlight is not at the correct X position. This…
Scenario:
- add a RTL language to website (eg. arabic)
- go to the website and add a highlight to part of a line
- switch to RTL language
Result: the highlight is not at the correct X position.
This commit fixes the issue for most browser by changing in RTL that:
- the SVG is positionned from the right so the SVG right matches
the boundary rect right
- mirroring the SVG so when the 1x1 pixel is scaled, it is scaled toward
the left and it matches the left boundary rect
This is not always working (mostly for safari) because the positionning
of position:absolute SVG inside highlighted position:relative SPAN is
behavior differently in RTL (an even behave differently in case of mixed
RTL / LTR strings in dir:rtl blocks).
This is reproduced in this code:
https://gist.github.com/nle-odoo/21fea59d338b55b3e2a337cf360ef878
So to fix that issue, after inserting a SVG element in RTL in DOM, we
correct the X position by the current error from what we intended.
opw-5049432
opw-5344412
opw-5867908
## PR NOTE:
### 1) For the part:
```diff
- const firstRect = highlightEl.getClientRects()[0];
+ const rtl = window.getComputedStyle(highlightEl).direction === "rtl";
+ let firstRect;
+ if (rtl) { // Take the first top right element instead of top left
+ firstRect = [...highlightEl.getClientRects()].sort((a, b) => a.top - b.top || (b.left + b.width) - (a.left + a.width))[0];
+ } else {
+ firstRect = highlightEl.getClientRects()[0];
+ }
+
...
- const spanOffsetX = firstRect.x - containerRect.x;
const spanOffsetY = firstRect.y - containerRect.y;
- svg.style.left = `${(rects.x - containerRect.x - spanOffsetX) * scale}px`;
svg.style.top = `${(rects.y - containerRect.y - spanOffsetY) * scale}px`;
svg.style.bottom = `0px`;
- svg.style.right = `0px`;
+ if (rtl) { // Position from the right instead of left and mirror the SVG
+ const spanOffsetX = containerRect.x + containerRect.width - firstRect.x - firstRect.width;
+ svg.style.left = `0px`;
+ svg.style.right = `${(containerRect.x + containerRect.width - rects.x - rects.width - spanOffsetX) * scale}px`;
+ svg.style.transform = 'scale(-1, 1)';
+ } else {
+ const spanOffsetX = firstRect.x - containerRect.x;
+ svg.style.left = `${(rects.x - containerRect.x - spanOffsetX) * scale}px`;
+ svg.style.right = `0px`;
+ }
```
I don't understand why the other SVG are positioned relative to the first one(but the original code did that and making it but with the logic of RTL instead of LTR seems to be the only way to make it work).
Note that in saas-18.3 the logic seemed to be a lot more simple, but there was a "display: inline-block;" on the highlight item which simplified the logic a lot (you can just have 100% width to match the item highlighted), but would make (LTR in RTL content, or RTL in LTR content) "`<highlight>hello</highlight> world`" appear in RTL as "`world <highlight>hello</highlight>`".
Forward-Port-Of: odoo/odoo#226359This update addresses discrepancies in invoice totals, particularly for Peppol transactions, caused by rounding of product prices. The change ensures that invoice totals more closely match original documents by removing fixed decimal precision from 'Product Price' fields. This improves data accuracy and compliance.
Original PR description
Imported invoices can show different totals than what the original document show. This especially an issue for Peppol. Because `price_unit` is rounded, by computing the total of a line with `quantity * price_unit`, it may not be possible to obtain the same total as the one from the original document. To face this issue, the float fields related to "Product Price" don't have a decimal precision set anymore. To keep the UI clean, the precision set on "Product Price" is now interpreted as a "minimal precision". So if it set to 3, we'll see at least 3 digits. If there's more, all the digits are shown. As so: `4.0` -> `'4.000'` `4.23` -> `'4.230'` `4.235` -> `'4.235'` `4.2358` -> `'4.23458'` task-4895014 Forward-Port-Of: odoo/odoo#247064 Forward-Port-Of: odoo/odoo#243987
This update fixes an issue where the HTML editor toolbar would unexpectedly close and not reopen after a link popover was closed. The fix ensures the toolbar correctly reopens when focus returns to the editor, improving the user experience when working with rich text content. This resolves a previous bug that caused cursor issues.
Original PR description
#### Description of the issue this PR addresses: `focusEditable`: - The previous focusEditable logic failed in the website because `this.editable` is `contenteditable="false"` and there is often a…
#### Description of the issue this PR addresses: `focusEditable`: - The previous focusEditable logic failed in the website because `this.editable` is `contenteditable="false"` and there is often a non-editable ancestor near the selection. - As a result, the editor did not receive focus, and focusing the wrong element caused the cursor to collapse or move unexpectedly. `Toolbar not remains open`: - The toolbar closed when focus leaves iframe but not getting reopen when focus returns. ### Desired behavior after PR is merged: - The focusEditable focuses the nearest element with `contenteditable="true"` and then restores the cursor when the selection lies inside a non-editable region. - We dispatch `selection_enter_handlers` when focus returns to the iframe document. - This reopens the toolbar when the selection is not collapsed. task-5261404 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244970 Forward-Port-Of: odoo/odoo#237953
This update resolves an issue where resizing an image within a link would unexpectedly make it fill the entire link width. The fix ensures that image resizing within links maintains the intended proportions, providing a more consistent and user-friendly experience. This improves the visual quality of linked images.
Original PR description
Problem: Resizing an image inside a link causes it to snap to 100% width on mouseup. Cause: The percentage calculation uses the parent element's width as reference. When the parent is inline (like `<a>`) or has fit-content width, its width equals the image width, resulting in 100% every time. Solution: Find the first ancestor with content width larger than the image and use it as reference for the percentage calculation. Steps to reproduce: - Add an image inside a link - Resize the image - Observe the image snaps to 100% width on release opw-xxxx --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247229
This update fixes an issue where components added to manufacturing orders through the product catalog weren't correctly transferred to the pre-production warehouse. The fix adds a warehouse ID to the moves created by the catalog, ensuring proper stock movement and fulfilling multi-step manufacturing requirements. This improves the accuracy of inventory tracking.
Original PR description
Issue
-----
In multi step manufacturing, components added to MO through the catalog don't get transfered to the pre-prod location.
Steps to reproduce
-----
- 2 step manufacturing
- Create 2 products
- Create a MO for the first product
- Open the product catalog
- Add some qty of the second product
- Go back to the MO & confirm it
> No procurement transfer for the second product from stock to pre-prod
Cause
-----
The move created by the catalog has no `warehouse_id` so in `adjust_procure_method` we don't find any rule which means it gets set to MTS
https://github.com/odoo/odoo/blob/6ecd271ff34313d900a0ad14b1c20679808ba9b8/addons/stock/models/stock_move.py#L2366-L2368
-----
Ticket:
opw-5221418
Forward-Port-Of: odoo/odoo#243036
Forward-Port-Of: odoo/odoo#239265This update fixes an issue where combo items weren't always printed correctly on preparation printers. Now, the system considers both the combo's and individual item's categories, ensuring all items in a combo are printed as intended. This improves the accuracy of order fulfillment for combo sales.
Original PR description
Previously, combo choice items with categories assigned to a preparation printer were skipped when their category differed from the combo parent product’s category. This commit ensures that both the combo parent product’s category and the item product’s category are taken into account to correctly print items to the preparation printer. Task: 5902389 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247028
This update enhances the reliability of syncing user data with Google Calendar. Previously, the sync process could time out with a large number of users due to a single, lengthy operation. Now, multiple sync cron jobs are used, targeting different user groups, to distribute the workload and prevent timeouts.
Original PR description
Before this commit, the sync cron of google could only work by performing a search on the users and starting the sync. But the cron could timeout with a large amount of users. As users were fetched in the same order, some users could never be synced. This change allows to create several cron with different type of user in self (by company, department, etc) to allow distribute the sync effort over several crons. 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#210286
This update resolves an issue where searching large datasets, particularly with many2many fields, could cause performance problems and errors due to excessive filtering. By adding a context to control grouping, the system now avoids unnecessary searches, improving stability and speed for users. This primarily impacts the Mail and Attachment modules.
Original PR description
Add a context to know if we are grouppnig. This allows us to stop `_search` methods which need to search and filter manually all records. For example, when asking if a field is groupable, `_description_groupable` will run a dummy search for many2many fields, for a normal user searching on ir.attachment, it would search for all attachments and try to filter them in memory leading to OOM error. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update significantly speeds up the process of importing products into Odoo, particularly when dealing with a large number of stock locations. The change optimizes a slow database query, resulting in a much faster import time. This improves overall system performance and reduces import delays.
Original PR description
Problem: When importing products in Inventory, _compute_quantities_dict fetches data from all internal stock.location. For databases with many internal locations (e.g., 37K), the query using LIKE ANY with a large array of parent paths is very slow. Solution: - Replace LIKE ANY(%s) pattern matching with a semi-join subquery using EXISTS, allowing the query to terminate on the first match. - Add an index on (parent_path, id) to convert sequential scans into index-only scans. Benchmark: |Number of rows| Before | After | |--------------|--------|-------| |37K | 4.xxs | 1.xxs | Simplied plan (a few hundred records instead of 37K) |Before|After| |-|-| |https://explain.dalibo.com/plan/8gb1257c6712age5|https://explain.dalibo.com/plan/5ef9c3g7aab3dfag| Related ticket: opw-5500169 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245939
This update corrects a bug causing dynamic website snippets to flicker in and out of view. The issue stemmed from a mismanaged CSS class, which has now been restored to its original state: snippets should be initially hidden and then displayed based on content. This ensures a consistent and reliable user experience for website visitors.
Original PR description
Steps to reproduce [18.2+]: 1. Add a dynamic snippet to a website page (e.g., Events). 2. Unpublish all event records. 3. The snippet first appears with a visible header, which then disappears. [A]-…
Steps to reproduce [18.2+]: 1. Add a dynamic snippet to a website page (e.g., Events). 2. Unpublish all event records. 3. The snippet first appears with a visible header, which then disappears. [A]- Starting from [1], the `o_dynamic_empty` class was introduced to handle the dynamic snippets visibility, and an upgrade script (see [3]) set this class by default on them. Later in 18.0 (after [2]), the class was changed to `s_dynamic_empty` in the XML template, while on the JS side, the class used to toggle snippet visibility was `o_dynamic_snippet_empty`. This class was also added to snippets on destroy (before saving). [B]- As a result, a dynamic snippet may end up with: - `o_dynamic_empty` & `o_dynamic_snippet_empty`: for old (before 18.0) but edited snippets. - `o_dynamic_empty`: for old snippets never updated in edit mode on 18.0. - `s_dynamic_empty` & `o_dynamic_snippet_empty`: for new snippets created in 18.0. Remark: the `s_dynamic_empty` class was introduced by mistake and does not have any associated CSS Since only `o_dynamic_snippet_empty` has `display: none` in CSS, the interaction flow became inconsistent (starting from 18.2): snippets were initially visible, then hidden if no content was found... which caused the flickering behavior described above. And because of [B], old snippets with the `o_dynamic_empty` class will be visible by default in 18.0. This commit restores the intended (and original) behavior: - A dynamic snippet should be invisible by default, - Then the interaction decides (based on actual content) whether the snippet should be displayed. [1]: https://github.com/odoo/odoo/commit/63def9c87305dd7773e0592a28fe19d0b63c0878 [2]: https://github.com/odoo/odoo/commit/76cf201e1fc356ad00b27bcdec408c54949df33b [3]: https://github.com/odoo/upgrade/commit/af5821d9aeb75d09653fc33f14e98fae5f5ba906 opw-5354523 Forward-Port-Of: odoo/odoo#240807 Forward-Port-Of: odoo/odoo#238305
This update resolves minor visual inconsistencies in the new image gallery template. Specifically, it corrects issues with missing styling and undefined class names, ensuring a more polished and reliable display of images for users. This improves the overall user experience.
Original PR description
This commit fixes a few minor issues in the new carousel items template introduced in [1]: items having an `"undefined"` class, and a missing margin style in the main snippet template. [1]: https://github.com/odoo/odoo/commit/9042b1cae7b630b20e0670788b7a4ed9e4c97609 linked-task-3414281 Forward-Port-Of: odoo/odoo#245357 Forward-Port-Of: odoo/odoo#241785
This update corrects a technical issue where inconsistent environments were causing errors in automated mail sending processes within Odoo. By standardizing the environment context, the system now reliably avoids these concurrent update errors, ensuring stable operation.
Original PR description
### [FIX] base: ensure an uniform environment between action variables The aim of this commit is to make the environment and context uniform across the variables that can be accessed in an action. Context: The mail override of `<ir.actions.server>._get_eval_context` that modifies the `env` wasn't reflected on the other variables which lead to a difference of context. Before this commit: This difference resulted in a concurrent update error caused by a direct mail send in method like `_cron_try_auto_reconcile_statement_lines`. After this commit: The environment and its context are uniform as expected and cron don't trigger a mail send directly, removing the concurrent error issue. task-id: None The issue was brought in the internal channel, temporarily fixed by adding the context in the server action and seen again in odoo.com logs through another cron. Forward-Port-Of: odoo/odoo#247255
This update fixes an issue where recurring prices on ecommerce product pages were displayed with incorrect grammar, specifically using singular forms for billing periods longer than one. The change ensures all recurring price labels are pluralized, providing a more professional and user-friendly experience for customers.
Original PR description
Issue: - On ecommerce product pages, recurring prices displayed incorrect grammar. - Billing periods greater than one were shown in singular form (e.g. 'Every 6 month' instead of 'Every 6 months'). Fix: - Updated recurring price display logic to use plural period labels when the billing period value is greater than one. Impact: - Recurring prices now display correct and user-friendly grammar. taskid-5529937 Forward-Port-Of: odoo/enterprise#105127
This update fixes an issue where annual returns incorrectly used a fiscal year filter when a company's fiscal year differed from the calendar year. Now, annual returns always follow the company's fiscal year, ensuring accurate reporting and eliminating confusion for users. This improves the reliability of financial data presented in reports.
Original PR description
When a company fiscal year differs from the civil year, the annual return incorrectly falls back to the report’s FY-aligned year filter. The return should always follow the civil year, so the fallback is skipped and the return period filter is shown instead. task-5511074 Forward-Port-Of: odoo/enterprise#104726
This update resolves an issue preventing the legal validation of annual VAT reports for Luxembourg. The PR adds missing required fields to the XML export, ensuring compliance with tax regulations. This corrects a previous validation error related to specific data fields.
Original PR description
### Issue: The annual VAT report could not be legally validated because some mandatory parent fields were missing in the XML export ### Cause: This PR add some required fields:…
### Issue: The annual VAT report could not be legally validated because some mandatory parent fields were missing in the XML export ### Cause: This PR add some required fields: https://github.com/odoo/enterprise/pull/93357 However, for file validation, the following parent fields are mandatory if certain child fields are present: ``` - Field 129: Field 129 is mandatory if one of the following fields is filled : 771, 971, 772, 972, 774, 773, 973, 124, 128, 197 - Field 137: Field 137 is mandatory if one of the following fields is filled : 776, 976, 777, 977, 778, 978, 134, 136, 198 - Field 145: Field 145 is mandatory if one of the following fields is filled: 781, 981, 782, 982, 783, 983, 142, 144, 199 - Field 163: Field 163 is mandatory if one of the following fields is filled : 791, 991, 793, 993, 797, 795, 995, 158, 162, 200 - Field 175: Field 175 is mandatory if one of the following fields is filled: 396, 162 ``` 164 and 165 are also added according to this assertion: https://github.com/odoo/enterprise/blob/c93388741182f1873054557a6e7767186674fafa/l10n_lu_reports/models/l10n_lu_annual_tax_report.py#L167-L171 ### Note: This PR is related to the 18.0 PR: https://github.com/odoo/enterprise/pull/104785 It also fix issues in `_add_yearly_fields()` because the validation consider form as float instead of dict ### Steps to reproduce: - Install `l10n_lu_reports` and switch to LU company - Open the Tax Report `Annual VAT Declaration` - Export the XML - Notice that codes 396, 394 149, and 153 are present, but 129, 137, 145, 163 and 175 are missing opw-5119920 Forward-Port-Of: odoo/enterprise#106457 Forward-Port-Of: odoo/enterprise#105143
This update corrects a bug where subscriptions with zero-sum quantities resulted in invoices being set to the subscription start date instead of the correct invoice period. The fix ensures accurate invoice date calculations for subscriptions with mixed positive and negative quantities, preventing incorrect billing.
Original PR description
### Issue: When creating a subscription with several lines whose quantities add up to zero, the next invoice date is not updated and set to the start date. ### Steps to reproduce: - Install…
### Issue: When creating a subscription with several lines whose quantities add up to zero, the next invoice date is not updated and set to the start date. ### Steps to reproduce: - Install 'sale_subscription' - Create a new Subscription with two lines and a tart data several months in the past - One with a quantity of 1 and a higher price - The other with a quantity of -1 - It can be the same service product with invoicing based on ordered quantity - Confirm the Subscription - Click "Create Invoice" and confirm the invoice - Back to the Subscription, the next invoice date was not updated. ### Cause: In `_get_max_invoiced_date()` to compute the invoiced periods we check the quantity corresponding to this period. But if an invoice has two lines with opposite quantities, they will cancel each other out at this line: https://github.com/odoo/enterprise/blob/c2ac44f492ec53083864f07ff5bfbff9458ddf2a/sale_subscription/models/account_move_line.py#L131 So the method will return not return the date in `invoice_dates`. Later, if `_get_max_invoiced_date()` returns nothing for `last_invoice_end_date` then `next_invoice_date` is set to `start_date`: https://github.com/odoo/enterprise/blob/c2ac44f492ec53083864f07ff5bfbff9458ddf2a/sale_subscription/models/account_move.py#L66-L67 ### Solution: The goal was to not include invoices that were fully refunded for the `last_invoice_end_date`. This is why `_get_max_invoiced_date()` substract the quantities from refunds. To make this work we can take the absolute value of the quantity returned by the compute method before giving it the wanted sign based on if it's an invoice or a refund. opw-5360930 Forward-Port-Of: odoo/enterprise#106364 Forward-Port-Of: odoo/enterprise#103705
This update resolves an issue where the printer selection wizard could generate errors if it encountered printers that were no longer active in the system. The change filters out these inactive printers, ensuring the wizard functions smoothly and avoids potential disruptions. This improves the user experience and data integrity.
Original PR description
Printers saved by the selection wizard in local storage can correspond to records that no longer exist in the database (removed in the meantime). To avoid a traceback when creating the wizard with non- existing printers, we filter out the ones that don't correspond to any device. Forward-Port-Of: odoo/enterprise#106268
This update ensures that freight costs are now accurately included in the customs documents generated for international sales. Previously, these costs were missing, leading to potential discrepancies in customs declarations. This change aligns with SendCloud API specifications and improves the accuracy of international shipping documentation.
Original PR description
Issue ----- For international deliveries, the customs document does not include the freight costs. Steps to reproduce ----- - Create an international sale (eg BE -> US) - Validate delivery - Open the commercial invoice > Freight costs is set to 0 Change ----- The `freight_costs` should be included in the `customs_information` field of the request (along with all customs-related data, as other fields have been deprecated) https://api.sendcloud.dev/docs/sendcloud-public-api/branches/v2/parcels/operations/create-a-parcel#:~:text=object%2E-,customs%5Finformation ----- Ticket: opw-5486742 Forward-Port-Of: odoo/enterprise#106387 Forward-Port-Of: odoo/enterprise#105543
This update resolves an error that occurred when employees were linked to multiple commission plans using the same payslip input. The fix ensures accurate currency conversion for commissions, preventing a system error and guaranteeing correct payslip generation for users with multiple commission plans. This improves payroll accuracy and reliability.
Original PR description
Currently, an error occurs while generating a payslip for an employee who is linked to more than one commission plan using the same payslip input. **Steps to Reproduce:** 1. Install the…
Currently, an error occurs while generating a payslip for an employee who is linked to more than one commission plan using the same payslip input. **Steps to Reproduce:** 1. Install the hr_payroll_sale_commission module. 2. Create a user and link to an employee. Set a contract for the employee. 3. Create two commission plans for the same user: - Use the same Payslip Input in both plans. - Set the Target Frequency to "Monthly" for both. 4. Generate a payslip for the employee. Ref: [Video](https://drive.google.com/file/d/1HhtUL2xznS_Aoi9ePL0OJLdGaXU8ZFZR/view?usp=sharing) **Error:** `ValueError - Expected singleton: sale.commission.report(30026010100009, 40026010100009)` **Cause:** When multiple commission records belong to the same payslip input, it tries to convert the commission amount using `coms.commission`, where coms has multiple recordsets. This leads to a singleton error during currency conversion. **Fix:** This commit ensures the currency conversion is applied per commission and prevents the singleton error. sentry-7187854690 Forward-Port-Of: odoo/enterprise#106124 Forward-Port-Of: odoo/enterprise#104464
This update fixes an issue where WhatsApp messages to blacklisted numbers wouldn't be blocked if the recipient's country differed from the sender's company. The fix ensures that all international phone numbers are correctly processed, regardless of the sender's location, preventing unwanted messages. This improves compliance and protects users from spam.
Original PR description
Sending a WhatsApp message to a blacklisted number fails to be blocked if the recipient's phone number country differs from the sender company's country. ### Steps to reproduce 1. Configure a…
Sending a WhatsApp message to a blacklisted number fails to be blocked if the recipient's phone number country differs from the sender company's country.
### Steps to reproduce
1. Configure a WhatsApp account.
2. Set the Company's country to Germany (+49).
3. Create a Contact with a Belgian phone number (e.g. +32456001122).
4. Send a template message to this contact.
5. Have the contact reply with "STOP" to opt-out (this correctly adds +32456001122 to the blacklist).
6. Send another message to the contact.
- Expected: The message is blocked.
- Actual: The message is sent successfully.
### Root cause
The blacklist search logic relies on implicit phone number sanitization which behaves incorrectly for international numbers without a `+` prefix.
1. `whatsapp.message` stores numbers as `CountryCode + NationalNumber` without a `+` (e.g. "32456001122").
2. `phone.blacklist` stores numbers in E.164 format with a `+` (e.g. "+32456001122").
3. When searching `phone.blacklist` with "32456001122", the system interprets it as a local number for the Company's country (Germany) because of the missing `+`.
4. It reformats the search term to German E.164 ("+4932456001122").
5. The query fails to match the actual blacklisted number ("+32456001122"), allowing the message to pass.
### Fix
Explicitly prepend a `+` to the recipient's number before searching the blacklist. This forces the validation logic to parse the number as international (E.164), bypassing the company-country bias and ensuring the search term matches the stored blacklisted number.
opw-5401789
Forward-Port-Of: odoo/enterprise#106395
Forward-Port-Of: odoo/enterprise#104556This update resolves an issue where malformed PDFs caused errors during the signature process. The change allows Odoo to attempt a less strict PDF parsing method, ensuring that more PDF documents can be successfully processed and used for signatures. This improves the reliability of the signature workflow.
Original PR description
Before this commit, opening some malformed PDF failed during flattening because PyPDF2 strict parsing and form-field reads raised errors. After this commit, we try first parsing the PDF in the usual way and if we fail, we try again with strict=False. See https://pypdf.readthedocs.io/en/stable/user/robustness.html. task-5902859 Forward-Port-Of: odoo/enterprise#106276
This update resolves an issue where the quantity of components in a manufacturing order wasn't correctly updated after exiting the barcode MRP operation. Specifically, the system incorrectly handled reserved quantities, leading to inaccurate component tracking. This fix ensures that component quantities are accurately reflected after the operation completes.
Original PR description
**Issue** When leaving the barcode MRP operation, `post_barcode_process()` may incorrectly update the move quantities. **Steps to reproduce** - Create a product with a BOM using a component with qty…
**Issue** When leaving the barcode MRP operation, `post_barcode_process()` may incorrectly update the move quantities. **Steps to reproduce** - Create a product with a BOM using a component with qty 6. - Create an MO producing qty 1. - Open the Barcode app > Manufacturing > open the MO (remove “MO Ready” filter if needed). - Click “+1”. - Edit the component qty from 6 to 3. - Exit the operation. - Re-enter the operation. -> The component shows 3/3 instead of 3/3 and 0/3. **Cause** On exit, `_onExit`: https://github.com/odoo/enterprise/blob/776848dc4e29d07a027847fde46a59f84dd35f56/stock_barcode/static/src/models/barcode_picking_model.js#L1489 calls `post_barcode_process()`, which triggers `split_uncompleted_moves`: https://github.com/odoo/enterprise/blob/776848dc4e29d07a027847fde46a59f84dd35f56/stock_barcode/models/stock_move.py#L16 correctly creating a `stock.move.line` with qty 3. However, `_truncate_overreserved_moves`: https://github.com/odoo/enterprise/blob/776848dc4e29d07a027847fde46a59f84dd35f56/stock_barcode/models/stock_move.py#L40 then reduces the move quantity to `max_reserved_qty = 3` and unreserves the remaining 3 units: https://github.com/odoo/enterprise/blob/776848dc4e29d07a027847fde46a59f84dd35f56/stock_barcode/models/stock_move.py#L49 This happens because the newly created move line is initialized with `reserved_uom_qty = 0`: https://github.com/odoo/enterprise/blob/776848dc4e29d07a027847fde46a59f84dd35f56/stock_barcode/static/src/models/barcode_picking_model.js#L1256 leading to `max_reserved_qty = quantity_done = 3 < move.quantity = 6`, while `move.product_uom_qty` is still 6. opw-5166763 Forward-Port-Of: odoo/enterprise#104199 Forward-Port-Of: odoo/enterprise#100314
This update corrects a bug that was incorrectly flagging miscellaneous entries with both expense and revenue accounts as invalid. Previously, the system would generate an error when using different deferred entry methods for expenses and revenues. Now, the validation only applies to entries with actual deferred dates configured, improving usability for common accounting scenarios.
Original PR description
The `_get_deferred_entries_method` checks for expense/income account conflicts using all line accounts, not just lines with deferred dates. This causes a false positive error when posting misc…
The `_get_deferred_entries_method` checks for expense/income account conflicts using all line accounts, not just lines with deferred dates. This causes a false positive error when posting misc entries with both expense and revenue accounts but no deferred dates configured. https://github.com/odoo/enterprise/blob/3e6d2f3ca7e2d4e940f2c2022f816202c72cbd1b/account_accountant/models/account_move.py#L150-L151 Steps To Reproduce: 1. Go to Settings → Accounting and set different "Generate Entries" methods for deferred expenses "On bill validation" and deferred revenues "Manually & Grouped". 2. Go to Accounting Dashboard and create a new Miscellaneous Operation. 3. Create 2 journal items: one with an expense account and one with a revenue account (neither configured for deferred entries). 4. Try to post the entry. 5. Error appears: "Having different deferred entries generation methods for expenses and revenues is not supported..." The validation should only apply when lines actually have deferred dates set, not for all misc entries with mixed account types. Commit that caused the issue: https://github.com/odoo/enterprise/commit/3e6d2f3ca7e2d4e940f2c2022f816202c72cbd1b Ticket [link](https://www.odoo.com/odoo/project.task/5486114) opw-5486114 Forward-Port-Of: odoo/enterprise#104476
This update resolves an issue where CFDI payroll validation failed when users created payrolls with no deductions. The fix ensures that the CFDI report accurately reflects the absence of deductions, aligning with Mexican tax regulations. This prevents validation errors and ensures compliance.
Original PR description
…eductions Currently, if users modify the MX Payroll structure in order to have no deductions in the final payroll, CFDI validation for the payroll entry will fail. Steps to reproduce: - Set up…
…eductions
Currently, if users modify the MX Payroll structure in order to have no deductions in the final payroll, CFDI validation for the payroll entry will fail.
Steps to reproduce:
- Set up Payroll Structure "Mexico: Regular Pay" with Salary Rules:
- Used subsidy:
- Code: SUBSIDY
- Category: Allowance
- CFDI Concept: (O02) Employment Subsidy (Effectively Delivered to the Worker)
- Deduction:
- Code: DEDUCTION
- Category: Deduction
- CFDI Concept: (D04) Others
- Net Salary:
- Code: NET
- Category: Net
- CFDI Concept: (P01) Salaries, Wages, Stripes, and Day Labor
- Formula: `result = payslip.paid_amount`
- In Payroll > Payslips, Click 'New Off-Cycle'
- Select employee, compute sheet, create draft journal entry and post it
- Back to the payslip, mark as paid and generate CFDI
Issue:
CFDI Validation will fail with error
`Code : 301 Message : Error en complemento Nómina. [Error #NOM38] El atributo Nomina.TotalDeducciones, no debe existir. Folio: 0002. Serie: SLR/2025/12.`
It occurs because, according to the official specs [1] attribute `TotalDeducciones` should not be reported in case there are no deductions
[1] http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/GuiallenadoNomina311221.pdf
opw-5348789
Forward-Port-Of: odoo/enterprise#104311This update ensures that product prices within Odoo Enterprise are stored with a minimum level of precision. This change addresses a technical issue identified in previous development and improves data consistency. It primarily impacts the accuracy of product pricing calculations.
Original PR description
Fix tests, related to https://github.com/odoo/odoo/pull/243987 task-4895014 Forward-Port-Of: odoo/enterprise#106382 Forward-Port-Of: odoo/enterprise#104728
This update simplifies the one-time payment form accessed through the employee record. The version field, previously required, has been removed as it's automatically determined by the system. This change ensures a cleaner user experience and avoids potential errors related to incorrect employee or version selection.
Original PR description
… payment form The one time payment view is accessed only via the smart button on the employee form for a specific version. This view displays only that employee's one time payments for the selected version. Since the version is provided by the context and creating a payment for a different employee or version would not make sense, the version field is made invisible. Task: 5384437 Forward-Port-Of: odoo/enterprise#103245
This update resolves a technical problem where sales commission IDs were exceeding JavaScript limits, causing errors. The fix increases the range of the plan ID, allowing for a significantly larger number of sales plans (from 900 to 90,000) while maintaining security and minimizing the risk of duplicate records.
Original PR description
Issue: 10^13 was too big of an exponent as such the id generated were bigger than JS limit `Number.MAX_SAFE_INTEGER`, this resulted in the id being rounded to the nearest reprentable integer. Which resulted in a traceback as we were fetching records that didn't exist. This fix allow a bigger margin for the plan_id while keeping the collusion risk equal, as we have the following: - user_id margin is 10^5 - date is in YYMMDD format, so it occupies at most 6 integer - plan_id can thus occupy the space after which is 5 + 6 so 10^11 Only issue possible left with this id generation would be to have user that are 1000 id apart, with same date and same plan. Or that we have too much plan that we exceed the JS limit. Number of plan that can be handled with this change goes from ~900 -> ~90000 which seems reasonable. Forward-Port-Of: odoo/enterprise#106513
This update resolves an issue where sign requests created on older Odoo versions (before 16.0) would fail due to missing communication company information. The fix automatically uses the user's company date format in these cases, ensuring sign requests can be processed correctly. This prevents crashes and improves the reliability of the sign request workflow.
Original PR description
For old databases that were created before 16.0, existing sign request might not have a communication company set. Following commit odoo/enterprise@6b505a34f7bdee89c155eed7507296d5acfd8a9b trying to…
For old databases that were created before 16.0, existing sign request might not have a communication company set.
Following commit odoo/enterprise@6b505a34f7bdee89c155eed7507296d5acfd8a9b trying to open such sign request will result in a crash:
```
Traceback:
...
File "/data/build/odoo/enterprise/saas-18.3/sign/controllers/main.py", line 354, in get_document
context = self.get_document_qweb_context(request_id, token)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/enterprise/saas-18.3/sign/controllers/main.py", line 88, in get_document_qweb_context
date_format = posix_to_ldml(lang.date_format, locale=locale)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/odoo/saas-18.3/odoo/tools/misc.py", line 606, in posix_to_ldml
for c in fmt:
TypeError: 'bool' object is not iterable
```
This commit fallback to the create user's company to determine the date language when there is not communication company set.
no-task (from feedback pad)
Forward-Port-Of: odoo/enterprise#87526This update corrects a technical issue related to the HR payroll tour in the Swiss localization. The tour was incorrectly displaying a Work Entries button, which isn't relevant for Swiss companies. This fix ensures the tour functions correctly for Swiss businesses, streamlining the payroll process.
Original PR description
The Work Entries button on the form view of the hr_payslips is defined differently in the Swiss localization. We need to override the tour to make it work for swiss companies. Runbot Error: 234647 Forward-Port-Of: odoo/enterprise#106147
This update fixes an issue where the business card scanner button disappeared from the mobile version of the CRM. The change restores the button's functionality, allowing users to easily scan business cards directly within the CRM's mobile interface. This ensures a seamless experience for mobile users adding leads.
Original PR description
After the introduction of the lead generation dropdown (task-4876662) in the CRM kanban control panel, the business card scanner button was no longer rendered on mobile devices. This commit restores the business card scanner button in the kanban control panel on mobile. Task-5899751
This update ensures salary configuration details (like address and personal information) are automatically populated when creating contracts from templates. Previously, templates didn't use employee data, but this change now leverages the employee's latest version, streamlining the offer creation process. This improves data accuracy and reduces manual input.
Original PR description
The personal informations in the salary config is prefilled using the version selected in the offer. When making a new offert for an already employed person, the default version is the last active version, the address and other personal info are already set on that version and the salary has the last up-to-date data. But when selecting a contract template in an offer, the version does not have the personal info from the employee (as it's a template). In this commit, we force to use the employee itself (from the active version of the employee, or the employee linked to the contract template copy - created during the offer creation). may it be an applicant or an existing employee, when an offer is generated, an employee is created (or re-used) and set on the contract template. So it works in every case. Taks-5162703 Forward-Port-Of: odoo/enterprise#104375 Forward-Port-Of: odoo/enterprise#99908
This update resolves an issue where payment reports were inconsistently using different export formats (NACHA or localization-specific). The fix ensures that payment reports now automatically use the correct format based on the company's localization, improving report accuracy and usability for users. The changes have been backported to version 18.0 and include new tests.
Original PR description
\* = l10n_{ae, au, ch, in, sa, us}_hr_payroll + hr_payroll_account_iso20022
Issue:
The current behavior looks deterministic: when clicking on "Create Payment Report" it -sometimes- shows the current company's export format by default, other times it shows the "NACHA" type. Or it could be the last installed module's export format value for the other companies.
Solution:
I fixed it in this PR: https://github.com/odoo/enterprise/pull/93683 and now backporting the changes to version 18.0
task-5189295
Forward-Port-Of: odoo/enterprise#104377
Forward-Port-Of: odoo/enterprise#100126This update fixes a potential issue where applicants could incorrectly reopen and re-sign expired job offers. The system now prevents access to fully signed offers, ensuring data integrity and a smoother applicant experience. A database constraint has also been added to prevent invalid offer validity dates.
Original PR description
This commit improves the offer validation logic to avoid invalid or unintended signature attempts. Fixes included: - Block access to offers that are already fully signed, preventing applicants from reopening the link and unintentionally reverting the offer to a partially signed state. - Add an SQL constraint on the `validity` field to disallow negative values, ensuring that expired/invalid offers cannot be accessed due to incorrect validity data. These changes ensure that expired or fully processed offers no longer expose active signature links and that offer validity is consistently enforced at the database level. task-5405456 Forward-Port-Of: odoo/enterprise#104354 Forward-Port-Of: odoo/enterprise#101834
This update fixes an issue where appraisal templates couldn't select departments without a linked company. The fix ensures all departments, including those without a company association, are now available for selection within the template configuration. This improves usability and prevents limitations in defining appraisal processes.
Original PR description
### Issue:
On the appraisal template form view, the dropdown of "Departments" does not show departments with no company.
### Steps to reproduce:
- In the Employee app create a new Department with no company
- Go in Appraisals > Configuration > Appraisal Templates
- Click on a template, remove it's company if it has one
- Try to change the Department of the template
- The new department does show
### Cause:
The field `department_ids` on `hr.appraisal.template` have this domain: `(company_id and [('company_id', 'in', [company_id, False])] or [('company_id', 'in', allowed_company_ids)])` It excludes departments with no company when the template have no company because `allowed_company_ids` doesn't contain `False`.
### Solution:
Add `False` in `allowed_company_ids`.
opw-5354581
Forward-Port-Of: odoo/enterprise#103531This update fixes an issue where the employee's filling status wasn't updating correctly when the associated address state was changed. The fix adjusts the system to dynamically reflect the correct filling status based on the employee's working address location, ensuring accurate payroll calculations for users in different states.
Original PR description
to reproduce: ============= - create employee and set working address with state in CA - set filling status to match the state - in the address record change the state to AL (don't change the record in employee) - go back to employee form view, filling status is still the same problem: ======== currently we are relying on a constraint to check if the filling status is valid for the state in the working address. But `api.constrains` doesn't support dotted paths, so modifying `address_id.state_id` doesn't trigger it. solution: ========= make the filling status computated field depending on `address_id.state_id` opw-5878740 Forward-Port-Of: odoo/enterprise#106000
This update resolves an issue where toggling the Studio feature in Odoo Enterprise could disrupt the layout of form stat buttons. The fix ensures the stat button layout remains consistent, regardless of whether Studio is active, improving the user experience and preventing potential formatting problems.
Original PR description
**Before this commit:** Toggling Studio could break the layout of form stat buttons. **After this commit:** The stat button layout remains intact when Studio is toggled. task-5480309 Forward-Port-Of: odoo/enterprise#106452
This update resolves an issue causing duplicate Worldline receipts to appear in POS transactions. The fix ensures receipts are only added when a Worldline transaction is fully completed, improving the accuracy and reliability of sales records. This prevents potential discrepancies and ensures data integrity.
Original PR description
This PR fixes the issue where Worldline receipts were sometimes added twice to the pos receipt by only modifying the receipt if the transaction has been finished (currently we modify the receipt no matter the message type (cancellation/payment failed etc.)) ticket-5342655 Forward-Port-Of: odoo/enterprise#106554
This update ensures that sign templates are correctly named in all languages, reflecting the actual document being signed. Previously, templates created in non-English languages defaulted to 'New Template' due to a comparison issue. This fix guarantees accurate naming across all supported languages, improving the user experience and data consistency.
Original PR description
## Steps to reproduce: 1. Upload a new PDF document to be signed. 2. Select it in the Documents app to sign it. 3. Check the name of the sign template created. ## Issue: When creating signature templates in languages other than English, the template name would stay as "New Template" instead of updating to the actual document name. This happened because the code was comparing the template name against a translated version of "New Template", but the template was initially created with the English default value. Since "New Template" ≠ "Nueva Plantilla" (Spanish), the comparison failed and the name never got updated. The fix ensures we always compare against the original English default value, so the template name gets properly updated to match the document name regardless of the user's language. Related commit: 4254542 opw-4980747 Forward-Port-Of: odoo/enterprise#104846 Forward-Port-Of: odoo/enterprise#92682