Daily updates from Odoo
Thursday, August 21, 2025
51 changes · saas-18.4
Enhancements to existing features
Saudi Arabia POS receipts now support the required ZATCA Phase 2 QR code when applicable. If a QR code cannot be verified or the document has not been submitted, the receipt or invoice is clearly marked as not a legal document to help avoid compliance misunderstandings.
Original PR description
Adds phase 2 QR code on POS receipts and shows it as a non-legal document if we are unable to verify the QR code on invoices and POS receipts. This change is done to accommodate for ZATCA compliance in Saudi Arabia (ZATCA) task-4646326 Description of the issue/feature this PR addresses: Adds phase 2 ZATCA QR code and hides unverified QR codes Current behavior before PR: Always shows Phase 1 ZATCA QR Code Desired behaviour after PR is merged: Showing ZATCA phase 2 QR code when required and hiding un-submitted QR Codes, adds text of "Not a Legal Document" to unsubmitted docs --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220293 Forward-Port-Of: odoo/odoo#208510
Stock pickings with many serial-numbered items are now processed more efficiently during reservation and validation. This reduces timeouts and significantly improves performance for large warehouse operations.
Original PR description
### Description: When using serial numbers, pickings with many move lines can cause performance issues during validation. This is due to `_update_reserved_quantity` updating quantities and creating move lines individually. By moving the creation outside `_update_reserved_quantity`, we can batch create move lines per move, significantly improving performances. ### Benchmark: | N° of mls | Before | After | |-----------|---------|-------| | 500 | 1:37 | 1:34 | | 15000 | Timeout | 3:30 | | 30000 | Timeout | 4:29 | ### Reference: opw-4889581 Forward-Port-Of: odoo/odoo#223420 Forward-Port-Of: odoo/odoo#219471
The Point of Sale screen now displays the standard Odoo favicon in the browser tab. This makes the POS interface easier to recognize and keeps it visually consistent with the rest of Odoo.
Original PR description
Before this commit: ==================== The POS UI did not display a favicon in the browser tab. After this commit: ================== The standard Odoo Point of Sale favicon is now displayed in the browser tab for the POS UI, consistent with the backend interface. Task-4978320 Forward-Port-Of: odoo/odoo#223528
This update adds automated checks for the Point of Sale loyalty features, including loyalty cards, rewards, order handling, payment, and related screens. These tests help reduce the risk of regressions in gift cards, loyalty rewards, and customer-facing checkout flows during future updates.
Original PR description
In this commit: ======================= - Added HOOT tests for the `pos_loyalty` module. - Included tests for main models like `loyalty.card` and patched models: `pos.order` and `pos.order.line`. - Added tests for popups and screens related to loyalty features. task - 4945628 Forward-Port-Of: odoo/odoo#221182
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)
Miscellaneous changes
Render a template using record that the current user as no access to. While rendering the template QWeb fail with a AccessError exception, that exception is wrapped inside a QWebException and catch by `ir.http._handle_error`. In `http_routing` a custom template is rendered for every common errors, including AccessError. Fine-tuning of 2ef1ae4, unwrapping the QWebException must be done independently of the other `isinstance`s. Description of the issue/feature this PR addresses: Current b
Original PR description
Render a template using record that the current user as no access to. While rendering the template QWeb fail with a AccessError exception, that exception is wrapped inside a QWebException and catch by `ir.http._handle_error`. In `http_routing` a custom template is rendered for every common errors, including AccessError. Fine-tuning of 2ef1ae4, unwrapping the QWebException must be done independently of the other `isinstance`s. 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#214378