Friday, July 4, 2025
47 changes · saas-18.4
Resolved issues and error corrections
Price list rules now update correctly when products or variants are changed, reducing pricing mistakes. Archived price lists are hidden from rule views, and price-related labels and inputs are clearer based on enabled settings.
Original PR description
--- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The website builder now shows a more accurate preview of the Color Blocks snippet before it is placed on a page. This helps users make layout choices with confidence because the preview better matches the final page result.
Original PR description
The `s_color_blocks_2` block uses paddings expressed using the `vw` unit. Inside the snippets modal, this makes them evaluated to a value that does not reflect the aspect ratio of the actual block. This commit forces the padding of the block during preview to fixed values so that it better matches the dropped version inside the page. At the time of writing, there is no other block that uses that unit. task-4367641
The website builder no longer shows the “Round Corners” setting when editing Font Awesome icons. This removes an unintended option, making the icon settings clearer and reducing confusion for website editors.
Original PR description
The `BorderConfigurator` used in `FontAwesomeOption` did include the field to specify "Round Corners". This was unintended. This commit removes the "Round Corners" field from the "Icon"'s options. task-4367641
This fixes cases where website-specific hidden elements could still appear because the system checked a shared template status instead of the current website's setting. Website editors can now more reliably show or hide menu and template options for each website.
Original PR description
Fixed cache pollution of _get_cached_template_info and added tests regarding the website editor, more specifically on enabling or disabling options related to views. Context: - Base: - the xmlid and…
Fixed cache pollution of _get_cached_template_info and added tests
regarding the website editor, more specifically on enabling or disabling
options related to views.
Context:
- Base:
- the xmlid and key of ir.ui.view are unique;
- the ir.ui.view are inherited if they are active, otherwise inheritance
is not applied;
- _get_cached_template_info(key) returns the cached record values.
- Website:
- the key of ir.ui.view are not unique; they can exist for different
websites and without a website;
- the ir.ui.view are inherited if they are active, otherwise inheritance
is not applied. If a specific inherited view exists (for the current
website), the default view (with same key) is not applied;
- for t-call, the specific view are used only if the view is active,
otherwise the default view is displayed;
- is_view_active(key) should return False if the view of the website in
question is inactive. If the default view is False, but the website
view is True, then the response should be True;
Issue:
`is_view_active` returns True if a view with this key is active, ignoring
the website-specific inactive view.
The issue was seen because the editor changes the display (active) of the
views by copying them with the website reference. So when we want to
change the menu, and hide it, the view is copied and set active=False.
Part of the menu was still visible because it uses a
`t-if="is_view_active(...)"`.
Issue introduced by: 97c2dd2ec569d34b044da6aa6f473277b48ada12Website editors now see image gallery, image wall, and carousel card settings in the expected order again. This makes page editing more predictable and also restores missing border and shadow controls for carousel cards.
Original PR description
Since the conversion to `html_builder`, the image gallery and image wall options order was shuffled. This commit restores the initial order by splitting the options in two templates and specifying sequences on each part. task-4367641
This fixes an issue where newly added image blocks could inherit placeholder styling, making the final image appear faded or incorrectly rounded. Website editors now get the expected image appearance immediately after drag and drop, reducing manual cleanup.
Original PR description
> [BVR] Drag and drop an "Image" Inner Content block. The image has the opacity-50 class (and also the rounded class — unclear why). The opacity-50 class is probably for the placeholder, but it should be removed for the image The commit b401f887a2d844720a34d73ba4dcadb78bf7ee29 adds the argument `node` to `openMediaDialog` in `ImageSnippetOptionPlugin.onSnippetDropped`. This caused the style of the placeholder to be used for the dropped image (including the `opacity-50`) task-4367641
This fix prevents a hidden backup preview frame from interfering with mouse actions in the website builder. Users can resize website elements more reliably, reducing frustration while editing pages.
Original PR description
Since [1] when the fallback iframe was reintroduced in `html_builder`-based website builder, the resize operations do not behave properly anymore - some mouse events seem to be caught by the wrong iframe. This commit avoids this by sending the fallback iframe a bit below the main one. [1]: https://github.com/odoo/odoo/commit/e167c3b4bfeda7b4482a755563dbd0fb90d70cbe task-4367641
Product unit labels are now hidden across sales, purchasing, inventory, manufacturing, and point of sale screens when the Units of Measure feature is not enabled. This reduces unnecessary information and avoids confusion for users who do not use multiple units of measure.
Original PR description
**Description of the issue/feature this PR addresses:** Should not show product uom when the feature "Units of Measure" is not activated  --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#216905 Forward-Port-Of: odoo/odoo#190006
This fix prevents visitors or editors from posting comments or uploading files from the blog comment area while the website builder is open. It keeps editing mode focused on page design and avoids accidental public interactions during content changes.
Original PR description
> [MOU, chrome]: Enable comments on a blog post page > You can send comments from the "Edit" mode (already spotted on master, but with the new code, a user can also upload documents...) Steps to reproduce: - Go to `/blog` - Open website builder - Enable "Comments" at the "Bottom" - Bug: you can write messages, send them, ... while still in editor mode This commit blocks with `pointer-event: none` on `#discussion` because this is the id of the top div of `portal.message_thread` task-4367641
This update fixes how employee version status is calculated by separating the logic into clearer parts. It helps make HR records more reliable and easier to maintain without changing the day-to-day user experience.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents purchase stock tests from failing when an optional product matrix feature is not installed. It only uses extra product attribute information when that attribute is actually available, improving reliability in single-app test environments.
Original PR description
### Description of the issue/feature this PR addresses: [build_error-227711](https://runbot.odoo.com/odoo/error/227711) ### Current behavior before PR: When testing for proper move descriptions, we…
### Description of the issue/feature this PR addresses:
[build_error-227711](https://runbot.odoo.com/odoo/error/227711)
### Current behavior before PR:
When testing for proper move descriptions, we add a second (no variant) attribute to the product only if the module `purchase_product_matrix` is installed.
In its absence (such as in a single-app test), we only have a single attribute_line, and referring to a second line throws an IndexError:
```
Traceback (most recent call last):
File "/data/build/odoo/addons/purchase_stock/tests/test_create_picking.py", line 886, in test_move_description
'product_no_variant_attribute_value_ids': [Command.set(product_with_description.attribute_line_ids[1].product_template_value_ids[0].ids)],
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^
File "/data/build/odoo/odoo/orm/models.py", line 6375, in __getitem__
return self.browse((self._ids[key],))
~~~~~~~~~^^^^^
IndexError: tuple index out of range
```
### Desired behavior after PR is merged:
Instead, we should only populate the `product_no_variant_attribute_value_ids` of the order line when the no_variant attribute is present in the product, i.e. only when the optional module is installed.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis fix prevents users from being redirected to another website page after clicking Edit while the editor is still loading on a slow connection. It keeps the website builder focused on the intended page, avoiding a broken editing session and user confusion.
Original PR description
With a slow connection, it is possible to click on edit, then click on a menu link before the builder opens and be redirected. This should not be possible and was not the case before [1]. Steps to reproduce: - Set your network to "regular 3G" - Click on Edit - Click on another menu item => The iframe is redirected, then the builder sidebar opens but you can't edit the page. [1]: https://github.com/odoo/odoo/commit/9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 task-4367641
Website builder snippets now appear in the correct default language when editing multilingual websites, including after switching between websites. The related automated test has also been restored to help prevent this issue from returning.
Original PR description
\* = html_builder, website This PR re-enable the `test_snippet_translation` test that were broken and skipped after the DOM changes introduced by the new Website Builder and adapts it's tour selectors. (commit 2) It also fixes some translation related issues that were introduced by the new Website Builder. (see commit 1 and 3)
This fixes a visual issue where the first row of color choices in the editor color picker did not line up with the rows below. It also improves usability by keeping the selection shape correct on touch devices and making keyboard navigation between rows more consistent.
Original PR description
Steps to reproduce: - Go to the html_editor (via Project for example) - Select a text and open the colorpicker | Current | Expected | |--------|--------| |  |  |
Odoo now correctly translates invoice email buttons when multiple invoices for customers using different languages are sent and printed together. This prevents customers from receiving emails with a button label in the wrong language, improving communication quality and professionalism.
Original PR description
**Issue**: When multiple invoices with different customer languages are sent and printed together, the invoice email button may appear with an incorrect translation for some of them. **Steps to…
**Issue**: When multiple invoices with different customer languages are sent and printed together, the invoice email button may appear with an incorrect translation for some of them. **Steps to reproduce**: - Open the Accounting app - Go to Customers > invoices - Create a new invoice with a customer with its language set to German - Create a new invoice with a customer with its language set to English - Go back to Customers > invoices - Select the two invoices just created and click on action > Sent & Print and then click on the Sent & Print button - Go to Settings > Technical > Email > Emails and check the two last emails. One of them should have the invoice email button wrongly translated **Cause**: Before sending an email, it retrieve the `type_name` using the lang of the customer https://github.com/odoo/odoo/blob/28c3b9cf10488536dce5a4927fdbe8fcd6e5a839/addons/account/wizard/account_move_send.py#L596C1-L605C14 This will trigger that compute method https://github.com/odoo/odoo/blob/a6368e8a5787f3067d09d79516a2924b3f1207f0/addons/account/models/account_move.py#L841C1-L850C67 which set the `type_name` of all the records. Since the compute method only depends on move_type, it does not recompute type_name per record. As a result, all records may share the same type_name, regardless of language context. Please notice that `type_name` is used to display the invoice email button in the right language. **Solution**: Make the compute method `_compute_type_name` depending to the lang parameter, thus it will use the right `type_name` for each email to send. opw-4748741 Forward-Port-Of: odoo/odoo#216811
This fixes a problem in Odoo's web testing tools where drag-and-drop data could miss updates added during a test. The change makes these simulated interactions behave more like real browser behavior, helping prevent false test results and improving confidence in web interface quality.
Original PR description
Before this commit, the 'types' property of datatransfers used in Hoot interactions was mocked to insert the initial types of the given 'items' and 'files'. However, this didn't account for the items added dynamically on the datatransfer object. The good thing is that it doesn't actually need to be mocked, since it already works with the given 'files' and 'items' types without having to override the 'types' descriptor. So the mock has been removed. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#217313
This update makes an automated website popup test more reliable by allowing extra time for the popup to appear before checking it. This reduces occasional false failures in the test system without changing the customer-facing website behavior.
Original PR description
Before to this commit, the ‘closing s_popup with the X button updates the invisible elements panel’ test failed from sometimes on runbot. We think boostrap.js takes longer than normal to display the popup. Solution: We're going to increase the waiting timeout so that the crash doesn't recur. We've taken this decision because the problem is very specific and probably link to bootstrap.js. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update makes an automated website builder color picker test more stable by ensuring actions are fully processed before checks continue. It reduces false test failures, helping development and release validation run more smoothly without changing customer-facing behavior.
Original PR description
Since [1] introduced the test, it may fail due to race conditions. By waiting for an animation frame after clicks, we make sure the call had the time to be processed. [1]: https://github.com/odoo/odoo/commit/b3512d76af44d3f48d8b0027495c220df550b602 runbot-229604
This fix makes the sales signature test wait until the signature area is ready before accepting and signing. It prevents false error messages during automated checks, helping keep the sales signing flow stable for users.
Original PR description
In commit, we make sure that the signature is present in the modal before reaching the step where we click on "accept & sign". If the canvas is not yet loaded at this step, then there is an error message "Signature is missing". 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#217202 Forward-Port-Of: odoo/odoo#217099
The website shop test for comparing list prices now enables pricelist selection before running. This ensures the test can show all configured pricelists and helps prevent false failures in release validation.
Original PR description
Before this commit, the `compare_list_price_price_list_display` tour failed due to a missing feature flag. The user was unable to select a pricelist as only one was available. This commit enables the pricelist feature before the tour, ensuring that the drop-down selector displays all the configured pricelists. runbot-162702 Forward-Port-Of: odoo/odoo#217069
Sales orders created under a branch company now calculate unit prices correctly when product taxes belong to the parent company. This prevents incorrect displayed prices when fiscal positions convert price-included taxes to price-excluded B2B taxes.
Original PR description
Versions -------- - 17.0+ Steps ----- 1. Set up 10% price-included tax; 2. copy the tax to a B2B version that's price-excluded; 3. create a B2B fiscal position mapping the first tax to the second; 4.…
Versions -------- - 17.0+ Steps ----- 1. Set up 10% price-included tax; 2. copy the tax to a B2B version that's price-excluded; 3. create a B2B fiscal position mapping the first tax to the second; 4. create a $10 product using the first tax; 5. create a branch for the current company; 6. switch to the branch company; 7. set up a sale order with the fiscal position; 8. add the product to the order. Issue ----- While the line displays the correct B2B tax, the unit price displays $10, as if it was computed without any taxes, instead of a price-excluded tax. Cause ----- In the `_compute_price_unit` method, it filters out all tax records linked to the product that don't have the same company as the order line, so the parent company's tax does not get factored in. Solution -------- Rather than requiring strict equality between companies, also allow taxes that belong to a parent company of the line's company. opw-4853042 Forward-Port-Of: odoo/odoo#217012 Forward-Port-Of: odoo/odoo#216124
Follower invitation emails no longer show an extra divider between the header and message body. This small visual fix makes notification emails look cleaner and less confusing for users receiving updates on leads, tasks, and similar records.
Original PR description
When adding an Odoo user as a follower to a lead/task/..., there are two separators between the message header and its body. This commit removes the extraneous separator. Steps to reproduce: - Open a lead/task/... - Add Marc Demo as a Follower - Toggle the option to have them notified task-4889715 Forward-Port-Of: odoo/odoo#217291
The chat hub menu now handles the “Reset initial position” action correctly. This prevents an error for users who want to restore the chat window to its default placement, making the messaging experience smoother.
Original PR description
**Purpose of this PR:** Fix an error that occurred when clicking 'Reset initial position' in the chathub menu. Forward-Port-Of: odoo/odoo#214203
Link editing now handles links that contain images, buttons, or other formatted content without removing or breaking that content. This prevents issues in apps like Todo and Recruitment where editing a link could damage the email/template formatting or leave the edit popover stuck open.
Original PR description
reproduction: 18.0+18.1: 1. In Todo, insert an inline image, and create a link including the image and some text 2. click on the text part, click edit button, modify the label area and click apply 3.…
reproduction: 18.0+18.1: 1. In Todo, insert an inline image, and create a link including the image and some text 2. click on the text part, click edit button, modify the label area and click apply 3. the image is removed Test case 2: 1. go to Recruitment, and open an application and click "Send interview" 2. click on the link inside the template, change the url 3. apply, format of the button breaks 18.2: same flow with test case 2, click apply causing a traceback 18.3: same flow with test case 2, click on the link, do nothing and click away, the popover not close Fix: a partial back port of https://github.com/odoo-dev/odoo/pull/4633 The idea is that when the link doesn't only contain text, we don't show the label input field nor apply the label to the link. Because the label field extracts/display the text content of the link element, the field doesn't support html fragment, applying the label on a link including another element inside will break it. on 18.4+, we only rename the variable from isLabelHidden to showLabel task-4881878 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#217226 Forward-Port-Of: odoo/odoo#215023
This fixes an inventory issue where reducing a sales order quantity could create an extra incorrect delivery transfer when a route uses its own destination location. The change ensures stock adjustments use the intended route destination, keeping warehouse movements accurate and avoiding confusing duplicate pickings.
Original PR description
Steps to reproduce: - Install Sales and Stock - Activate the multi-step routes setting - Go to a Delivery route in the warehouse - Change the `location_dest_id` of the operation type set on the rule…
Steps to reproduce: - Install Sales and Stock - Activate the multi-step routes setting - Go to a Delivery route in the warehouse - Change the `location_dest_id` of the operation type set on the rule - Enable the "Location Dest. Taken from Rule" checkbox - Ensure `rule.location_dest_id` and `operation_type.location_dest_id` are different - Create a Sales Order (SO) for a product with quantity = 5 and confirm - Change the SO line quantity to 3 and save Issue: A second picking is created with a move taking the product from `rule.operation_type.location_dest_id -> rule.operation_type. location_src_id` with quantity = -2. This happens because the decrease in the SO quantity triggers a negative move, and this move is not merged with the existing positive move. Instead, a new move is created in the opposite direction. In `_merge_moves`: https://github.com/odoo/odoo/blob/3c4275fb00255e519f01bf5547eff1db3a59d4b5/addons/stock/models/stock_move.py#L1191-L1193 It checks if the negative move has similar characteristics to the existing positive moves. However, the `neg_key(neg_move)` differs in `location_dest_id`, so the merge fails. This happens because the negative move does **not** read the `location_dest_id` from the rule — unlike the procurement, which **does** use the rule and therefore creates positive moves with the correct destination. When the negative move is created with the procurement, it initially has the correct `location_dest_id`. But then: https://github.com/odoo/odoo/blob/b984c72df398c4fe942d8894442e4e893ca0660e/addons/stock/models/stock_move.py#L1191 triggers `_compute_location_dest_id`, which doesn't consider the `rule.location_dest_id` and defaults to `operation_type. location_dest_id`, causing the merge to fail due to mismatched destination_locations. The positive move has read the correct value, because when it was assigned to a picking, the picking has the correct destination from the procurement. But for the neg_move it has picking None so it maps to the operation_type without consdiering the location from rule checkbox. opw-4793171 Forward-Port-Of: odoo/odoo#212355
Odoo now ignores accidental trailing spaces in customer names during checkout, preventing false warnings when users submit their address details. Imported text fields that should be trimmed are also cleaned consistently, reducing data quality issues from imports.
Original PR description
**Steps to reproduce:** 1. Install the website_sale app. 2. Import a user with trailing spaces in the Name field. 3. Make this user Admin in settings 4. Log in with that user and go to Website >…
**Steps to reproduce:** 1. Install the website_sale app. 2. Import a user with trailing spaces in the Name field. 3. Make this user Admin in settings 4. Log in with that user and go to Website > Shop. 5. Click on new and create a new product 6. Add this product to the cart and proceed to checkout. 7. The checkout form pre-fills the name (with trailing spaces). 8. fill other fields 9. Submitting the form triggers a warning due to changed name. **Expected behaviour:** - Name is not changed by us so it should let us checkout - There should not be trailing spaces in imported char fields if trim attribute is true **Issue:** - The name field from the form is trimmed in post request, but the value from the database (with trailing spaces) is used during comparison This results in a false positive change detection. - User's name with trailing spaces is because of Imported records does not check for trim attribute in backend but this is handled in ui. **Solution:** - Trim the database value before comparing it to the form input - Trim the values of char field before importing if trim attribute is true opw-4794220 Forward-Port-Of: odoo/odoo#215467 Forward-Port-Of: odoo/odoo#212040
This fixes an issue where manually adjusted extra hours on an employee attendance could be overwritten when a new attendance was created. The change helps preserve user-entered overtime values in automatic approval setups, reducing payroll and attendance corrections.
Original PR description
**Steps to reproduce** - Set "Extra Hours Validation" to "Automatically approved" - Create an attendance for an employee - Change the "Extra Hours" to a different value - Create another attendance…
**Steps to reproduce** - Set "Extra Hours Validation" to "Automatically approved" - Create an attendance for an employee - Change the "Extra Hours" to a different value - Create another attendance for this employee (not necessarily on the same day) - See that the "Extra hours" of the previous attendance has been recomputed, resetting the value entered by the user. **Cause** When creating an attendance for an employee, we recompute the `validated_overtime_hours` for the other attendances of this employee https://github.com/odoo/odoo/blob/cac96f5d3c391ea0d52da2e3433e7eabe07e8fb0/addons/hr_attendance/models/hr_attendance.py#L426 In case of attendances with no validation, this field is synced with the `overtime_hours` https://github.com/odoo/odoo/blob/cac96f5d3c391ea0d52da2e3433e7eabe07e8fb0/addons/hr_attendance/models/hr_attendance.py#L156 **Solution** We may still want to recompute the `validated_overtime_hours` of automatically approved attendances, since it is their default state, unlike manually approved attendances. If the `validated_overtime_hours` field is different from `overtime_hours`, it means it has been modified. In that case, we avoid recomputing it. This doesn't guarantee a manually set value will never be overriden by a change in its dependencies, but it reduces the likelihood. opw-4639230 Forward-Port-Of: odoo/odoo#207806
This fix restores reliable resizing of grid-based content boundaries in the website editor. Business users editing pages can now adjust elements such as the Pills snippet as expected, reducing layout frustration and editing interruptions.
Original PR description
Before this commit, grid resizing wasn't working properly, because of the pointer up event not firing. To reproduce the issue: - open website, start editing - drop the "pills" snippet - click on text and try to resize its 'boundaries' => It's not working as expected This commit follows the [html_builder refactoring] [html_builder refactoring]: odoo/odoo@9fe45e2b7ddb Related to task-4367641
Payments using an existing third-party check now automatically use the check's original currency, avoiding incorrect currency conversions. The system also blocks combining checks in different currencies, reducing payment errors for Latin American check workflows.
Original PR description
**Steps to reproduce:** - Install accountant, l10n_ar and l10n_latam_check - Switch to an Argentinian company (e.g. (AR) Responsable Inscripto) - Make sure that USD currency has a rate different than…
**Steps to reproduce:**
- Install accountant, l10n_ar and l10n_latam_check
- Switch to an Argentinian company (e.g. (AR) Responsable Inscripto)
- Make sure that USD currency has a rate different than 1
- Create a journal:
* Journal Name: Checks journal
* Type: Cash
- Save the journal
=> a Cash Account should be automatically created
- In "Incoming Payments" tab of the journal, set:
* "New Third Party Checks" with the Cash Account
* "Existing Third Party Checks" with the Cash Account
- In "Outgoing Payments" tab of the journal, set:
* "Existing Third Party Checks" with the Cash Account
- Create an invoice:
* Customer: [an Argentinian customer] (e.g. ADHOC SA)
* Currency: ARS
* Invoice Lines:
- Quantity: 1
- Price: 150000.00
- Taxes: VAT 21%
- Confirm the invoice
- Pay the invoice:
* Journal: [the created Checks journal]
* Currency: ARS
* Checks: [add a line with the amount of the invoice]
- Create a bill:
* Vendor: [an Argentinian customer] (e.g. ADHOC SA)
* Currency: USD
* Invoice Lines:
- Quantity: 1
- Price: 500.00
- Taxes: VAT 21%
- Pay the bill:
* Journal: [the created Checks journal]
* Payment Method: Existing Third Party Checks
* Checks: [add a line and select the check used to pay the invoice]
**Issue:**
When the check (from the invoice) is selected to pay the bill, the original amount (in ARS) is used but the currency stays in USD, which is not correct.
If the currency is changed to ARS, the currency rate is applied on the amount that is already the amount in ARS, which generates a higher incorrect amount.
**Solution:**
Use the currency set on the existing check by default.
Also prevent adding several checks with different currencies.
opw-4741607
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#215435This fixes an issue in Point of Sale where entering extra digits after using quick amount buttons could produce the wrong payment amount. Cashiers can now reliably type payment amounts, reducing checkout errors and manual corrections.
Original PR description
Steps to reproduce: =================== - Add a product to the orderline from the product screen - Click payment - Select any payment method - Enter the amount manually - Press `+20`, then press `2`, OR press `+20`, then press `6` Issue: ====== - In the case of `+20` and `2`, the expected result is `202`, but we get `20` - In the case of `+20` and `6`, the expected result is `206`, but we get `20.01` Cause: ====== - `formatCurrency` is used for the buffer, but the buffer should not depend on the currency Fix: ==== - Remove the usage of `formatCurrency` and treat the buffer as a string Task: 4850543 Forward-Port-Of: odoo/odoo#217108 Forward-Port-Of: odoo/odoo#213294
This fix makes shared website editing resources stay available across embedded editing views, so the same data is not downloaded repeatedly. It reduces unnecessary network requests when reopening snippet dialogs, making the editor feel faster and more efficient.
Original PR description
Before this commit, bundle cache wasn't global but limited to one document only, so iframes would end up in refetching bundles again. To reproduce the issue: - Open website, start editing and open the network tab in devtools to monitor requests; - click on any snippet group, close the dialog and click on the group again => Bundles are fetched again.
This fix prevents the website editor from crashing when duplicate website views share the same identifier. Users can continue editing pages normally even if duplicated view records exist in the system.
Original PR description
When multiple `ir.ui.view` records exist with the same key (e.g., due to duplication), it can lead to a singleton error. **Steps to reproduce:** 1. Install the website module 2. Go to `Settings >…
When multiple `ir.ui.view` records exist with the same key (e.g., due to duplication), it can lead to a singleton error. **Steps to reproduce:** 1. Install the website module 2. Go to `Settings > Technical > User Interface > Views`. 3. Find and duplicate the **Home** view for **My Website** (same key). 4. Open the website home page in Editor mode. **Error:** `ValueError - Expected singleton: ir.ui.view(2776, 2774)` **Cause:** In `viewref()`, it uses `filter_duplicate()` to filter for the most suitable view, but it may return multiple views if more than one match the criteria. - [1] **Ref:** At [2], system uses `limit=1` in `_view_obj()` to ensure only one view is returned, even if duplicates exist for the same key. [1]: https://github.com/odoo/odoo/blob/edfa37271a0015a0d4acb17e6985a87e707e5f33/addons/website/models/website.py#L1228-L1230 [2]: https://github.com/odoo/odoo/blob/51fcbd211d2b1abf4b93becedbcbb9e03002cdd6/addons/web_editor/models/ir_ui_view.py#L326 **Fix:** This commit ensures that the result is a record set with at most one view and preventing singleton-related errors. sentry-6223988092 Forward-Port-Of: odoo/odoo#213113
The live chat widget page now adapts properly to smaller mobile screens. This prevents text and layout from overflowing, making it easier for visitors to use chat from their phones.
Original PR description
**Before this PR:** the livechat widget page was not responsive on mobile devices. This PR fixes the issue by adding the missing meta tag and adjusting font sizing and word wrapping to prevent content overflow on small screens. task-3499603 Forward-Port-Of: odoo/odoo#217127
This fix restores the helpful hint that appears when users click an editable image in the website editor. It makes image editing easier to discover by reminding users they can double-click to edit.
Original PR description
problem: The "Double-click to edit" popover tooltip when clicking once on an image was not displayed anymore. to reproduce: - In the website app, open the editor - Click on any editable image - The "Double-click to edit" popover is not displayed why: It has not been transferred in the new builder desired behavior: When clicking once on an editable image, a popover tooltip should be displayed below the image with "Double-click to edit" message.
Fixes several subscription pricing issues so customers see the right recurring and one-time prices, including pricelist visibility, plan availability, and discounts. It also improves product duplication behavior by copying valid pricing rules and ignoring obsolete inactive-product rules, reducing errors for sales teams.
Fixed an issue where some Winbooks journals were skipped during import when their codes were longer than the allowed length and shared the same starting characters. The import now assigns clear temporary codes to those duplicate cases, helping Belgian accounting migrations bring in all journals reliably.
Original PR description
**Steps to reproduce:** - Install accountant, l10n_be and account_winbooks_import - Switch to a Belgian company (e.g. BE Company CoA) - Go to "Accounting / Configuration / Settings" - Click on…
**Steps to reproduce:** - Install accountant, l10n_be and account_winbooks_import - Switch to a Belgian company (e.g. BE Company CoA) - Go to "Accounting / Configuration / Settings" - Click on "Import (for full history)" in "Accounting Import" section - Click on "Import WBK" in "Winbooks" section - Upload a Winbooks file containing several journals having their "DBKID" value longer than 5 characters with the 5 first characters being identical (e.g. "SALES001", "SALES002",...) - Import **Issue:** Some journals are not imported. **Cause:** The code of a journal is limited to 5 characters and is unique per company. When a code is longer than 5 characters, only the 5 first characters are kept. In this case, several journals to create have the same 5 first characters. Therefore, only one of them is created. **Solution:** If the code of a journal to create has the same first 5 characters of a journal that has already been created (and the same last 5 characters), we use a generic code formatted with a starting "*" char followed by a number that is incremented. This format allows to quickly find it if we want to change its value once imported. This solution is limited to 9999 journals that have a code that can starts with the same 5 characters than another journal, but it should be more than enough. opw-4812655 Forward-Port-Of: odoo/enterprise#86068
Fixed an issue where bank reconciliation reports could show an amount calculated in the company currency while displaying the journal currency symbol. This prevents misleading balances when journal entries are posted through journals using a different currency.
Original PR description
…eport Currently in bank reconciliation report we expect all the entries to have the balance encoded in journal currency However it may not be the case if an entry is posted in a misc journal set in another currency Steps to reproduce: - Create a new journal in another currency (€) than the company's ($) - Create a new journal entry using the journal main account - Go to the account dashboard > click on the 3 dots of the journal - Open the Reconciliation report Issue: The journal entry amount is in company curreny (balance), but with the journal currency symbol (€) opw-4701349 Forward-Port-Of: odoo/enterprise#89321 Forward-Port-Of: odoo/enterprise#87313
This fix ensures the invoice sending time is saved before contacting the Mexican e-invoicing provider. If a connection drops during sending, Odoo can reuse the same timestamp when retrying, reducing duplicate CFDIs with slightly different dates.
Original PR description
### Background In https://github.com/odoo/enterprise/pull/85026 we changed the behaviour of `l10n_mx_edi_post_time` so that it gets set during the CFDI sending process, rather than when the invoice…
### Background In https://github.com/odoo/enterprise/pull/85026 we changed the behaviour of `l10n_mx_edi_post_time` so that it gets set during the CFDI sending process, rather than when the invoice is posted. This was needed to ensure that the post time both reflects the sending time and is re-used if the invoice needs to be re-sent. ### Bug description Since then, several Mexican customers have reported that some CFDIs are sent duplicated, with a difference of a few seconds in the CFDI's Fecha. ### Analysis A disconnection might occur during sending of the CFDI. In that case, the PAC will process the CFDI, but in Odoo the transaction will be rolled back, and the `l10n_mx_edi_post_time` will be lost. When Odoo re-sends the CFDI, it will take a new `l10n_mx_edi_post_time`. ### Solution Commit before performing the API call so that the `l10n_mx_edi_post_time` gets committed to DB. opw-4780096 Forward-Port-Of: odoo/enterprise#89263 Forward-Port-Of: odoo/enterprise#89117
Belgian payroll reports now calculate worker counts much faster, reducing a slow operation from about 50 seconds to under a second on odoo.com. This improves responsiveness for payroll teams and reduces waiting time when processing Belgian HR payroll data.
Original PR description
From 50 to 0.4 seconds on odoo.com
Belgian payroll now creates follow-up activities when an employee contract starts running, rather than every time the contract is edited. This prevents duplicate or mistimed reminders and also avoids including contract templates in pay run generation.
Original PR description
Once the contract got running, not at each write on it.
The UAE payroll rules now calculate end-of-service compensation in line with the official government calculator. Employees receive the 30-day compensation rate only after completing the sixth year, improving payroll accuracy and compliance.
Original PR description
- to algin with UAE goverment eos calculator, salary rule is update to concider full 30 compensation after completing the 6th year not the 5th. Task: 4756963 Forward-Port-Of: odoo/enterprise#89306 Forward-Port-Of: odoo/enterprise#84752
The planning calendar now blocks creation of shifts that are not assigned to any resource. This avoids confusing open shifts caused by leftover calendar multi-create behavior and keeps schedules cleaner for planners.
Original PR description
This commit's purpose is to prevent the creation of open shifts in the calendar view of the planning. Recently, the multi-create feature was added to the calendar view, but some code of the early iteration of the task was left. This fix aim to remove the unneeded code. target saas-18.4
The Knowledge article comment composer now shows only the intended Log button instead of displaying both a paper-plane send icon and Log button. This avoids confusion for users when adding comments to article text and keeps the commenting flow clearer.
Original PR description
Steps to reproduce =============== 1. Go to knowledge. 2. Open any article with write access. 2. Open the comment composer for any text of article. --> Two buttons are shown to post a comment. (Paper-plane and `Log` button) From [Commit], the condition to show the paper plane was modified, which will be always evaluated to `true` for the knowledge comment composer. After this commit, we will explicitly make that condition false for knowledge comment composer. Task-4866473 [Commit]: https://github.com/odoo/odoo/commit/9ba04f2a28f4d2b1adeb04628383d4730b5e72b6 Forward-Port-Of: odoo/enterprise#88225
This fix prevents payslip creation from failing when a Belgian employee has a work entry spanning an unusually long period, such as a full month. Payroll teams can now generate the affected payslips without encountering the error.
Original PR description
There is a bug in the module that made the creation of payslip triggers an error. Steps to reproduce it :
1) Use a Belgian company and an employee with a contract;
2) Create a work entry for a whole month (from 05/01/2025 09:00:00 to 06/01/2025 17:00:00 for example);
3) Try to create a payslip for this employee.
Error :
File "/data/build/enterprise/l10n_be_hr_payroll/models/hr_contract.py", line 517, in _get_work_hours_split_half
work_data[('half', work_entry.work_entry_type_id.id)] += dt.days * 24 + dt.seconds / 3600 # Number of hours
TypeError: 'float' object is not iterable
[opw-4752109](www.odoo.com/odoo/project/49/tasks/4752109)
Forward-Port-Of: odoo/enterprise#88445
Forward-Port-Of: odoo/enterprise#84810Payslip company selection is now locked to the company derived from the employee, preventing mismatched company data in payroll batches. This avoids errors when creating draft accounting entries for batches containing payslips from multiple companies and provides a clearer validation message for older affected records.
Original PR description
Currently a traceback is occurring when the user tries to create a Draft Entry, in the batch that contains payslips of multiple companies. **To reproduce this issue:** 1) Install hr_payroll_account…
Currently a traceback is occurring when the user tries to create a Draft Entry, in the batch that contains payslips of multiple companies. **To reproduce this issue:** 1) Install hr_payroll_account and switch to multi-company environment 2) Create two employees with two running contracts respectively 3) Now create a Batch record from payroll/payslips/batches 4) Create two playslips with different companies with the created batch 5) Compute both the payslips and open the batch 6) Now, try to click on the Create Draft Entry **Error:** A traceback will occur. ``` ValueError: Expected singleton: res.company(1, 2) ``` **Cause:** When the user created multiple payslips with multiple companies containing the same batch and tries to create a Draft Entry, we filtered out the payslips based on the payslip state, and try to change the state to Done using the action_payslip_done method. https://github.com/odoo/enterprise/blob/1e5d7155466f80942f0b8fe2df7fdfb86cae7417/hr_payroll/models/hr_payslip_run.py#L70 So the self will contain multiple payslip recordsets with different company in each payslip. This leads to the above traceback when accessing company_id from self https://github.com/odoo/enterprise/blob/1e5d7155466f80942f0b8fe2df7fdfb86cae7417/hr_payroll_account/models/hr_payslip.py#L61 **Solution:** In payslips, the company_id field should be in readonly state, since the value of the company_id will computed from the employee_id which is a required field. Also raised a validation Error for the previously created record to handle the traceback. Related Upgrade PR:- https://github.com/odoo/upgrade/pull/7763 opw-4797089 Forward-Port-Of: odoo/enterprise#88307 Forward-Port-Of: odoo/enterprise#86628
The Partner Ledger XLSX export now correctly includes entries without an assigned partner when users search for “Unknown Partner.” This ensures downloaded reports match the on-screen results and prevents missing accounting lines in exported files.
Original PR description
### Issue: When searching for "Unknown Partner" in the Partner Ledger to get the lines with no partner, nothing shows on the downloaded XLSX. ### Steps to reproduce: - Have a partner Ledger with -…
### Issue:
When searching for "Unknown Partner" in the Partner Ledger to get the lines with no partner, nothing shows on the downloaded XLSX.
### Steps to reproduce:
- Have a partner Ledger with
- Search for "unknown Partner" in the search bar, only the lines grouped under "Unknown Partner" are shown.
- Click on the button "XLSX"
- The downloaded document does not include "Unknown Partner"
### Cause:
When `filter_search_bar` has a value, the domain used to query the partners/lines will check if the names of the partner match the search text. The resulting SQL query excludes the lines where `partner_id` is `NULL`.
### Solution:
Add a new condition in the domain: `('partner_id', '=', False)` This way the lines with no partner are returned by the query
When searching another existing partner these lines are excluded by an [already existing filter](https://github.com/odoo/enterprise/blob/8eff9194618a1d181c57820829e53aa23c7759d5/account_reports/models/account_partner_ledger.py#L55-L58). It excludes the lines if the search test does not match "Unknown Partner".
opw-4772529
Forward-Port-Of: odoo/enterprise#88139Cancelled drag-and-drop actions in Documents now remove the temporary preview card instead of leaving it visible. This prevents clutter in the interface and avoids test screens filling with duplicate placeholder cards.
Original PR description
Before this commit, when aborting a drag & drop sequence in documents views, the temporary card "ghost" was not removed from the DOM, and stayed in place. This was most noticable in tests, where multiple cards would pile up on the screen. This commit, adds a cleanup for each added card, to ensure that they are properly disposed of. Forward-Port-Of: odoo/enterprise#89418