Daily updates from Odoo
Monday, July 28, 2025
47 changes · saas-18.4
Resolved issues and error corrections
The website editor now shows saved carousel transition speeds using the correct unit when reopened. This prevents confusing values such as 1000 seconds appearing instead of 1 second, helping users confidently edit saved page settings.
Original PR description
This commit fixes a bug where the value of a BuilderNumberInput would not load with the assigned unit of measure. Steps to reproduce - add a carousel snippet - edit Transition/Speed to be 1s - save - the speed is correctly saved as 1000ms - reopen editor and check the carousel snippet again => the speed is 1000s instead of 1s
When a server action raises a warning, users will now see a clear, friendly dialog instead of a technical traceback. This makes the error easier to understand and helps users know what happened without needing developer support.
Original PR description
### Description of the issue/feature this PR addresses: https://github.com/odoo/odoo/commit/ef4c1350df10c186efec79b1414306e325707549 introduced a new exception `ServerActionWithWarningsError`:…
### Description of the issue/feature this PR addresses: https://github.com/odoo/odoo/commit/ef4c1350df10c186efec79b1414306e325707549 introduced a new exception `ServerActionWithWarningsError`: https://github.com/odoo/odoo/blob/851c46923332aa13c56fbce3a5ed3c5d37a70c92/odoo/addons/base/models/ir_actions.py#L486-L488 This was not registered as an error_dialog. This led to the frontend displaying the entire traceback instead of an error dialog similar to `UserError` when a `ServerActionWithWarningsError` is raised. This commit fixes it by correctly registering the error in `error_dialog` registry category so a more user friendly dialog is displayed with the error contents. Thanks @brboi for helping with the fix ### Current behavior before PR: A traceback error is thrown when a `ServerActionWithWarningsError` is raised. Example: <img width="1896" height="904" alt="image" src="https://github.com/user-attachments/assets/0bfee329-e6c5-4652-a2ac-d41b763e2bdb" /> Video reproducing it: https://drive.google.com/file/d/1C_aE0d_9bP27f388dB1NJLeWHBpsM7AW/view?usp=drive_link (credits: gavb-odoo) ### Desired behavior after PR is merged: An error dialog similar to UserError which is easier to understand is displayed <img width="1906" height="799" alt="image" src="https://github.com/user-attachments/assets/d57c5cab-14f2-4f39-9f0c-b8099e8b0089" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr opw-4885670 Forward-Port-Of: odoo/odoo#219977
Accounting journal sequence prefixes that include Greek letters can now be used without causing invoice confirmation errors. This prevents disruptions for businesses using European communication standards and localized document numbering.
Original PR description
**Issue** Using a Greek letter in the journal's sequence prefix causes a traceback error when confirming an invoice **Steps to Reproduce** 1. Install the Accounting module 2. Navigate to Accounting >…
**Issue** Using a Greek letter in the journal's sequence prefix causes a traceback error when confirming an invoice **Steps to Reproduce** 1. Install the Accounting module 2. Navigate to Accounting > Configuration > Journals 3. Open the Sales journal 4. Under the Advanced Settings tab, set the communication standard to "European" 5. Set the sequence prefix to include Greek letters (e.g., "TΠY") 6. Create and confirm a new invoice 7. Observe the traceback error **Root Cause** The prefix is used in calculating the `check_digits` via a base-36 to base-10 conversion. This conversion fails for Greek characters, which are not valid in base-36, leading to an exception **Fix** Greek letters in the prefix are transliterated to their Latin equivalents before performing the checksum calculation, ensuring compatibility with the base-36 conversion logic Opw-4813790 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212169
Newsletter signup forms now work correctly when Cloudflare Turnstile is enabled on a website. This prevents page errors and ensures visitors can subscribe without the anti-spam protection breaking the form.
Original PR description
Forward-port of: 10550b3c7ad607576dc48eeba4d601184a2f90d4 Scenario: - configure turnstile in setting - install website_mass_mailing - drop the newsletter widget in any page Result: In saas-18.3 and…
Forward-port of: 10550b3c7ad607576dc48eeba4d601184a2f90d4 Scenario: - configure turnstile in setting - install website_mass_mailing - drop the newsletter widget in any page Result: In saas-18.3 and over, we get this traceback error and the turnstile code is not working: TypeError: Cannot destructure property 'turnStile' of 'odoo.loader.modules.get(...)' as it is undefined. Cause: - On January 2025, in saas-18.2 and over, 421c5e5c4ee6271bb1085b43505cc1c28b2cb574 and 22e777c046521f3f89b62caa5876680beb7f5aba rewrote turnstile - On April 2025, in 17.0 up to master, c48e74f57569a1670fee65d65625488846513d79 uses addTurnstile and addSpinner method and the old file - On April 2025, in saas-18.2 and only saas-18.2, 10550b3c7ad607576dc48eeba4d601184a2f90d4 fixes turnstile for the interaction rewrite So turnstile still cause an error with the newsletter widget in saas-18.3 up to master. Fix: forward-port the saas-18.2 10550b3c7ad607576dc48eeba4d601184a2f90d4 fix in following versions. opw-4925771 opw-4933957 Forward-Port-Of: odoo/odoo#219255
Foreign customers without a state are now correctly treated as overseas customers when creating Indian invoices and sales orders. This prevents them from being assigned the company’s Indian state, helping ensure accurate GST tax treatment and compliance.
Original PR description
Before this PR: When creating invoices/orders for foreign customers that don't have states defined in their country, both **account.move** and **sale.order** models would incorrectly assign the…
Before this PR: When creating invoices/orders for foreign customers that don't have states defined in their country, both **account.move** and **sale.order** models would incorrectly assign the company's Indian state as the place of supply. This happened because the fallback logic would always use **move.company_id.state_id** without checking if the partner was actually Indian. As a result, foreign customers would be treated as Indian customers in GST calculations, leading to incorrect tax treatment and compliance issues. After this PR: Both models now correctly identify foreign customers by checking the partner's country first, before falling back to state-based logic. Foreign customers without states are now properly assigned the foreign state reference (**l10n_in.state_in_oc**) instead of the Indian company's state. This ensures accurate GST treatment where foreign customers are correctly identified as overseas transactions. Task-4900697 Forward-Port-Of: odoo/odoo#220717 Forward-Port-Of: odoo/odoo#216220
The stock serial number generation wizard now only shows unit-of-measure information when that option is enabled. This prevents an error for users creating serial or lot numbers when unit-of-measure settings are not active.
Original PR description
Previous to this commit, the generating serial wizard would try to load the product uom in case that the product was lot-tracked, even if the UoM group was not activated. This led to an error when opening the wizard without activating the group. This commit makes sure the group is activated before showing that field. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Recruitment users can now refuse a newly created applicant even if no applicant name has been entered. This prevents an error from interrupting the refusal workflow and keeps application management running smoothly.
Original PR description
Currently, an error occurs when refusing an applicant. Steps to Reproduce: - Install the `hr_recruitment` module. - Go to `Recruitment` > `Applications` > `All Applications`. - Click `New`, then click `Refuse`. `TypeError: sequence item 0: expected str instance, bool found` This error occurs when refusing an applicant who does not have an applicant name. It tries to access partner_name or display_name, but since it is False, the join raise the error[1]. This commit ensures that if the partner name is present, it is added; otherwise, an empty string is added. [1]- https://github.com/odoo/odoo/blob/ca90fd17b2c50651d698e6e0e3065ba978b06d01/addons/hr_recruitment/wizard/applicant_refuse_reason.py#L52 sentry-6740479737 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The recruitment app now disables the copy email button until a new tracker record has been saved. This prevents users from encountering an error when creating recruitment source trackers and improves reliability during hiring setup.
Original PR description
Currently an error occurs when user try to copy email on a newly created record. Steps to reproduce: - Install `hr_recruitment`with demo data. - Add a random Alias Domain (`Settings > Technical >…
Currently an error occurs when user try to copy email on a newly created record. Steps to reproduce: - Install `hr_recruitment`with demo data. - Add a random Alias Domain (`Settings > Technical > Email > Alias Domains`). - Open `hr_recruitment` and on 'Experienced Developer', open the option dropdown (meatball) and click on 'Trackers'. - Now click on `New` and click the copy email button (without saving). Error: `ValueError: Expected singleton: hr.recruitment.source()` Cause: - Error occurs due to a recent change in this [commit](https://github.com/odoo/odoo/pull/198995/commits/f8cf1b70e28166c100558d2bf5cbc6d8d3513cc6) that introduced the new copy widget - The error occurs because the function was called even before the record was saved. This caused the function call to be made with empty recordset that causes the singleton error at line [1]. Solution: - Made the copy button disabled until record is saved. [1]: https://github.com/odoo/odoo/blob/679d99b8bd233a1046e3219ddb3e23e8465f6107/addons/hr_recruitment/models/hr_recruitment_source.py#L49 sentry-6753165441 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Website charts now automatically assign a visible color when a new dataset column is added. This restores the expected editing behavior so users do not see transparent or missing chart colors after adding data.
Original PR description
Before [the refactoring of the html_builder], [0,0] cell was selected by default and the selected cell was kept when we switched the chart type. Now, this was lost in the refactoring. [the refactoring of the html_builder]: https://github.com/odoo/odoo/commit/9fe45e2b7ddb Related to task-4367641
Website editors can now move the last block from one table of content into another without triggering an error. This prevents an editing interruption and makes page building more reliable.
Original PR description
Since [1], a traceback appears when we drag the last block of a table of content into another one. Drag and drop two tables of content on the website page One by one, drag and drop the blocks from the second table to the first one traceback for the last one... This commit resolves the issue [1]:https://github.com/odoo/odoo/commit/6cd9606e285741b59042b9674bf6682273c43a69 task-4144022 Forward-Port-Of: odoo/odoo#180039
This fixes an issue where the same point of sale order could be sent to preparation printers from multiple devices, causing duplicate tickets. The system now checks whether an order was already sent and synchronizes updates after printing, reducing confusion for staff and avoiding repeated preparation work.
Original PR description
Before this change, when a device sent an order in preparation via the ticket printer, this could result in the same order being printed by multiple devices, as the order was not synchronized after it was sent. The error is a bit tricky, because if the user had installed a preparation screen, the order was sent to the preparation screen via syncAllOrders. In this case, the order was correctly synchronized and the other devices were informed of the changes. This commit adds two things. - We check the server before sending the order to preparation to make sure it has not already been sent. - Even when the user does not have a preparation display, the order will be synchronized after being sent to a printer. Forward-Port-Of: odoo/odoo#220716 Forward-Port-Of: odoo/odoo#220535
This fixes an issue where some point-of-sale orders could not be invoiced after session closing when cash rounding was enabled only for cash payments and the order used mixed payment methods. Businesses can now invoice these posted POS orders without accounting imbalance errors.
Original PR description
Before this commit, an imbalance entry error occurred when invoicing a posted order under specific conditions. This issue arose when cash rounding was enabled only for the cash payment method, but the order was paid using both bank and cash. For example, if an order had a total of 12.91, and was partially paid with a bank transfer of 15.59, resulting in a cash return of -2.70, the session could be closed. However, attempting to invoice this order after closing the session would fail due to the imbalance. opw-4912399 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#218430
This update removes an unnecessary database index for project collaborators because an existing uniqueness rule already supports the same lookup need. It reduces redundant database maintenance with no expected change to user-facing project behavior.
Original PR description
There is a unique constraint `_unique_collaborator`, whos first key is `project_id`, which will cover the necessity for an explicit index on `project_id` --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220595
The Calendar app's “Attending?” filter now correctly finds events based on the current user's attendance status, such as declined invitations. This prevents empty search results and helps users reliably manage their calendar events.
Original PR description
The filter on an event's "Attending?" status was not working correctly. When filtering, the search would always return an empty result set because the underlying search implementation was logically flawed. It incorrectly compared calendar.event IDs with calendar.attendee data, which could never match. This commit corrects the `_search_current_attendee` method to properly query the `calendar.attendee` model. It now finds the intersection of attendees that both belong to the current user and match the filter criteria (e.g., state is 'declined'). It then uses these results to return the correct parent calendar events. A unit test has been added to verify the filter now works as expected. opw-4892386 Forward-Port-Of: odoo/odoo#218878
This fix helps IoT boxes start correctly when connected to older Odoo versions and reduces early connection failures caused by incorrect device time. It also makes certificate downloading more tolerant of slow networks and prevents Wi-Fi update errors when no IP address is available.
Original PR description
This commit fixes the following issues: - The hw_drivers and hw_posbox_homepage folders were missing from the sparse checkout, meaning that connected to version prior to 18.4 would prevent Odoo from starting. - As the IoT box can only sync time with the network once it gets an internet connection, some early requests could fail due to it thinking the SSL certificates were invalid. We disable verification of the requests to bypass this. - The request to download the certificate for the IoT box only had a timeout of 5 seconds, sometimes this could not be enough so the timeout has been increased to 10 seconds. - Fix an error when calling the `update_wifi` route, caused by `helpers.get_ip()` now being able to return `None`. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Point of Sale invoices now use the bank account configured on the selected payment method when available, instead of always using the company's default partner bank account. This ensures customers receive invoices with the intended payment details and reduces payment routing mistakes.
Original PR description
When generating an invoice for a PoS order we were never using the bank account set on the payment method, but always the one set on the company partner. Steps to reproduce: ------------------- * Create two bank account A and B * Set the bank account A as the company partner bank account * Set the bank account B on any payment method journal * Open PoS and create a new pos_order * Go to the payment screen and check the invoice button * Pay using the payment method linked to bank account B > Observation: The generated invoice will use bank account A Why the fix: ------------ We first try to use the bank account set on the payment method journal if none is present we fallback on the one set on the company partner. opw-4705497 Forward-Port-Of: odoo/odoo#220256 Forward-Port-Of: odoo/odoo#214523
After users upload or drop documents in Expenses, the upload drop area is now hidden instead of remaining on screen. Users are also taken back to the expense list so they can see the created expenses, even if document recognition fails.
Original PR description
When dropping documents on Expense, the drop zones would stay being displayed. We now stop to display it when a file is uploaded / dropped. task-4942503 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#218812
This fixes an issue where customers who paid online through self-ordering could see the same order again as unpaid after the point-of-sale session was reopened. The self-order data is now synchronized with the server so payment status stays accurate across sessions.
Original PR description
If you paid for an order in self-order mode with an online payment method, then close the session and open a new one. The paid order would appear again in the self-order as not paid. Steps to reproduce: ------------------- * Setup a PoS with self-ordering and online payment method. * Open mobile menu and create a new order. * Add a product and pay for the order. * Close the session and open a new one. * Open mobile menu. > Observation: The order you just paid for appears again. Why the fix: ------------ When reading user data from server we should synchronise them with the indexedDB that still contains the old order that is not paid. Note: ---------- I was not able to come up with a test because the indexedDB is not kept between 2 tours. opw-4819672 Forward-Port-Of: odoo/odoo#219258
This update prevents errors when users replace an image with a caption and then edit that caption. It also avoids confusing editor tooltips appearing over images by keeping nearby content blocks properly formed when captions are added.
Original PR description
**Current behavior before PR:** - Replacing an image that has a caption, then editing the caption and clicking outside it, would result in a traceback. - When a caption was added to an image, the previous sibling block of the image became empty. As a result, the tooltip of that empty block could appear hovering above the image. **Desired behavior after PR is merged:** - A traceback no longer occurs when the image is replaced and the caption is edited before clicking outside. - If the previous sibling block is found to be empty when a caption is added, a `<br>` element is inserted into it. This ensures the block is no longer considered empty, preventing the tooltip from appearing above the image. task: 4876199
This fix lets website editors change or remove text animations even when their cursor is placed inside the animated text without selecting the whole word. It reduces repeated attempts and makes editing animated website content more predictable.
Original PR description
> [VBAL] Toolbar: Add an animation on some text > Try to remove it --> the animation stays on the end of the word, have to repeat x times to get rid of it Since 8c5e3d745b80c61332dbb814e622294d047e2576, it is possible to change an existing highlight when the selection is collapsed and inside it. The same thing is enabled for animated text, which allows to remove the animation options from the sidebar for animated text task-4367641
This update adjusts how background shape options behave in the website builder and adds test coverage for related builder controls. It helps ensure users can configure page backgrounds more reliably when editing website content.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix ensures products with variant options can still be sold in Point of Sale after an attribute line is removed. It prevents valid product combinations from being incorrectly treated as unavailable, reducing sales disruption at checkout and self-ordering points.
Original PR description
Before this commit, removing an attribute line from a product would inadvertently prevent the sale of any combination in the PoS interface. opw-4947529 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#219251
This fixes an issue where the website editor toolbar could leave unnecessary blank space below the page footer, even when the toolbar was hidden. The toolbar now stays correctly positioned outside the page layout, improving page rendering and avoiding confusing extra whitespace.
Original PR description
Description of the issue/feature this PR addresses: - Commit [189a7c96](https://github.com/odoo/odoo/commit/189a7c96e6e26825dc05c0c6466576fe63aa091e#diff-de0d67e89972b45b101a9c4b04f316824314b0d69aba6208528586f1edb4f01cL25-L40) moved scrollbar from `#wrapwrap` element to `<body>`, caused the space below the footer visible for the floating toolbar. Current behavior before PR: - Space below the footer was always visible, even when the toolbar was hidden. Desired behavior after PR is merged: - `top: 0;` is applied on `.oe-toolbar` to ensure it stays out of the layout flow. - This prevents unnecessary layout space and ensures correct toolbar positioning. task-4652202 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#217270
This update makes an automated website builder test more reliable by ensuring test timing is fully controlled during execution. It reduces random test failures caused by high system load, helping maintain smoother development and release validation.
Original PR description
Hoot provides us with "time control" features such as "advanceTime", which is useful for testing scenarios where we want to wait for some events to happen (such as a debounced function), but without…
Hoot provides us with "time control" features such as "advanceTime", which is useful for testing scenarios where we want to wait for some events to happen (such as a debounced function), but without actually waiting too much. The way it works is that hoot simply override setTimeout and related functions to keep track of all handlers and their scheduled time. However, this is not enough, as the real setTimeout is still by default called, so it can happen in some tests that when we advance the time by some amount, say 500ms, if the cpu load is very high, then other handlers that are scheduled AFTER the 500ms may have run as well. To fix this, we can use the freezeTime feature from hoot. It simply give the full control to hoot, and do not call the real setTimeout function. 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
Purchase reports now calculate product volume correctly when orders use pack-based units of measure. This ensures reporting reflects the real total volume purchased, improving accuracy for purchasing and inventory analysis.
Original PR description
_______________________________________ ## Short functional explanation of the error When setting the unit of measure as packs, the volume of products aren't computed correctly. ## Reproduction Steps…
_______________________________________ ## Short functional explanation of the error When setting the unit of measure as packs, the volume of products aren't computed correctly. ## Reproduction Steps 1. Go to settings. In the purchase section, click on Units of Measure & Packagings. 2. Click on new, set the unit name as "pack of 4", and set the quantity of the reference unit at 4. Set the reference unit as "units." 3. Go to products and create a test product. 4. In the inventory tab, set the volume greater than 0. 5. Go back to purchase and click on new. Add a line containing the test product, a set quantity, and set as unit "pack of 4." 6. Confirm the order, click on receive then validate. 7. Click on the reporting tab, then purchase. Set the measure as volume and click on the bar chart button. Then, click on the blue column and click on the row corresponding to the purchase operation. ### Expected behavior Let's say we set the product volume as 4 m³, and we purchased one pack of 4. The total volume would be (product volume) * (number of products), which would correspond to 4*4 = 16. ### Unexpected behavior Instead of 16, the total volume shows 1. ## Origin of the issue In the code, the volume is obtained with the operation (product volume) / (number of products) _________________________________________ opw-4871100 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#215605
Invoices created from Point of Sale orders now include the order name in the Customer Reference field. This makes it easier for staff to match backend invoices with the original POS transaction and reduces manual lookup work.
Original PR description
## Short functional explanation of the error When selling items in the point of sale module with an invoice, when we check said invoice in the backend, the customer reference field is empty. ##…
## Short functional explanation of the error When selling items in the point of sale module with an invoice, when we check said invoice in the backend, the customer reference field is empty. ## Reproduction Steps 1. Go to Point of sale and open a shop interface. Add a random item to the basket and select a customer. 2. Click on payment, then check Invoice, select a payment method, and Validate. 3. Click on the hamburger menu on the top right and click on Backend. 4. Hover the box of the shop you opened with your mouse. In the top right corner of the box should appear a 3-dot menu. Click on it and click on Sessions. 5. Click on the latest session ID. On the top of the page, click on the "Orders" smart button. 6. Click on the order you just finalized. On the top of the page click on the "Invoice" smart button. 7. Click on "Other info" tab. ### Expected behavior The Customer Reference field should be filled with the name of the order. ### Unexpected behavior The Customer Reference field is left empty. ## Origin of the issue When setting the values for the invoice, the field 'Ref' was absent. opw-4732492 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#218158
This update makes an automated live chat test more reliable by removing an unnecessary step that could randomly fail. It helps ensure browser back-and-forth navigation between live chat sessions and discussions is consistently validated without affecting day-to-day user behavior.
Original PR description
The `test_session_history_navigation_back_and_forth` test sometimes fail. The test ensures we can navigate between the session list view and discuss using the browser history. To do so, the tour first accesses the list view using the command palette. However, command palette sometimes doesn't open. The command palette part of the tour is useless as the view can directly be accessed by passing the correct url to the `start_tour` function. This commit removes the command palette part of the tour thus fixing the issue. fixes runbot-108129 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#220539 Forward-Port-Of: odoo/odoo#220345
Sales orders imported into Point of Sale now keep the tax position set on the original order, even when it differs from the customer's default. This helps ensure accurate taxes and pricing at checkout when fulfilling sales orders through PoS.
Original PR description
When a sales order is imported into the PoS, the tax position does not match if the sales order has a different tax position than the one assigned to the partner. This commit ensures that the tax position will always be the one assigned to the sales order and not that of the partner. taskId: 4963118 Forward-Port-Of: odoo/odoo#220709 Forward-Port-Of: odoo/odoo#219869
The point of sale now handles cases where a register session was deleted from another device while a user is still on the opening screen. Instead of showing an error, the screen refreshes so staff can continue working without disruption.
Original PR description
Steps to reproduce: 1. Open a POS session on two devices. Leave both on the opening control screen. 2. On Device 1: - Click Open the Register. - Then click Close the Register. - Click on Backend ( the session is deleted) 3. On Device 2: - Click Open the Register. - This will result in a MissingError. After this commit, the case where the session has been deleted is handled, and the UI is refreshed to ensure the user can continue working without displaying the exception. Retarget of https://github.com/odoo/odoo/pull/218381 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220310
Reception report PDFs with many products now print cleanly across multiple pages. The change prevents product rows from overlapping with section headers, making large reception reports easier to read and use.
Original PR description
## Short functional explanation of the error When printing a reception report containing a lot of products, the top row of the pages after the first one is overlapped with its corresponding header in…
## Short functional explanation of the error When printing a reception report containing a lot of products, the top row of the pages after the first one is overlapped with its corresponding header in the resulting PDF. ## Reproduction Steps 1. Open the settings. In the inventory section, enable "Reception Report". 2. Create a new quotation and add at least 40 different products. Each product should have at least 1 copy in stock, and the quantity to order must be greater than the quantity we have of this product in stock. 3. Confirm the sales order. 4. Create a new purchase order and add the exact same products you added in the quotation. 5. Confirm the order and click on the "Recept" smart button. 6. Click on the "Allocation" smart button and click on the "Assign all" gray button. 7. Click on print and open the PDF once it finishes downloading. ### Expected behavior Each row (corresponding to the reception of a product) and its corresponding header is printed properly, regardless of how many pages constitute the report. ### Unexpected behavior The PDF has more than one page, and on the top of the second page, the product row is overlapped with the header of its corresponding section. ## Origin of the issue It comes from an issue with WKHtmltopdf itself: https://github.com/wkhtmltopdf/wkhtmltopdf/issues/1524 The report uses the "thead" tag for the headers. However, in some cases, when the header is linked to a table dynamically (with for-each, for example), WebKit ignores or breaks the "Thead" behavior. ## Explanation of the fix I override the default behavior of thead, which repeats the header automatically at each new page, with a new style. Now, the "Thead" special behavior is ignored and treated like ordinary lines. The header isn't shown at each new page anymore, avoiding the overlapping of product rows. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#215398
The keyboard shortcut shown while switching views now stays visible instead of overlapping the active view button. This makes the view switcher clearer and easier to use for users who rely on shortcuts.
Original PR description
Previously when switching views using the hotkey, the hotkey (SHIFT + V) was not properly visible, it was overlapping with the active view button. After this commit the hotkey (SHIFT + V) will be visible and not overlap with the active view. task-4828401 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#217639
Fixes an error that could stop users from sending multiple invoices at once when the invoice email template used custom recipients. This helps accounting teams complete batch invoice sending reliably without manual workarounds.
Original PR description
Currently, an error occurs when sending invoices in bulk. Steps to Reproduce: - Install the `account` module. - Go to `Email Templates` and open `Invoice: Sending`. - In the `Email Configuration`,…
Currently, an error occurs when sending invoices in bulk. Steps to Reproduce: - Install the `account` module. - Go to `Email Templates` and open `Invoice: Sending`. - In the `Email Configuration`, uncheck `Default Recipients` and enter `demo@gmail.com` in the `cc` field. - Go to `Invoices`. - Select multiple invoices and click `Send`. `KeyError: <NewId origin=33>` This error occurs when sending invoices in bulk. As mentioned in commit https://github.com/odoo/odoo/commit/058d324855a6e2fe3df51386aa153d46419766bf, the issue was introduced in commit https://github.com/odoo/odoo/commit/39d1907d77ca9c88431e7e9dc9e8c938c79a2987, where the _compute_alerts method attempts to set an alert in the wizard. However,since this is a computed field, the wizard record has a NewId and calls the method with a transient record [1]. When trying to access record.id, it returns a NewId [2], and later, when this NewId is used as a res_id [3],it raises a KeyError. [1]-https://github.com/odoo/odoo/blob/aff5f006d5b1996ea3ecc67998067cd0e292cf2a/addons/account/wizard/account_move_send_batch_wizard.py#L63 [2]- https://github.com/odoo/odoo/blob/c70bca77d0447b005b3898e1861facc2828475fc/addons/mail/models/mail_thread.py#L2037 [3]- https://github.com/odoo/odoo/blob/c70bca77d0447b005b3898e1861facc2828475fc/addons/mail/models/mail_thread.py#L2084 This commit fixes the above issue by using move_ids._origin, ensuring that the method is always called with real records, and removes the changes from the previous commit https://github.com/odoo/odoo/commit/058d324855a6e2fe3df51386aa153d46419766bf. sentry-6562659542 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#217730
This update allows list views to correctly use settings for creating, editing, and deleting groups. It prevents errors when those options are configured, improving reliability for affected views without changing user workflows.
Original PR description
Forgot to add the attributes `group_create`, `group_edit`, and `group_delete` in the list `rng`, which was causing an
error when they are used.
In this commit added attributes.
https://github.com/odoo/odoo/commit/0c18c0ee29458ed4724dc4337d9f6a060d09165f
https://github.com/odoo/odoo/commit/224d592ca3093b0a79c5866a3845ea171252d4b4
task-4489162The self-ordering page now hides product categories when they only contain special internal products that customers cannot order. This prevents restaurants from showing confusing empty categories, improving the ordering experience for guests.
Original PR description
Steps to reproduce: - Install the pos_black_box_be module. - Configure a Belgian restaurant and enable self-ordering. - Open the self-ordering page. - The category 'Fiscal category' is displayed even though it does not contain any products. This commit ensures that categories containing only special products (which are not displayed) will no longer appear on the self-ordering page. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220419 Forward-Port-Of: odoo/odoo#217642
Fixes an issue where an employee’s current work location could show as “unspecified” after changing today’s work location before saving. The presence tooltip now reflects the selected daily work location, reducing confusion for HR users and managers.
Original PR description
Step to reproduce:
------------------
* Go on Employees
* Click on one Employee
* Change a today worklocation "office" (don't save, you need to have the little cloud)
* Hover over hr presence icon
This title will be "unspecified" and not "office".
Reason:
--------
name_work_location_display is computed but doesn't depends of daily worklocation field (monday_worklocation, tuesday...)
Solution:
---------
Depends of these daily worklocation field
task-4948488
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#220359
Forward-Port-Of: odoo/odoo#219222This fix makes an automated check in the Sales Project area wait correctly before selecting a newly created sales order line. It reduces false test failures when the app is installed without demo data, helping keep releases more stable without changing user-facing behavior.
Original PR description
Steps to reproduce the issue: 1- install sale_project without demo data 2- as the test is not deterministic, adding step_delay may help reproducing it The test was failing because the tour was not waiting for the modal to close before trying to click on the created sale order line. so accoding to this line https://github.com/odoo/odoo/blob/18.0/addons/sale_project/models/sale_order_line.py#L63-L63 the New Sale order line have in it a default product which doesnt open a modal build_error-163102 Forward-Port-Of: odoo/odoo#220179
This fix prevents an error from appearing in the restaurant point of sale after a customer completes and pays for a mobile self-order. It improves reliability for restaurants using QR ordering with online payments and preparation printers.
Original PR description
**Configuration:** - Restaurant mode - Self-order mode: "QR + Ordering" - Pay after: "Each order" - Online payment is enabled for self-order **Steps:** - Open the restaurant UI in one tab. - Open the self-order UI in another tab. - Process a self-order with successful online payment. - Switch to the restaurant tab — a server traceback appears. **cause:** - The `notify_synchronisation` method attempted to read POS records with empty record IDs, causing the traceback. **Fix:** - Skip processing records with empty IDs before making server calls. Task-4858105 Forward-Port-Of: odoo/odoo#213500
This update makes an automated website builder test more reliable by ensuring time-based checks run consistently, even under heavy system load. It also removes unused website builder code, reducing maintenance overhead without changing user-facing behavior.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Website editors can no longer accidentally turn off a parallax effect by setting its intensity to zero. The zoom in and zoom out parallax options now behave as labeled, making page design controls more predictable.
Orders sent to preparation from a point-of-sale printer are now checked and synchronized so the same order is not printed multiple times across devices. This reduces duplicate kitchen or preparation tickets and helps staff avoid confusion when handling orders.
Original PR description
*: pos_urban_piper_enhancements Before this change, when a device sent an order in preparation via the ticket printer, this could result in the same order being printed by multiple devices, as the order was not synchronized after it was sent. The error is a bit tricky, because if the user had installed a preparation screen, the order was sent to the preparation screen via syncAllOrders. In this case, the order was correctly synchronized and the other devices were informed of the changes. This commit adds two things. - We check the server before sending the order to preparation to make sure it has not already been sent. - Even when the user does not have a preparation display, the order will be synchronized after being sent to a printer. Forward-Port-Of: odoo/enterprise#91093 Forward-Port-Of: odoo/enterprise#91006
Fixes an issue that prevented users from merging duplicate records in the Data Cleaning app after a recent system change. This restores the merge action so deduplication workflows can continue without an unexpected error.
Original PR description
Currently an error occurs when we try to merge data in deduplication. Steps to replicate: - Go to: Data Cleaning > Configuration > Deduplication. - Open any Deduplication Rules > Deduplicate > select…
Currently an error occurs when we try to merge data in deduplication. Steps to replicate: - Go to: Data Cleaning > Configuration > Deduplication. - Open any Deduplication Rules > Deduplicate > select any record (Make sure at least one record is available in list view). - Click `Merge` on top left. Error: `ValueError: invalid literal for int() with base 10: 'NaN'` The error because of a recent [refactor](https://github.com/odoo/odoo/pull/205486) where the data of a `many2one` will be an object rather than an array. (task-[3547961](https://www.odoo.com/odoo/project/49/tasks/3547961)) In `saas-18.3`, `record.data.group_id` (many2one field) was an array, so the line [1] worked perfectly. But starting in `saas-18.4`, after the change, the value became an object instead of an array. Because of that, `record.data.group_id[0]` is now `undefined`, and `parseInt()` returns NaN, which causes the `int()` on line [2] to throw a `ValueError`. [1] - https://github.com/odoo/enterprise/blob/7d020d73762a17386cae4b68c15a5d59a51fb480/data_cleaning/static/src/views/data_merge_list_view.js#L108 [2] - https://github.com/odoo/enterprise/blob/7d020d73762a17386cae4b68c15a5d59a51fb480/data_cleaning/models/data_merge_group.py#L113 The lines that returns object is [this](https://github.com/odoo/odoo/blob/564348a5172ea98b38c903686c21d007d0e57b48/addons/web/static/src/model/relational_model/utils.js#L517-L523). This commit solves the problem by accessing the ID using `.id` instead. sentry-6739344848
Commission calculations now account for subscription transfer logs during renewals, so sales teams receive credit based on the correct recurring plan rates. The update also prevents duplicate achievement lines when no currency is set and improves commission report performance for larger datasets.
Original PR description
PURPOSE In order to take into account the achievement rate based on recurring plan for MRR log on a renewal, we need to take into account transfer logs SPECIFICATIONS Take into account transfer logs…
PURPOSE
In order to take into account the achievement rate based on recurring plan for MRR log on a renewal, we need to take into account transfer logs
SPECIFICATIONS
Take into account transfer logs in achievements computation. Source should be clear that it's a transfer log of a renewal
Example:
If you have a Monthly sub to 100$/month but the yearly of 1000/year (MRR = 83.33) With a commission plan rewarding: 80% MRR of Monthly and 100% MRR of yearly
If you renew a montlhy into a yearly --> MRR that was 100 become 83,33 so you have a negative MRR so a negative commission and a negative on yearly so with more weight (100% instead of 80)
Current:
Renew in into yearly: 100% of MRR change -16.67 = -$16.67
New monthly 80% of MRR change $100 = $80
Total = 63.33 (modifié)
New
New monthly 80% of MRR change $100 = $80
Transfer 1 : 80% of MRR change -100 = -$80
Transfer 2 : 100% of MRR change +100 = +$100
Contraction of MRR: 100% of MRR change -16.67 = -$16.67
Total = 83.33
Moreover this PR:
- fix a bug when achievements were duplicated when no currency was set.
- improve performances by creating a temporary table for invoice rules.
taskid-4783929
Forward-Port-Of: odoo/enterprise#88646Uploading an attachment from the Documents chatter no longer shows an unnecessary progress card or row in the main kanban or list views. This keeps the Documents workspace visually cleaner and avoids confusing users with temporary upload items in the wrong place.
Original PR description
Step to reproduce: - In Documents, open the chatter either on a folder or a document. - Upload an attachment through the chatter. - You will see the upload kanban card / list row showing the progression. There should be no visual in kanban/list views showing the progression. Task-4863051 Forward-Port-Of: odoo/enterprise#90836 Forward-Port-Of: odoo/enterprise#87410
Disallowed expense reports no longer fail when entries have a 0% or missing rate. The report now keeps those lines uniquely identified, preventing duplicate key errors and improving reliability for affected accounting reports.
Original PR description
Before this **PR**: When only the account_disallowed_expenses module was installed, the report failed with a duplicate key error if a line had a 0 rate or no rate at all. This was because such child lines were assigned the same line_id as their parent. After this **PR**: Lines with a 0 or no rate have the parent account appended to their line_id to ensure uniqueness and avoid key collisions. Forward-Port-Of: odoo/enterprise#90236
Customer statement emails now handle selected contacts that do not have a name. This prevents scheduled report sending from failing when customer selections include unnamed contacts, improving reliability for accounting workflows.
Original PR description
**PROBLEM** In the accounting app, when selecting multiples customers, if one of them doesn't have a name, the cron sending the report will traceback. **STEP TO REPRODUCE** - On a clean db, install…
**PROBLEM** In the accounting app, when selecting multiples customers, if one of them doesn't have a name, the cron sending the report will traceback. **STEP TO REPRODUCE** - On a clean db, install the account_reports module - From the accounting app, create a new company customer (Customers/Customers) - From that new company customer form view, add a new contact of type "other" and don't specify a name for it. - Create an invoice for the company - From the customer list view, select all, and trigger the action "Open Customer Statements" - Send -> Print and Send - Check the console, the cron task should traceback on the template **CAUSE** In accout_report.py, we get the name of each selected partners, and we don't check if the name doesn't exist. In the template `pdf_export_filters`, we try to join all the name in a string, it fails because one of the name isn't a string (its value is False because it doesn't exist on the partner record). **FIX** When getting the partners names, filter out the partners without names. opw-4916660 Forward-Port-Of: odoo/enterprise#90154
Fixes an issue in Odoo Sign where radio button groups lost their mutual selection behavior when a template layout was reused on a new document. This preserves the intended signing experience and prevents recipients from selecting multiple options in what should be a single-choice group.
Original PR description
If applied, this commit will make so that when a user uses the layout of a template document on a new document, the radio buttons will stay linked.…
If applied, this commit will make so that when a user uses the layout of a template document on a new document, the radio buttons will stay linked. _____________________________________________________ Using the layout of a template document, containing radio buttons, on a new document will unlink radio buttons, making them useless. 1. Go to the Sign module, and click on the Templates tab. 2. Click on the "Upload PDF" purple button, and upload a PDF of your choice. 3. On the left side of the screen, there's a panel where we can drag and drop sign items. Drag and drop a Radio button. 2 buttons will automatically show, and a yellow link will appear between the buttons. This link indicates that, when a user opens the document to sign, when clicking on a radio button, the other one will automatically be unselected if previously selected. 4. Save and return to the Templates window. 5. A new row has appeared with the name of the document. On the right side of this row, hover the house next to the share button and click on the 3 dots. Then, click on Use Layout. 6. Upload a PDF of your choice. 7. When the PDF shows, there's no yellow link between the radio buttons, unlike on the template from which the layout was used. In the file sign/models/sign_document.py, in the method _copy_sign_items_to(self, new_document), we copy every sign item from the template to the new document. However, the copy method we call doesn't take into consideration the special link between radio buttons, replicating the buttons correctly but not the link. This link is expressed by the radio set to which the radio buttons belong: indeed, after the copy of sign items, each radio button belongs to a different radio set, separating them. ### Explanation of the fix The fix consists of a rework of the _copy_sign_items_to method and a brand-new method specifically used to copy radio buttons. To keep the link between them, we assign all the buttons of the same set on the original documents to the same brand new radio set. The first button is copied normally: this creates a new radio set. Then, for the remaining buttons, we call copy_radio_item, to which we pass the button created first to use the information the next buttons will share with it. ______________________________________________________________ opw-4842590 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/enterprise#87536
Users can now clear date fields on existing commission plans without causing a save error. This prevents an unexpected crash and helps sales administrators update commission plan validity periods more reliably.
Original PR description
Currently, an error occurs when clear the date_to field from an already created record. Steps to Reproduce: - Install the `sale_commission` module. - Go to `Commission Plans` and create a record. -…
Currently, an error occurs when clear the date_to field from an already created record. Steps to Reproduce: - Install the `sale_commission` module. - Go to `Commission Plans` and create a record. - Now, clear the `date_from` field and save. `TypeError: '>' not supported between instances of 'bool' and 'datetime.date'` This error occurs when we clear the date_to field from an already created record. The error started occurring after https://github.com/odoo/enterprise/commit/926c8f041b51a04f0153be27cfcc8658a07be5b0 this commit that introduced the daterange widget for the date_from field. And when we clear the date_to field and try to save, it triggers the constraint [1] and raises the error. [1] https://github.com/odoo/enterprise/blob/377321fd7e7b1b2026734b75c79c74c8947e2e6c/sale_commission/model/commission_plan.py#L64 This commit ensures that the record is saved only if the date_to field is also present in the record. sentry-6710699656 Forward-Port-Of: odoo/enterprise#88769