Monday, November 3, 2025
29 changes · saas-18.3
Resolved issues and error corrections
Product forms now show the correct tax information when a branch company uses taxes inherited from its parent company. This helps users see accurate sale prices on products, matching the taxes applied later on sales orders and invoices.
Original PR description
Steps: - Install account app. - Create a branch company under the main company. - Create a tax for the branch company. - Add a main company tax on a product. - Switch to branch company. Issue: - Tax…
Steps: - Install account app. - Create a branch company under the main company. - Create a tax for the branch company. - Add a main company tax on a product. - Switch to branch company. Issue: - Tax string is not displaying on the product form even though its setting tax from parent company on invoice line and SO line so its displaying wrong sale price on product form. Cause: - After [PR] taxes are only consider from current company even though company is branch company but in [17.0 PR] we share taxed and other accounting related data b/w main and branch company so if branch does not it's specific tax applied on product then it should take tax from its parent company. Fix: - Compute tax_string in product the way we compute tax on invoice line, SOL etc using `_filter_taxes_by_company` method this way it'll give proper tax which will be applied on related documents. [PR]: https://github.com/odoo/odoo/pull/194881 [17.0 PR]: https://github.com/odoo/odoo/pull/125642 opw-5042833 Forward-Port-Of: odoo/odoo#233720
This fix updates the Cambodian accounting localization so tax names are no longer duplicated. It prevents errors when businesses manually install the Cambodian chart of accounts, making setup more reliable.
Original PR description
Fixes an issue where some taxes in the Cambodian package have the same name, leading to errors when manually installing the chart template. Interestingly enough, the constraints does not trigger on the demo data company. Task [link](https://www.odoo.com/odoo/project.task/5194444) task-5194444 Forward-Port-Of: odoo/odoo#232968
The Point of Sale settlement flow now checks that a customer still exists before calculating their outstanding balance. This prevents sessions from crashing when a customer was deleted while the session was still open, improving reliability for store staff.
Original PR description
Currently, a missing exception is triggered when reopening a PoS session after a partner is deleted. **To reproduce this issue:** 1) Install point_of_sale and pos_settle_due. 2) Open a PoS session 3)…
Currently, a missing exception is triggered when reopening a PoS session after a partner is deleted. **To reproduce this issue:** 1) Install point_of_sale and pos_settle_due. 2) Open a PoS session 3) Create a customer and place an order with payment. 4) Without closing the session, go to the backend. 5) Delete the customer from Contacts. 6) Reopen the previously opened PoS session. **Error:** A `missing record` exception is triggered. **Cause:** When the user reopens a PoS session after deleting a partner, the method `setAllTotalDueOfPartners` is triggered during setup. https://github.com/odoo/enterprise/blob/7c6ba26970698cb60121157c2cca0e414d5b62a0/pos_settle_due/static/src/app/services/pos_store.js#L7-L9 https://github.com/odoo/enterprise/blob/7c6ba26970698cb60121157c2cca0e414d5b62a0/pos_settle_due/static/src/app/services/pos_store.js#L44-L48 This method makes an RPC call to `get_all_total_due` to update all partners' due amounts. Since the partner was deleted, this causes a missing record exception. https://github.com/odoo/enterprise/blob/7c6ba26970698cb60121157c2cca0e414d5b62a0/pos_settle_due/models/res_partner.py#L28-L32 **Solution:** Before calling `get_total_due`, verify the partner still exists in the database. Related Community PR:- https://github.com/odoo/odoo/pull/219809 opw-4897814 Forward-Port-Of: odoo/enterprise#90596
Customers linked to Point of Sale orders can no longer be deleted while they are still needed by an open PoS session. This prevents reopening a session from failing with missing customer data and helps keep sales records consistent.
Original PR description
Currently, a partner can be deleted even if they have associated PoS orders. This causes inconsistent behavior, such as missing record tracebacks when reopening a PoS session. **To reproduce this…
Currently, a partner can be deleted even if they have associated PoS orders. This causes inconsistent behavior, such as missing record tracebacks when reopening a PoS session. **To reproduce this issue:** 1) Install point_of_sale and pos_settle_due. 2) Open a PoS session 3) Create a customer and place an order with payment. 4) Without closing the session, go to the backend. 5) Delete the customer from Contacts. 6) Reopen the previously opened PoS session. **Error:-** A `missing record` exception is triggered. **Cause:** - Starting from SaaS-18.1, PoS supports offline mode with limited functionality, due to this commit: https://github.com/odoo/odoo/pull/184417/commits/711e248efd54500f91acfb1b9a30f48177c34925 - Before this commit, data was reloaded whenever a session was opened or reopened, ensuring proper synchronization with the backend. - After this commit, IndexedDB is used to cache data and it is reused every time the session is reopened. - When the user reopens a PoS session after deleting a partner, the method `setAllTotalDueOfPartners` is triggered during setup. - This method makes an RPC call to `get_all_total_due` to update all partners due amounts. Since the partner was deleted, this causes a missing record exception. **Solution:** - Prevent users from deleting a partner who has PoS orders and an open session. - Before calling `get_total_due`, verify the partner still exists in the database. Related Enterprise PR:- https://github.com/odoo/enterprise/pull/90596 opw-4897814 Forward-Port-Of: odoo/odoo#219809
The Saudi e-invoicing address form now labels the second street/address line as “District” instead of “Street 2”. This helps users enter the correct district or borough information required for Saudi e-invoicing compliance and reduces the risk of data entry mistakes.
Original PR description
## Before this commit The `street2` field on `res.company` and `res.partner` was mapped to `cac:AccountingSupplierParty/cac:Party/cac:PostalAddress/cbc:CitySubdivisionName`, but its placeholder displayed `Street 2…`. This caused confusion among users, as they assumed it referred to `cbc:AdditionalStreetName`, leading to incorrect data entry and potential non-compliance. ## After this commit The placeholder of the `street2` field has been changed from `Street 2…` to `District…`, clarifying that this field represents the city subdivision (district or borough) of the Seller/Customer, in line with the Saudi Arabia e-invoicing specification. > Task-4951545 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#231676 Forward-Port-Of: odoo/odoo#231160
The Journal Report now updates its Global Tax Summary amounts when users change the rounding unit. This keeps tax summary figures consistent with the rest of the report and prevents confusion from mixed number formats.
Original PR description
Currently when users change the rounding unit filter in the Journal Report, the Global Tax Summary values remain in the old format instead of updating to reflect the new rounding setting. This…
Currently when users change the rounding unit filter in the Journal Report, the Global Tax Summary values remain in the old format instead of updating to reflect the new rounding setting. This creates inconsistency where main report values update correctly but tax summary values stay unchanged. Cause: - The issue occurs because `_format_column_values` method in `account_report.py` wasn't handling the special tax summary data structures (`tax_report_lines` and `tax_grid_summary_lines`) that store pre-formatted values. These structures need to be reformatted when rounding unit changes, but the formatting logic only covered standard report columns. Fix Applied: - Updated frontend (`filters.js`) to call `format_column_values_from_client` via `dispatch_report_action` instead of calling `format_column_values` directly. (this enables proper routing through the custom handler system) - Added `format_column_values_from_client` override in `JournalReportCustomHandler` that intercepts the formatting call and applies special handling for tax summary lines by adding logic to reformat `tax_report_lines` and `tax_grid_summary_lines` monetary fields using their `_no_format` counterparts. - The custom handler then delegates to the base method via `report.format_column_values_from_client()` to format standard columns. - Also added missing `_no_format` fields in `account_journal_report.py` for `base_amount` and `tax_amount` to enable proper reformatting. Forward-Port-Of: odoo/enterprise#98508 Forward-Port-Of: odoo/enterprise#94660
Fixed an issue where updating multiple combo products on an unsaved sales order could move combo items under the wrong combo. Sales teams can now adjust combo quantities with confidence that the order lines remain correctly grouped before saving.
Original PR description
Steps to Reproduce: - Create a Sale Order containing two combo products placed consecutively. - Change the quantity of the first combo → corresponding combo items update correctly. - Without saving,…
Steps to Reproduce: - Create a Sale Order containing two combo products placed consecutively. - Change the quantity of the first combo → corresponding combo items update correctly. - Without saving, change the quantity of the second combo. - Observe that the combo items now appear misplaced — items from the second combo are inserted before those of the first combo. Issue: - The order of combo items becomes incorrect when multiple combo products are updated consecutively in the same unsaved Sale Order. Cause: - During `onchange`, the `self.order_line` recordset reflects the *in-memory order of applied commands* rather than the database `sequence` field because they are not saved in the DB during the edition. - Each `onchange` rebuilds `order_line` using concatenated command lists (`delete + create + update`), So when multiple combos are modified without save, newly created combo items are appended according to command evaluation order — not by logical grouping. - This causes combo items to shift relative to their parent combo lines. Solution: - Restrict the recomputation of order lines to non-combo lines by filtering out combo item lines during the rebuild. As combo items will always be in their desired sequence. - This ensures that combo items always stay under their respective parent combos and their sequence is preserved, regardless of the order in which combos are updated. opw-5148770 Affected Version:18.0 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233740
Barcode scans are now ignored when a draft, cancelled, or completed batch transfer is opened in a context where scanning cannot be processed. This prevents confusing error messages and system tracebacks, giving warehouse users a smoother experience in the barcode app.
Original PR description
### Issue: Scans processed during picking batch creation in the barcode app are interpreted as scans related to the BarcodePickingBatchModel edition (that is product, lot, package,... scans) which…
### Issue: Scans processed during picking batch creation in the barcode app are interpreted as scans related to the BarcodePickingBatchModel edition (that is product, lot, package,... scans) which does not make sense and raises multiple errors. ### Steps to reproduce: - In the settings enable "Batch Transfers" - Inventory/Operations/Transfers/Batch Transfers - Create a new batch and do not confirm it - Go to the barcode app > Batch Transfers > Clear filters - Select your draft batch - Scan anything #### > Traceback #### Other issues: The same flow with a cancelled batch triggers the same tracebacks and, with a done batch triggers the message: "This picking is already done". ### Cause of the issue: Since `this.state.view === "barcodeLines"`, scans are processed as if we were processing an existing `BarcodePickingBatchModel` with lines: https://github.com/odoo/enterprise/blob/ce7460b27028d4133c4689afd2e8f303268494a0/stock_barcode/static/src/components/main.js#L204-L209 In particular, if the scan corresponds to a product, and error will be raised because the scan can not process a `createNewLine` for the scanned product in the current view and if the scan does not correspond to anything valid, it will raise an error because `this.picking` is undefined and `this.picking.use_existing_lots` raises an error: https://github.com/odoo/enterprise/blob/ce7460b27028d4133c4689afd2e8f303268494a0/stock_barcode/static/src/models/barcode_model.js#L1115 https://github.com/odoo/enterprise/blob/ce7460b27028d4133c4689afd2e8f303268494a0/stock_barcode_picking_batch/static/src/models/barcode_picking_batch_model.js#L177-L179 opw-5162164 Forward-Port-Of: odoo/enterprise#98022 Forward-Port-Of: odoo/enterprise#97526
This fixes Belgian payroll so public holidays during long-term sick leave are no longer paid after the legally required 30-day period. It helps ensure payslips follow Belgian rules and avoids overpaying employees in these specific absence cases.
Original PR description
Bug: In Belgium, after 30 calendar days of sick leave, all public holidays during the sick leaves are no longer paid. But here they were still being paid. Cause: The method that was checking what to do about public holidays was never seeing public holidays since they were already changed to their corresponding work entries at the work entry generation. Fix: Add the public holidays in the context and change the condition for checking if the current leave is actually from a public holiday or not. Task: 3864585 Forward-Port-Of: odoo/enterprise#98388 Forward-Port-Of: odoo/enterprise#95178
Dimona-related employee fields are now shown only for Belgian employees instead of appearing for everyone. This reduces confusion for companies operating in multiple countries and keeps payroll screens focused on relevant local requirements.
Original PR description
Before this commit, the fields about dimona were shown for all employees, now these fields will be displayed only for belgian employees. task-5148931 Forward-Port-Of: odoo/enterprise#98484 Forward-Port-Of: odoo/enterprise#96496
1. We didn't met one of the specific requirement of the BIS3 invoices to be sent through Chorus Pro. > The SIRET number for the final recipient, behind Chorus Pro should always be sent in the following tag: Invoice/cac:AccountingCustomerParty/PartyLegalEntity/CompanyID 2. One of the attributes of the CompanyID was set to schemeName which is not a valid attribute of the Peppol BIS3 specification. Fixed in 18.0+: https://github.com/odoo/odoo/commit/c3ae4b29c51c7b0cff11aac5f4bf4aab5fad16c
Original PR description
1. We didn't met one of the specific requirement of the BIS3 invoices to be sent through Chorus Pro. > The SIRET number for the final recipient, behind Chorus Pro should always be sent in the following tag: Invoice/cac:AccountingCustomerParty/PartyLegalEntity/CompanyID 2. One of the attributes of the CompanyID was set to schemeName which is not a valid attribute of the Peppol BIS3 specification. Fixed in 18.0+: https://github.com/odoo/odoo/commit/c3ae4b29c51c7b0cff11aac5f4bf4aab5fad16c9 task-none (possible opw-4972189, but might not be the only problem) Source: <img width="787" height="673" alt="image" src="https://github.com/user-attachments/assets/2a410fa8-572a-4738-aa5d-764e91271880" /> https://www.pagero.com/onboarding/aife/aife-en Forward-Port-Of: odoo/odoo#233648 Forward-Port-Of: odoo/odoo#229014
### Issue: Given a specific configuration, the `SwitchCompanyMenu` will not display all the companies a user can access. Suppose we have a company hierarchy with the following: `Company 1 > Company 2 > Company 3` (where 2 is a branch of 1, and 3 is a branch of 2). If a user has access to C1 and C3, but not C2, the menu selector will only display C1, rather than a hierarchy of all 3 companies with C2 disabled. This menu has been improved between versions, but the logic behind how we determine
Original PR description
### Issue: Given a specific configuration, the `SwitchCompanyMenu` will not display all the companies a user can access. Suppose we have a company hierarchy with the following: `Company 1 > Company 2…
### Issue: Given a specific configuration, the `SwitchCompanyMenu` will not display all the companies a user can access. Suppose we have a company hierarchy with the following: `Company 1 > Company 2 > Company 3` (where 2 is a branch of 1, and 3 is a branch of 2). If a user has access to C1 and C3, but not C2, the menu selector will only display C1, rather than a hierarchy of all 3 companies with C2 disabled. This menu has been improved between versions, but the logic behind how we determine which companies to display remains consistent. We loop over each root company from `companyService.allowedCompaniesWithAncestors`, add it, and then add its children. Depending on whether the child company is accessible, it will be disabled (but still displayed) in the hierarchy list. `companyService` pulls its company information from the `session['user_companies']` dict that is created from `session_info`. For each of the `allowed_companies`, we build the `child_ids` from the intersection of each `user.company_id.child_ids` and `user.company_ids`. So we only add the child if it itself is an allowed company, which C2 would not be. C1 is now considered a root company with no children in our loop, so C2 is skipped. C2 isn't a root company either, so it will never be seen, and therefore neither will C3. ### Solution: A similar case was addressed in #138942, where given the same company hierarchy as above, the user instead has access to C2 and C3, but not C1. This PR adjusted how we build the `child_ids` for `disallowed_ancestor_companies` (C1 in this case), properly setting the children for us to loop through. We can use this same logic for the `child_ids` of `allowed_companies`, ensuring we can properly loop through the disallowed children of allowed companies. Additionally, we need to adapt the `CompanySelector` component, which previously grabbed all children even if they were disallowed. opw-4880477 Forward-Port-Of: odoo/odoo#228438 Forward-Port-Of: odoo/odoo#217001
Problem: Reverting history sometimes restores children in the wrong order (e.g. `acb` instead of `abc`). Cause: In `historyRevert`, node reinsertion relied on `nextId` / `previousId` only if the referenced sibling was connected to the live DOM (`.isConnected`). When that check failed, the fallback was `parent.append()`. On some Firefox versions, mutation events list the parent removal *after* its children’s, meaning the parent is reinserted first while the children’s siblings still exist b
Original PR description
Problem: Reverting history sometimes restores children in the wrong order (e.g. `acb` instead of `abc`). Cause: In `historyRevert`, node reinsertion relied on `nextId` / `previousId` only if the…
Problem:
Reverting history sometimes restores children in the wrong order (e.g. `acb` instead of `abc`).
Cause:
In `historyRevert`, node reinsertion relied on `nextId` / `previousId` only if the referenced sibling was connected to the live DOM (`.isConnected`).
When that check failed, the fallback was `parent.append()`. On some Firefox versions, mutation events list the parent removal *after* its children’s, meaning the parent is reinserted first while the children’s siblings still exist but are detached. Because `.isConnected` returned false, the fallback `append()` misplaced nodes and broke the order.
Example (processed in reverse order):
```js
[
{ type: 'remove', id: 'p', parentId: 'root', node: { tagName: 'P' } },
{ type: 'remove', id: 'b1', parentId: 'p', nextId: 'b2',
node: { textValue: 'b' } },
{ type: 'add', id: 'b1', append: 'x', node: { textValue: 'b' } },
{ type: 'remove', id: 'c1', parentId: 'p', node: { textValue: 'c' } },
{ type: 'add', id: 'c1', append: 'x', node: { textValue: 'c' } },
]
```
During revert:
- Child removals (b1, c1) are processed first.
- Their sibling nodes exist but are detached → .isConnected false.
- Fallback append() used → "b" inserted after "c" → acb.
- `<p>` restored last with children in wrong order.
Solution:
Remove the `.isConnected` condition.
`before()` and `after()` work even on detached nodes, preserving the original child order regardless of browser mutation sequence.
Steps to reproduce:
- Open todo.
- Have this:
```html
<p>a[]</p>
<p>b<br>c</p>
```
- Press Delete.
- Observe "b" and "c" are not in the right order.
opw-5139795
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#233582This test was not awaiting each step properly, which becomes visible when the runbot is overloaded and the querySelector calls return null, at which point accessing `click` or `value` would trigger a traceback. runbot-161423 Forward-Port-Of: odoo/odoo#233900
Original PR description
This test was not awaiting each step properly, which becomes visible when the runbot is overloaded and the querySelector calls return null, at which point accessing `click` or `value` would trigger a traceback. runbot-161423 Forward-Port-Of: odoo/odoo#233900
On small screens (e.g., Zebra scanner, iPhone 4), the image overlaps the barcode scan button, making it impossible to click and scan new items. ### Steps to reproduce: On a small screen size (Zebra scanner, Iphone 4,..) * Open barcode app * Go on Operations -> Receipts * Apply a filter so that the list becomes empty. -> the image is over the barcode button and the text. ### Observation: Our image (in div .o_view_nocontent) has position absolute, anchoring it to the top part of
Original PR description
On small screens (e.g., Zebra scanner, iPhone 4), the image overlaps the barcode scan button, making it impossible to click and scan new items. ### Steps to reproduce: On a small screen size (Zebra…
On small screens (e.g., Zebra scanner, iPhone 4), the image overlaps the barcode scan button, making it impossible to click and scan new items. ### Steps to reproduce: On a small screen size (Zebra scanner, Iphone 4,..) * Open barcode app * Go on Operations -> Receipts * Apply a filter so that the list becomes empty. -> the image is over the barcode button and the text. ### Observation: Our image (in div .o_view_nocontent) has position absolute, anchoring it to the top part of the screen where the search bar is located (in div .o_control_panel). The issue is that in barcode there is another element where the button to scan is located (o_kanban_tip_filter), and since the image is absolutely positioned relative to the top rather than this element, it ends up overlapping the button and the text, preventing interaction. ### Why the fix: The solution we chose is to change the position of the image to relative, for the image to not hide the text. Another possible solution was to make the image (more specifically .o_view_nocontent .o_nocontent_help) ignore all input, allowing them to go through the image and reach the button below. opw-5123880 Forward-Port-Of: odoo/enterprise#98243
Steps to Reproduce: 1. Add a Countdown snippet. 2. Change the layout to Boxes. 3. Apply a background color to the layout. 4. Hover over the delete button in the color picker. 5. A traceback error occurs. Issue: A traceback error occurs because the does not have a default value assigned. This is necessary for the snippet to preview correctly when no additional color is applied. Fix: Assign a default value to ensure that the hover behavior works properly, even when no color is set.
Original PR description
Steps to Reproduce: 1. Add a Countdown snippet. 2. Change the layout to Boxes. 3. Apply a background color to the layout. 4. Hover over the delete button in the color picker. 5. A traceback error occurs. Issue: A traceback error occurs because the does not have a default value assigned. This is necessary for the snippet to preview correctly when no additional color is applied. Fix: Assign a default value to ensure that the hover behavior works properly, even when no color is set. The issue was produced here: https://github.com/odoo/odoo/commit/03c552690b15#diff-a0262b81bb090b8c62afbd342b2a30f054cf353a35f9fc0ceeb0f86b7b9cd645 task-4752497 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232094 Forward-Port-Of: odoo/odoo#224012
Steps to reproduce the current behaviour: - Update the DEMO user to be a website "restricted editor" and sales "admin" who cannot bypass HTML field sanitization. - As ADMIN, add a YouTube video to a product page > Save. - As DEMO, try to update the content on the product page > You cannot (a dialog informs you that you cannot edit the content because an admin edited it previously). Explanation: Starting from [1], an HTML field can be flagged as `sanitize_overridable` which all
Original PR description
Steps to reproduce the current behaviour: - Update the DEMO user to be a website "restricted editor" and sales "admin" who cannot bypass HTML field sanitization. - As ADMIN, add a YouTube video to a…
Steps to reproduce the current behaviour: - Update the DEMO user to be a website "restricted editor" and sales "admin" who cannot bypass HTML field sanitization. - As ADMIN, add a YouTube video to a product page > Save. - As DEMO, try to update the content on the product page > You cannot (a dialog informs you that you cannot edit the content because an admin edited it previously). Explanation: Starting from [1], an HTML field can be flagged as `sanitize_overridable` which allowed users with the `base.group_sanitize_override` group to skip the HTML field sanitize process. If such users added some content that is not considered "sanitize friendly" (e.g. YouTube iframe), a restricted user won't be allowed to add content in the fields, since the sanitizer will remove the original content from the DOM. For this case, the code from [2] added an implementation to consider the field as none editable and warn the user once he tries to update it. Implementation: The goal of this commit it to fix the current limitation for video upload that currently prevents non admin users to edit a website record once an admin adds a video on it... The idea of the fix is the following: - We already have a technical fallback when uploading a video to save the iframe `src` to an attribute: `data-oe-expression`. - The public widget is now destroying the video iframes so they are never saved in the DOM. - A non-lazy code will build the iframes immediately on page load. - The public widget can always create the iframes if they are not already created (for compatibility). [1]: https://github.com/odoo/odoo/commit/cf844e34dd0ce4830eb99fd0fa5b6b9cb58c867c [2]: https://github.com/odoo/odoo/commit/cb80c15d3db49ede3c93171abcaa9064b88822c6 task-3757205 Forward-Port-Of: odoo/odoo#232871 Forward-Port-Of: odoo/odoo#175717
This is a feedback from a partner at OXP, he wants to know the number of activities (late or not) linked to some Lead -> activities grouped by res_id. But grouping a pivot by a many2one_reference is currently not supported. This commit adds the support. Note that carelessly grouping by a many2one_reference mixes records linked to different models (same id, but different model). To avoid mixin apples and oranges, you have to either groupby model, *then* by res_id, or add the model t
Original PR description
This is a feedback from a partner at OXP, he wants to know the number of activities (late or not) linked to some Lead -> activities grouped by res_id. But grouping a pivot by a many2one_reference is currently not supported. This commit adds the support. Note that carelessly grouping by a many2one_reference mixes records linked to different models (same id, but different model). To avoid mixin apples and oranges, you have to either groupby model, *then* by res_id, or add the model to the domain. Task: 5102923 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#231994 Forward-Port-Of: odoo/odoo#227939
This fix stops the system from trying to create product feeds for websites that would immediately exceed the allowed product limit. It prevents a migration error and helps affected databases upgrade smoothly without hitting an unnecessary validation failure.
Original PR description
``` File /home/odoo/src/odoo/saas-18.4/addons/website_sale_product_feed/models/product_feed.py, line 105, in _check_product_limit raise ValidationError(feed.env._( odoo.exceptions.ValidationError: A…
```
File /home/odoo/src/odoo/saas-18.4/addons/website_sale_product_feed/models/product_feed.py, line 105, in _check_product_limit
raise ValidationError(feed.env._(
odoo.exceptions.ValidationError: A single feed cannot contain more than 5,000 products. Please separate products with Categories.
```
```
(Pdb) feed.env['product.product'].search_count(feed._get_feed_product_domain())
12433
```
During migration I am getting the traceback mentioned above, which is occurring because [here](https://github.com/odoo/odoo/blob/saas-18.3/addons/website_sale_product_feed/__init__.py#L14) we have populated feed records in _post_init_hook which will create feed records without any [category ID](https://github.com/odoo/odoo/blob/saas-18.3/addons/website_sale_product_feed/models/website.py#L21) because of which, [here](https://github.com/odoo/odoo/blob/saas-18.3/addons/website_sale_product_feed/models/product_feed.py#L101) we get all records without a category, which is of course higher than our soft limit of 5000, and a validation error occurs: the customer database does not have GMC enabled. Still, it calls _populate_product_feeds, which is why I have moved it to a condition.
opw-5180407
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThe setting previously labeled as a reminder has been renamed to deadline to better reflect its real use. This helps users understand that the value is used to calculate the default tax return deadline, reducing confusion when configuring accounting settings.
Original PR description
This field is not a reminder anymore and is used to compute the default deadline from the end of the tax return. task-5153900
This change reverts a previous workaround that disabled autofocus in a few mobile POS views. The issue is now handled by a broader fix, so this update keeps the code aligned with the new global behavior and avoids maintaining an unnecessary special case.
Original PR description
Task: [#5016943](https://www.odoo.com/odoo/project/1737/tasks/5016943) Revert PR: - [odoo/231045](https://github.com/odoo/odoo/pull/231045) - [enterprise/96873](https://github.com/odoo/enterprise/pull/96873) --- The purpose of this task was to remove the autofocus for certain views concerning the POS on mobile devices. However, this is no longer needed, since the root of the issue was global and had to be fixed across all views. While this task addressed the issue on a few specific views, [PR #232054](https://github.com/odoo/odoo/pull/232054) provides a global fix. Forward-Port-Of: odoo/enterprise#98494
This change removes an earlier workaround that disabled autofocus in some mobile POS views. The issue has now been fixed at a broader level, so this module no longer needs its own special handling.
Original PR description
Task: [#5016943](https://www.odoo.com/odoo/project/1737/tasks/5016943) Revert PR: - [odoo/231045](https://github.com/odoo/odoo/pull/231045) - [enterprise/96873](https://github.com/odoo/enterprise/pull/96873) --- The purpose of this task was to remove the autofocus for certain views concerning the POS on mobile devices. However, this is no longer needed, since the root of the issue was global and had to be fixed across all views. While this task addressed the issue on a few specific views, [PR #232054](https://github.com/odoo/odoo/pull/232054) provides a global fix. Forward-Port-Of: odoo/odoo#233849
The product catalog now shows the right price when a product already on the order has a discount and the unit price is displayed separately. This fixes a mismatch that could make catalog prices appear higher than the actual order price, helping users review orders more accurately.
Original PR description
Catalog prices do not consider discounts when displayed separately from the unit price on the order line (if any for a given product). It was fixed for the /update_order_line_info route with 5d1837e47c20f04458472658c4f8ea71284fb6ca, but the issue still remained when fetching the original catalog data on opening, through the /order_lines_info route. This only happened when the product was already added to the order, because in this case we avoid recomputing the pricelist price and use the existing sale order line price. This commit makes sure that the sale order line discount field is correctly considered in that case, and also adds tests to cover the catalog more extensively. Fixes #232219 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233098
Website menus linked to pages will now appear active only when the visitor is on the exact matching page path. This avoids unrelated pages being highlighted at the same time, making navigation clearer and less confusing for users.
Original PR description
__Current behavior before commit:__ A menu is shown as active if the unslug version of its URL matches the current accessed URL. The issue is that the unslug version of a menu linked to a page has no real meaning. Such menu should only be shown as active if the request URL path matches exactly. __Description of the fix:__ Added a check to ensure that when a menu is linked to a page, it isn't shown as active if its path doesn't exactly match the request path. __Steps to reproduce:__ 1. On the website, go to Site > Pages 2. Create a new page with title "iOS 26" and another page with title "iPadOS 26" 3. Go to /ios-26 4. Both menus "iOS 26" and "iPadOS 26" are highlighted task-5094899 Forward-Port-Of: odoo/odoo#233865 Forward-Port-Of: odoo/odoo#230623
Scanning a barcode in the product search now reliably uses the entire barcode instead of sometimes stopping at a partial value. This prevents incorrect searches and helps users find the right product faster and more consistently.
Original PR description
Issue ----- When scanning a barcode in the product view, the search is made using only part of the barcode. Steps to reproduce ----- - Open the product view - Scan a barcode (eg 1234567890) > The search might only contain 12345678, 123456 or actually the full barcode Cause ----- When scanning a barcode, we receive all of the barcode characters followed by newline. When we receive the newline, we select the first item in the dropdown. The problem is that the search input changed but it hasn't been reflected yet in the items (a rendering is scheduled but hasn't been applied to the DOM yet). ----- Ticket: opw-4874425 Forward-Port-Of: odoo/odoo#232270
This change improves how ribbons and status bars look in pop-up forms. It keeps the ribbon visually separate when a status bar is present and preserves a clean layout while scrolling, making the form easier to read and less cluttered.
Original PR description
Previously, `position: static` was added on `.o_form_sheet` in modal forms to fix an issue where the ribbon looked ugly (not pinned to the top right) due to the absence of borders in modals. See…
Previously, `position: static` was added on `.o_form_sheet` in modal forms to fix an issue where the ribbon looked ugly (not pinned to the top right) due to the absence of borders in modals. See commit: https://github.com/odoo/odoo/commit/1ac2ff5b7dd64ccfe1bfb9c3fb7bb8a758e887d7 However, when a statusbar is present, this rule caused the ribbon to merge into the statusbar, making its display worse. In addition, on scrolling in a modal, the statusbar and the form contents were getting merged. This commit refines : - the selector so that `position: static` is only applied when a modal form has a ribbon but no statusbar. When a statusbar exists, the ribbon remains visually separated from the statusbar. - the statusbar background-color logic so that inside modals it uses the proper `$o-view-background-color`, ensuring a clean separation even on scrolling. task-4873636 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226074
Guests who have not been active in the last 12 hours will no longer receive notifications when a call starts. This reduces unnecessary alerts and helps avoid contacting people who are likely no longer available.
Original PR description
With this commit, guests who haven't been online in the last 12 hours will not be notified of a call starting. task-5136330 backport of https://github.com/odoo/odoo/pull/230337 Forward-Port-Of: odoo/odoo#233669 Forward-Port-Of: odoo/odoo#233221
This update corrects how device certificates are read on older IoT boxes, ensuring the system uses the right method for each version. It prevents compatibility issues and avoids warning messages without changing the expected behavior for users.
Original PR description
To avoid a deprecation warning on `x509.Certificate`, we switched from `not_valid_after` to `not_valid_after_utc`, and patched the newer version to point to the previous one if the iot box was before a certain version. However this patch wasn't working properly as the certificate object isn't patchable (not python type). We now call the specific method depending on the version everytime we need this attribute.
This fix ensures the currency and unit shown for emitted emissions refresh properly when the emission factor changes. It prevents outdated values from being displayed in ESG reports, improving accuracy and consistency for users.
Original PR description
The `currency` and `unit` fields on emitted emissions are supposed to be related fields on the emission factor. However, due to how the report combining accounting emissions and other emissions is implemented, they are not correctly updated when the factor is modified. This PR makes them computed fields and enable the "store" attribute en them. Despite there being no actual table to store data into, this allows us to do a round trip to the server to fetch the correct values.