Tuesday, June 17, 2025
41 changes · saas-18.2
Enhancements to existing features
The point of sale category selector now uses less padding, giving category names more room to display. This makes longer category names easier to read for cashiers and reduces visual crowding in the POS interface.
Original PR description
This commit reduces padding so that long category names can occupy more available space. task-4865740 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Invoice screens now show the India e-Invoicing status directly in both the invoice list and invoice form. This helps users quickly check e-Invoicing progress without opening extra details or switching views.
Original PR description
**After this commit:** - Users will be able to view the India e-Invoicing status directly from the invoice list view. - The India e-Invoicing status field has also been added to the invoice form view. **Task**-4844345 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
This fix prevents message action buttons in the chatter from appearing on forms that have not yet been saved. It avoids a user-facing error when someone tries to mark a chatter message as to-do before the related record exists, improving form reliability.
Original PR description
Currently, an error occurs due to message action buttons being visible on unsaved forms. Steps to replicate: - Open any module with chatter (eg. `sale_management`). - Click on `Mark as todo` (star…
Currently, an error occurs due to message action buttons being visible on unsaved forms. Steps to replicate: - Open any module with chatter (eg. `sale_management`). - Click on `Mark as todo` (star icon) without saving (hover near to user's name in chatter). Error: `TypeError: 'float' object is not iterable` The error occurs due to a recent [commit](https://github.com/odoo/odoo/pull/211362/files#diff-0fc14194d473213159537bf41f421dcbaf940dfd81ac87d263b196e914d40af3R160) that added the d-flex class to the `<div>` [1] containing the message actions. The core issue lies in the use of `d-flex`, which overrides any conditional visibility logic [2] applied to its child elements. As a result, the message action buttons become visible even before the form is saved. This commit resolves the issue by making the visibility logic important so it doesnt get overridden by `d-flex`. This ensures that the conditional visibility logic is respected, preventing the action buttons to appear before the form is saved. [1] - https://github.com/odoo/odoo/blob/e7cbe74f388ed1177d4c5c6fbe54988a1dc18217/addons/mail/static/src/core/common/message.xml#L160 [2] - https://github.com/odoo/odoo/blob/e7cbe74f388ed1177d4c5c6fbe54988a1dc18217/addons/mail/static/src/chatter/web_portal/chatter.scss#L5-L7 https://github.com/user-attachments/assets/4a4d168d-961e-4b49-be84-c95b0d899b7b sentry-6657359767 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Miscellaneous changes
Before this commit: - The `_compute_l10n_in_state_id` method only considered `pos_session_ids` when assigning the state for Indian POS moves. - Reversed POS orders were ignored, leading to missing `l10n_in_state_id`. After this commit: - Added `reversed_pos_order_id` to the `@api.depends` decorator. - Updated domain to include moves with `reversed_pos_order_id`. Ensures correct place of supply is computed for reversed POS orders as well. OPW: 4862639 Forward-Port-Of: odoo/odoo#2142
Original PR description
Before this commit: - The `_compute_l10n_in_state_id` method only considered `pos_session_ids` when assigning the state for Indian POS moves. - Reversed POS orders were ignored, leading to missing `l10n_in_state_id`. After this commit: - Added `reversed_pos_order_id` to the `@api.depends` decorator. - Updated domain to include moves with `reversed_pos_order_id`. Ensures correct place of supply is computed for reversed POS orders as well. OPW: 4862639 Forward-Port-Of: odoo/odoo#214293
This fix ensures the Point of Sale discount product is loaded in the correct way. It helps prevent issues during product loading that could affect discount handling in POS sessions.
Original PR description
Before this commit, the product.product record was loaded for the Discount product when loading the product templates, which caused several issues. opw-4876402 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update adjusts an internal Discuss test so it no longer fails unpredictably when a message is occasionally marked as read twice. The user impact is minimal: it acknowledges a rare duplicate background action while keeping automated checks reliable until a deeper design fix is decided.
Original PR description
Before this commit, a HOOT test in discuss was failing non-deterministically on runbot: ``` [HOOT] Test "@mail/thread/thread/mark channel as fetched when a new message is loaded and thread is…
Before this commit, a HOOT test in discuss was failing non-deterministically on runbot: ``` [HOOT] Test "@mail/thread/thread/mark channel as fetched when a new message is loaded and thread is focused" failed: ``` The test should RPC mark as read once but rarely does twice instead. This happens because the condition for mark as read depends on whether the current user has seen the last message[1] and the RPC is not triggered again while marking as read is ongoing[2]. The problem is that "current user has seen" data are received from bus notification, while the "ongoing marking as read" window is until RPC response. This means it will properly make mark-as-read RPC once as long as the bus notification is received before the RPC response. In rare case the bus notification is received after, then the code[1] will think the user hasn't read the last message and also there's no ongoing marking as read [2] therefore it will trigger a RPC again. This problem shows a design issue with code flow using both RPC response and bus notifications. RPC response is simpler to understand but doesn't scale with Discuss needs, and since recently bus notifications did not work in tours so we were tempted to make discuss work a bit in tours thanks to RPC responses. One idea to solve this problem would be to rely solely on bus notifications, so every flow that expects RPC return should actually await the related bus notification response. While we are deciding on this topic, this commit just relax the test to assert at least one "mark as read". In practice a user may sometimes "mark as read" twice, but this is a known and minor issue for now until we find a better design to fix this problem once and for all. [1]: https://github.com/odoo/odoo/blob/saas-18.2/addons/mail/static/src/discuss/core/common/thread_model_patch.js#L337 [2]: https://github.com/odoo/odoo/blob/saas-18.2/addons/mail/static/src/discuss/core/common/thread_model_patch.js#L357 runbot-223240
Problem: Videos added in the operation worksheet are not visible on the Shop Floor interface. Cause: `embedded_components`, such as video iframes, are only supported within the HTML editor context and cannot be rendered elsewhere. This results in the video being silently dropped. Solution: Introduce a `disableVideo` flag for the `note` field in worksheet views. This avoids embedding unsupported video content and ensures the interface remains consistent. Steps to reproduce: 1. G
Original PR description
Problem: Videos added in the operation worksheet are not visible on the Shop Floor interface. Cause: `embedded_components`, such as video iframes, are only supported within the HTML editor context and cannot be rendered elsewhere. This results in the video being silently dropped. Solution: Introduce a `disableVideo` flag for the `note` field in worksheet views. This avoids embedding unsupported video content and ensures the interface remains consistent. Steps to reproduce: 1. Go to Manufacturing > Operations > Worksheet. 2. Add a video in the worksheet's description field. 3. Create a Manufacturing Order (MO) for a product using this operation. 4. Confirm the MO and open it in the Shop Floor interface. 5. Open the worksheet tab. → The video is missing (not rendered). opw-4783722 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#214210 Forward-Port-Of: odoo/odoo#209554
Versions -------- - 17.0+ Steps ----- 1. Have a partner with a `commercial_partner_id`; 2. for the `commercial_partner_id`, create an partner of type `invoice`; 3. create & confirm a sale order invoiced to the initial partner; 4. create & confirm a sale order invoiced to the invoice partner; 5. check the `credit_to_invoice` of the partner; 6. check the `credit_to_invoice` of the `commercial_partner_id`. Issue ----- The credit to invoice is twice what it should be. Cause ----
Original PR description
Versions -------- - 17.0+ Steps ----- 1. Have a partner with a `commercial_partner_id`; 2. for the `commercial_partner_id`, create an partner of type `invoice`; 3. create & confirm a sale order…
Versions -------- - 17.0+ Steps ----- 1. Have a partner with a `commercial_partner_id`; 2. for the `commercial_partner_id`, create an partner of type `invoice`; 3. create & confirm a sale order invoiced to the initial partner; 4. create & confirm a sale order invoiced to the invoice partner; 5. check the `credit_to_invoice` of the partner; 6. check the `credit_to_invoice` of the `commercial_partner_id`. Issue ----- The credit to invoice is twice what it should be. Cause ----- The `_compute_credit_to_invoice` method sums up the `credit_to_invoice` on a partner's `commercial_partner_id`. By first checking the partner's credit to invoice, it searched all sale orders credited to the commercial entity. Before it can sum these, it first has to compute the `credit_to_invoice` of the `commercial_partner_id`, which retrieves the same sale orders, and hence get summed up twice. Solution -------- Only compute the `credit_to_invoice` on commercial partners by taking the intersection of `self` & `self.commercial_partner_id`. opw-4855507 Forward-Port-Of: odoo/odoo#214343 Forward-Port-Of: odoo/odoo#213849
### Steps to reproduce: - Create a storable product - Click on the Forecast smart button > Replenish - Process the dialog or close it #### > Your browser will crash as you just started an infinite loop this can be seen in the logged by an infinite amount of `search_read` on the stock.warehouse model made to render the template an infinite amount of time. ### Cause of the issue: Closing on replenish will open a dialog. Closing this dialog will in turn call its `_onClose` method: http
Original PR description
### Steps to reproduce: - Create a storable product - Click on the Forecast smart button > Replenish - Process the dialog or close it #### > Your browser will crash as you just started an infinite…
### Steps to reproduce: - Create a storable product - Click on the Forecast smart button > Replenish - Process the dialog or close it #### > Your browser will crash as you just started an infinite loop this can be seen in the logged by an infinite amount of `search_read` on the stock.warehouse model made to render the template an infinite amount of time. ### Cause of the issue: Closing on replenish will open a dialog. Closing this dialog will in turn call its `_onClose` method: https://github.com/odoo/odoo/blob/ef356e1f803a6f82811a83f5b8a8dd54ef41cf32/addons/stock/static/src/stock_forecasted/forecasted_buttons.js#L26-L28 Now the issue is that `res` does nto contains a special key and hence the `reloadReport` call will execute an `ir.actions.client` to relaod the forecast page: https://github.com/odoo/odoo/blob/ef356e1f803a6f82811a83f5b8a8dd54ef41cf32/addons/stock/static/src/stock_forecasted/stock_forecasted.js#L97-L106 This is highly problematic since executing such an action will call the `_updateUi` method and hence close all existing dialog: https://github.com/odoo/odoo/blob/ef356e1f803a6f82811a83f5b8a8dd54ef41cf32/addons/web/static/src/webclient/actions/action_service.js#L1274 https://github.com/odoo/odoo/blob/ef356e1f803a6f82811a83f5b8a8dd54ef41cf32/addons/web/static/src/webclient/actions/action_service.js#L1111 Since our dialog hasn't been closed yet this will in turn call back the `_onClose` that started this call resulting in this chain of action: `_onClose -> updateUi -> closeAll -> _onClose -> ...` And, since the `noReload` parameter is not used in our `_onClose` we end up in an infinite loop. ### Note: The infinite loop has become possible since saas-18.1 see commit d606be75c44fccf0b1ddf5216892f1d4b7162686 which changes the order on which a dialog is closed and its call back method called (onClose). Prior to that change the dialog was closed and then its call back called. It is now the opposite so that if the onClose of a dialog triggers an action closing all dialogs, it will in turn call the onClose of the dialog one more time. The way to avoid infinite recursion is therefore to ensure that the `noReload` parameter of the onClose is correctly used as introduced here: https://github.com/odoo/odoo/commit/d606be75c44fccf0b1ddf5216892f1d4b7162686#diff-552aefb62246b1f4fe6a2607ec8f0a01773e53de2d68293266b38bc99c5cb56dL1123-R1108 opw-4847129 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#214191
Versions -------- - 18.0+ Feature doesn't exist in earlier versions. Steps ----- 1. Create a product with a tag; 2. create another product with a different tag; 3. create a delivery method with these 2 tags as Must Have Tags; 4. add one product to the cart in eCommerce; 5. go to checkout. Issue ----- Delivery method isn't available for selection. Cause ----- While the "Must Have Tags" description states that the method should be available if at least one product on the or
Original PR description
Versions -------- - 18.0+ Feature doesn't exist in earlier versions. Steps ----- 1. Create a product with a tag; 2. create another product with a different tag; 3. create a delivery method with these 2 tags as Must Have Tags; 4. add one product to the cart in eCommerce; 5. go to checkout. Issue ----- Delivery method isn't available for selection. Cause ----- While the "Must Have Tags" description states that the method should be available if at least one product on the order has at least one of these tags, the `_match_must_have_tags` method requires *all* of the `must_have_tags` to be present in the order. Solution -------- Instead of using `all`, use `any` when matching must-have tags. opw-4836137 Forward-Port-Of: odoo/odoo#214312
In odoo/odoo#199763, `_related_analytic_distribution()` was introduced to pass the existing analytic distribution in a sale order line to an invoice line. However, sale_line_ids is a Many2Many field, so to avoid singleton errors in the case of multiple SOLs, only the analytic distribution of the first sale order line is passed. no-task --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#214035
Original PR description
In odoo/odoo#199763, `_related_analytic_distribution()` was introduced to pass the existing analytic distribution in a sale order line to an invoice line. However, sale_line_ids is a Many2Many field, so to avoid singleton errors in the case of multiple SOLs, only the analytic distribution of the first sale order line is passed. no-task --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#214035
When scrapping a tracked product without a lot and without a picking_type_id, `stock.move.line._action_done` raises a UserError requiring a lot/serial number. This happens because the method checks for the absence of both `picking_type_id`, `is_inventory`, and `lot_id`, assuming a lot is always mandatory outside inventory and picking flows. However, scrap operations may occur outside these flows and should not necessarily require a lot, especially when triggered programmatically (e.g. via
Original PR description
When scrapping a tracked product without a lot and without a picking_type_id, `stock.move.line._action_done` raises a UserError requiring a lot/serial number. This happens because the method checks…
When scrapping a tracked product without a lot and without a picking_type_id, `stock.move.line._action_done` raises a UserError requiring a lot/serial number. This happens because the method checks for the absence of both `picking_type_id`, `is_inventory`, and `lot_id`, assuming a lot is always mandatory outside inventory and picking flows. However, scrap operations may occur outside these flows and should not necessarily require a lot, especially when triggered programmatically (e.g. via API or automation), bypassing the form view validation. This commit updates the condition in `_action_done()` to check the context key `is_scrap`, which is already passed in `do_scrap()` via `move.with_context(is_scrap=True)._action_done()`. This allows tracked products to be scrapped without a lot in valid scenarios, without misleadingly assigning a `picking_type_id` to the move. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#213536 Forward-Port-Of: odoo/odoo#206900
### Description: Deleting manufacturing orders (MOs) is slow due to unoptimized code. The methods `_action_cancel` and `_compute_picking_ids` are the main performance issues. ### Fix: `_compute_picking_ids`, is improved by moving its search outside the loop and grouping by `group_id`, reducing the amount of calls to the ORM. A `skip_activity` context check is added in `_action_cancel` to bypass activity generation during cancellation, aligning with the existing check done later in `_
Original PR description
### Description: Deleting manufacturing orders (MOs) is slow due to unoptimized code. The methods `_action_cancel` and `_compute_picking_ids` are the main performance issues. ### Fix:…
### Description: Deleting manufacturing orders (MOs) is slow due to unoptimized code. The methods `_action_cancel` and `_compute_picking_ids` are the main performance issues. ### Fix: `_compute_picking_ids`, is improved by moving its search outside the loop and grouping by `group_id`, reducing the amount of calls to the ORM. A `skip_activity` context check is added in `_action_cancel` to bypass activity generation during cancellation, aligning with the existing check done later in `_log_activity_get_documents`. Also, a bug in `_action_cancel` was calling a filtering on`self`, rather than `production`, and that for each production, which was degrading the performance. ### Benchmark: | N° of MO | Before | After | |----------|--------|-------| | 80 | 15s | 1s | | 160 | 33s | 2s | | 1000 | 2:52 | 8s | ### Reference: opw-4734710 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#214347 Forward-Port-Of: odoo/odoo#207960
The test `test_website_event_tour_admin` fails randomly depending on the processing speed available. When clicking on `a[title='Back to All Events']`, if the website happens to still be in edit mode, the click will be prevented: https://github.com/odoo/odoo/blob/18.0/addons/website/static/src/client_actions/website_preview/website_preview.js#L424-L438 We can use the clickOnSave function made specifically for this. It ensures exiting edit mode before continuing. --- runbot-223022 Fo
Original PR description
The test `test_website_event_tour_admin` fails randomly depending on the processing speed available. When clicking on `a[title='Back to All Events']`, if the website happens to still be in edit mode, the click will be prevented: https://github.com/odoo/odoo/blob/18.0/addons/website/static/src/client_actions/website_preview/website_preview.js#L424-L438 We can use the clickOnSave function made specifically for this. It ensures exiting edit mode before continuing. --- runbot-223022 Forward-Port-Of: odoo/odoo#211221
to_reproduce: --- 1. Create a combo product (no company set) 2. Create a combo choice (no company set) 3. Add a product with company restrictions 4. Multi-company error appears: "Incompatible companies on records" 5. Set company on combo choice and product template - error resolves 6. Remove company from both combo choice and combo product template 7. Save succeeds despite invalid company configuration problem: --- - During combo choice updates, only the modified combo items are inc
Original PR description
to_reproduce: --- 1. Create a combo product (no company set) 2. Create a combo choice (no company set) 3. Add a product with company restrictions 4. Multi-company error appears: "Incompatible…
to_reproduce: --- 1. Create a combo product (no company set) 2. Create a combo choice (no company set) 3. Add a product with company restrictions 4. Multi-company error appears: "Incompatible companies on records" 5. Set company on combo choice and product template - error resolves 6. Remove company from both combo choice and combo product template 7. Save succeeds despite invalid company configuration problem: --- - During combo choice updates, only the modified combo items are included in vals['combo_item_ids'], while existing unchanged combo items are not added to the validation scope. https://github.com/odoo/odoo/blob/b13c686dbd6a887a251143efca1c18e7a4fb631a/addons/web/models/models.py#L68 - The company validation logic only checks items present in the vals, missing the existing combo items that should also be validated for company consistency. https://github.com/odoo/odoo/blob/b13c686dbd6a887a251143efca1c18e7a4fb631a/addons/web/models/models.py#L1092 solution: --- - Add another check on combo items opw-4844678 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#213615
Steps to reproduce: - add a property on Tasks - open a pivot view - group by this property - insert in spreadsheet => boom The pivot cannot be loaded because the property is not a real field. Hence it's not loaded by `fields_get` and we are missing the property metadata (type) We need to load the definition independently and we push it to the fields. It's a hack but it seems to work. opw-4858129 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/su
Original PR description
Steps to reproduce: - add a property on Tasks - open a pivot view - group by this property - insert in spreadsheet => boom The pivot cannot be loaded because the property is not a real field. Hence it's not loaded by `fields_get` and we are missing the property metadata (type) We need to load the definition independently and we push it to the fields. It's a hack but it seems to work. opw-4858129 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#213832
Forward-Port-Of: odoo/odoo#214247 Forward-Port-Of: odoo/odoo#208639
Original PR description
Forward-Port-Of: odoo/odoo#214247 Forward-Port-Of: odoo/odoo#208639
When exploding a BoM that includes phantom (kit) components, the resulting list of components moves was not respecting the sequence order defined in the BoM. Steps to reproduce: - Create a product P1 with a BoM that includes: - Component 1 (sequence = 1) - Component 2 - KIT (sequence = 2), which itself contains: - Component 2-1 (sequence = 1) - Component 2-2 (sequence = 2) - Component 3 (sequence = 3) - Create a Manufacturing Order for P1. Observed behavior: - The
Original PR description
When exploding a BoM that includes phantom (kit) components, the resulting list of components moves was not respecting the sequence order defined in the BoM. Steps to reproduce: - Create a product P1…
When exploding a BoM that includes phantom (kit) components, the resulting list of components moves was not respecting the sequence order defined in the BoM.
Steps to reproduce:
- Create a product P1 with a BoM that includes:
- Component 1 (sequence = 1)
- Component 2 - KIT (sequence = 2), which itself contains:
- Component 2-1 (sequence = 1)
- Component 2-2 (sequence = 2)
- Component 3 (sequence = 3)
- Create a Manufacturing Order for P1.
Observed behavior:
- The generated stock moves are ordered as:
1. Component 1
2. Component 3
3. Component 2-1
4. Component 2-2
Expected behavior:
- The stock moves should respect the BoM line sequence:
1. Component 1
2. Component 2-1
3. Component 2-2
4. Component 3
Root cause:
- When exploding phantom BoMs, child lines were appended at the end of the processing queue, causing out-of-order moves:
https://github.com/odoo/odoo/blob/d64b108db54c02098c9e95f58fa3278007c92642/addons/mrp/models/mrp_bom.py#L416-L418
https://github.com/odoo/odoo/blob/d64b108db54c02098c9e95f58fa3278007c92642/addons/mrp/models/mrp_bom.py#L430
Solution:
- Insert the child BoM lines at the beginning of the processing queue (`bom_lines`), sorted by their sequence field, to ensure correct processing order.
opw-4809095
Forward-Port-Of: odoo/odoo#212761### Steps to reproduce: - Insert an image into the editor. - Open the Transformation controls for the image. - Press the `Backspace` key to delete the image. - The transformation overlay remains visible after the image is removed. ### Description of the issue/feature this PR addresses: - In commit [1](https://github.com/odoo/odoo/commit/85698bf4f591fc9280f054b9a255a7d5ff4d1fe2), the `image_transform_button` component unmounted before `selectionchange` event could fire. As a result,
Original PR description
### Steps to reproduce: - Insert an image into the editor. - Open the Transformation controls for the image. - Press the `Backspace` key to delete the image. - The transformation overlay remains…
### Steps to reproduce: - Insert an image into the editor. - Open the Transformation controls for the image. - Press the `Backspace` key to delete the image. - The transformation overlay remains visible after the image is removed. ### Description of the issue/feature this PR addresses: - In commit [1](https://github.com/odoo/odoo/commit/85698bf4f591fc9280f054b9a255a7d5ff4d1fe2), the `image_transform_button` component unmounted before `selectionchange` event could fire. As a result, event listener was removed, and the transform container was not closed when the image was deleted. Desired behavior after PR is merged: - The `selectionchange` listener is now attached within the `image_transformation` component. - A `keydown` listener is also added to explicitly handle Backspace and Delete keys, addressing the case where Chrome does not trigger `selectionchange` on image deletion. task-4831728 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212715
Steps to reproduce: - Enter website edit mode. - Click the header. - Select "Sidebar" in the template options. - Save the page. - Click Site > Menu Editor in the backend navbar. - Add a "Mega menu" to the menu and save the dialog. - In the sidebar, open the "Mega menu". - Bug: The layout is broken. The mega menu should be displayed in a single column, but it's displayed in three columns. In this commit, we fix the issue by forcing the columns width of the mega menu to 100% when the
Original PR description
Steps to reproduce: - Enter website edit mode. - Click the header. - Select "Sidebar" in the template options. - Save the page. - Click Site > Menu Editor in the backend navbar. - Add a "Mega menu" to the menu and save the dialog. - In the sidebar, open the "Mega menu". - Bug: The layout is broken. The mega menu should be displayed in a single column, but it's displayed in three columns. In this commit, we fix the issue by forcing the columns width of the mega menu to 100% when the header is set to "Sidebar" or "Hamburger". This commit also hides the "Size" option of the mega menu when the header template is set to "hamburger" or "sidebar", as it has no effect with either of these headers. task-4830118 Forward-Port-Of: odoo/odoo#212752
Since the edited page is within an iframe, the built-in fonts used by the wysiwyg are also loaded inside the page within the iframe, which causes them to replace the one used when viewing the page as a visitor if it happens to be one of the fallback fonts. This commit avoids that by giving a distinct `font-family` to the fonts used by the wysiwyg. task-3080104 Forward-Port-Of: odoo/odoo#214128 Forward-Port-Of: odoo/odoo#112759
Original PR description
Since the edited page is within an iframe, the built-in fonts used by the wysiwyg are also loaded inside the page within the iframe, which causes them to replace the one used when viewing the page as a visitor if it happens to be one of the fallback fonts. This commit avoids that by giving a distinct `font-family` to the fonts used by the wysiwyg. task-3080104 Forward-Port-Of: odoo/odoo#214128 Forward-Port-Of: odoo/odoo#112759
Description of the issue this PR addresses: Current behavior before PR: Attachments like files and images removed from the mail attachment list were still present in the editor, resulting in broken links and 404 errors. Desired behavior after PR is merged: Removing an attachment from the list also removes its reference from the editor. task-4794954 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#213843 Forwar
Original PR description
Description of the issue this PR addresses: Current behavior before PR: Attachments like files and images removed from the mail attachment list were still present in the editor, resulting in broken links and 404 errors. Desired behavior after PR is merged: Removing an attachment from the list also removes its reference from the editor. task-4794954 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#213843 Forward-Port-Of: odoo/odoo#212309
…axes --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212075
Original PR description
…axes --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212075
Adds a test to ensure the Sales Details report computes the correct total base amount when products with multiple taxes are sold. This test covers a previously incorrect behavior where the base amount was summed multiple times for products with multiple tax lines, leading to inflated totals. Now, the report uses the accurate tax-excluded total to avoid duplication. Opw-4670643. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: o
Original PR description
Adds a test to ensure the Sales Details report computes the correct total base amount when products with multiple taxes are sold. This test covers a previously incorrect behavior where the base amount was summed multiple times for products with multiple tax lines, leading to inflated totals. Now, the report uses the accurate tax-excluded total to avoid duplication. Opw-4670643. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212377 Forward-Port-Of: odoo/odoo#203289
**Issue** When viewing an invoice in Spanish, the "Outstanding credits" section may overflow or be cut off on the right side. **Steps to Reproduce** 1. Install the Accounting module. 2. Switch the user language to Spanish. 3. Navigate to Contabilidad > Clientes > Facturas. 4. Open an invoice that has outstanding credits. 5. Set the browser zoom to 125%. 6. Observe that the outstanding credits widget content is truncated or overflows its container. **Root Cause** The field `invoice_
Original PR description
**Issue** When viewing an invoice in Spanish, the "Outstanding credits" section may overflow or be cut off on the right side. **Steps to Reproduce** 1. Install the Accounting module. 2. Switch the…
**Issue** When viewing an invoice in Spanish, the "Outstanding credits" section may overflow or be cut off on the right side. **Steps to Reproduce** 1. Install the Accounting module. 2. Switch the user language to Spanish. 3. Navigate to Contabilidad > Clientes > Facturas. 4. Open an invoice that has outstanding credits. 5. Set the browser zoom to 125%. 6. Observe that the outstanding credits widget content is truncated or overflows its container. **Root Cause** The field `invoice_outstanding_credits_debits_widget` was placed directly in the form without a layout container, causing it to misalign and overflow in cases where translated text or zoom scaling increased its width. The lack of a proper responsive layout prevented it from adapting gracefully. **Fix** Wrapped the field inside a `<group>` element with class `oe_subtotal_footer px-4` to ensure it inherits consistent padding and alignment with other form elements. This provides a flexible layout that handles longer text and browser zoom correctly, maintaining readability and visual consistency. opw-4716266 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#213012 Forward-Port-Of: odoo/odoo#211100
**[FIX] test_http: make test_webjson_list_args reliable** The domain in the query-string is quoted by werkzeug, but there are multiple possible equivalent quoting strategy and the test sometimes fails because it is quoted differently. The test is not about testing the different quoting strategy, use a proper url parser to make the test more resilient. **[FIX] test_http: more reliable test_models3** The quote in the returned text sometimes get escaped, sometimes not, sometimes with
Original PR description
**[FIX] test_http: make test_webjson_list_args reliable** The domain in the query-string is quoted by werkzeug, but there are multiple possible equivalent quoting strategy and the test sometimes fails because it is quoted differently. The test is not about testing the different quoting strategy, use a proper url parser to make the test more resilient. **[FIX] test_http: more reliable test_models3** The quote in the returned text sometimes get escaped, sometimes not, sometimes with a different QP code. Remove the quote, since the test is not about them, to make the test more reliable. Forward-Port-Of: odoo/odoo#212534 Forward-Port-Of: odoo/odoo#212333
If the automatic check out and absence managment settings in attendance are set, it will not take into account the employees that have a flexible working schedule. These settings were not compatible with the notion of flexibility in hours. Backport of https://github.com/odoo/odoo/pull/196822 task-4816736 Forward-Port-Of: odoo/odoo#211461
Original PR description
If the automatic check out and absence managment settings in attendance are set, it will not take into account the employees that have a flexible working schedule. These settings were not compatible with the notion of flexibility in hours. Backport of https://github.com/odoo/odoo/pull/196822 task-4816736 Forward-Port-Of: odoo/odoo#211461
There are several flows where the persona of a member might not (or no longer) be known in JS. These members should simply be ignored when computing the correspondent of a channel rather than crashing. Forward-Port-Of: odoo/odoo#214458 Forward-Port-Of: odoo/odoo#214395
Original PR description
There are several flows where the persona of a member might not (or no longer) be known in JS. These members should simply be ignored when computing the correspondent of a channel rather than crashing. Forward-Port-Of: odoo/odoo#214458 Forward-Port-Of: odoo/odoo#214395
Check that the menu actually exists before adding it to the results. Also don't raise error if not found. 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#212555
Original PR description
Check that the menu actually exists before adding it to the results. Also don't raise error if not found. 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#212555
Problem --------- Follow-ups can be configured to execute multiple type of follow-ups (email, whatsapp, sms, ...) One of those is to print a letter, but it's not the most used. When you try to execute a follow-up manually, a wizard opens and follows the setup of the to-be-executed level ; so for example if the next level is configured to send a SMS, SMS should be ticket by default. But the "Print" option is always ticked, even if the "Letter" option is not selected in the configuration o
Original PR description
Problem --------- Follow-ups can be configured to execute multiple type of follow-ups (email, whatsapp, sms, ...) One of those is to print a letter, but it's not the most used. When you try to execute a follow-up manually, a wizard opens and follows the setup of the to-be-executed level ; so for example if the next level is configured to send a SMS, SMS should be ticket by default. But the "Print" option is always ticked, even if the "Letter" option is not selected in the configuration of the level. This always generates an additional PDF that is often not needed. Objective --------- Do not tick "Print" by default when manually executing a follow-up level, unless "Letter" is ticket in the configuration of the level. Solution --------- Set "Print" default value in the wizard to the "Letter" value of the follow up line instead of leaving it as True (which is the default). task-4574971 Forward-Port-Of: odoo/enterprise#86750 Forward-Port-Of: odoo/enterprise#80116
Zipping the generator "tests" was producing an empty result. Then, the loop wasn't asserting anything. Forward-Port-Of: odoo/enterprise#87315
Original PR description
Zipping the generator "tests" was producing an empty result. Then, the loop wasn't asserting anything. Forward-Port-Of: odoo/enterprise#87315
Steps to reproduce: 1. Install the german localization 2. Create company in DE 3. Create a partner that has country = PL 4. Create a customer invoice for the PL partner 5. Open: Accounting > Reporting > EC Sales List 6. Hit the wheel and create the CSV export. 7. Open the file Issue: see that the amount is a float Ticket [link](https://www.odoo.com/odoo/project/967/tasks/4575788) opw-4575788 Forward-Port-Of: odoo/enterprise#87421 Forward-Port-Of: odoo/enterprise#83822
Original PR description
Steps to reproduce: 1. Install the german localization 2. Create company in DE 3. Create a partner that has country = PL 4. Create a customer invoice for the PL partner 5. Open: Accounting > Reporting > EC Sales List 6. Hit the wheel and create the CSV export. 7. Open the file Issue: see that the amount is a float Ticket [link](https://www.odoo.com/odoo/project/967/tasks/4575788) opw-4575788 Forward-Port-Of: odoo/enterprise#87421 Forward-Port-Of: odoo/enterprise#83822
**Current behavior:** A user who can otherwise use the entire mps can not add 'rows' to the view (i.e., write on `ResCompany` `mrp_mps` fields). **Expected behavior:** Can add rows to the MPS. **Steps to reproduce:** 1. Install `mrp_mps` with demo data 2. Edit "Demo" user access rights so they only have the mrp manager group 3. Open MPS -> click `Rows` dropdown (under search bar) and add/remove one -> access error **Cause of the issue:** Field is on `ResCompany` and the MPS us
Original PR description
**Current behavior:** A user who can otherwise use the entire mps can not add 'rows' to the view (i.e., write on `ResCompany` `mrp_mps` fields). **Expected behavior:** Can add rows to the MPS. **Steps to reproduce:** 1. Install `mrp_mps` with demo data 2. Edit "Demo" user access rights so they only have the mrp manager group 3. Open MPS -> click `Rows` dropdown (under search bar) and add/remove one -> access error **Cause of the issue:** Field is on `ResCompany` and the MPS user can't write to that model. **Fix:** Permit writes on `ResCompany` `mrp_mps` fields if they are on an mps field and the user has the mrp manager group. opw-4591655 Forward-Port-Of: odoo/enterprise#87651 Forward-Port-Of: odoo/enterprise#80881
When exploding a BoM that includes phantom (kit) components, the resulting list of components moves was not respecting the sequence order defined in the BoM. Steps to reproduce: - Create a product P1 with a BoM that includes: - Component 1 (sequence = 1) - Component 2 - KIT (sequence = 2), which itself contains: - Component 2-1 (sequence = 1) - Component 2-2 (sequence = 2) - Component 3 (sequence = 3) - Create a Manufacturing Order for P1. Observed behavior: - The
Original PR description
When exploding a BoM that includes phantom (kit) components, the resulting list of components moves was not respecting the sequence order defined in the BoM. Steps to reproduce: - Create a product P1…
When exploding a BoM that includes phantom (kit) components, the resulting list of components moves was not respecting the sequence order defined in the BoM.
Steps to reproduce:
- Create a product P1 with a BoM that includes:
- Component 1 (sequence = 1)
- Component 2 - KIT (sequence = 2), which itself contains:
- Component 2-1 (sequence = 1)
- Component 2-2 (sequence = 2)
- Component 3 (sequence = 3)
- Create a Manufacturing Order for P1.
Observed behavior:
- The generated stock moves are ordered as:
1. Component 1
2. Component 3
3. Component 2-1
4. Component 2-2
Expected behavior:
- The stock moves should respect the BoM line sequence:
1. Component 1
2. Component 2-1
3. Component 2-2
4. Component 3
Root cause:
- When exploding phantom BoMs, child lines were appended at the end of the processing queue, causing out-of-order moves:
https://github.com/odoo/odoo/blob/d64b108db54c02098c9e95f58fa3278007c92642/addons/mrp/models/mrp_bom.py#L416-L418
https://github.com/odoo/odoo/blob/d64b108db54c02098c9e95f58fa3278007c92642/addons/mrp/models/mrp_bom.py#L430
Solution:
- Insert the child BoM lines at the beginning of the processing queue (`bom_lines`), sorted by their sequence field, to ensure correct processing order.
opw-4809095
Forward-Port-Of: odoo/enterprise#87003Users can upload request documents from the kanban and the activity views. This commit extends this feature to the list view. task-4745800 Forward-Port-Of: odoo/enterprise#84518
Original PR description
Users can upload request documents from the kanban and the activity views. This commit extends this feature to the list view. task-4745800 Forward-Port-Of: odoo/enterprise#84518
Steps to reproduce the bug: - Create a storable product “P1” - Create a delivery order with one unit of P1, not linked to any sale order - Go to the delivery order list view - Select the created delivery order - Click on Action → Fetch shipping label Problem: A traceback is triggered: ``` ValueError: ValueError('Expected singleton: shopee.shop()') while evaluating 'records._fetch_shipment_label()' The above server error caused the following client error: ``` The `_fetch_s
Original PR description
Steps to reproduce the bug:
- Create a storable product “P1”
- Create a delivery order with one unit of P1, not linked to any sale order
- Go to the delivery order list view
- Select the created delivery order
- Click on Action → Fetch shipping label
Problem:
A traceback is triggered:
```
ValueError: ValueError('Expected singleton: shopee.shop()') while
evaluating
'records._fetch_shipment_label()'
The above server error caused the following client error:
```
The `_fetch_shipment_label` function expects at least one item, but
we don't check it via a user error, because we're supposed to call
`_sync_shopee_pickings` instead, where all these filtering and checks
are done
opw-4812360
Forward-Port-Of: odoo/enterprise#86442Current behavior before commit: When resetting a closing entry from a tax-locked period, the system raises a lock date error, even if the user has a temporary lock date exception allowing them to bypass the restriction. Root Cause: The method only checks the company's permanent tax_lock_date, without considering temporary user-level exceptions. As a result, even if an exception is granted, the system still raises a lock error based on the permanent date. Additionally, the hard lock dat
Original PR description
Current behavior before commit: When resetting a closing entry from a tax-locked period, the system raises a lock date error, even if the user has a temporary lock date exception allowing them to…
Current behavior before commit: When resetting a closing entry from a tax-locked period, the system raises a lock date error, even if the user has a temporary lock date exception allowing them to bypass the restriction. Root Cause: The method only checks the company's permanent tax_lock_date, without considering temporary user-level exceptions. As a result, even if an exception is granted, the system still raises a lock error based on the permanent date. Additionally, the hard lock date (which overrides all other lock types and doesnt allow exceptions) and parent company lock date are ignored. Fix: Replaced the direct lock date check with _get_lock_date_violations(), which: - Correctly considers user-specific temporary lock date exceptions. - Returns violations based on effective lock rules (including hard lock). - Provides a more generic error message. Steps to reproduce: - Use a tax report with carryover values (e.g. Belgian VAT return, line 81). - Post a refund using a tax that maps to the carryover (e.g. 21% M). - Generate a closing entry. - Set the company’s tax_lock_date to a date covering the refund. - Grant a temporary lock date exception to the user, covering the same date. - Try to reset the closing entry → Lock date error is raised (incorrectly). opw-4715100 Forward-Port-Of: odoo/enterprise#85337
This commit introduces two improvements to the 'Add Properties' button in the cog menu of the Asset model: 1. Hides the button if the record has state = 'model'. Previously, the button was available but no action was triggered. 2. Raises an error message if the button 'Add Properties' is clicked in an asset without an asset model associated. Previously, only a warning with the unclear message "You need edit access on the parent doument to update these property fields" was shown. task-482209
Original PR description
This commit introduces two improvements to the 'Add Properties' button in the cog menu of the Asset model: 1. Hides the button if the record has state = 'model'. Previously, the button was available but no action was triggered. 2. Raises an error message if the button 'Add Properties' is clicked in an asset without an asset model associated. Previously, only a warning with the unclear message "You need edit access on the parent doument to update these property fields" was shown. task-4822091 Forward-Port-Of: odoo/enterprise#86651
When generating the accounting entry from the Corporate Tax Report, the system first tries to find a miscellaneous journal with the short code `MISC`. If this specific journal does not exist, the logic attempts to fall back and find any other journal of type 'Miscellaneous' (`type = 'general'`). However, this fallback search fails with an error due to an incorrect search domain syntax. Steps to reproduce: 1. Go to Accounting > Configuration > Journals. 2. Ensure no journal exists with th
Original PR description
When generating the accounting entry from the Corporate Tax Report, the system first tries to find a miscellaneous journal with the short code `MISC`. If this specific journal does not exist, the logic attempts to fall back and find any other journal of type 'Miscellaneous' (`type = 'general'`). However, this fallback search fails with an error due to an incorrect search domain syntax. Steps to reproduce: 1. Go to Accounting > Configuration > Journals. 2. Ensure no journal exists with the short code MISC. 3. Ensure at least one other journal of type "Miscellaneous" exists (for example, with short code GEN or MSC). 4. Go to Accounting > Reporting > Corporate Tax Report. 5. Try to generate the accounting entry. opw-4836686 Forward-Port-Of: odoo/enterprise#87300
Currently, a raceback occurs when the user changes or adds the expression label of the column in the "Generic Tax report". **To reproduce this issue:** 1) Install "account_reports" 2) Open "Generic Tax report" from "Accounting Reports" 3) In columns change the "Expression Label" and save the record 4) Open the "Tax Report" in "Reporting" 5) A traceback occurs **Error:** ``` UnboundLocalError: local variable 'col_value' referenced before assignment ``` **Cause:** The "co
Original PR description
Currently, a raceback occurs when the user changes or adds the expression label of the column in the "Generic Tax report". **To reproduce this issue:** 1) Install "account_reports" 2) Open "Generic Tax report" from "Accounting Reports" 3) In columns change the "Expression Label" and save the record 4) Open the "Tax Report" in "Reporting" 5) A traceback occurs **Error:** ``` UnboundLocalError: local variable 'col_value' referenced before assignment ``` **Cause:** The "col_value" is assigned based on the "expr_label" if it doesn't match the if conditions it leads to a traceback. https://github.com/odoo/enterprise/blob/d154cbf1bd5b4cc104ff0e2443047aff0c05330f/account_reports/models/account_generic_tax_report.py#L921-L932 **Solution:** This commit will resolve this issue by assigning a fallback value of an empty string to col_value. opw-4841789 Forward-Port-Of: odoo/enterprise#87277
Currently, an error is produced when the payslip start date is not set, but the end date is provided. **Steps to reproduce:** - Install `hr_payroll` module(with demo). - Create new **Payslip** for employee **Anita Oliver**. - Clear both the start and end dates under the "Period" section. - Set only the end date. **Error:** `TypeError: '<' not supported between instances of 'bool' and 'datetime.date'` **Cause:** The `_compute_warning_message` method performs a comparison between `s
Original PR description
Currently, an error is produced when the payslip start date is not set, but the end date is provided. **Steps to reproduce:** - Install `hr_payroll` module(with demo). - Create new **Payslip** for…
Currently, an error is produced when the payslip start date is not set, but the end date is provided. **Steps to reproduce:** - Install `hr_payroll` module(with demo). - Create new **Payslip** for employee **Anita Oliver**. - Clear both the start and end dates under the "Period" section. - Set only the end date. **Error:** `TypeError: '<' not supported between instances of 'bool' and 'datetime.date'` **Cause:** The `_compute_warning_message` method performs a comparison between `slip.date_from` and `contract_id.date_start` without verifying if `date_from` is set. When `date_from` is `False`, the comparison `False < datetime.date(...)` - [1], raises a `TypeError`. [1] - https://github.com/odoo/enterprise/blob/a65314702b99df97c778d4f12f943191a19dafd1/hr_payroll/models/hr_payslip.py#L1029-L1031 This commit adds checks to ensure that start and end date is defined before performing date comparisons in warning message computation, preventing the error. Sentry - 6618275041 Forward-Port-Of: odoo/enterprise#86091