Daily updates from Odoo
Thursday, August 21, 2025
136 changes
46 changes
Resolved issues and error corrections
This update corrects invalid formatting in delivery reports that could disrupt the report editor. Businesses should see more reliable delivery report editing and rendering, with no expected change to day-to-day workflows.
Original PR description
because of odoo/odoo#169512, there was some illegal html generated in the delivery report. Indeed a <div> in a <p> is not supported. This created issues in the reportEditor, and possibly elsewhere 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#223452 Forward-Port-Of: odoo/odoo#223158
Updating a parent partner no longer incorrectly raises an error when one related contact has an empty VAT value and the other has no VAT value. This prevents unnecessary blocking of partner updates while still protecting accounting consistency.
Original PR description
An error exists if we update the parent partner and the the VAT number does not match with the child partner to prenvent inconsistencies between journal item created before the change. This error is also triggered when one partner vat is '' and the other is False. This commit aims to fix that. opw-4915851 Forward-Port-Of: odoo/odoo#223413 Forward-Port-Of: odoo/odoo#223022
This fixes cases where messages or comments with attachments could behave incorrectly if a file was still uploading. Users are less likely to accidentally delete attachments or send incomplete messages in chat, mail, live chat, and course review flows.
Original PR description
\* = im_livechat, website_slides Not waiting for the uploading state to be resolved can lead to unexpected behavior, such as deleting the attachment immediately when clicking on the delete button rather than showing the confirm dialog. This might also prevent the composer from being sent if the attachment is still uploading. This is checked when checking the enabled state of the send button when clicking on it, but it is not checked when pressing enter directly. Some tests also checked uploading was finished but didn't target the correct attachment. https://runbot.odoo.com/odoo/error/230901 https://github.com/odoo/enterprise/pull/92620 Forward-Port-Of: odoo/odoo#223464 Forward-Port-Of: odoo/odoo#223367
This fix restores the Australian tax setting so GST-only import taxes are treated as fully included for customs purposes. This helps ensure import-related tax amounts are calculated and reported correctly for Australian accounting.
Original PR description
It was price_include before and got removed with the changes from https://github.com/odoo/odoo/commit/be308e106ce9699f99efe133976c40519d6128f9 Re-add them 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#223372 Forward-Port-Of: odoo/odoo#223260
Payment methods set up at a parent company now appear correctly when viewing partner contact forms from a child branch. This prevents branch users from missing existing payment options and helps keep payment setup consistent across company structures.
Original PR description
In this bug, the payment method is not shown in the child branch. To reproduce: 1- Create a db with account and contact app installed 2- Create a company and a branch 3- Create a payment method in parent company and add it to contact form of a partner 4- Go to child branch. You can see the payment method is not shown in the contact form. opw-4920219 Forward-Port-Of: odoo/odoo#223598 Forward-Port-Of: odoo/odoo#219448
Cart notifications now omit the unit of measure when a product only has one available unit. This keeps the shopping experience cleaner by avoiding information that does not help customers make a decision.
Original PR description
If there aren't multiple uoms defined on the product, there is no need to display the uom in the cart notification. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The website builder now shows the correct names for the “Bold 1” and “Bold 2” text highlight options. This fixes an empty label in the highlight picker, making the editing experience clearer for website users.
Original PR description
With the initial [website builder refactor], there was a typo in the keys for the names of the bold highlights. This commits fixes the typo, so that the keys in `highlightIdToName` match the ones in `textHighlightFactory` Steps to reproduce: - Open website builder - Select text, in the expended toolbar, add highlight - Select the "Bold 1" or "Bold 2" highlight (these are the last ones) - Bug: the picker shows an empty button instead of the highlight's name [website builder refactor]: 9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 task-4367641
The website builder now avoids unnecessarily reloading the Instagram Page snippet when visibility settings are changed. This keeps the snippet visible and provides a smoother editing experience, especially in Firefox.
Original PR description
> 2. Instagram Snippet Flickering when changing visibility settings from "Conditionally" to "No Condition" (Firefox Browser) With the initial [website builder refactor], the instagram snippet's iframe reloaded when an option was changed on its container. By implementing `shouldStop` to check if the url of the iframe changed, this commit prevents reloads on changes on other options. Steps to reproduce: - Open website builder - Drop the "Instagram Page" snippet (in "Social" category) - Change the "Visibility" to "Conditional" - Bug: the snippet becomes blank during a short time [website builder refactor]: 9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 task-4367641
This update brings the spreadsheet component to the latest version and fixes several user-facing issues. Users should see more reliable chart exports, cleaner copy-paste behavior, safer table row moves, and correct pivot refresh after undoing deletions.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/d5eb3a626 [REL] 18.4.7 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/d5eb3a626 [REL] 18.4.7 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/c25b8c6cb [FIX] xlsx: correctly export aggregated charts [Task: 4954426](https://www.odoo.com/odoo/2328/tasks/4954426) https://github.com/odoo/o-spreadsheet/commit/1c099dc42 [FIX] clipboard: don't paste both image and text content [Task: 4876682](https://www.odoo.com/odoo/2328/tasks/4876682) https://github.com/odoo/o-spreadsheet/commit/a593cb80a [FIX] selection: prevent partial move of table rows with headers [Task: 4862731](https://www.odoo.com/odoo/2328/tasks/4862731) https://github.com/odoo/o-spreadsheet/commit/a74b221a4 [FIX] pivot: reload when delete is undone [Task: 5001153](https://www.odoo.com/odoo/2328/tasks/5001153) Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya <rmbh@odoo.com> Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com>
This fixes a display issue where collaborator avatars could overlap form status buttons while scrolling through long records. The status area now stays clear and only shows its scroll shadow when needed, making collaborative editing easier to use.
Original PR description
User avatars displayed in collaborative mode overlap with buttons when scrolling. This commit extends the statusbar to take the full width, independently of the sheet's one. Also, to avoid an ugly shadow when not scrolling, it only adds it when the scroll is actually performed. Steps to reproduce: - open a task with two users - write in the description in collaborative mode -> user avatars should be displayed - make sure the description is long enough for the sheet to scroll - scroll for one of the avatars to reach the sticky statusbar => overlap between the avatar and the statusbar task-4907797 Forward-Port-Of: odoo/odoo#223196
Restaurant point-of-sale orders are now reliably saved and synchronized when staff return to the floor screen after making edits. This prevents changes such as notes, customer details, quantities, prices, discounts, or pricelists from being missed across devices or sessions.
Original PR description
Previously, changes made to an order did not trigger synchronization when navigating back to the floor screen. These changes include: • Adding a note or customer note to a line or order • Setting a customer • Modifying quantity, price, or discount via the numpad • Setting a pricelist This commit ensures the order is marked as dirty, which triggers the sync when returning to the floor screen. task.4946929 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221292 Forward-Port-Of: odoo/odoo#220724
Website editors can once again adjust the size of primary and secondary buttons without switching to custom button settings. This makes button styling easier and improves the editing panel by centering labels for a cleaner experience.
Original PR description
Before this commit, the user could only change the size of a button by using the "custom" settings. I was not allowed for the "primary" or "secondary" button types. This commit restores the sizing option for these buttons. This commit also improves the UI by centering the labels. task-4367641
This fixes an issue in the HTML editor where changing a snippet's color preset could accidentally remove its background image. Users can now adjust color styling without losing previously selected imagery, preserving page design work.
Original PR description
[FIX] html_editor: do not remove background image when switching o_cc Steps to reproduce: - Add a snippet. - Set a background image. - Set a color preset (first tab of the colorpicker). - Change the color preset. -> The background image is removed The goal of this commit is to fix a small error introduced by [this one]: `styleWithoutGradient.backgroundImage` is always `none` at this step as we remove the `background-image` property before computing `styleWithoutGradient`. [this one]: https://github.com/odoo/odoo/commit/d013db1f43a411a8ae32989a4fbe0d9c5b6c54ce Related to task-4367641
This fixes an issue where the online shop page could fail to load if all variants of a product template had been deleted. Customers and staff can now browse the shop without encountering an error caused by incomplete product variant data.
Original PR description
When a product template's variants are deleted, accessing the shop page raises an traceback. Steps to reproduce the error: - Install ``website_sale`` module - Enable Product Variants From Settings - Go to Website > eCommerce > Attributes > Open Color > On Product Cards: Visible > Add 2 Attribute values - Create a new Product Template > Attributes & Variants > Add Color attribute with 2 values - Delete the variants of this Product Template - Go to Website > Shop Traceback: ``IndexError: tuple index out of range`` https://github.com/odoo/odoo/blob/c7bedc25c9702956aab73cb6a0c0c544c062a3dd/addons/website_sale/models/product_template.py#L298 When a product template's variants are deleted, ``ptav.ptav_product_variant_ids`` becomes empty. The code tries to access the first element by index, causing the traceback. sentry-6801851377 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Selecting a record from the "Search more" dialog now correctly fills the field instead of unexpectedly opening the record form. This prevents confusion when choosing items such as purchase order lines and keeps the selection flow focused on completing the field.
Original PR description
Example of steps: - install web, purchase and studio - add a many2one with studio anywhere and choose purchase.order.line - close studio - try to use this new field, select "Search more" - select a random record - It opens the form view record instead of select It This is because purchase order line has an openAction that forces the opening of a form view. However, for a select_create_dialog, we must bypass this action to allow nothing except selection. To do this, a new prop has been added, “allowOpenAction,” in the list_controller, which will be true by default, but will be false for select_create_dialog. opw-4958121 Forward-Port-Of: odoo/odoo#223253 Forward-Port-Of: odoo/odoo#222602
Point of Sale now records clearer details about order lines and payments when mismatches occur. This helps support teams identify the cause of order issues faster, reducing investigation time without changing the checkout experience.
Original PR description
Before this commit, in case of a mismatch it was difficult to identify the root cause since the logs did not show which lines or payments were added to the order. opw-4954736 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#223266
Fixes an editor issue where creating a new paragraph after a manual line break could make the previous paragraph lose its visible spacing. This helps users keep intended formatting when editing website or HTML content.
Original PR description
Problem: When at the end of a paragraph, pressing SHIFT+ENTER followed by ENTER creates a new paragraph, but the previous one loses its last line break. Cause: When splitting an element, the `<br>` at the selection point is moved to the newly created split element. However, to render an empty line visibly, two `<br>` elements are needed. Moving the existing `<br>` makes the last line break in the original paragraph invisible. Solution: In this special case, instead of moving the `<br>` at the selection point, insert a new `<br>` in the new element, preserving the visual line break in the original paragraph. Steps to reproduce: - Add a paragraph - Type some text, then press SHIFT+ENTER - Press ENTER to create a new paragraph -> The last line break in the first paragraph is lost opw-4987922 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221869
Purchase replenishments will no longer reuse an existing purchase order when its project does not match the new procurement. This prevents purchases from being incorrectly grouped under the wrong project, keeping project-related purchasing records accurate.
Original PR description
Steps to reproduce: - Create a storable product: - Vendor: Azure Interior - Routes: MTO + Buy - Click on the replenishment button → a purchase order is created - Open the PO and set a project - Replenish the product again Problem: The first purchase order is reused even though it has a project, while it should not. Solution: When searching for a candidate purchase order, ensure that the `project_id` matches the procurement values: - A PO with a project can only be reused for procurements with the same project. - A PO without a project can only be reused for procurements without a project. opw-4976606 Forward-Port-Of: odoo/odoo#223422
Combo products now show the correct pricelist discount on product pages and during checkout. This prevents customers from seeing misleading crossed-out prices such as $0.00 and helps ensure discount information remains consistent through the buying flow.
Original PR description
Versions -------- - 18.0+ Steps ----- 1. Have a combo product; 2. create a pricelist that gives a 10% discount on the product; 3. go to product's website page; 4. observe the displayed discount; 5. add product to cart; 6. go to checkout. Issue ----- The discount has disappeared, instead it displays the original price next to a stricken-through "$ 0.00" Cause ----- The `_compute_discount` method does not get the correct `pricelist_item_id` for the combo items. Additionally, on checkout, it shows the `price_unit` of the combo line in the strike-through, which is always 0. Solution -------- When computing the discount of a combo item, retrieve the discount of its linked line, which has the correct value. Additionally, when displaying a combo product in eCommerce, use `_get_display_price_ignore_combo` instead of the `price_unit`. opw-4968848 Forward-Port-Of: odoo/odoo#223436 Forward-Port-Of: odoo/odoo#222472
This fixes incorrect duration calculations for employees on flexible schedules when attendance is recorded on a public holiday. Work entries now reflect the actual time gaps instead of incorrectly assigning a full 8-hour duration, improving payroll and time-off accuracy.
Original PR description
### Steps to reproduce: - Set Marc Demo's contract work entry source to attendances and working schedule to flexible hours. - Create a public holiday with generic time off work entry type. - Create…
### Steps to reproduce: - Set Marc Demo's contract work entry source to attendances and working schedule to flexible hours. - Create a public holiday with generic time off work entry type. - Create one or multiple attendances for marc demo on the public holiday. - Regenerate work entries for marc demo for that day, the gaps in between the attendances created and the working hours will be filled with work entries with the right start/end time but duration will always be 8h. ### Cause: This is happening because when getting the duration batch for the work entry we get the attendance intervals the employee should work in that period and if the employee is flexible we will get a fake attendance with the number of hours required per day ignoring if the period is just a small period of the day ### Fix: We are checking now since the start date not monday so we don't set a fixed week start. We check if the period is less than the remaining hours we get it as it mostly means that it is less than one day opw-4887933 Forward-Port-Of: odoo/odoo#222646 Forward-Port-Of: odoo/odoo#218823
Editing the quantity on a validated receipt for products valued by lot no longer causes an unexpected crash. The system now guides users with an error when the lot information is ambiguous, helping prevent incorrect inventory valuation changes.
Original PR description
Steps to reproduce: 1) Create a product tracked by lot and with valuation by lot. 2) Create a Purchase Order with this product and Confirm it. 3) Go to Receipt 4) Add a Lot number and validate 3) Unlock the receipt and modify the `quantity`. Current behavior - Get a traceback. Expected behavior: - If there is only one lot: - update the lot quantity - Else : - raise an error The fix should be applied before the `web_save` call to prevent the creation of a new `stock.move.line`. Therefore it's done on the `onchange` call. opw-4841162 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221620 Forward-Port-Of: odoo/odoo#213534
This fixes the Spanish VAT Model 303 report so operations covered by articles 22, 23, and 24 are included in box 60. Businesses using Spanish localization will get more accurate tax reporting and reduce manual correction needs.
Original PR description
Operations included in articles 22, 23 and 24 should be included in section 60 of the model 303 report: source: https://declarando.es/modelo-303/casillas-59-60-y-61? opw-4954870 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#222549 Forward-Port-Of: odoo/odoo#221686
Event tickets sold through Point of Sale now keep their ticket-specific price when a customer is added or the pricelist changes. This prevents accidental price reductions to the base product price and helps ensure customers are charged the intended event ticket amount.
Original PR description
Before this commit: ========== - When selling event tickets through the Point of Sale (PoS), if an orderline was created with the ticket-specific price (higher than the base product price), the price would reset to the base product price when a customer (partner) was added or the pricelist was changed. After this commit: ========== - The event ticket orderline now retains its original ticket price even after a partner is selected or the pricelist is updated. This ensures pricing consistency and prevents unintended overrides for event-specific products. task-4862687 Forward-Port-Of: odoo/odoo#223549 Forward-Port-Of: odoo/odoo#214109
Time Off now uses the employee's active running contract when calculating working schedules and holiday days. This prevents incorrect balances when an employee has multiple contracts for the same period, such as a part-time active contract and a future full-time contract.
Original PR description
Steps: -Install the hr_holidays_contract module - Create two contracts for the same employee: - Contract A (Part-time) starting from 01/01/2025 and set to Running - Contract B (Full-time) also…
Steps: -Install the hr_holidays_contract module - Create two contracts for the same employee: - Contract A (Part-time) starting from 01/01/2025 and set to Running - Contract B (Full-time) also starting from 01/01/2025 and set to New - open holiday dashboard for that employee Description of the issue/feature this PR addresses: The Time Off dashboard incorrectly considers the full-time contract instead of the part-time one, even though the part-time contract is in the running state. Cause: The contract selection logic did not correctly prioritize the running contract when multiple contracts existed for the same period. Fix: This PR updates the logic to ensure that: - If a contract is in the running state at a given time, it is used to determine the working schedule and time off calculations. - If no contract is running during that time and multiple contracts exist, the contract with the latest creation_id will be considered. task-4724155 Forward-Port-Of: odoo/odoo#212959
The web interface now shows a helpful "start typing" message when a relational dropdown has no available results and create/edit is disabled. This prevents flickering and gives users clearer guidance instead of an unstable empty menu.
Original PR description
Before this commit, the m2x dropdown flickered when the option "create and edit" was disabled and there was no data. Now, we display at least the "start typing" message. task-4920761 Forward-Port-Of: odoo/odoo#222746
This fixes unstable automated tests around sending chat messages after typing commands. The change helps ensure test results are consistent, reducing false failures in mail and live chat areas without changing customer-facing behavior.
Original PR description
\* = crm_livechat, im_livechat Enter after typing a command will either send the message when the suggestion list is not opened yet, or select the suggestion. This can either be fixed by waiting for the suggestion list to be opened, closing it, and then pressing enter, or by simply clicking on the send button which is what is done here as the way the message is sent is irrelevant for these tests. https://runbot.odoo.com/odoo/runbot.build.error/230977 https://github.com/odoo/enterprise/pull/92772
Self-order prices now correctly include extra charges from all selected product options, including checkbox-style choices. This prevents customers from seeing or paying the wrong amount when ordering configurable items such as pizzas with size and topping options.
Original PR description
Currently, there is inconsistent behavior in price calculation when a user places a self order for a product containing attributes. **Pre-requisites:** - POS module installed and configured. -…
Currently, there is inconsistent behavior in price calculation when a user places a self order for a product containing attributes. **Pre-requisites:** - POS module installed and configured. - Variant enabled in settings. - Self-ordering is enabled in the POS configuration. - Two product attributes created in the settings/attributes: - One of type radio with variant creation set to Instantly. - Another of type multi-checkbox with variant creation set to Never. - Create attribute lines for both attributes with default extra prices. **Steps to reproduce:** 1) Create a product template linking the above attributes 2) Ensure the product is available in POS and self ordering 3) Open a POS session in one browser tab and the self-ordering in another. 4) Select the product in the self-ordering interface, first choosing an option for the radio attribute, then selecting one or more options for the multi-checkbox attribute. **Error:** You will see the difference between the expected price and the displayed price **Example for Clarity:** Consider a product called Pizza with 2 attributes. The base price of the pizza is $10. | Attribute | Option | Extra Price | | ----------------------------------- | ---------------- | --------------------- | | **Size** (radio) | Small (S) | \$0 (no extra charge) | | | Medium (M) | \$5 | | | Large (L) | \$10 | | **Extra Toppings** (multi-checkbox) | Veggies | \$3 | | | Extra Cheese | \$3 | | | Veggies & Cheese | \$5 | If the user selects a medium-sized pizza with veggie toppings, The expected price is: ``` $10 (base) + $5 (Medium size) + $3 (Veggies) = $18. However, the price shown is only $13. ``` **Root Cause:** For attributes of the multi-checkbox type, variant creation is set to Never by default. This means no product variants are generated for such attributes. Because of this, when calculating the price, the extra price associated with the multi-checkbox attribute is added directly to the base price of the product template instead of the price of the selected variant. This happens because the variant information is not properly passed to the price calculation method: https://github.com/odoo/odoo/blob/9df334c0aca8a57dcbed4c87b43b18403f3a7c6e/addons/pos_self_order/static/src/app/services/card_utils.js#L187-L196 https://github.com/odoo/odoo/blob/9df334c0aca8a57dcbed4c87b43b18403f3a7c6e/addons/point_of_sale/static/src/app/models/product_template.js#L185-L189 As a result, the extra price for the multi-checkbox attribute is incorrectly added to the product template’s base price rather than the variant’s price. **Solution:** Pass the product_variant derived from the selected product.product to the price calculation method. This ensures that if a variant exists based on the user’s selection, the extra price is added to the variant’s price rather than the base product template price, resulting in the correct total price. opw-4963537 Forward-Port-Of: odoo/odoo#221375
This update fixes checks around file uploads across several Odoo Enterprise apps so the system consistently recognizes when files are being added. This helps prevent upload-related errors in comments, helpdesk knowledge articles, spreadsheets, WhatsApp messages, and attachment previews.
Original PR description
\* = knowledge, test_mail_enterprise, test_spreadsheet_edition, website_helpdesk_knowledge, whatsapp Enterprise counter-part. https://runbot.odoo.com/odoo/error/230901 https://github.com/odoo/odoo/pull/223367 Forward-Port-Of: odoo/enterprise#92697 Forward-Port-Of: odoo/enterprise#92620
Creating a draft journal entry from a payslip list filtered by pay run now keeps the correct company context. This prevents empty entries from being created in the wrong company and ensures payroll accounting entries are populated as expected.
Original PR description
Problem ---------- When you create a draft entry from the payslip list view filtered by payrun, it creates a empty journal entry in Company US instead of the current one. Objective ---------- Create a filled journal entry in the good company Solution ---------- The context of the payrun card component was empty. The context of the list controller is now transmitted to the Record Component to keep the same context task-4932712
This fixes an issue where Odoo Studio treated behind-the-scenes fields as editable items in views. Studio now keeps those fields available for data loading without showing them or letting them interfere with view editing, helping avoid incorrect layout changes.
Original PR description
…lly added since commit odoo/odoo@6f06420e4a9443c52dc0cb427f8f55eb4aecabce, fields that are present in expression but not in the arch are automatically added. This caused problems in Studio, where those were considered normal nodes, while they should only be there to tell the model what to fetch. This commit aims at not rendering those nodes in a way that prevent them from parasiting the computation of xpaths. opw-4981741 Forward-Port-Of: odoo/enterprise#92789 Forward-Port-Of: odoo/enterprise#92602
Setting a Pricer Sales Pricelist on a product variant no longer triggers an error. This helps users configure product pricing smoothly, including while working with newly created product records.
Original PR description
Steps to Reproduce: ---------------------------------- - Open the product variant form - Set the Pricer Sales Pricelist field - Traceback Issue: ---------------------------------- - `TypeError: ProductPricelist._compute_price_rule() takes 3 positional arguments but 4 were given` Cause: ---------------------------------- - `_get_product_price()` was calling `_compute_price_rule()` with positional args instead of named quantity - If the product record is not yet created (`product._origin` is False), it skips price computation logic Fix: ---------------------------------- - Pass `quantity=1.0` explicitly to `_compute_price_rule()` to resolve the argument mismatch - Handle case where `product._origin` is False by falling back to `product` itself Task-4888983 Forward-Port-Of: odoo/enterprise#88321
The accounting payment widget now correctly shows remaining bank statement amounts after partial reconciliation and applies the right currency conversion. This helps accountants match invoices to bank statement lines accurately and prevents unrelated invoice payments from being undone when one partial match is removed.
Original PR description
[FIX] account_accountant: fix multi_currency payment_widget To reproduce: - Make a statement line for partner_a for 200 $ - Make an invoice for same partner for 100 $ - Reconcile it with the…
[FIX] account_accountant: fix multi_currency payment_widget To reproduce: - Make a statement line for partner_a for 200 $ - Make an invoice for same partner for 100 $ - Reconcile it with the statement line - Duplicate the invoice and post it => First issue, you don't see the 100$ left on the statement line It's still reconciliable To fix that, we only remove fully reconciled statement lines. Second issue: - Have a bank journal in EUR with a rate of 2 - Make a statement line for 400€ in this journal - Create an invoice for the same partner of 100$ => The widget proposes a statement line of 400$ instead of a 200$ equivalent (with the rate conversion) The issue is that we convert with a foreign_currency_id that is not present in that case. To fix both, we change the way we compute the amount to always use the residual converted from the right currency [FIX] account_accountant: partial on statement line for invoice widget To reproduce: - Make a statement line for partner_a for 200 $ - Make 2 invoice for same partner for 100 $ - Reconcile them with the statement line (via the widget) - Unreconcile first invoice via the payment widget => The second invoice is also unreconciled To solve: Only unreconcile the lines that are part of the partial that we want to unlink Forward-Port-Of: odoo/enterprise#92005
Fixed an issue where document sharing email previews or sent emails could break when a company logo was present. This ensures shared folder notifications work reliably and present the company branding as expected.
Original PR description
94fe1cd1ff066e2238b33b885e102c01c0bd7241 introduce a new mail template for document sharing, replacing the `message_notify` function. The issue is that the logo's `alt` attribute expects the `documents.access` model to have a `create_uid` field, which doesn't exist. This is reproducible in the runbot by either previewing the `documents.mail_template_document_share` template or by sharing a folder after a company logo has been added. opw-5011444
The Belgian payroll accounting setup no longer fails when a specific mobility budget salary rule is missing. This helps companies install or update accounting smoothly, especially on older databases or where that rule was removed.
Original PR description
Currently an issue occurs when the user tries to install `10n_be_hr_payroll_account/account` after follow steps: - Install `l10n_be_hr_payroll` and switch to `BE Company CoA` - Go to Payroll > Configuration > Salary > Rules - Delete `Mobility Budget Special Contribution` - Error occurs when trying to install accounting error: `ValueError: External ID not found in the system: l10n_be_hr_payroll.cp200_employees_salary_mobility_budget_tax` The salary rule mentioned above steps was added with commit [1], and the issue also occurs if the database was created before commit [1] with a module `l10n_be_hr_payroll` and the user tries to install the account after commit [1]. This commit fixes the issue by using `raise_if_not_found=False`, which prevents an error from being raised when the salary rule is missing. [1] - https://github.com/odoo/enterprise/commit/16c8a223beda4e4ebcf2c24f716687726f7230f3 sentry-6578747340 Forward-Port-Of: odoo/enterprise#84578
Reloading the Point of Sale with the booking view selected no longer leaves users on a blank screen. The booking screen now opens automatically as expected, helping staff continue managing restaurant appointments without interruption.
Original PR description
**Before this commit**: When reload data in pos then booking tab is display blank. It is action method so need to call when component is called. **After this commit**: Booking view now correctly and automatically opens when the POS is loaded or reloaded with the `actionName=manage-booking` parameter. Task - 4873055
Fixed an issue where employees on flexible schedules could receive incorrect 8-hour work entry durations for short gaps on public holidays. Work entries now calculate durations from the actual period being regenerated, improving payroll and attendance accuracy.
Original PR description
### Steps to reproduce: - Set Marc Demo's contract work entry source to attendances and working schedule to flexible hours. - Create a public holiday with generic time off work entry type. - Create…
### Steps to reproduce: - Set Marc Demo's contract work entry source to attendances and working schedule to flexible hours. - Create a public holiday with generic time off work entry type. - Create one or multiple attendances for marc demo on the public holiday. - Regenerate work entries for marc demo for that day, the gaps in between the attendances created and the working hours will be filled with work entries with the right start/end time but duration will always be 8h. ### Cause: This is happening because when getting the duration batch for the work entry we get the attendance intervals the employee should work in that period and if the employee is flexible we will get a fake attendance with the number of hours required per day ignoring if the period is just a small period of the day ### Fix: We are checking now since the start date not monday so we don't set a fixed week start. We check if the period is less than the remaining hours we get it as it mostly means that it is less than one day opw-4887933 Forward-Port-Of: odoo/enterprise#92193 Forward-Port-Of: odoo/enterprise#90163
Updating a company's address now also clears outdated map coordinates for related child contacts, preventing old or incorrect pins from staying visible. This helps users trust that Map View reflects the latest contact address information, with a known limitation for some import scenarios that can be corrected by resyncing the parent contact.
Original PR description
**Issue:** When adding contacts with incorrect address data, the Map View could display outdated or incorrect markers **Cause:** The `partner_latitude` and `partner_longitude` fields were not reset…
**Issue:** When adding contacts with incorrect address data, the Map View could display outdated or incorrect markers **Cause:** The `partner_latitude` and `partner_longitude` fields were not reset for child contacts when the parent’s address changed **Fix:** We added a `partner_latitude` and `partner_longitude` reset when changing address in write We added `partner_latitude` and `partner_longitude` in the _address_fields to update the value each time it can be required, like on address change or contact creation The extension in the _address_fields is there to detect the changes on children synchronization, because it only replace the value that where present in vals for the fields in that list In that way, it will detect more address changes and trigger the write for the children with the corresponding parent `partner_latitude` and `partner_longitude` We also make sure that those extra _address_fields will not be displayed in the formatted address by removing them from `_formatting_address_fields` **Limitations:** One issue remains during import: the parent-child address synchronization is disabled on contact creation This means children may be created with addresses different from the parent’s and have mismatch positions on Map This can be corrected by updating or re-importing the parent to trigger synchronization **Steps to reproduce:** With Form: - Add a parent contact company with a valid address - Add a child contact related to company, with a valid address - Open the Map View, both address must appear on Map - Modify the parent address to remove street (make it invalid) - Check that the child address match the parent one - Check the Map View, before the fix the child should remain with a wrong position With import: Create an import file (an example is in on the ticket) - Add a sheet for the Parent contact with an valid address - Add a sheet to add the Child contact with a parent_Id, with a valid address - Add a sheet to break the address on the parent, removing the street - Open the contacts app - Import the valid Parent and Child sheets (you need to select Related Company / External ID) - Add a filter to get your created contacts - Check the Map View (You should see both parent and child) - Import the Break parent sheet - Check that the child address match the parent one in the Form - Check the Map View, before the fix the child should remain with a wrong position A file can be found on the ticket with pre-made data **Technical notes:** The reset logic is duplicated from the `base_geolocalize` module, because this module is optional and may not be installed in all cases Since `base_geolocalize` is not always present, its `write` override will not be triggered consistently On the other hand, `web_map` is automatically installed with the Enterprise version of Odoo Therefore, it is necessary to implement this fix in at least one of the two modules to ensure the behavior is active when Enterprise is used We chose to keep the override in both `base_geolocalize` and `web_map` to cover both Community and Enterprise cases reliably An alternative approach would be to move the reset logic directly into `res.partner` in the `base` module, making it always available regardless of installed addons and avoiding the duplication opw-4842910 Forward-Port-Of: odoo/enterprise#92658 Forward-Port-Of: odoo/enterprise#90392
The French VAT report export has been updated to use the 2025 reporting version. This keeps the report aligned with the latest French tax filing requirements and avoids automated validation failures, without changing the VAT export content itself.
Original PR description
The version for 2025 is out. As far as we can see, the changes don't concern the export of VAT report. So we just change the value to 2025. (2024 non blocking for prod is still accepted in 2025 but it fails for the server test). task-4617663 Forward-Port-Of: odoo/enterprise#92676 Forward-Port-Of: odoo/enterprise#92542
Fixed an issue where previewing a sales order could fail after switching from a subscription quotation template to a regular one. This prevents an error screen and lets users preview non-subscription quotes normally, even when subscription billing details are absent.
Original PR description
Steps to reproduce: 1. Go to Sales > Configuration > Settings. 2. Set Subscription Template as default Quotation Template e.g.(Yearly Cleaning) 3. Create a new Sales Order 4. Switch the quotation…
Steps to reproduce:
1. Go to Sales > Configuration > Settings.
2. Set Subscription Template as default Quotation Template e.g.(Yearly Cleaning)
3. Create a new Sales Order
4. Switch the quotation template from a Subscription one to a non-subscription template e.g.(Office Furnitures)
5. Click Preview on the Sales Order.
Issue:
A traceback is raised:
`TypeError: unsupported operand type(s) for +: 'datetime.date' and 'bool'`
Cause:
In the portal template, the following expression is evaluated without checking if value is falsy or empty:
https://github.com/odoo/enterprise/blob/36f419e4604a2adc946f3a6828e69fba7584d2df/sale_subscription/views/sale_subscription_portal_templates.xml#L66
When sale_order.plan_id.billing_period is False, the expression fails because a datetime.date cannot be added to a bool.
Solution:
Added a conditional check to ensure that billing_period is truthy before performing the addition:
`<t t-if="sale_order.plan_id.billing_period"
t-set="modal_max_pause_time"
t-value="modal_start_time + sale_order.plan_id.billing_period"/>`
opw-4980869Currently an exception is generated due to the variables translated into the `Spanish (Latin America)` language. `KeyError: 'tipo'` This commit fixes the issue by using the original variable name instead of translated terms. sentry-6046430921 Forward-Port-Of: odoo/enterprise#92716
Original PR description
Currently an exception is generated due to the variables translated into the `Spanish (Latin America)` language. `KeyError: 'tipo'` This commit fixes the issue by using the original variable name instead of translated terms. sentry-6046430921 Forward-Port-Of: odoo/enterprise#92716
This fixes a timing issue that could affect sending messages with the Command + Enter keyboard shortcut in Discuss and website live chat helpdesk areas. The change helps prevent intermittent failures, making message sending more dependable for users and support teams.
Original PR description
\* = test_discuss_full_enterprise, website_helpdesk_livechat Enterprise counter-part. https://runbot.odoo.com/odoo/runbot.build.error/230977 https://github.com/odoo/odoo/pull/223601
The kitchen preparation display no longer crashes when an order is marked done in a setup with only one preparation stage. This improves reliability for restaurants using simplified kitchen workflows and avoids interruptions during service.
Original PR description
Currently, an IndexError traceback occurs when changing the order state in the preparation display if it contains only one stage. **Steps to reproduce this issue:** 1) Install POS, Kitchen Display 2)…
Currently, an IndexError traceback occurs when changing the order state in the preparation display if it contains only one stage. **Steps to reproduce this issue:** 1) Install POS, Kitchen Display 2) Create a preparation display by removing all but one stage in the prep settings. 3) Open a restaurant session and create an order. 4) Open the preparation display and mark the created order as DONE. 5) A traceback will occur **Error:** ``` IndexError: tuple index out of range ``` **Cause:** When the Done button is clicked in a preparation display with only one stage, an ORM call to `change_state_status` is triggered. This then calls `_record_status_change_prep_time`, followed by `is_stage_position`. https://github.com/odoo/enterprise/blob/39810b5b7df01f381a08582ddc0c5218e99c964c/pos_enterprise/models/pos_prep_state.py#L31-L40 https://github.com/odoo/enterprise/blob/39810b5b7df01f381a08582ddc0c5218e99c964c/pos_enterprise/models/pos_prep_stage.py#L21-L22 In `is_stage_position`, static positions [0, -1, -2] are used to access items in the `stage_ids`. If only one stage exists, accessing indices -2 results in an IndexError. **Solution:** Before accessing a stage by position, check that the length of stage_ids is greater than or equal to the absolute value of the position. This prevents attempts to access out-of-range indices. opw-4985306 Forward-Port-Of: odoo/enterprise#91918
Odoo Studio now handles buttons whose linked server action has been deleted. Instead of showing an error, the button editor can open normally, reducing disruption for users customizing forms.
Original PR description
The error is triggered when a user configures a button to execute a serveraction, deletes the associated server action, and then attempts to edit the button. This causes a failure at the line `self.env.ref(str_action)` due to the missing external ID. **Steps to reproduce:** * Install `crm` and `web_studio` * crm > Form View> Studio > `Add a button`> Run a server Action > Enrich * Settings > Technical > Actions > Server Actions > `Enrich` > Delete it * crm > Form View > Studio `ValueError: External ID not found in the system: crm_iap_enrich.action_enrich_mail` **Solution:** * Return `False` when the referenced server action cannot be found or has been removed. **Sentry-6608495874** Forward-Port-Of: odoo/enterprise#92683 Forward-Port-Of: odoo/enterprise#89218
This fix prevents the restaurant preparation display from crashing when a setup has only one stage and staff mark it as Reset or Done. It helps restaurants using simplified workflows keep orders moving without interruption.
Original PR description
This error occurs when we try to mark a single stage as `Reset` or `Done` in the preparation display. Steps to reproduce: --- - Install the `pos_restaurant` module - Create a New `Preparation Display` with one stage - Open `Preparation Screen` - Now `Reset` or `Done` the stage in the other tab Traceback: --- `IndexError: tuple index out of range` At [1], an error occurs because it tries to access a `position` that doesn't exist in the tuple. This happens because at [2], the code attempts to retrieve the second-to-last (-2) stage position, but only one stage is being used. [1]- https://github.com/odoo/enterprise/blob/285cca92a52f7b79de1d020558aa9b116cd7e44a/pos_enterprise/models/pos_prep_stage.py#L21-L22 [2]- https://github.com/odoo/enterprise/blob/285cca92a52f7b79de1d020558aa9b116cd7e44a/pos_enterprise/models/pos_prep_state.py#L72 sentry-6681171781 Forward-Port-Of: odoo/enterprise#87098
The link to Six payment setup instructions in the POS payment provider settings has been fixed. Users can now access the right documentation directly, reducing confusion during payment terminal configuration.
Original PR description
Before this commit: ------------------- - The Six documentation link in the POS payment provider configuration was broken, leading to a poor user experience. After this commit: ------------------ - The Six documentation link has been corrected to ensure proper access to setup instructions. Task: 4797691 Forward-Port-Of: odoo/enterprise#91974
Users editing spreadsheet global filters now see the selected filter panel replace the existing side panel instead of piling up a second panel. This prevents broken Cancel or Remove actions and makes filter management more reliable.
Original PR description
Steps to reproduce: - Open the global filter side panel (list of all filters) - Pin the panel - Click on a specific filter to view/edit it Current behavior before PR: - A second side panel was opened instead of replacing the current one - Clicking 'Cancel' on the new panel had no effect - Clicking 'Remove' caused a traceback Desired behavior after PR is merged: - The new side panel replaces the current one (main or secondary) - The previous panel is restored correctly on 'Cancel' or 'Remove' - If the new panel is already open, we simply close the current one Task: [4911603](https://www.odoo.com/odoo/2328/tasks/4911603)
33 changes
Resolved issues and error corrections
The Attendance overview list now shows employees only when they have matching attendance records. This avoids clutter and makes grouped attendance reports easier for HR teams to read, while preserving the existing Gantt view behavior.
Original PR description
To reproduce: ============= - Activate the "Attendances" app. - Go to Attendances > Overview. - Switch to list view. - Group by Employee. Issue: ====== The current domain fetches all employees…
To reproduce: ============= - Activate the "Attendances" app. - Go to Attendances > Overview. - Switch to list view. - Group by Employee. Issue: ====== The current domain fetches all employees matching the filter, regardless of whether they have attendance entries in the grouped model. https://github.com/odoo/odoo/blob/5b5f0bf795ca538e91f063f2b3185c12b1d0a992/addons/hr_attendance/models/hr_attendance.py#L677 Fix: ==== Restrict the employee list to only those linked to a resource that appears in the grouped data https://github.com/odoo/odoo/blob/5b5f0bf795ca538e91f063f2b3185c12b1d0a992/odoo/models.py#L2360-L2361 The problem is the behavior of gantt view will change it's behavior So we have to applied only to the list. there's something unique when we call it from the gantt which is `gantt_start_date` property that we will use it so we can differentiate between list and gantt view -- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#223594 Forward-Port-Of: odoo/odoo#223181
Online-paid self-order POS orders are now sent to the preparation display, matching the behavior of terminal-paid orders. This prevents kitchen or preparation teams from missing orders that customers already paid for online.
Original PR description
After this pr: https://github.com/odoo/odoo/pull/213493 the orders were not sent to the preparation display if the order was payed with and online payment method. This commit add the same logic as the terminal payments to send the order to the preparation display. 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 copied databases using the Greek e-invoicing module from unintentionally contacting external services. It helps support teams investigate customer issues safely without affecting live operations or customers.
Original PR description
This commit adds the missing neutralization necessary for the l10n_gr_edi module introduced in [1] The purpose of the standard neutralization framework is to allow us to create database copies that will not interact with external systems in ways that could impact the production database (or if it is not possible to prevent the interactions, make sure that they are benign or won't result in actual changes), or impact the customers of the operator of the production database. This is mainly useful to allow safe support investigation on database duplicates. [1] odoo#203428 Forward-Port-Of: odoo/odoo#223536
Updating a parent or child contact no longer raises an error when one VAT value is blank and the other is unset. This prevents unnecessary blocking of partner updates while still protecting accounting consistency when VAT numbers truly differ.
Original PR description
An error exists if we update the parent partner and the the VAT number does not match with the child partner to prenvent inconsistencies between journal item created before the change. This error is also triggered when one partner vat is '' and the other is False. This commit aims to fix that. opw-4915851 Forward-Port-Of: odoo/odoo#223413 Forward-Port-Of: odoo/odoo#223022
This fix ensures the customer name used in a point-of-sale loyalty gift card test is unique and can be found reliably in the PoS. It helps prevent false test failures and supports more stable validation of loyalty workflows.
Original PR description
This commit make sure that the partner name is unique and can be retrieved in the PoS opw-230992 Forward-Port-Of: odoo/odoo#223387
Fixes an issue where payment methods set up in a parent company were not visible when viewing a contact from a child branch. This ensures branch users can see and use the expected payment details without switching company context.
Original PR description
In this bug, the payment method is not shown in the child branch. To reproduce: 1- Create a db with account and contact app installed 2- Create a company and a branch 3- Create a payment method in parent company and add it to contact form of a partner 4- Go to child branch. You can see the payment method is not shown in the contact form. opw-4920219 Forward-Port-Of: odoo/odoo#223598 Forward-Port-Of: odoo/odoo#219448
This update refreshes Odoo Spreadsheet with several fixes that improve everyday reliability. It corrects chart exports to Excel, avoids duplicate pasted content from the clipboard, prevents inconsistent table row moves, and restores pivot data properly after undoing deletions.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/ab02b0cb9 [REL] 18.3.17 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/ab02b0cb9 [REL] 18.3.17 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/0d2a01e6c [FIX] xlsx: correctly export aggregated charts [Task: 4954426](https://www.odoo.com/odoo/2328/tasks/4954426) https://github.com/odoo/o-spreadsheet/commit/4d2398b70 [FIX] clipboard: don't paste both image and text content [Task: 4876682](https://www.odoo.com/odoo/2328/tasks/4876682) https://github.com/odoo/o-spreadsheet/commit/7f80875f3 [FIX] selection: prevent partial move of table rows with headers [Task: 4862731](https://www.odoo.com/odoo/2328/tasks/4862731) https://github.com/odoo/o-spreadsheet/commit/64cf69dc0 [FIX] pivot: reload when delete is undone [Task: 5001153](https://www.odoo.com/odoo/2328/tasks/5001153) Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya <rmbh@odoo.com> Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com>
This fix prevents custom readonly fields on invoice lines from becoming editable when users open invoices. It avoids accidental changes and incorrect dirty-state warnings while keeping intended editing behavior for product labels and products.
Original PR description
Steps to reproduce ================== - Go to invoices - Open studio - Click on the invoice lines - Edit the list view - Add a new field of type checkbox - Mark that field as readonly - Exit studio - Open an invoice - Click on the checkbox => The form is marked as dirty and the checkbox is toggled Cause of the issue ================== https://github.com/odoo/odoo/commit/291518a7e7708690d183b9d1ca53c84d0c56ad90 If the state is not in ["cancel", "done", "posted"], the fields are never in readonly Solution ======== Only do this for the "name" and "product_id" fields opw-4917471 Forward-Port-Of: odoo/odoo#222595
The Italian localization now includes the required 0% EU services export tax with the correct legal note. This helps businesses issue compliant invoices for EU service exports and distinguish them from other zero-rated EU tax cases.
Original PR description
Description of the issue this commit addresses: The export tax for services is missing in the italian localization. It's required because it has a different legal note than the usual 0% EU tax. --- Desired behavior after this commit is merged: The italian localization has a 0% EU S for exported services in EU with the right legal note. --- task-4715771 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#223524 Forward-Port-Of: odoo/odoo#205521
The sales order availability indicator is now hidden when the remaining delivery has been intentionally canceled. This prevents users from seeing a confusing “No future availability” warning after deciding not to deliver the outstanding quantity, even when stock exists.
Original PR description
Issue ----- The availability widget states "No future availability" when the backorder of a product has been cancelled, despite the product being available in stock. Steps to reproduce ----- - Create…
Issue ----- The availability widget states "No future availability" when the backorder of a product has been cancelled, despite the product being available in stock. Steps to reproduce ----- - Create a stored product with some on hand quantity - Create a SO for the product - Register a partial delivery (or set the move quantity to 0) - Cancel the backorder - Go back to the SO --> The widget is red and states that there is "No future availability". While the logic is sound, this is confusing the user because they have some qty in stock. Solution ----- The user has manually decided not to deliver the (full qty of) product. There is aready some logic to set the `display_qty_widget` field to False when the user deletes the move from the the picking. https://github.com/odoo/odoo/blob/693e1ef2f934f58209a78787404d5c76be550af4/addons/sale_stock/models/sale_order_line.py#L61 Since the user specified that there is nothing left to deliver, we can extend the condition to include our use case. To do so, we can simply check the existence of a move that is not in a 'done' or 'cancel' state. This will make the widget invisible because it is conditionally invisible. https://github.com/odoo/odoo/blob/693e1ef2f934f58209a78787404d5c76be550af4/addons/sale_stock/static/src/widgets/qty_at_date_widget.xml#L7 ----- Ticket: opw-4942277
This fixes cases where files could be acted on before their upload was fully recognized, which could cause attachments to delete without confirmation or block messages from sending. It improves reliability when adding files in chat, messaging, live chat, and course review workflows.
Original PR description
\* = im_livechat, website_slides Not waiting for the uploading state to be resolved can lead to unexpected behavior, such as deleting the attachment immediately when clicking on the delete button rather than showing the confirm dialog. This might also prevent the composer from being sent if the attachment is still uploading. This is checked when checking the enabled state of the send button when clicking on it, but it is not checked when pressing enter directly. Some tests also checked uploading was finished but didn't target the correct attachment. https://runbot.odoo.com/odoo/error/230901 https://github.com/odoo/enterprise/pull/92620 Forward-Port-Of: odoo/odoo#223464 Forward-Port-Of: odoo/odoo#223367
This fix prevents products used as loyalty rewards from being hidden in the Point of Sale. It helps ensure loyalty promotions remain usable at checkout and avoids cashier confusion when applying rewards.
Original PR description
Before this commit, a product used as a loyalty reward could be hidden in the PoS. opw-5005934 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222451
Point of Sale order logs now include clearer details about which order lines and payments were added. This makes it easier for support teams to investigate mismatches and resolve issues faster without changing the checkout experience.
Original PR description
Before this commit, in case of a mismatch it was difficult to identify the root cause since the logs did not show which lines or payments were added to the order. opw-4954736 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#223266
Shared Microsoft Office documents now keep the correct file type instead of being treated as ZIP files. This lets portal users open and work with documents in Odoo features such as spreadsheets without file type errors.
Original PR description
Issue: Inconsistent mimetype vs filename for documents shared by portal users. 1. Share a ms office document logged in as a portal user. 2. filename is correct, but mimetype is `application/zip`. 3.…
Issue: Inconsistent mimetype vs filename for documents shared by portal users. 1. Share a ms office document logged in as a portal user. 2. filename is correct, but mimetype is `application/zip`. 3. User can't interact with the file to open the file in the Odoo spreadsheet because the mimetype is zip. <img width="387" height="192" alt="image" src="https://github.com/user-attachments/assets/be31f05f-e4e3-44d9-b12a-66f96feba950" /> <img width="274" height="67" alt="image" src="https://github.com/user-attachments/assets/93064e5c-c028-41ce-8e79-1b9c9447c018" /> With `fix_filename_extension()`, the following two commits fixed the issue of Odoo's `guess_mimetype` function incorrectly guessing extensions such as `.xlsx` as `.zip` extension. https://github.com/odoo/odoo/commit/8842b6b43e7c3d1cc67d7d399bb210e4009e23b2 https://github.com/odoo/odoo/commit/34d9375e2efb604f8e7036cb710f44b01f9ccaee However, the `_from_request_file()` still uses the incorrectly guessed mimetype to create an attachment, leading to inconsistent extension from the filename (.xlsx) vs attachment record's mimetype (.zip). This commit fixes the issue by using the mimetype from the filename's extension. This is safe if the following assumption is correct: At the point where the `from_request_file()` attempts to create the attachment record, the `filename` contains correct extension name, presumably fixed by the `fix_filename_extension()`. Commit message to be changed after with Julien's confirmation; opw-4753670 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222556 Forward-Port-Of: odoo/odoo#222368
Applying a button style to text in the HTML editor now preserves the font size the user already chose. This prevents unexpected visual changes and helps website content keep its intended appearance.
Original PR description
### Steps to reproduce: - Type some text and apply a large font-size. - Select the text and apply the button style. - Notice that the font-size is not reflected on the button. ### Description of the…
### Steps to reproduce: - Type some text and apply a large font-size. - Select the text and apply the button style. - Notice that the font-size is not reflected on the button. ### Description of the issue/feature this PR addresses: - The `<a class=btn>` element was placed inside a font-size `<span>`. - However, the `.btn` class defined its own font-size, causing the original styling to be overridden. ### Desired behavior after PR is merged: - Improved the splitAroundUntil utility to correctly handle cases where the target node has no previous or next sibling. In such edge cases, the function now recursively splits up the inline ancestry until the specified limitAncestor, ensuring that the target node is fully isolated. - The font-size `<span>` is moved inside `<a>` tag when applying a button style. - This ensures the original font-size is preserved and correctly displayed. task-4731416 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222348 Forward-Port-Of: odoo/odoo#216300
This fixes invalid formatting in the delivery report template that could cause problems when editing or rendering reports. Business users should see more reliable delivery report handling, especially in the report editor.
Original PR description
because of odoo/odoo#169512, there was some illegal html generated in the delivery report. Indeed a <div> in a <p> is not supported. This created issues in the reportEditor, and possibly elsewhere 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#223158
This fix keeps paragraph line breaks visible when users split a paragraph after inserting a manual line break. It prevents edited website or HTML content from unexpectedly losing spacing, helping pages keep the layout users intended.
Original PR description
Problem: When at the end of a paragraph, pressing SHIFT+ENTER followed by ENTER creates a new paragraph, but the previous one loses its last line break. Cause: When splitting an element, the `<br>` at the selection point is moved to the newly created split element. However, to render an empty line visibly, two `<br>` elements are needed. Moving the existing `<br>` makes the last line break in the original paragraph invisible. Solution: In this special case, instead of moving the `<br>` at the selection point, insert a new `<br>` in the new element, preserving the visual line break in the original paragraph. Steps to reproduce: - Add a paragraph - Type some text, then press SHIFT+ENTER - Press ENTER to create a new paragraph -> The last line break in the first paragraph is lost opw-4987922 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221869
Combo product discounts now display correctly when a pricelist discount applies, both on the product page and during checkout. This prevents customers from seeing confusing crossed-out zero prices or missing discounts, improving pricing clarity in eCommerce flows.
Original PR description
Versions -------- - 18.0+ Steps ----- 1. Have a combo product; 2. create a pricelist that gives a 10% discount on the product; 3. go to product's website page; 4. observe the displayed discount; 5. add product to cart; 6. go to checkout. Issue ----- The discount has disappeared, instead it displays the original price next to a stricken-through "$ 0.00" Cause ----- The `_compute_discount` method does not get the correct `pricelist_item_id` for the combo items. Additionally, on checkout, it shows the `price_unit` of the combo line in the strike-through, which is always 0. Solution -------- When computing the discount of a combo item, retrieve the discount of its linked line, which has the correct value. Additionally, when displaying a combo product in eCommerce, use `_get_display_price_ignore_combo` instead of the `price_unit`. opw-4968848 Forward-Port-Of: odoo/odoo#223436 Forward-Port-Of: odoo/odoo#222472
This fixes checks around file uploads across messaging, knowledge, helpdesk knowledge, spreadsheet comments, and WhatsApp-related areas. It helps ensure files are properly treated as uploading when added, reducing upload-related errors and test failures.
Original PR description
\* = knowledge, test_mail_enterprise, test_spreadsheet_edition, website_helpdesk_knowledge, whatsapp Enterprise counter-part. https://runbot.odoo.com/odoo/error/230901 https://github.com/odoo/odoo/pull/223367 Forward-Port-Of: odoo/enterprise#92697 Forward-Port-Of: odoo/enterprise#92620
This fix ensures appointment booking updates sent to Google Reserve keep all existing slot information while adding the party size. This helps Google receive a complete, correctly formatted booking response and reduces the risk of update failures or missing booking details.
Original PR description
The controller incorrectly modified the given "slot" to only contain the party size key. Instead, it should update the information to add this key next to the existing ones, and in turn return a properly formatted slot to Google. Task-3083812 Forward-Port-Of: odoo/enterprise#92839
Employee clock-in updates in Belgian POS now include the required staff identification field when shared with other devices. This prevents errors when another device receives the update and needs to communicate with the Belgian fiscal blackbox.
Original PR description
Before this commit, when clocking, the session was synchro with other devices but without the _employee_insz_or_bis_number custom field. _employee_insz_or_bis_number was thus not accessible after the device receives the websocket message and the pos was returning a traceback when trying to send a message to the blackbox. This commit fixes the issue.
Products that are neither rentable nor sellable are now kept out of sales order product selections. This prevents staff from accidentally adding unavailable products and helps keep sale and rental workflows accurate.
Original PR description
This PR adds a test for the explained case which was solved by: - PR https://github.com/odoo/enterprise/pull/91701 - Commit…
This PR adds a test for the explained case which was solved by: - PR https://github.com/odoo/enterprise/pull/91701 - Commit https://github.com/odoo/enterprise/commit/a2bbf33f5e787420389f1550d8e66b7b6995dc75 #### Issue: Not rentable product were displayed in sale order product dropdown list whether they were salable or not #### Step to reproduce: - install Sale, Rental, - create a product no Sales, no Rental - create a new sale order #### Current behavior: - your product appears in the dropdown list to add a product #### Expected behavior: - your product shouldn't appear in the dropdown list to add a product #### Cause: - From the commit [d5f72c2](https://github.com/odoo/enterprise/commit/d5f72c201bf0642f2f47315f06468528268251a3) domain for rental are computed on back end. - sale_renting module override the `_domain_product_id()` method. It add a OR to the domain on `'rent_ok' = order_is_rental`. Therefore, if one create a sale order outside of the rental app, every not rentable product is displayed. #### Solution: - This domain should apply only if `order_is_rental` is enabled. Therefore add a AND to check if `order_is_rental` is enabled. opw-4966082
This fixes an issue in the Belgian salary contract offer process. It helps ensure salary contract offers are handled correctly, reducing the risk of errors for HR teams using Belgian payroll workflows.
Original PR description
Forward-Port-Of: odoo/enterprise#88918
A test user setup was simplified by removing an unnecessary timesheet approval permission. This prevents failures when the manufacturing work order accounting app is tested on its own, improving reliability without changing business functionality.
Original PR description
on the test `test_mrp_aa_employee_without_account_rights` the user was created with the group `hr_timesheet.group_hr_timesheet_approver` which is not needed and was causing the test to fail on Single app test as this module does not depend on hr_timesheet. This commit removes this group from the user creation. runbot-231137 Forward-Port-Of: odoo/enterprise#92747
Belgian payroll accounting can now be installed even if the Mobility Budget Special Contribution salary rule was deleted or is absent from an older database. This prevents an installation error and helps companies complete accounting setup without manual technical intervention.
Original PR description
Currently an issue occurs when the user tries to install `10n_be_hr_payroll_account/account` after follow steps: - Install `l10n_be_hr_payroll` and switch to `BE Company CoA` - Go to Payroll > Configuration > Salary > Rules - Delete `Mobility Budget Special Contribution` - Error occurs when trying to install accounting error: `ValueError: External ID not found in the system: l10n_be_hr_payroll.cp200_employees_salary_mobility_budget_tax` The salary rule mentioned above steps was added with commit [1], and the issue also occurs if the database was created before commit [1] with a module `l10n_be_hr_payroll` and the user tries to install the account after commit [1]. This commit fixes the issue by using `raise_if_not_found=False`, which prevents an error from being raised when the salary rule is missing. [1] - https://github.com/odoo/enterprise/commit/16c8a223beda4e4ebcf2c24f716687726f7230f3 sentry-6578747340 Forward-Port-Of: odoo/enterprise#84578
Receipt validation now correctly triggers automatic lot or serial number label printing after a quality check is passed. This prevents missing label downloads when incoming products require quality checks, helping warehouse teams complete receiving flows without manual reprints.
Original PR description
## Issue: When 'auto_print_lot_labels' is activated on Receipts Operation Type, and you received a product, the print action wasn't trigger when you validate before making the Quality Check The…
## Issue: When 'auto_print_lot_labels' is activated on Receipts Operation Type, and you received a product, the print action wasn't trigger when you validate before making the Quality Check The wizard is automatically opened but when you click on the Pass button, the wizard was closed without sending the print action ## Cause: The action wasn't return by the wizard function 'action_generate_next_window()' making the only action to be a 'act_window_close' ## Note: The state wasn't correctly set to done for all products when you validate pickings both with and without QCs in them at the same time, it should now be fix Enabling Delivery Slip for the Receipts will make the SN to not be print even after disabling the option ## Steps to reproduce: - Toggle the Lot/SN Labels option in the Hardware Tab for the Operation Type Receipts - Create a Product tracked by Unique Serial Number - Add a Quality Check for the Receipts operation - Create a New Receipt for the product - Mark as Done and Add the Serial Number - Validate the receipt and Pass the check - Before the fix, no document was downloaded opw-4790427 Forward-Port-Of: odoo/enterprise#90134
This fixes an issue where tax report setup could use the wrong country reference when looking for tax groups. It helps ensure accounting reports behave correctly even when some tax group data is missing.
Original PR description
The previous domain wasn't working as country is a recordset and not an id.
Users can now remove a partner from a bank statement line after setting an account. This fixes an editing issue in accounting workflows and helps keep bank statement data accurate.
Original PR description
Before this commit when doing a set account on a bank statement line, and then editing this line to remove the partner was not working. This commit will allow the user to remove the partner when editing the line. task-4984569
Odoo Studio now ignores automatically added helper fields when displaying and arranging views. This prevents invisible technical fields from interfering with layout calculations, making Studio edits more reliable for users.
Original PR description
…lly added since commit odoo/odoo@6f06420e4a9443c52dc0cb427f8f55eb4aecabce, fields that are present in expression but not in the arch are automatically added. This caused problems in Studio, where those were considered normal nodes, while they should only be there to tell the model what to fetch. This commit aims at not rendering those nodes in a way that prevent them from parasiting the computation of xpaths. opw-4981741 Forward-Port-Of: odoo/enterprise#92751 Forward-Port-Of: odoo/enterprise#92602
The French VAT report configuration has been updated to use the 2025 version required by current validation tests. This keeps VAT report submissions aligned with the latest accepted reporting year without changing the report export content.
Original PR description
The version for 2025 is out. As far as we can see, the changes don't concern the export of VAT report. So we just change the value to 2025. (2024 non blocking for prod is still accepted in 2025 but it fails for the server test). task-4617663 Forward-Port-Of: odoo/enterprise#92676 Forward-Port-Of: odoo/enterprise#92542
Fixes an issue where closing a POS register could fail if an invoice selected for settlement was paid elsewhere at the same time. This helps cashiers close sessions reliably and avoids disruption from already-paid invoices.
Original PR description
This error occurs when attempting to settle an invoice in POS that has already been paid. Steps to reproduce: --- - Install `pos_settle_due` module - Create a new Invoice with Customer(eg: Billy Fox)…
This error occurs when attempting to settle an invoice in POS that has already been paid. Steps to reproduce: --- - Install `pos_settle_due` module - Create a new Invoice with Customer(eg: Billy Fox) and Confirm - Open `Bakery Shop` > Add Product > Select Customer(eg: Billy Fox) and `Settle Invoices` > Select the Invoice you created > Make payment - In another Tab, `Pay` the Invoice you created - Close Register Traceback: --- `TypeError: 'bool' object is not subscriptable` At [1], this error occurs because `inv.invoice_outstanding_credits_debits_widget` is set to `False`. This happens because, at [2], the condition `move.payment_state` evaluates to True, allowing the code to continue execution. As a result, `inv.invoice_outstanding_credits_debits_widget` remains False. [1]- https://github.com/odoo/enterprise/blob/95567f106fba3ed6d334ce6ad523378239865204/pos_settle_due/models/pos_session.py#L18-L21 [2]- https://github.com/odoo/odoo/blob/e61d55c6bf8afaef37d813a702438cb96baeddb1/addons/account/models/account_move.py#L1324-L1327 sentry-6628404004
Currently an exception is generated due to the variables translated into the `Spanish (Latin America)` language. `KeyError: 'tipo'` This commit fixes the issue by using the original variable name instead of translated terms. sentry-6046430921 Forward-Port-Of: odoo/enterprise#92716
Original PR description
Currently an exception is generated due to the variables translated into the `Spanish (Latin America)` language. `KeyError: 'tipo'` This commit fixes the issue by using the original variable name instead of translated terms. sentry-6046430921 Forward-Port-Of: odoo/enterprise#92716
The link to Six payment setup documentation in Point of Sale settings has been corrected. This helps users access the right instructions when configuring payment providers, reducing confusion during setup.
Original PR description
Before this commit: ------------------- - The Six documentation link in the POS payment provider configuration was broken, leading to a poor user experience. After this commit: ------------------ - The Six documentation link has been corrected to ensure proper access to setup instructions. Task: 4797691 Forward-Port-Of: odoo/enterprise#91974
21 changes
Resolved issues and error corrections
This fixes instability in an automated test for public mail channels by making sure repeated test runs target the correct message. It helps reduce false build failures and improves confidence in the mail feature testing process.
Original PR description
This tour had many race conditions in the past and keeps having them. Some of them are actually due to the fact the tour is ran twice, but the selectors completely ignore this fact, leading to unexpected results. The message body is now updated before the second run to avoid confusion and the selectors are adapted to always target the message of the current run. Also remove the reload for emojis as they are showing immediately after being added. Also remove the useless comments that makes the test twice as long to read and to understand. https://runbot.odoo.com/odoo/runbot.build.error/230901
This fixes an issue where some sales orders with tracked products could not be properly brought into the Point of Sale when stock movements had not yet been created. Staff can now settle those orders in PoS more reliably, avoiding checkout interruptions for affected sales.
Original PR description
Before this commit, if an order was not confirmed and stock moves were not created, if products are tracked, the order lines would not be added to the PoS. opw-5026892 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents zero-priced lines on credit notes from being exported with a misleading negative zero price. It helps ensure UBL electronic credit notes, including Romanian CIUS-RO files, pass validation and can be sent successfully.
Original PR description
**Issue description:** When creating a UBL credit note, a line with a zero unit price and a negative quantity would have its gross unit price calculated as `0.0 / <negative_qty>`. This results in a negative zero `-0.0`, which is considered an invalid negative net price by some EDI validators (e.g., Romanian CIUS-RO), causing the file to be rejected. **Steps to reproduce:** 1. Create a Sales Order with two lines: one product for €100 and a second (e.g., a delivery service) for €0. 2. Create and pay a downpayment invoice for a fixed amount greater than the order total, e.g., €200. 3. Go back to the Sales Order and create a "Regular Invoice". This will generate a credit note with negative quantities on the lines. 4. Ensure the journal is configured for UBL export (e.g., CIUS-RO). 5. Post, then send the credit note and inspect the generated XML file. The zero-priced line will show `cbc:PriceAmount = '-0.0'`. opw-5000314 Forward-Port-Of: odoo/odoo#223074
This fixes the setup of two Spanish 0% sales taxes so they are correctly treated as exempt with the right legal exemption reasons. It also removes older duplicate exempt tax entries that are no longer needed, helping Spanish invoices and tax reports use the correct classification.
Original PR description
Currently 2 sales taxes are misconfigured.
They both should be marked as 'exento' ("Exento") instead of 'no_sujeto_loc' ("No Sujeto por reglas de Localization")
- "0% EU G"; with "Exempt Reason" E5 / "Art. 25"
- "0% EX G"; with "Exempt Reason" E2 / "Art. 21"
This commit updated those taxes
Due to this the following sales taxes become obsolete.
- "VAT Exempt (Art. 21)"
- "VAT Exempt (Art. 25)"
They are deleted in this commit.
opw-4850585
Forward-Port-Of: odoo/odoo#223603Timesheet entries are now correctly connected to down payment invoices created from sales orders. This makes invoice grouping and reporting more accurate for services billed from tracked time.
Original PR description
To reproduce: ============= - create service product based on timesheet that creates project/task - create sale order with this product - confirm sale order - record couple hours on the task - go back to sale order and create downpayment invoice - go back to timesheet and group by invoice - you will see that the timesheet is not linked to the downpayment invoice Problem: ======== - before this commit, we only link timesheet to regular invoices, not to downpayment invoices. - the `_link_timesheets_to_invoice` method fetches timesheets from the SOL linked to the created invoice, which is in case of downpayment a different SOL than the one linked to the timesheet. Solution: ========= we call `_link_timesheets_to_invoice` in case of downpayment invoices and we also ensure that the method fetches the timesheets from all SOLs on the whole sale order. opw-4850089 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes how Odoo matches debit and credit lines during reconciliation when multiple partners are involved. Matching lines by partner produces cleaner, more accurate reconciliation details behind the scenes and avoids confusing residual amounts.
Original PR description
**Steps to reproduce:** - Install Accounting - Go to "Accounting / Accounting / Journals / Journal Entries" - Create the following MISC entries in this order: 1) | Account | Partner | Debit | Credit…
**Steps to reproduce:** - Install Accounting - Go to "Accounting / Accounting / Journals / Journal Entries" - Create the following MISC entries in this order: 1) | Account | Partner | Debit | Credit | | ------------------ | --------- | ----- | ------ | | Receivable Account | Partner A | 1000 | 0 | | Account X | Partner A | 0 | 1000 | 2) | Account | Partner | Debit | Credit | | ------------------ | --------- | ----- | ------ | | Receivable Account | Partner B | 1001 | 0 | | Account X | Partner B | 0 | 1001 | 3) | Account | Partner | Debit | Credit | | ------------------ | --------- | ----- | ------ | | Receivable Account | Partner C | 1002 | 0 | | Account X | Partner C | 0 | 1002 | 4) | Account | Partner | Debit | Credit | | ------------------ | --------- | ----- | ------ | | Receivable Account | Partner C | 0 | 1002 | | Account X | Partner C | 1002 | 0 | 5) | Account | Partner | Debit | Credit | | ------------------ | --------- | ----- | ------ | | Receivable Account | Partner B | 0 | 1001 | | Account X | Partner B | 1001 | 0 | 6) | Account | Partner | Debit | Credit | | ------------------ | --------- | ----- | ------ | | Receivable Account | Partner A | 0 | 1000 | | Account X | Partner A | 1000 | 0 | - Go to "Accounting / Accounting / Journals / Journal Items" - Select the 6 created lines linked to the Receivable Account - Reconcile them **Issue:** The 6 lines are fully reconciled, but when checking the amounts of the partial reconcile records (not visible in the UI), the debit and credit amounts are matched by their actual order. So, the first debit line of 1000 is matched with the first credit line of 1002, which results in a residual credit of 2 that is then matched with the second debit line of 1001, which leads to a residual debit of 999 and so on. This generates weird amounts in the partial reconcile records. **Solution:** In the case there are several lines with different partners, the lines can be sorted by partner to try to match the lines with the same partner together. opw-449356 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Message action buttons on log notes written by the current user now appear in the expected mirrored position next to the date. This makes the mail thread layout more consistent and easier to use.
Original PR description
**Purpose of this PR:** Fix the position of message actions on log notes authored by the current user. Messages authored by self appear on the right side of the thread. This PR mirrors the action placement logic so that, like messages from others (which show actions to the right of the date), self-authored messages show actions to the left of the date. Before: <img width="392" height="638" alt="image" src="https://github.com/user-attachments/assets/8b66c98f-3e00-47c8-abf3-ee62169ed499" /> After: <img width="392" height="638" alt="image" src="https://github.com/user-attachments/assets/d1a425da-fb0c-4793-a080-735286bc2bb9" /> task-[4689357](https://www.odoo.com/odoo/project/1519/tasks/4689357)
Partial payment links for invoices now correctly request only the partial amount selected, rather than the full invoice total. This prevents customers from being asked to overpay when using a payment link.
Original PR description
Versions -------- - 18.0+ Steps ----- 1. Have an unpaid invoice; 2. generate a partial payment link; 3. open partial payment link; 4. click the Pay button. Issue ----- The invoice's full amount gets requested. Cause ----- Commit 5697493e0091 added `amount` as a named keyword parameter in an `_invoice_get_page_view_values` override, but failed to pass it along to the call to `super`. As the base method no longer receives an `amount` parameter, it defaults to the invoice total. Solution -------- Pass `amount` to the `super` call. opw-5013044
This update refreshes the spreadsheet component and fixes several issues affecting exports and data interactions. Users should see more reliable chart exports, safer table row handling, and better pivot behavior when undoing deletions.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/bc6051c9e [REL] 18.0.41 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/bc6051c9e [REL] 18.0.41 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/e95196363 [FIX] xlsx: correctly export aggregated charts [Task: 4954426](https://www.odoo.com/odoo/2328/tasks/4954426) https://github.com/odoo/o-spreadsheet/commit/f55d9f356 [FIX] selection: prevent partial move of table rows with headers [Task: 4862731](https://www.odoo.com/odoo/2328/tasks/4862731) https://github.com/odoo/o-spreadsheet/commit/94acb2343 [FIX] pivot: reload when delete is undone [Task: 5001153](https://www.odoo.com/odoo/2328/tasks/5001153) Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya <rmbh@odoo.com> Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com>
Point of Sale order searches by tracking number now use the correct session information. This helps staff find the right orders reliably, including orders from different sales sessions.
Original PR description
Before this commit, searching for an order by `tracking_number` matched against the `pos_reference` field. However, the `tracking_number` is constructed using the `session_id`, not the `pos_reference`. This mismatch could cause orders from other sessions to be not found, as the session id related part of the `tracking_number` may not align with the `pos_reference`. This commit fixes the issue by adjusting the search logic to match against the `session_id` instead, ensuring accurate results when looking up orders by `tracking_number`. opw-4934482 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Fixed an issue where employee organization charts could behave incorrectly when an employee had more than five managers. The chart now refreshes before the employee record is saved, giving users a more accurate view while editing employee details.
Original PR description
A buggy behavior when there are more than 5 managers was fixed. The org chart now updates before the employee record is saved. task-4609465 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#223453 Forward-Port-Of: odoo/odoo#216940
Fixes an issue where removing text color or formatting in the HTML editor could cause the editor to freeze in certain cases. This improves editing reliability, especially when formatting is applied to larger text blocks or protected content is selected.
Original PR description
**Current behavior before PR:** - When color was applied to a block-level element, attempting to remove it caused the `removeFormat` method to enter an infinite loop. - Removing formatting on a contenteditable false element infinite loop when removing format. **Desired behavior after PR is merged:** - Now, the color is correctly removed from the selected text, even when it is applied to a block-level element. - Now, the toolbar no longer opens when the selected element is contenteditable false task: 4575459
Product label reports now pass the selected currency in a safer way when calculating prices. This helps prevent incorrect prices from appearing on printed labels when templates include currency-specific pricing.
Original PR description
Description of the issue/feature this PR addresses: In product label reports, calling _get_product_price with positional arguments may lead to incorrect parameter binding (e.g. currency_id being interpreted as uom). This can cause wrong prices to be displayed in labels in some cases. Current behavior before PR: Some label templates pass currency as a positional argument. This may result in wrong prices being shown depending on argument order. Desired behavior after PR is merged: Label templates always pass currency as a keyword argument, ensuring correct price computation and preventing mismatches. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr My CLA signature is being added in this PR: https://github.com/odoo/odoo/pull/223312
This fix restores an optimization that avoids unnecessary reading of full image data when only file size information is needed. It improves performance in image-heavy views such as product kanban, especially for systems using slower external storage.
Original PR description
Since 7744886d6141ca7971d91807d0444c707e10fdf8, reading binary field with bin_size=True still reads the ir.attachment datas field, which is relatively slow with some storage backends. In the products kanban view this can easily add 1 sec to web_search_read, if there is a 10ms latency when reading images. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes internal email-related tests so they pass consistently when an optional file detection library is present. It helps keep quality checks reliable across environments and reduces false test failures during maintenance.
Original PR description
Those tests are failing when python-magic is installed. Since 26f9c82b99 Odoo > saas-18.4 has this lib as a requirement and comes with appropriate fixes. This commit adapts some test from 17.0 up to saas-18.4 to also work when the python-magic lib is installed. Forward-Port-Of: odoo/odoo#223609
Payment links generated from invoices now correctly apply the custom amount entered by the user. This prevents customers from seeing or paying an unexpected amount when opening the link.
Original PR description
Steps to reproduce: 1. Create an invoice with an amount. 2. Post the invoice. 3. Generate a payment link with a custom amount. 4. Open the link. Issue: The generated link did not respect the amount…
Steps to reproduce: 1. Create an invoice with an amount. 2. Post the invoice. 3. Generate a payment link with a custom amount. 4. Open the link. Issue: The generated link did not respect the amount provided. Cause: In `account`, the method `_invoice_get_page_view_values` retrieves `amount` from `kwargs`. However, in `account_payment`, the overridden `_invoice_get_page_view_values` was incorrectly declaring `amount` as a method parameter instead of leaving it in `kwargs`. As a result, it was not passed to `super()`. This caused the amount from the link to be ignored. Solution: Remove `amount` from the method parameters, keep it inside `kwargs`, and then clean it up in `_get_common_page_view_values` to avoid multiple arguments error when retrieving the payment providers. Note: This issue was found while preparing the Pull Request [#218243](https://github.com/odoo/odoo/pull/218243). --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an editor issue where a line break could disappear after users pressed Shift+Enter and then Enter at the end of a paragraph. The change keeps the intended spacing visible, helping edited content match what users expect.
Original PR description
Problem: When at the end of a paragraph, pressing SHIFT+ENTER followed by ENTER creates a new paragraph, but the previous one loses its last line break. Cause: When splitting an element, the `<br>` at the selection point is moved to the newly created split element. However, to render an empty line visibly, two `<br>` elements are needed. Moving the existing `<br>` makes the last line break in the original paragraph invisible. Solution: In this special case, instead of moving the `<br>` at the selection point, insert a new `<br>` in the new element, preserving the visual line break in the original paragraph. Steps to reproduce: - Add a paragraph - Type some text, then press SHIFT+ENTER - Press ENTER to create a new paragraph -> The last line break in the first paragraph is lost opw-4987922 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221869
This fixes an accounting issue where switching an invoice from a foreign currency to the company currency and back before saving could incorrectly apply exchange rates to journal item amounts. Businesses can now rely on invoice line balances remaining accurate when users adjust currency selections during invoice entry.
Original PR description
Steps to reproduce: - Enable a foreign currency with rate - Create an invoice in foreign currency - Switch to company currency, then back to foreign currency before saving - Check journal items values Issue: Amount currency and balance have been affected by the currency rate even if the original currency was restored before saving opw-4864994
This fix ensures copied databases using the Greek EDI module are neutralized so they do not accidentally contact live external services. It helps support teams investigate issues on database duplicates without risking real customer or production interactions.
Original PR description
This commit adds the missing neutralization necessary for the l10n_gr_edi module introduced in [1] The purpose of the standard neutralization framework is to allow us to create database copies that will not interact with external systems in ways that could impact the production database (or if it is not possible to prevent the interactions, make sure that they are benign or won't result in actual changes), or impact the customers of the operator of the production database. This is mainly useful to allow safe support investigation on database duplicates. [1] odoo#203428
This fixes the listed external dependency for the LDAP authentication module. It prevents unnecessary warning messages during installation and reduces noise in nightly build checks.
Original PR description
The wrong package name leads to a warning at install time making unnecessary noise in nighlty builds.
This fixes Turkish e-Dispatch XML generation so the delivery customer is taken from the main commercial partner, while the delivery address remains the actual delivery contact. It also uses the appropriate customs ZIP for non-Turkish customers and hides XML generation when no delivery address is available, helping avoid incorrect or invalid dispatch documents.
Original PR description
Behaviour before this commit: - Previously, the picking partner was used for sending both the Delivery Customer and delivery address in the XML. - Secondly, ZIP was used in Delivery Customer regardless of the country of the partner (Turkish or Non-Turkish) Desired behaviour after this commit: - After this commit, the commercial partner of the picking partner will be used for sending the Delivery Customer data and picking partner itself will be used for sending the Delivery Address in the XML. - Additionally, if the commercial partner is non turkish, customs ZIP will be used in the Delivery Customer in the XML. - If the delivery is validated without giving Delivery Address, then the 'Generate e-Dispatch (XML)' button will be hidden. TaskID:4918748 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#218096