Daily updates from Odoo
Monday, July 13, 2026
303 changes
20 changes
Enhancements to existing features
This pull request enhances the user experience for subcontracting workflows in Odoo. It simplifies the interface by renaming key columns and removing irrelevant fields, making it easier for users to manage subcontracting operations. These changes improve clarity and reduce potential confusion.
Original PR description
Small UX improvements for subcontracting, includes following changes: - Custom Operation Dependency should not be displayed/set if type of the BOM is subcontracting/kit. - Column name was changed from Free to use / On Hand subcontractor location to Subcontractor Stock - Manufacturing Readiness should not be displayed/set if type of the BOM is subcontracting/kit. task-6320074
Resolved issues and error corrections
This update removes a confusing message ('Connect your software...') from sales quotations that was appearing in PDFs for customers with portal access. The change ensures all quotes, regardless of customer portal usage, present a clean and professional look. This improves the customer experience and aligns with the standard portal button design.
Original PR description
Steps to reproduce: 1. Install Contacts and Sales 2. Open any of the contacts, click on the gear icon at the top and click on "Grant portal access" 3. Grant access to all contacts 4. Create a Sale Quotation for that contact and print it Issue: The sentence 'Connect your software... ' appears in the pdf when sending the quote to a contact who was portal access, while it does not appear if the contact does not have portal access Expected behavior: Should not appear regardless of whether the customer has a portal account or not since they have it appear as a smart button in their portal. opw-6308357 Forward-Port-Of: odoo/odoo#275469 Forward-Port-Of: odoo/odoo#272893
This update strengthens the website's wishlist feature by preventing unauthorized users from subscribing to products that don't exist or using existing user accounts. It now validates product availability and requires users to sign in before subscribing, reducing potential security risks and misuse of user data.
Original PR description
Description of the issue/feature this PR addresses: Currently, in the website_sale_stock module, there is no backend validation when subscribing to notifications for products without stock. This…
Description of the issue/feature this PR addresses: Currently, in the website_sale_stock module, there is no backend validation when subscribing to notifications for products without stock. This allows public users to potentially use emails that belong to registered accounts. Current behavior before PR: Users could subscribe to stock notifications for products that don’t exist or cannot be added (no stock). Public users could use emails already associated with registered accounts, allowing them to subscribe on behalf of another user. No validation is enforced, leading to potential security issues. Desired behavior after PR is merged: Adding a subscription for a non-existent or unavailable product raises a ValidationError. Public users trying to subscribe with an email that belongs to a registered user receive an AccessError prompting them to sign in first. Backend validation prevents misuse of registered user emails and improves security. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#275422 Forward-Port-Of: odoo/odoo#271880
This update corrects a technical issue where an empty distribution model was being flagged for merging. The fix removes unnecessary merging logic, streamlining the process and preventing errors. This ensures smoother operation within the analytic accounting module.
Original PR description
It is possible to have an empty distribution model, there is therefore ne need to merge it, especially since it raises when doing this ```python self.env['account.analytic.plan'].mapped(lambda p: p._column_name()) ``` Forward-Port-Of: odoo/odoo#275839
This update brings the latest version of the spreadsheet component to Odoo 19.4. It addresses several technical issues related to chart rendering, conditional formatting, and named ranges, ensuring a smoother and more reliable spreadsheet experience for users. Multiple developers collaborated on this update to improve stability and performance.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/c83d4aa59 [REL] 19.4.2 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/c83d4aa59 [REL] 19.4.2 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/9b3aee7f3 [FIX] named range selector: select hidden named range [Task: 6171849](https://www.odoo.com/odoo/2328/tasks/6171849) https://github.com/odoo/o-spreadsheet/commit/30ead68b5 [IMP] dashboard: fix dark mode background [Task: 6349211](https://www.odoo.com/odoo/2328/tasks/6349211) https://github.com/odoo/o-spreadsheet/commit/79c5f8589 [FIX] conditional_formatting: handle zero color scale midpoint [Task: 6312961](https://www.odoo.com/odoo/2328/tasks/6312961) https://github.com/odoo/o-spreadsheet/commit/c92559567 [FIX] charts: handle undefined values in treemap chart [Task: 6329404](https://www.odoo.com/odoo/2328/tasks/6329404) https://github.com/odoo/o-spreadsheet/commit/4a3e3c7fc [FIX] config: filter-out claude folder from prettier [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> 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: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya (rmbh) <rmbh@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@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> Co-authored-by: Marceline Thomas (matho) <matho@odoo.com>
This update fixes an issue where duplicated printers in the Point of Sale module would lose their configured IP address, defaulting to 0.0.0.0. The fix ensures that when a printer is duplicated, it retains the original IP address, simplifying setup and improving the user experience. This prevents potential connectivity problems with POS hardware.
Original PR description
Steps to reproduce: ==== - Configure a printer from printers menu. - Duplicate the printer. Issue: ==== - The duplicated printer's IP address is reset to `0.0.0.0`. Cause: ==== - copy_data()` unconditionally overrides `printer_ip` with `0.0.0.0`. Fix: ==== - Stop overriding `printer_ip` so the duplicated printer inherits the original IP address by default. task-6365809 Forward-Port-Of: odoo/odoo#274964
This update fixes several issues within the HTML editor's file box functionality. Specifically, it prevents the powerbox from appearing within file boxes, ensures plain text is pasted correctly, and resolves cursor behavior problems. These changes enhance usability and stability when working with files in the editor.
Original PR description
### Purpose of this PR: * Prevent the powerbox from opening inside a static file box. * Paste content as plain text inside a static file box, since formatting is not supported there. * Prevent the cursor from leaving an empty file name box when pressing `ArrowLeft` or `ArrowRight`. * o_we_preview_favicon had a fixed height larger than its content, causing the link popover to overflow and show an unwanted scrollbar when the file input was empty as there was nothing to preview. Reduced the height to match the actual content size. * Shorthands (such as `#` for headings or `*` for lists) should not trigger when editing inside a file box. task-6283420 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#275765 Forward-Port-Of: odoo/odoo#268827
This update resolves an issue where pressing the space key in the Contact app could cause a technical error. The fix ensures the system handles optional settings correctly, preventing the error and improving the user experience. This change enhances stability and reliability for Contact record management.
Original PR description
**Steps to reproduce:** - Go to Contact app - Open any record - Press "Space" key - Traceback: `Cannot read properties of undefined (reading 'groupId')` **Issue:** `quickCreateState` props is undefined (as it is optional). **Fix:** Add check to safely handle such cases. [introduced by] https://github.com/odoo/odoo/commit/22c07c7dcb2a93d9ebef5a83e48aa3d252128519 opw-6377425 Forward-Port-Of: odoo/odoo#275329
A recent update to the website builder was causing slow updates due to a delay in fetching image sources. This fix resolves the issue by ensuring images have the correct source data, preventing performance bottlenecks and improving the builder's responsiveness. This impacts the user experience when editing website content.
Original PR description
Commit [1] introduced a cache for images' src in `_getValidSrc`. An undefined src will work but block the thread for a moment (up to seconds in some cases) until `fetch` returns a 404. The bug can be seen from the website builder: - Open the builder - Open your dev tools on the "network" tab - Click on the website logo => a failed fetch (404) appears and blocks the builder from being updated quickly. It happens because the element doesn't have any `dataset.originalSrc` (in this case, because it is an image field). [1]: https://github.com/odoo/odoo/commit/5164080cbadddaa7052dd4d2f997b944bd7a16e8 task-6247171 Forward-Port-Of: odoo/odoo#275078
This update fixes an issue where the ECPay payment portal displayed in simplified Chinese when Odoo was set to traditional Chinese. The fix ensures the portal correctly uses traditional Chinese (zh_TW) for users in Taiwan, aligning with the Odoo locale setting. This improves the user experience for our customers using the traditional Chinese language.
Original PR description
…chinese ## Current behavior: When Odoo locale is set in traditional Chinese (zh_TW), the ECPay payment portal shows up in simplified Chinese (zh_CN). ## Expected behavior: When Odoo locale is set in…
…chinese ## Current behavior: When Odoo locale is set in traditional Chinese (zh_TW), the ECPay payment portal shows up in simplified Chinese (zh_CN). ## Expected behavior: When Odoo locale is set in traditional Chinese (zh_TW), the ECPay payment portal should show up in traditional Chinese (zh_TW) also. ## Steps to reproduce: In Odoo 19.0, 1. Install modules: payment_ecpay, website, ecommerce 2. Change the company and website language to Traditional Chinese (zh_TW). Make sure the currency is in TWD (Taiwanese Dollar) 3. Add ECPay as a payment method 4. Add some test products and checkout with ECPay 5. Observe the language on ECPay portal website, and payload in V5 package in network tab ## Cause of the issue: Initially the locale mapping was wrong, mapping CHI to zh. There's no "zh" locale, must either be "zh_TW" or "zh_CN". So when the Odoo locale is set to traditional Chinese (zh_TW), it included Language=CHI in the payload and redirect to ECPAY, making ECPay think that we're trying to request the simplified Chinese site. Caused by commit: 76c81d6f67b54940879b1020068c7140c4f2199b ## Fix: Fixed the language mapping following ECPay developer docs, and what language code to be included in the payload sent to ECPay from current Odoo locale. opw-6270820 --------------------------------------------------------------- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#269206
This update fixes a formatting issue in Odoo's logs that was displaying extremely long, precise numbers for request times (like milliseconds). By rounding these times before they're logged, the logs now show more readable and manageable values, making it easier to identify potential performance bottlenecks. This improves the clarity and usefulness of our operational logs.
Original PR description
The per-request access log formats query_time and remaining_time with %s, so unless they are rounded first they are rendered as the full float repr, e.g. "0.0016751289367675781" for a sub-millisecond request. Round query_time and remaining_time once, before `colored_extra` is copied from `extra`. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where the 'ICE' field on customer records in the Odoo portal was not saving correctly. The change ensures that this critical field is properly updated, preventing it from remaining empty after customer modifications. This improves data accuracy and functionality for users.
Original PR description
After this PR https://github.com/odoo/odoo/pull/262274 ICE field on frontend was no longer saving on customer and because of that it always stays empty after save. Handle `additional_identifiers` field on portal to properly set those values in `additional_identifiers` fiels. task-5208254
This update resolves an issue where clearing the search in the Threads panel caused unexpected behavior and excessive data loading. By ensuring the search results are consistently rendered, the system now correctly displays the intended list size, improving the user experience. This fix prevents performance issues and ensures a smoother browsing experience.
Original PR description
The Threads panel resets its search results in a layout effect, so clearing the search empties `searchTerm` one render before the full sub-channel list is restored. During that transient render the load-more sentinel (`t-if="!searchTerm"`) re-mounts next to the still short filtered list; the IntersectionObserver can catch it visible and fetch an extra page, making the list overshoot its expected size. The `count(31)` tour step then never matches, jumping straight to 61. Read the displayed list straight from the record while browsing so the list and the sentinel flip together in the same render, leaving no window where the sentinel sits next to a short, filtered list. https://runbot.odoo.com/odoo/error/941492
This update fixes a visual glitch (flickering) in the call settings dialog when switching between tabs. The change improves the user experience by ensuring the dialog renders smoothly and consistently. Additionally, the underlying code was refactored for better efficiency and to automatically update device selections.
Original PR description
Purpose Prevent height flickering in the call settings dialog when changing tabs. Before this commit, the DeviceSelect component awaited asynchronous work in `onWillStart`, blocking the rendering of…
Purpose Prevent height flickering in the call settings dialog when changing tabs. Before this commit, the DeviceSelect component awaited asynchronous work in `onWillStart`, blocking the rendering of tab content and causing the settings dialog height to flicker when switching tabs. After this commit, the asynchronous work is still started in `onWillStart`, but its promise is no longer awaited before rendering. This allows the tab content to render immediately while the asynchronous initialization completes in the background, eliminating the flicker. This commit also refactors the DeviceSelect component by: - Replacing the proxy-based state with signals. - Computing `selectedDevice` from `userDevices` instead of updating it on every device change. This ensures the selected device label stays in sync automatically when `userDevices` changes (e.g. due to permission changes or newly detected devices), reducing duplicated state. | | | |-|-| | BEFORE | <img width="800" height="446" alt="ezgif-1545762edb9521cb" src="https://github.com/user-attachments/assets/d453dec7-007e-4bc3-a04b-125208d7a8e2" /> | | AFTER | <img width="800" height="446" alt="ezgif-1db5bef8c163cf2d" src="https://github.com/user-attachments/assets/bdf05366-3490-414b-ac83-2b1e35c6309c" /> |
This update resolves a bug preventing website settings changes to the robots.txt file from being saved correctly. The fix ensures the system accurately identifies the target website, allowing users to properly edit and apply robots.txt configurations. This improves website SEO and crawling functionality.
Original PR description
Steps to Reproduce: 1. Visit the '/robots.txt' URL and check its content. 2. Go to website settings through the configuration menu. 3. Switch to debug mode. 4. Click on the 'Edit robots.txt' option under the 'Tracking & SEO' block. 5. Make an edit in the wizard and save your changes. 6. Reopen the wizard to modify the content. Observed Issue: The changes made using the 'Edit robots.txt' option are not reflected at the '/robots.txt' URL and are also not visible when the content is re-edited. Explanation: The `env.context` no longer contains the `website_id`. The robots.txt editor wizard relied on `env.website` to read and write the current website's robots.txt content. Since the website is no longer available in this context, the wizard cannot determine which website to operate on. This commit passes the target `website_id` through the action context, allowing it to initialize and save the wizard content into particular field. task-6365217
A technical issue preventing the generation of the Return Slip report for return pickings has been fixed. This change ensures the report can be reliably printed, preventing errors and improving the usability of the Stock module. The fix addresses a 'KeyError' caused by accessing a variable before it was defined in the report template.
Original PR description
Issue before this commit: ========================= Printing the return slip report for a return picking raised a traceback. Steps to reproduce: =================== - Install the Stock module with demo data. - Create a return picking. - Click on the Action menu and print the Return Slip report. Result: A traceback is raised with: KeyError: 'picking' Cause: ====== The 'stock.return_label_header' template accesses the 'picking' variable before it is defined, resulting in a 'KeyError' during report rendering. This issue was introduced by PR: https://github.com/odoo/odoo/pull/234112 With this commit: ================= Define the 'picking' variable before calling the template that uses it, preventing the traceback.
This update adds email verification to the French PDP registration wizard. Previously, invalid email addresses could cause errors later in the process. This change ensures data integrity and a smoother user experience by preventing issues caused by incorrect contact information.
Original PR description
No verification was done on the contact email in the wizard but if the email is invalid the user would have an error later task-6344324 Forward-Port-Of: odoo/odoo#274065
This update corrects an issue where the spreadsheet function incorrectly identified account codes based on partial matches. The change improves the accuracy of account lookups within the spreadsheet, ensuring users can correctly associate transactions. This resolves a potential error in reporting and data analysis.
Original PR description
Adjusting spreadsheet account lookup by name to exclude partial matches. Adjusting a related test to verify. task-6354503 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where a new database index wasn't being used by Odoo's internal queries. The change ensures the index is correctly utilized by both specific queries and those generated by the Odoo ORM, improving query performance. This primarily impacts the project and to-do modules.
Original PR description
The index added by 778c09f4ffb4 works for the specific query it was meant to improve. Unfortunately, it cannot be used by ORM-generated queries, which is unfortunate. The reason is that the ORM generates queries with `IS TRUE` or `IS NOT TRUE` for boolean fields. Because `=` and `IS` do not have the same semantics, postgresql cannot use the index for ORM-generated queries. = -> eval(NULL = True) -> NULL IS -> eval(NULL IS TRUE) -> FALSE By changing both the index and the query to use `IS TRUE`, the index is now used by both the specific query and the ORM. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#275681
This update fixes a discrepancy in the default tax date obligation for Serbian VAT invoices. Previously, the system defaulted to a 'By Issuance Date' setting, which wasn't compliant with Serbian law. Now, it correctly defaults to 'By Delivery Date' as mandated by Article 16 of the Serbian VAT Law, ensuring accurate tax reporting.
Original PR description
According to[ Article 16 of Serbia's VAT Law](https://www.paragraf.rs/propisi/law-on-value-added-tax.html#:~:text=of%20Tax%20Obligation-,Article%2016,-A%20tax%20obligation), the tax obligation arises at the time of delivery of goods/services by default. 'By Issuance Date' only applies to a narrow set of services under Article 16(2a) Before: l10n_rs_tax_date_obligations_code defaulted to '3' (By Issuance Date) After: defaults to '35' (By Delivery Date) Upgrade: odoo/upgrade#10657 task-6348377 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#273608
13 changes
New functionality added to Odoo
This update introduces two new tax types for Latvian businesses – 'car tax' and 'representation tax' – impacting VAT deductions. The changes include tagging tax reports and adjusting financial calculations based on these new tax types, ensuring accurate reporting and compliance.
Original PR description
#### [IMP] l10n_lv: add tax report attachment tags Add tags for the tax report attachments added in the related enterprise PR and tag all existing taxes. They determine the transaction type. It also adds the special tag `Rep` that is irrelevant for the transaction type. From a base amount line tagged with `Rep` we only put 40% of the amount for the attachments. #### [IMP] l10n_lv: add a car and a representation purchase tax This commit adds 2 new taxes - "car tax": 50% of the VAT is deductible - "representation tax": 40% of the VAT is deductible #### references task-4251184 Forward-Port-Of: odoo/odoo#212698
Resolved issues and error corrections
This update corrects a bug that occurred when attempting to merge empty distribution models within Odoo. The fix removes unnecessary merging logic, preventing errors that arose when this operation was performed. This ensures smoother and more reliable distribution model management.
Original PR description
It is possible to have an empty distribution model, there is therefore ne need to merge it, especially since it raises when doing this ```python self.env['account.analytic.plan'].mapped(lambda p: p._column_name()) ``` Forward-Port-Of: odoo/odoo#275839
A technical bug in the restaurant order tour was prematurely closing the user session, preventing error reporting. This fix ensures that errors related to order cancellations are properly logged and displayed, improving the reliability of the restaurant order process. The change addresses a reported runbot error.
Original PR description
The tour was closing the session in frontend and in the backend, which was causing a missing error. runbot error: 242197
This update fixes an issue where a 'Products' snippet added above the variant selector on a product page incorrectly displayed the snippet's first product instead of the selected variant. The fix ensures that selecting a variant always shows the correct variant information, improving the user experience. This was caused by a change in how product IDs were identified.
Original PR description
When a "Products" snippet is dropped above the variant selector on a product page, selecting a variant displays one of the snippet's products instead of the chosen variant (its image/price take over…
When a "Products" snippet is dropped above the variant selector on a product page, selecting a variant displays one of the snippet's products instead of the chosen variant (its image/price take over the page).
Steps to reproduce
===================
1. Create a product with 2+ variants and publish it.
2. Edit the product page, drag any block above the variant selector and add the "Products" dynamic snippet, then save.
3. Select a variant. => The page shows the snippet's first product instead of the variant.
Root cause
==========
`ProductPage._getCombinationInfo` reads the product ids from `parent.querySelector('button[name="add_to_cart"]')`, with `parent` being the whole `.js_product`. `querySelector` returns the first match in DOM order, and the dynamic "Products" snippet's cards reuse the same `button[name="add_to_cart"]` markup with their own product ids. When the snippet sits above the variants, its button comes first, so `/website_sale/get_combination_info` is called with the snippet product's ids and the page is updated with that product's data.
The interaction was introduced in saas-19.1 (See [1]) and the lookup switched from the unique `#add_to_cart` id to the by-name selector in (See [2]), which is what started matching the snippet's cards.
Fix
===
Pick the first `add_to_cart` button that is not inside a product card (`.oe_product_cart`), i.e. the main product's button.
[1]: https://github.com/odoo/odoo/commit/4682748e6e3c#diff-7e1a99da9e95d0c4df79ee4d7aa718e46bcb8b7f1ed78cde58782e075c833cd1R326
[2]: https://github.com/odoo/odoo/commit/1c732cf75a4a4faa960d6a98f08ae9dbe99b2b69#diff-7e1a99da9e95d0c4df79ee4d7aa718e46bcb8b7f1ed78cde58782e075c833cd1R329
opw-6248285
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#268518This update removes a confusing message ('Connect your software...') from sales quotations that was appearing in PDF documents for customers with portal access. The change ensures all quotes, regardless of customer portal usage, display the standard, streamlined portal button. This improves the customer experience and avoids unnecessary confusion.
Original PR description
Steps to reproduce: 1. Install Contacts and Sales 2. Open any of the contacts, click on the gear icon at the top and click on "Grant portal access" 3. Grant access to all contacts 4. Create a Sale Quotation for that contact and print it Issue: The sentence 'Connect your software... ' appears in the pdf when sending the quote to a contact who was portal access, while it does not appear if the contact does not have portal access Expected behavior: Should not appear regardless of whether the customer has a portal account or not since they have it appear as a smart button in their portal. opw-6308357 Forward-Port-Of: odoo/odoo#275469 Forward-Port-Of: odoo/odoo#272893
This update automatically sets accounts as non-reconcilable when reconciliation with banks or cash transactions isn't expected. This simplifies the accounting process for various Odoo localization modules (like CA, KE, US, etc.) by preventing unnecessary reconciliation steps. It ensures that accounts are configured correctly from the start, reducing potential errors and improving data accuracy.
Original PR description
Changing the "payment reconciliation" boolean to false where it should be, ie. when no reconciliation with the bank nor cash transaction is expected. task-4902124
This update fixes an issue where duplicated point-of-sale printers would lose their configured IP addresses. The fix ensures that when a printer is duplicated, it retains the original IP address, simplifying setup and preventing connection problems. This improves the reliability of the POS system.
Original PR description
Steps to reproduce: ==== - Configure a printer from printers menu. - Duplicate the printer. Issue: ==== - The duplicated printer's IP address is reset to `0.0.0.0`. Cause: ==== - copy_data()` unconditionally overrides `printer_ip` with `0.0.0.0`. Fix: ==== - Stop overriding `printer_ip` so the duplicated printer inherits the original IP address by default. task-6365809 Forward-Port-Of: odoo/odoo#274964
This update fixes several issues within the Odoo spreadsheet component, ensuring improved stability and functionality. It addresses problems with chart rendering, conditional formatting, and named range selection, enhancing the user experience. Multiple developers collaborated on this update to ensure a robust solution.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/35c06d3a8 [REL] 19.3.11 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/35c06d3a8 [REL] 19.3.11 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/ed527c0f5 [FIX] named range selector: select hidden named range [Task: 6171849](https://www.odoo.com/odoo/2328/tasks/6171849) https://github.com/odoo/o-spreadsheet/commit/2e56727ca [FIX] conditional_formatting: handle zero color scale midpoint [Task: 6312961](https://www.odoo.com/odoo/2328/tasks/6312961) https://github.com/odoo/o-spreadsheet/commit/da294bd6a [FIX] charts: handle undefined values in treemap chart [Task: 6329404](https://www.odoo.com/odoo/2328/tasks/6329404) https://github.com/odoo/o-spreadsheet/commit/a40202e4f [FIX] config: filter-out claude folder from prettier [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> 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: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya (rmbh) <rmbh@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@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> Co-authored-by: Marceline Thomas (matho) <matho@odoo.com>
This update improves the accuracy of PDP verification tracking within the French localization module. It now ensures that PDP-specific tracking is only applied when the company is correctly configured for PDP, preventing incorrect tracking data from being displayed. This change addresses a potential issue where companies not set up for PDP could incorrectly show PDP tracking information.
Original PR description
The PDP-specific verification tracking must only be used when the active company is configured for PDP. Otherwise, a recipient using the 0225 identifier could show PDP/annuaire tracking while being checked from a non-PDP company. Related to odoo/odoo#275186
This update resolves an issue where pressing the space key in the Contact app could cause a technical error. The fix ensures the system handles missing configuration data gracefully, preventing the error and maintaining a stable user experience. This improvement enhances reliability for users working with Contact records.
Original PR description
**Steps to reproduce:** - Go to Contact app - Open any record - Press "Space" key - Traceback: `Cannot read properties of undefined (reading 'groupId')` **Issue:** `quickCreateState` props is undefined (as it is optional). **Fix:** Add check to safely handle such cases. [introduced by] https://github.com/odoo/odoo/commit/22c07c7dcb2a93d9ebef5a83e48aa3d252128519 opw-6377425 Forward-Port-Of: odoo/odoo#275329
A recent update to the website builder was causing slow loading times due to a delay in fetching image sources. This fix resolves the issue by ensuring images have the correct source data, preventing performance bottlenecks and improving the builder's responsiveness. This impacts the user experience when updating website content.
Original PR description
Commit [1] introduced a cache for images' src in `_getValidSrc`. An undefined src will work but block the thread for a moment (up to seconds in some cases) until `fetch` returns a 404. The bug can be seen from the website builder: - Open the builder - Open your dev tools on the "network" tab - Click on the website logo => a failed fetch (404) appears and blocks the builder from being updated quickly. It happens because the element doesn't have any `dataset.originalSrc` (in this case, because it is an image field). [1]: https://github.com/odoo/odoo/commit/5164080cbadddaa7052dd4d2f997b944bd7a16e8 task-6247171 Forward-Port-Of: odoo/odoo#275078
This update ensures that all user-defined descriptions for invoice lines are accurately exported in UBL format. Previously, the system only captured one description tag, but this change now correctly handles multiple descriptions, preventing data loss and improving the accuracy of invoices.
Original PR description
1) Previously, we were supposing that only one <cbc:Description> tag could be found on InvoiceLine item. After checking the UBL XSD, I found we could have multiple Description tags for one item. 2) The import order of <cbc:Name> and <cbc:Description> on the invoice line now has been changed to be more accurate and prevent loss of information. The export has been adapted to this change too. Now, we export the actual description written by the user. task-6153895 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#270308 Forward-Port-Of: odoo/odoo#261949
This update adds a check to ensure contact emails entered during the French PDP registration process are valid. Previously, invalid emails could lead to errors later, causing frustration for users. This change improves data quality and prevents potential issues during the registration workflow.
Original PR description
No verification was done on the contact email in the wizard but if the email is invalid the user would have an error later task-6344324 Forward-Port-Of: odoo/odoo#274065
14 changes
New functionality added to Odoo
This update introduces two new tax types – 'car tax' and 'representation tax' – specifically for Latvian accounting. These taxes allow for 50% and 40% VAT deduction respectively, impacting financial reporting and compliance within the Odoo system. The changes also include tagging of tax reports for accurate transaction type determination.
Original PR description
#### [IMP] l10n_lv: add tax report attachment tags Add tags for the tax report attachments added in the related enterprise PR and tag all existing taxes. They determine the transaction type. It also adds the special tag `Rep` that is irrelevant for the transaction type. From a base amount line tagged with `Rep` we only put 40% of the amount for the attachments. #### [IMP] l10n_lv: add a car and a representation purchase tax This commit adds 2 new taxes - "car tax": 50% of the VAT is deductible - "representation tax": 40% of the VAT is deductible #### references task-4251184 Forward-Port-Of: odoo/odoo#212698
Resolved issues and error corrections
This update resolves an issue where website builder option titles were missing translations, causing errors in the website editor. The fix ensures that titles for color pickers and carousel options are correctly translated and available, improving the user experience for website customization.
Original PR description
Steps to reproduce: - Open the website editor. - Go to the Theme tab. - Inspect the Primary or Secondary color picker title. => The title prop is undefined. - Go to a product page with several product images. - Edit the carousel thumbnail position option. => The Left and Bottom button titles are undefined. Before this commit, some builder option titles were passed as OWL expressions instead of translated string props. After this commit, these titles use translated string props and are properly available to the builder components. task-6034856 Forward-Port-Of: odoo/odoo#275235
This update resolves an error that occurred when multiple product images with identical descriptions were used on the website's SEO optimization tool. The fix ensures that image IDs are uniquely identified, preventing the 'duplicate key' error and allowing the optimization tool to function correctly. This improves the website's SEO performance.
Original PR description
## Problem: when snippets with identical images are added in the e-commerce website product page, the "Optimize SEO" option in debug mode causes an error to occur with a traceback. The traceback…
## Problem:
when snippets with identical images are added in the e-commerce website product page, the "Optimize SEO" option in debug mode causes an error to occur with a traceback. The traceback calls out a duplicate key in the `t-foreach` of a loop over `state.altAttributes`. the `t-key` for this loop is `img.id` which is generated by the `/website/get_alt_images` controller endpoint.
## Steps to reproduce:
1. Go to a product page and click on "go to website" smart nav btn.
2. Add a snippet with an image in the `description_ecommerce` field
3. Add a snippet with the same image in the `website_description` field.
4. In debug mode, open `site > Optimize SEO`
5. An error `Got duplicate key in t-foreach` is thrown.
## Solution:
The solution was simple to add a qualifier in the compound key generated by the controller action for the `id` field. The chosen qualifier in this case was `model['field']`. `field` is the position in the template where the image came from.
So now the keys for the two identical images go
FROM
> `${model}-${id}-${index}`
>
> 1st image of `website_description`:
> `product.template-6-0`
>
> 1st image of `description_ecommerce`:
> `product.template-6-0`
TO
> `${model}-${id}-${field}-${index}`
>
> 1st image of `website_description`:
> `product.template-6-website_description-0`
>
> 1st image of `description_ecommerce`:
> `product.template-6-description_ecommerce-0`
task-6325786
Forward-Port-Of: odoo/odoo#275649
Forward-Port-Of: odoo/odoo#272846This update fixes an issue where a message ('Connect your software...') was appearing in sales quotations sent to customers with portal access. The change ensures that this message is no longer included, regardless of whether the customer uses the portal, improving the customer experience and the professional appearance of quotes. This resolves a minor visual inconsistency.
Original PR description
Steps to reproduce: 1. Install Contacts and Sales 2. Open any of the contacts, click on the gear icon at the top and click on "Grant portal access" 3. Grant access to all contacts 4. Create a Sale Quotation for that contact and print it Issue: The sentence 'Connect your software... ' appears in the pdf when sending the quote to a contact who was portal access, while it does not appear if the contact does not have portal access Expected behavior: Should not appear regardless of whether the customer has a portal account or not since they have it appear as a smart button in their portal. opw-6308357 Forward-Port-Of: odoo/odoo#275469 Forward-Port-Of: odoo/odoo#272893
This update resolves a crash that occurred when users attempted to set up the 'AI Live Chat' snippet in Website Edit Mode without configuring API keys. The fix ensures the website remains stable by only displaying the redirect button when the necessary services are available, maintaining backend functionality.
Original PR description
Step to reproduce: 1.Go to Website ->Edit Mode 2,Add the snippet : 'AI Live Chat' 3.Don't update any Settings -> Hit 'Save' directly ( Don't add any API key for the chatgpt and/or gemini) 4.Search for something 5.Traceback occurs Before this commit: `RedirectWarningDialog` always displayed the redirect button and expected the `action` service to be available. When a `RedirectWarning` was raised from the website, where this service is not provided, the dialog crashed with an OWL error instead of being displayed. After this commit: the redirect button is only rendered when the `action` service is available, preventing the crash on the website while keeping the existing behavior in the backend. task-6220145 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a potential error that occurred when attempting to merge empty distribution models within Odoo. The change removes unnecessary merging logic, preventing the error from being triggered. This ensures smoother operation and avoids potential disruptions to financial reporting.
Original PR description
It is possible to have an empty distribution model, there is therefore ne need to merge it, especially since it raises when doing this ```python self.env['account.analytic.plan'].mapped(lambda p: p._column_name()) ``` Forward-Port-Of: odoo/odoo#275839
This update fixes an issue where the HTML editor was incorrectly triggering font size checks even when other formatting options were applied. Now, list item font size checks are restricted to only font size formatters, ensuring a smoother and more reliable editing experience. This improves the overall stability and usability of the HTML editor.
Original PR description
#### Description of the issue this PR addresses: - Fully selected list items could go through font size checks even when applying unrelated formatters. #### Desired behavior after PR is merged: - Restrict list item font size checks to font size formatters only. task-6329161 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#275590 Forward-Port-Of: odoo/odoo#272104
This update resolves a previous issue where processing large batches of invoices caused memory problems in the system. By optimizing the rank increment process, the system now handles more partners efficiently, significantly reducing processing time and memory usage. This improves the speed and stability of batch payment operations.
Original PR description
### Description: Processing batch payments for multiple invoices triggers the `_increase_rank` method across numerous partners. Previously, this could lead to Out-Of-Memory (OOM) errors in databases with extensive partner hierarchies (parent/child relationships), primarily due to cascaded writes triggered by `_commercial_sync_to_descendants`. This commit optimizes the rank increment process, significantly reducing both memory consumption and execution time. ### Benchmark: | Partner Count | Time Before | Time After | Memory After | |---------------|-------------|------------|--------------| | 191,946 | 2 min | 47s | 111 Mb | | 393,509 | OOM | 1 min 45 | 216 Mb | ### Reference: opw-5152687 Forward-Port-Of: odoo/odoo#270927 Forward-Port-Of: odoo/odoo#259334
This update resolves an issue where pressing the space key in the Contact app would sometimes cause an error. The fix ensures the system handles optional settings correctly, preventing the traceback and improving the user experience. This change focuses on stability and reliability within the Contact module.
Original PR description
**Steps to reproduce:** - Go to Contact app - Open any record - Press "Space" key - Traceback: `Cannot read properties of undefined (reading 'groupId')` **Issue:** `quickCreateState` props is undefined (as it is optional). **Fix:** Add check to safely handle such cases. [introduced by] https://github.com/odoo/odoo/commit/22c07c7dcb2a93d9ebef5a83e48aa3d252128519 opw-6377425 Forward-Port-Of: odoo/odoo#275329
A recent update to the website builder was causing slow loading times and occasional freezes. This fix resolves an issue where the system was waiting for image sources to load, leading to delays. The change ensures faster website updates and a smoother user experience.
Original PR description
Commit [1] introduced a cache for images' src in `_getValidSrc`. An undefined src will work but block the thread for a moment (up to seconds in some cases) until `fetch` returns a 404. The bug can be seen from the website builder: - Open the builder - Open your dev tools on the "network" tab - Click on the website logo => a failed fetch (404) appears and blocks the builder from being updated quickly. It happens because the element doesn't have any `dataset.originalSrc` (in this case, because it is an image field). [1]: https://github.com/odoo/odoo/commit/5164080cbadddaa7052dd4d2f997b944bd7a16e8 task-6247171 Forward-Port-Of: odoo/odoo#275078
This update resolves an issue where the recruiter dropdown on job positions (and applicants) doesn't display options when the company is set to 'Visible to all'. The fix ensures the dropdown correctly lists available recruiters based on the company setting, improving usability for recruiters.
Original PR description
**Problem:** On a job position whose company is left empty ("Visible to all"), the Recruiter dropdown does not propose any user anymore: only the "Create" option is offered. The same happens on…
**Problem:**
On a job position whose company is left empty ("Visible to all"), the Recruiter dropdown does not propose any user anymore: only the "Create" option is offered. The same happens on applicants without a company. Only saas-19.2 is affected: 19.0/19.1 still use the res.users-based recruiter field, and on saas-19.3 the company became mandatory on job positions.
**Steps to reproduce:**
1. Install Recruitment
2. Open a job position whose Company is "Visible to all" (e.g. any demo job position)
3. Edit the Recruiter field
**Current behavior:**
The dropdown shows no user, only the "Create" option.
**Expected behavior:**
The dropdown lists the recruiters of all companies, as it does (per company) when a company is set.
**Cause of the issue:**
Commit 05e22346050d replaced the res.users-based `user_id` recruiter field with the hr.employee-based `recruiter_id`, declared with `check_company=True`. For check_company fields, `_description_domain()` sends the client `company_id and [('company_id', 'in', [company_id, False])] or [('company_id', '=', False)]`. When the record has no company, the domain falls back to `[('company_id', '=', False)]`, and since `hr.employee.company_id` is required, no employee can ever match. This reintroduces the issue previously fixed by 5dfe494e62af for the old user_id field: the `allowed_user_ids` mechanism introduced there was dropped by the field replacement.
**Fix:**
`check_company=True` brings nothing to these models server-side (neither `hr.job` nor `hr.applicant` has `_check_company_auto`): its only effect is that client-side domain. Folding the company condition directly into the recruiter domain with `('company_id', '=?', company_id)` keeps the per-company filtering when a company is set and degrades to no filtering when it is not, mirroring what is already done for `interviewer_ids` on the job position. The domains become strings so the client keeps evaluating `company_id` per record.
opw-6290312This pull request updates the core spreadsheet component to version 19.2.20, addressing several technical issues and improving its functionality. Specifically, it fixes a problem with conditional formatting and removes a conflicting folder reference, ensuring consistent spreadsheet performance and appearance within Odoo.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/99a9aef31 [REL] 19.2.20 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/99a9aef31 [REL] 19.2.20 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/3912ef44a [FIX] conditional_formatting: handle zero color scale midpoint [Task: 6312961](https://www.odoo.com/odoo/2328/tasks/6312961) https://github.com/odoo/o-spreadsheet/commit/4eb05e8cb [FIX] config: filter-out claude folder from prettier [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> 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: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya (rmbh) <rmbh@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@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> Co-authored-by: Marceline Thomas (matho) <matho@odoo.com>
This update addresses a technical issue where opening the Gmail add-in when replying to an email sent to our own address would trigger an error. This fix ensures that users can reliably open and manage self-sent emails via the Gmail add-in without encountering this problem. It improves the usability of a core email functionality.
Original PR description
Bug === If we email ourselves, and open the Gmail addin on it, then an error is raised. Task-6375862
Features or functions removed from Odoo
This update refines the way payment lines are handled within the restaurant POS module. The change replaces older, snake_case naming conventions with modern camelCase, ensuring better compatibility and future development. This improves the underlying payment processing system.
Original PR description
In this commit: - Use the new method names in the payment adjustment flow. - Replace deprecated snake_case methods with their camelCase equivalents for payment lines, payment terminals, and order totals. Task:6049128 Forward-Port-Of: odoo/odoo#271792
16 changes
New functionality added to Odoo
This update introduces two new tax types – 'car tax' and 'representation tax' – specifically for the Latvian (l10n_lv) localization. These taxes allow for partial VAT deductions (50% and 40% respectively) and are linked to existing tax reports for accurate accounting. The changes also improve the tagging system for tax report attachments.
Original PR description
#### [IMP] l10n_lv: add tax report attachment tags Add tags for the tax report attachments added in the related enterprise PR and tag all existing taxes. They determine the transaction type. It also adds the special tag `Rep` that is irrelevant for the transaction type. From a base amount line tagged with `Rep` we only put 40% of the amount for the attachments. #### [IMP] l10n_lv: add a car and a representation purchase tax This commit adds 2 new taxes - "car tax": 50% of the VAT is deductible - "representation tax": 40% of the VAT is deductible #### references task-4251184 Forward-Port-Of: odoo/odoo#212698
Resolved issues and error corrections
This update corrects a bug where attempting to merge empty distribution models caused an error. The fix removes unnecessary merging logic, streamlining the process and preventing this error from occurring. This ensures smoother operation within the analytic accounting features.
Original PR description
It is possible to have an empty distribution model, there is therefore ne need to merge it, especially since it raises when doing this ```python self.env['account.analytic.plan'].mapped(lambda p: p._column_name()) ``` Forward-Port-Of: odoo/odoo#275839
This update resolves an issue preventing PEPPOL webhooks from working correctly. The change replaced a problematic method call with a more reliable one, ensuring seamless integration with PEPPOL systems. This fix is crucial for proper data exchange and compliance related to PEPPOL.
Original PR description
webhooks don't work because of it
This update corrects an issue where the 'Load More' button on the Odoo platform was consistently hidden. The fix ensures the button's visibility is correctly controlled based on the current state of the application, improving the user experience. This resolves a technical problem impacting how users interact with the platform.
Original PR description
Since #198829, a `t-att-class` has been added to the `loadOlder` template that relies on `mountedAndLoaded` of thread state to control the visibility of the `Load More` button. But it doesn't read the value from the state properly. As a result, the button is always transparent. This change fixes this by reading the value from the state. Forward-Port-Of: odoo/odoo#275253
This update resolves an issue where Odoo was incorrectly sending duplicate capture requests to Stripe for EFTPOS payments processed in Australia. Previously, the system treated these payments as needing a second capture, leading to errors and incomplete orders. This change ensures that payments processed via EFTPOS are captured correctly the first time, improving reliability for Australian POS users.
Original PR description
In Australia, Terminal payments using `payment_method_options.card_present.capture_method=manual_preferred` are not always captured later. When a payment is processed on the `eftpos_au` network, Stripe authorizes and captures it in a single step. However, the POS Stripe flow only skipped the extra capture based on the card brand instead of the processed network. As a result, payments such as `brand = visa` and `card_present.network = eftpos_au` were treated as capturable, and Odoo sent a second capture request. Stripe then rejected it with `payment_intent_unexpected_state` because the PaymentIntent had already been captured, leaving the POS order unfinished. This patch skips the extra capture call when the payment was processed on `card_present.network = eftpos_au`. opw-6228977 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#270293
This update resolves an issue where reverting inventory adjustments with packages resulted in negative quantities appearing within those packages. The fix ensures that quantities are accurately restored after a revert, preventing inconsistencies in package inventory levels. This improves data accuracy and reliability for stock management.
Original PR description
Currently when the user reverts an inventory adjustment move line with a package the package contains extra line showing negative quantity of the product. ## Steps to produce: - Install Inventory…
Currently when the user reverts an inventory adjustment move line with a package the package contains extra line showing negative quantity of the product.
## Steps to produce:
- Install Inventory without demo data
- Settings Enable 'Packages'
- Create a product:
- Cheese burger
- On hand > Create a new quant
- Package: 'Burgerbox' and 'On Hand Quantity`: 1 and save
- Set the On Hand quantity to zero and save
- History > Revert the Inventory adjustment line from WH/stock to Inventory adjustment by selecting it and reverting via actions.
- Products > Packages > BurgerBox
## Observed Behaviour:
After reverting an inventory adjustment that set the product's physical quantity to 0, the package contains two lines for the same product with quantities 1 and -1.
This is inconsistent because a package should not contain a product with a negative quantity.
The package should be restored to its original state and contain only the expected positive quantity.
## Root cause:
When the user reverts the move line, `action_revert_inventory` is called. This method creates the revert move and then marks that move as done at [1].
Marking the move as done subsequently marks all related move lines as done at [2]. During this process, the system first unreserves the quantity from the virtual location / inventory adjustment and then removes the quantity from that location (resulting in a -1 quantity move line at that location). This is performed through `_synchronize_quant`, which is responsible for synchronizing the physical inventory with the move line at [3].
The `_synchronize_quant` method uses the move line's `package_id` when updating the corresponding quant at [4]. As a result, `_update_available_quantity` creates a new quant with the following values at [5]:
```
{
'product_id': 1,
'location_id': 14,
'lot_id': stock.lot(),
'package_id': 1,
'owner_id': res.partner(),
'in_date': datetime.datetime(2026, 6, 22, 12, 42, 11),
'quantity': -1.0,
}
```
This creates a quant with a negative quantity that is linked to the package because `package_id` is set on the newly created quant. Consequently, the move line with the negative quantity becomes associated with the package.
[1]-
https://github.com/odoo/odoo/blob/333c279be7cba9fda17d2818be36f4d96d8cd0f6/addons/stock/models/stock_move_line.py#L1016-L1035
[2]-
https://github.com/odoo/odoo/blob/333c279be7cba9fda17d2818be36f4d96d8cd0f6/addons/stock/models/stock_move.py#L1956 [3]-
https://github.com/odoo/odoo/blob/333c279be7cba9fda17d2818be36f4d96d8cd0f6/addons/stock/models/stock_move_line.py#L662-L666
[4]-
https://github.com/odoo/odoo/blob/333c279be7cba9fda17d2818be36f4d96d8cd0f6/addons/stock/models/stock_move_line.py#L678-L687
[5]-
https://github.com/odoo/odoo/blob/333c279be7cba9fda17d2818be36f4d96d8cd0f6/addons/stock/models/stock_quant.py#L1130-L1143
## Solution:
Remove the source `package_id` when creating revert moves for inventory adjustment locations.
When an inventory adjustment sets a product's quantity to 0, the adjustment is completed without a destination package, meaning the product is effectively removed from the package. Therefore, the corresponding revert move should not retain the package as its source. Keeping the package as the source is inconsistent because package information should not exist on a virtual inventory adjustment location, and the original inventory adjustment removes the product from the package (there is no destination package).
By removing the source `package_id` from the revert move, the system avoids creating negative quants associated with the package during quant synchronization. This also ensures that, after the inventory adjustment is reverted, the quantities of products inside the package are restored correctly and match their state prior to the adjustment.
opw-6285739
Forward-Port-Of: odoo/odoo#274167
Forward-Port-Of: odoo/odoo#271440This pull request updates the core spreadsheet component within Odoo. It addresses several minor bugs and improves the spreadsheet's functionality, specifically related to conditional formatting and file organization. These changes ensure the spreadsheet continues to operate smoothly and efficiently.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/6eb95de5f [REL] 19.1.27 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/6eb95de5f [REL] 19.1.27 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/67aef5252 [FIX] conditional_formatting: handle zero color scale midpoint [Task: 6312961](https://www.odoo.com/odoo/2328/tasks/6312961) https://github.com/odoo/o-spreadsheet/commit/f993d6e32 [FIX] config: filter-out claude folder from prettier [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> 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: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya (rmbh) <rmbh@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@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> Co-authored-by: Marceline Thomas (matho) <matho@odoo.com>
This update resolves an issue where the 'load order tour' would fail on slower browsers due to a race condition when jumping to a pinned message. The fix ensures the tour waits for the message to fully scroll into view before proceeding, preventing the tour from timing out and improving the user experience.
Original PR description
Jumping to the pinned message highlights it and asynchronously scrolls it into view. On a slow browser that scroll can land right after the tour scrolls to the bottom and pull the thread back up to the pinned message. The load-newer observer callback, which awaits the highlight scroll before re-checking visibility, then finds the bottom sentinel hidden and drops the fetch of the following messages, so the final :count(60) step never matches and times out. Wait for the pinned message to be scrolled into view and for its highlight to clear (its scroll is then finished) before scrolling to the bottom, so the jump scroll no longer competes. https://runbot.odoo.com/odoo/error/941509
This update resolves a technical problem within the mass mailing module that was causing loading errors even when components were already destroyed. The fix ensures smoother operation and prevents potential disruptions to the system. This change improves the overall stability of the Odoo platform.
Original PR description
Commit [1] introduced an erroneous `!` operator before status, that would throw loading errors even if the component was already destroyed (those errors should be masked). [1]: https://github.com/odoo/odoo/commit/51c7846f99eb061a1d71ca5d9967f5b01f5551a1
A recent update to the website builder was causing delays in updates due to a minor issue with how images were being loaded. This fix resolves a problem where the system would wait unnecessarily for image data, impacting builder responsiveness. The change ensures faster website updates and a smoother user experience.
Original PR description
Commit [1] introduced a cache for images' src in `_getValidSrc`. An undefined src will work but block the thread for a moment (up to seconds in some cases) until `fetch` returns a 404. The bug can be seen from the website builder: - Open the builder - Open your dev tools on the "network" tab - Click on the website logo => a failed fetch (404) appears and blocks the builder from being updated quickly. It happens because the element doesn't have any `dataset.originalSrc` (in this case, because it is an image field). [1]: https://github.com/odoo/odoo/commit/5164080cbadddaa7052dd4d2f997b944bd7a16e8 task-6247171 Forward-Port-Of: odoo/odoo#275078
This update resolves an issue where users couldn't correctly create or update company information through the portal. Specifically, it ensures company records are always created properly and allows editing of commercial fields for customers with a single parent company. This improves data accuracy and usability for our users.
Original PR description
### [FIX] portal: fix parent company handling Before this commit, users could not update the company name from the portal, and creating a company resulted in a regular contact instead of a company. This happened because the additional_values passed to mark the parent as is_company=True were overridden to False when the customer did not have a VAT number. This commit sets is_company after creating the company, ensuring the parent contact is always created as a company. ### [FIX] portal: make commercial fields editable Before this commit, there was no way to edit commercial fields after a user entered a company name in the address form. Setting a company name created a parent company, and editing commercial fields was blocked because the customer had a parent record. This commit allows commercial fields to be edited again for customer addresses whose parent company has only a single direct child.
This update resolves an issue where Chrome was incorrectly suggesting previously filled values in empty selection fields. The change prevents the browser from offering auto-completion, ensuring a cleaner and more predictable user experience when creating new records. This improves data entry consistency.
Original PR description
Chrome keeps suggesting autocompletion on empty selection field. https://github.com/odoo/odoo/commit/5e7bc4ab851dba3d2e0b965f69e06cfeacec5674 is the commit introducing `autocomplete="selectMenuAutocompleteOff"` and I don't know why this value has been chosen but Chrome seem to consider this token as invalid Steps to reproduce: - Put a selection field on a form view with Studio - Create a record, complete the selection field and save - Create a new record and click on the selection field Current Behaviour: Chrome keeps suggesting the previously filled values Desired Behaviour: No autocomplete from the browser. Forward-Port-Of: odoo/odoo#274086
This update fixes a problem where device login alerts weren't being displayed in the user's preferred language. The fix ensures that notifications, including email subjects and body content, are correctly translated based on the user's selected language setting. This improves the user experience and ensures consistent communication across all languages.
Original PR description
**Steps to reproduce:** - Enable 2FA - Change user language - Log in in another private window / device - Check the notification email of a login with another device - Email body/subject are not properly adapted to user language **Issue:** View manual rendering doesn't pass the user language. **Fix:** Add it to the context before `_render_template` and subject translation (reapply similar fix [1]). [1] https://github.com/odoo/odoo/commit/4d8d1736ca03a3d6b4e86cbc7463a79a284d1f3c opw-6042550 Forward-Port-Of: odoo/odoo#274333 Forward-Port-Of: odoo/odoo#261468
This update corrects a visual issue where header text was too dark on mobile, particularly when the menu was opened at the top of the page. The fix ensures consistent color contrast and readability across the website, improving the user experience. This was a result of a conversion update that inadvertently removed a key CSS setting.
Original PR description
Steps to reproduce: - Set the header position to "Over the Content" - Set the background color to the last preset (dark) - Go to mobile view => If you are at the top of the page when opening the menu, the text is too dark to be readable. When the conversion from publicWidget to interaction was done, a mistake was made when converting HeaderGeneral. `o_top_menu_collapse_shown` was not toggled on `header#top` anymore. Therefore some css was not applied, leading to issues with the color constrasts. This commit fixes this issue by fixing the selector in dynamicContent. task-6311038 Forward-Port-Of: odoo/odoo#271410 Forward-Port-Of: odoo/odoo#270560
This update adds email verification to the French PDP registration wizard. Previously, invalid email addresses were accepted, leading to potential errors later in the process. This change ensures data integrity and a smoother user experience for customers registering through the French PDP.
Original PR description
No verification was done on the contact email in the wizard but if the email is invalid the user would have an error later task-6344324 Forward-Port-Of: odoo/odoo#274065
This update fixes a discrepancy in how the tax obligation date is determined for Serbian VAT invoices. Previously, the default date was set to 'By Issuance Date,' which wasn't compliant with Serbian law. Now, the default is correctly set to 'By Delivery Date' as mandated by Article 16 of the Serbian VAT Law, ensuring accurate tax reporting.
Original PR description
According to[ Article 16 of Serbia's VAT Law](https://www.paragraf.rs/propisi/law-on-value-added-tax.html#:~:text=of%20Tax%20Obligation-,Article%2016,-A%20tax%20obligation), the tax obligation arises at the time of delivery of goods/services by default. 'By Issuance Date' only applies to a narrow set of services under Article 16(2a) Before: l10n_rs_tax_date_obligations_code defaulted to '3' (By Issuance Date) After: defaults to '35' (By Delivery Date) Upgrade: odoo/upgrade#10657 task-6348377 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#273608
10 changes
New functionality added to Odoo
This update introduces two new tax types – 'car tax' and 'representation tax' – specifically for the Latvian (l10n_lv) localization. These taxes allow for partial VAT deductions (50% and 40% respectively) and are linked to existing tax reports through updated tagging, improving financial reporting accuracy.
Original PR description
#### [IMP] l10n_lv: add tax report attachment tags Add tags for the tax report attachments added in the related enterprise PR and tag all existing taxes. They determine the transaction type. It also adds the special tag `Rep` that is irrelevant for the transaction type. From a base amount line tagged with `Rep` we only put 40% of the amount for the attachments. #### [IMP] l10n_lv: add a car and a representation purchase tax This commit adds 2 new taxes - "car tax": 50% of the VAT is deductible - "representation tax": 40% of the VAT is deductible #### references task-4251184 Forward-Port-Of: odoo/odoo#212698
Enhancements to existing features
This update ensures that when expenses are marked as duplicates, their associated bills are automatically recognized as duplicates as well. Previously, bill duplication was handled separately, leading to potential inconsistencies. This change streamlines expense management and improves data accuracy.
Original PR description
Bills linked to expenses now rely on the expense duplication logic instead of the standard bill duplication. This ensures that when two expenses are marked as duplicates, their corresponding bills are also recognized as duplicates. task-5262550
This update brings the Owl library, a key component of our website's image carousel functionality, to version 2.8.4. This includes a fix to prevent lost renders and enables compatibility with Node.js, improving the overall performance and stability of our website. These changes enhance the user experience and ensure consistent image display.
Original PR description
- [FIX] runtime: don't lose coalesced renders - [IMP] loadable with nodejs See https://github.com/odoo/owl/commits/owl-2.x/ for more details 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#275568
This update ensures that product prediction based on name works consistently for all users. Previously, the feature was running regardless of whether users had disabled it in their settings, which could lead to confusion. Now, product prediction will automatically run for community users and will respect the user's preference as defined by the 'predict_bill_product' setting.
Original PR description
Context: There was an enterprise field `predict_bill_product` allowing users to toggle product prediction based on line label. Before this commit, product prediction by name was running without taking into account the value of this field, which could confuse users who had disabled the feature in settings. This commit makes product prediction by name depend on this field. For community users, the prediction will run by default. no-task --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#267138
Resolved issues and error corrections
This update corrects a technical issue where an empty distribution model was being incorrectly merged. The change removes unnecessary merging logic, preventing errors that occurred when attempting to merge empty models. This ensures smoother operation and avoids potential data inconsistencies.
Original PR description
It is possible to have an empty distribution model, there is therefore ne need to merge it, especially since it raises when doing this ```python self.env['account.analytic.plan'].mapped(lambda p: p._column_name()) ``` Forward-Port-Of: odoo/odoo#275839
This update addresses minor issues and improvements within the Odoo spreadsheet component. Specifically, it fixes a problem with conditional formatting and ensures the component is running the latest version (18.3.55). This ensures consistent spreadsheet functionality across Odoo.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/dc14a7ccf [REL] 18.3.55 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/dc14a7ccf [REL] 18.3.55 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/af3978059 [FIX] conditional_formatting: handle zero color scale midpoint [Task: 6312961](https://www.odoo.com/odoo/2328/tasks/6312961) https://github.com/odoo/o-spreadsheet/commit/d1364a37e [FIX] config: filter-out claude folder from prettier [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> 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: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya (rmbh) <rmbh@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@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> Co-authored-by: Marceline Thomas (matho) <matho@odoo.com>
This update fixes an issue where discount lines in the TBAI XML file generated for tax reporting were incorrectly showing negative import values. The fix ensures that all monetary values, including discounts, are consistently represented as positive numbers, aligning with the system's expected format. This prevents potential errors in tax reporting and data accuracy.
Original PR description
Step to reproduce: - install pos_discount and l10n_es_edi_tbai_pos with demo data - start pos, add a product and a discount of 10% - fulfill the order - go to backend and open that order - from…
Step to reproduce: - install pos_discount and l10n_es_edi_tbai_pos with demo data - start pos, add a product and a discount of 10% - fulfill the order - go to backend and open that order - from "TicketBai" page, open the "TicketBAI Post File" xml file Observation: - `ImporteUnitario` and `ImporteTotal` were exported as positive values for discount lines. cause: - Commit [1] assumed tax details are always positive. - This is not generally true, in case we have price_unit < 0 - The logic relied on `is_refund`, which depends on `qty * price`. - `_l10n_es_tbai_get_values` then multiplied values by `-1` again for refunds. https://github.com/odoo/odoo/blob/e751fa1e010dbda63903d598048ef415709b4af4/addons/l10n_es_edi_tbai_pos/models/pos_order.py#L177-L181 - For discount lines, `is_refund = True` and `price = -10`, resulting in `-10 * -1 = 10`. Fix: - Ensure tax detail values are always returned as positive values, matching the assumption introduced in commit [1] [1] https://github.com/odoo/odoo/commit/03d55104e49aa65aa4c6475e199747fe9132e754 opw-6226003 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#265777
This update fixes a technical issue that prevented push notifications from renewing properly when the browser refreshed the subscription. The system now correctly handles subscription renewals, ensuring that users continue to receive notifications as expected. This improves the reliability of our messaging system.
Original PR description
When a push subscription is renewed by the browser (typically every few days), the pushsubscriptionchange event fires and the service worker attempts to re-register the new subscription endpoint via…
When a push subscription is renewed by the browser (typically every few days), the pushsubscriptionchange event fires and the service worker attempts to re-register the new subscription endpoint via register_devices(). However, the VAPID public key was missing from the request kwargs. The server-side register_devices() always validates the VAPID key first and raises InvalidVapidError when it is absent. This caused the renewed subscription to never be saved in the database, silently breaking push notifications after the first subscription renewal. Fix by extracting the applicationServerKey from the new subscription's options and encoding it as a base64url string (without padding) — matching the existing logic in webclient.js _arrayBufferToBase64(). Description of the issue/feature this PR addresses: Current behavior before PR: Subscriptions don't get renewed causing push notifications to stop eventually. Desired behavior after PR is merged: Subscriptions get renewed successfully. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#275217
This update fixes an issue where attachments linked to invoices through journals weren't being sent via Peppol. The fix ensures that all attachments associated with invoices are correctly transmitted, improving invoice delivery processes. This resolves a previous limitation impacting Peppol integration.
Original PR description
When an attachment is added to an email template and is linked to a journal, and then you try to send an invoice, the attachment is shown in the attachments box but is not sent via peppol, the reason is that we were filtering to send only manually added attachments, and the email attachment was not considered "manual". task-id-6241354 Forward-Port-Of: odoo/odoo#272472
This update fixes a default setting in the Serbian VAT integration (l10n_rs_edi) to align with Serbian tax law. Previously, the tax obligation date was incorrectly set to 'By Issuance Date'. Now, it defaults to 'By Delivery Date' as required by Article 16 of the Serbian VAT Law, ensuring accurate VAT reporting.
Original PR description
According to[ Article 16 of Serbia's VAT Law](https://www.paragraf.rs/propisi/law-on-value-added-tax.html#:~:text=of%20Tax%20Obligation-,Article%2016,-A%20tax%20obligation), the tax obligation arises at the time of delivery of goods/services by default. 'By Issuance Date' only applies to a narrow set of services under Article 16(2a) Before: l10n_rs_tax_date_obligations_code defaulted to '3' (By Issuance Date) After: defaults to '35' (By Delivery Date) Upgrade: odoo/upgrade#10657 task-6348377 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#273608
18 changes
New functionality added to Odoo
This update introduces new tax reporting capabilities for Latvia, specifically adding 'car tax' and 'representation tax' with associated VAT deduction rules. It also standardizes tax report attachment tagging for improved transaction type determination, impacting how VAT is processed.
Original PR description
#### [IMP] l10n_lv: add tax report attachment tags Add tags for the tax report attachments added in the related enterprise PR and tag all existing taxes. They determine the transaction type. It also adds the special tag `Rep` that is irrelevant for the transaction type. From a base amount line tagged with `Rep` we only put 40% of the amount for the attachments. #### [IMP] l10n_lv: add a car and a representation purchase tax This commit adds 2 new taxes - "car tax": 50% of the VAT is deductible - "representation tax": 40% of the VAT is deductible #### references task-4251184
Enhancements to existing features
This update improves the performance and reliability of our website's image galleries by upgrading the Owl library to version 2.8.4. Specifically, it fixes a bug that prevented the loss of rendered images and adds support for running Owl with Node.js, enhancing flexibility.
Original PR description
- [FIX] runtime: don't lose coalesced renders - [IMP] loadable with nodejs See https://github.com/odoo/owl/commits/owl-2.x/ for more details 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#275568
Resolved issues and error corrections
This update addresses a technical issue where an empty distribution model could cause errors. The fix prevents unnecessary merging of these models, streamlining the system and avoiding potential problems. This improves the stability and efficiency of the analytic accounting features.
Original PR description
It is possible to have an empty distribution model, there is therefore ne need to merge it, especially since it raises when doing this ```python self.env['account.analytic.plan'].mapped(lambda p: p._column_name()) ```
This update corrects a technical issue where some users were unable to access certain elements within the partner view due to inconsistent access rights. The fix ensures all users, regardless of their group membership, can properly interact with the relevant features. This improves overall system usability and prevents potential data access problems.
Original PR description
This PR fixes the following warning (similar ones with different XMLID) which occurred during system update. ``` WARNING ? odoo.addons.base.models.ir_ui_view: <b>Access Rights…
This PR fixes the following warning (similar ones with different XMLID) which occurred during system update.
```
WARNING ? odoo.addons.base.models.ir_ui_view: <b>Access Rights Inconsistency</b><br/>This view may not work for all users: some users may have a combination of
groups where the elements <b><tt><button></tt></b> are displayed, but they depend on the field <b><tt>loyalty_card_count</tt></b> that is not accessible. You might fix this by mo
difying user groups to make sure that all users who have access to those elements also have access to the field, typically via group implications. Alternatively, you could adjust the “<
i>groups</i>” or “<i>invisible</i>” attributes for these fields, to make sure they are always available together.<br/>Debugging information:<br/>- field “loyalty_card_count” is accessib
le for groups: 'base.group_user'<br/>- element “<button name="action_view_loyalty_cards" type="object" class="oe_stat_button" icon="fa-money"
groups="base.group_system,sales_team.group_sale_salesman" invisible="loyalty_card_count == 0"/>” is shown in the view for groups: ('base.group_portal' & &
#39;base.group_system') | ('base.group_public' & 'base.group_system') | ('base.group_system' & 'base.group_user') | ('base.group_system&#
39; & 'base.group_partner_manager') | 'sales_team.group_sale_salesman'
View error context:
{'file': '/tmp/addons/account_invoice_import_simple_pdf/views/res_partner.xml',
'line': 1,
'name': 'res.partner form',
'view': ir.ui.view(15203,),
'view.model': 'res.partner',
'view.parent': ir.ui.view(15202,),
'xmlid': 'view_partner_property_form_move'}
```
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update corrects a technical issue in the Odoo accounting system that could have caused errors during payment processing. The fix ensures the system correctly identifies the 'company' record instead of the 'self' record, preventing potential errors and improving payment reliability. This resolves a minor bug impacting financial transactions.
Original PR description
This commit https://github.com/odoo/odoo/commit/f54d6918d8ef5aa143e63b7dc79e8c3e3d8583f8 introduced a bug, calling _get_batch_payment_sequence_values on self instead of company triggering possible ensure_one exception if self is not one company.
During checkout, users experienced a frustrating issue where the 'Save Address' button would get stuck in a loading state when navigating back to the address form. This was caused by the browser's cache incorrectly preserving a disabled button state. This update ensures the button is correctly reset, providing a smooth and reliable checkout experience.
Original PR description
When the address form is submitted, the button is disabled and a spinner is shown while the POST is in flight. On success, redirect() is called, which schedules a navigation via location.assign()…
When the address form is submitted, the button is disabled and a spinner is shown while the POST is in flight. On success, redirect() is called, which schedules a navigation via location.assign() asynchronously. The browser's bfcache can snapshot the page at this point — while the button is still disabled — and restore that snapshot when the user presses back, leaving the button stuck in the loading state. Fix: re-enable the button and remove the spinner before branching on result.redirectUrl so bfcache always captures a clean button state. In Odoo master this was fixed implicitly by PR odoo/odoo#201730 (commit 1d79eddc62a0), which refactored the widget to use the Interaction class with makeButtonHandler(), which always restores the button after the handler's promise resolves. Description of the issue/feature this PR addresses: Current behavior before PR: During checkout, when pressing the return arrow to go back into the address editing panel, the "Save Address" button gets stuck in loading forever. Desired behavior after PR is merged: The "Save Address" button is shown normal. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue that was preventing batch payments from processing correctly. The fix corrects a faulty call within the Odoo system, ensuring that payment sequences initialize properly. This improves the reliability of batch payment operations.
Original PR description
Fix a wrong call to self breaking ensure_one Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update adjusts Dominican Republic (l10n_do) income tax withholding rates to comply with Law 30-26, effective July 1st, 2026. The standard rate for service fees and rentals has increased from 10% to 15%, reflecting new tax regulations. This ensures accurate tax reporting for Dominican businesses using Odoo.
Original PR description
## Description Law no. 30-26 of June 18, 2026 (art. 17) amended article 309 of the Dominican Tax Code. Effective **July 1st, 2026**: - The income tax (ISR) withholding on fees, commissions and other…
## Description
Law no. 30-26 of June 18, 2026 (art. 17) amended article 309 of the Dominican Tax Code. Effective **July 1st, 2026**:
- The income tax (ISR) withholding on fees, commissions and other remunerations for services rendered by individuals not in a dependency relationship is raised from **10% to 15%** (payment on account).
- The ISR withholding on rentals of movable and immovable property paid to individuals is raised from **10% to 15%** (now a definitive payment).
Official references:
- Amended article 309 CT (art. 17 of the law): "a) 15% *(antes 10%)* ... alquiler o arrendamiento ... provistos por personas físicas ... pago único y definitivo; b) 15% *(antes 10%)* sobre los honorarios, comisiones y demás remuneraciones y pagos por la prestación de servicios en general provistos por personas físicas, no ejecutados en relación de dependencia ... pago a cuenta."
- Law 30-26 at the Ministry of Finance: https://www.hacienda.gob.do/marco-legal/ley-no-30-26/
- PwC summary quoting the new art. 309 scale ("15%, previously 10%"): https://www.pwc.com/ia/es/publicaciones/Noticias-Tax-Legal/Tax-and-legal-2026/modificaciones-Ley-30-26.pdf
- DGII implementation calendar (notice 10-26 — calendar only, the rates are in the law text): https://dgii.gov.do/publicacionesOficiales/avisosInformativos/Documents/2026/10-26.pdf
- DGII confirming the new percentages are in force since 2026-07-01: https://ayuda.dgii.gov.do/conversations/discusiones/retenciones-segun-ley-3026/6a42be2e3365d30845e40234
## Implementation notes
- The existing XML IDs (`ret_10_income_person`, `ret_10_income_rent`) are kept unchanged, so on existing databases the standard chart template reload (`_pre_reload_data`) replaces the outdated 10% taxes through the usual `[old]` renaming mechanism.
- The tax group `tax_group_person_services` labels are updated from "(10%)" to "(15%)" accordingly.
- No other article 309 rates changed for the taxes present in this template (5% government, 10% dividends, 2% N07-07, 27% remittances remain in force).
This is the first contribution by Grupo de Consultoria Henca (https://www.consultoriahenca.com); the corporate CLA signature is included in `doc/cla/corporate/consultoriahenca.md` as instructed by `doc/cla/sign-cla.md`.
## Related PRs
- 17.0: https://github.com/odoo/odoo/pull/275986
- 18.0: https://github.com/odoo/odoo/pull/275987
- 19.0: https://github.com/odoo/odoo/pull/275988This pull request updates the core spreadsheet component within Odoo. It addresses several technical improvements and bug fixes related to spreadsheet functionality, specifically focusing on conditional formatting and internal configuration. These updates ensure the spreadsheet component continues to operate smoothly and reliably.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/9183e3668 [REL] 18.0.74 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/9183e3668 [REL] 18.0.74 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/ec8874600 [FIX] conditional_formatting: handle zero color scale midpoint [Task: 6312961](https://www.odoo.com/odoo/2328/tasks/6312961) https://github.com/odoo/o-spreadsheet/commit/8278af136 [FIX] config: filter-out claude folder from prettier [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> 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: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya (rmbh) <rmbh@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@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> Co-authored-by: Marceline Thomas (matho) <matho@odoo.com>
This update ensures that the Klipy search placeholder now displays "Search KLIPY" as required by Klipy's attribution guidelines. This improves the user experience and maintains compliance with Klipy's documentation. The change was made to align with the platform's integration with Klipy.
Original PR description
Klipy requires attribution with "Search KLIPY" as the default placeholder [1]. This commit complies these guidelines. [1]: https://docs.klipy.com/attribution Forward-Port-Of: odoo/odoo#275677
A recent change blocked users from creating social media posts within event communications. This update removes a restriction that was causing the issue, allowing users to once again add social media posts to event communication templates. The change was initially intended to limit template edits but inadvertently caused broader functionality problems.
Original PR description
Issue: User goes to Event.event Form -> communication tab -> add line - can no longer create a social post in template communication tab Fix: remove "no_create_edit: True" to the associated field in the xml to unblock creation of new mail.templates Reverted from commit (odoo/odoo@f58e9f97192ac0ff8d159377494d6c68f871d20b) due to not being able to make social media posts on event communication tab. I originanlly suggested this change because WA Templates need more limitations for creation and edits. This then blocked other creation and edits that rely on this flow. opw-6334168
This update resolves an issue where activity descriptions weren't consistently appearing in all tabs after duplicating a chat window. The fix removes unnecessary computed fields from activity broadcasts, ensuring descriptions are accurately reflected across all connected tabs. This improves the user experience for sharing and receiving activity updates.
Original PR description
**Steps to reproduce:** - Install Contacts app - Open any record - Go to the chatter - Create an activity with a description - Duplicate the tab - Go back to the initial tab - Description doesn't…
**Steps to reproduce:**
- Install Contacts app
- Open any record
- Go to the chatter
- Create an activity with a description
- Duplicate the tab
- Go back to the initial tab
- Description doesn't appear anymore
- Refreshing shows it but will remove it from the other tab
**Issue:**
Behavior comes from the broadcasting of activity changes between tabs `new browser.BroadcastChannel("mail.activity.channel");`.
Computed fields are not recomputed on the receiver side after value insertion in `_onActivityBroadcastChannelMessage` (also related components are not (re)mounted, e.g. when a new activity is created the other tab doesn't show it without a refresh).
This means that `isNoteEmpty` keeps its default value `true` (added by `this.toData()`) and the `note` stays hidden here [1]:
```xml
<div t-if="!props.activity.isNoteEmpty" class="o-mail-Activity-note text-break" t-out="props.activity.note"/>
```
**Fix:**
Remove computed fields in activity `serialize` before broadcasting them to ensure they don't force the default value.
(note installing `calendar` in 19.3+ removes this issue due to [2] which overrides the condition on `isNoteEmpty`)
[1] https://github.com/odoo/odoo/commit/eb9f0658c3da1a9fef69f1cc1117c2d44f9d61b1
[2] https://github.com/odoo/odoo/commit/44e2c2c5ca07849fd8964140f3ca61122c47f0c6
opw-6247412This update resolves an issue where animated GIFs used within image shapes wouldn't play correctly in Firefox and Safari. The team added a technical workaround to ensure GIFs now function as expected, expanding the usability of image shapes with animated content.
Original PR description
Animated GIFs applied with an image shape freeze on Firefox and Safari when the shape's SVG is otherwise static. A dummy `<animateMotion dur="1ms" repeatCount="indefinite"/>` child on the <image> element keeps the animation running so the GIF plays. This hack was introduced in [1] but was missing from most shapes. This commit adds it to every <image> element that lacked it so any shape can be used with a GIF. task-5967171 [1]: https://github.com/odoo/odoo/commit/144e5ef799060da860a5fb1fbe0fd009919afe79
This update corrects a minor error in the turnstile template that prevented users from consistently controlling the display mode via the ?cf=show parameter. The fix ensures the turnstile appears as intended, resolving a visual inconsistency. This update is a safe forward-port from the 17.0 release.
Original PR description
Stable forward-port source patch. Issue - The turnstile template uses a misspelled variable name in data-appearance: appeareance. - JS provides appearance. - Because of this mismatch, data-appearance always falls back to interaction-only and ?cf=show cannot force always mode. Fix - Replace appeareance with appearance in the turnstile template. Why stable-safe - One-line template fix. - No API/model/signature changes. - No behavior change outside the intended appearance selection. This is intended as the 17.0 source fix so forward-porting can propagate to upper versions. Related: odoo/odoo#273306 and odoo/odoo#273652 Forward-Port-Of: odoo/odoo#273706
This update fixes a potential issue where loading certificates could cause unexpected errors and crashes in Odoo. By implementing safeguards, the system now gracefully handles malformed certificates, preventing tracebacks and ensuring smoother operation. This improves the overall reliability of certificate management within Odoo.
Original PR description
Loading a certificate could raise an unhandled exception instead of failing gracefully. Clearing the content, uploading a bundle with a corrupted certificate block, or handling certificates with unsupported signature algorithms or malformed extensions all could end up in a traceback. Guard those paths to ensure loading errors are handled. opw-6370529 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where event registration emails were directing users to the wrong website. The problem stemmed from a misconfigured base URL, leading to incorrect links. This change ensures that event registration emails now accurately reflect the event's assigned website, improving user experience and event management.
Original PR description
In Multiwebsite settings, when the public user interactions needs email generation (appointment or event flow), the email links are generated with a base url that does not corresponds to the one from which the request started. - Have website A and website B - Create an event and assign it to website B - As public user, access the event and register to it - Check the generated email Issue: button links in the email will redirect to the wrong website, so users will encounter an issue when managing the event. This occurs because the record `event.registration` has no website_id field and the base url is taken from the company default website (website A) opw-4146760 opw-4336369 Forward-Port-Of: odoo/odoo#274051
This update fixes a discrepancy in the default tax date obligation for Serbian VAT invoices. Previously, the system defaulted to a 'By Issuance Date' setting, which wasn't compliant with Serbian law. Now, it correctly defaults to 'By Delivery Date' as mandated by Article 16 of the Serbian VAT Law, ensuring accurate tax reporting.
Original PR description
According to[ Article 16 of Serbia's VAT Law](https://www.paragraf.rs/propisi/law-on-value-added-tax.html#:~:text=of%20Tax%20Obligation-,Article%2016,-A%20tax%20obligation), the tax obligation arises at the time of delivery of goods/services by default. 'By Issuance Date' only applies to a narrow set of services under Article 16(2a) Before: l10n_rs_tax_date_obligations_code defaulted to '3' (By Issuance Date) After: defaults to '35' (By Delivery Date) Upgrade: odoo/upgrade#10657 task-6348377 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#273608
Features or functions removed from Odoo
This update removes an unnecessary and always-true check within the Odoo POS self-ordering module. The previous code was designed to verify if the self-ordering mode was 'qr_code', but this option is no longer valid. This change streamlines the code and improves efficiency without impacting functionality.
Original PR description
Description of the issue/feature this PR addresses: Removed obsolete code checking "this.config.self_ordering_mode !== 'qr_code'". Since "qr_code" is not a valid value of the "self_ordering_mode" selection field. The condition is always true.
9 changes
Enhancements to existing features
This update enhances the display of Peppol error messages within Odoo. Previously, technical error details were difficult for users to understand and act upon. Now, errors are presented as a clear, human-readable HTML list in the chatter, making it easier to diagnose and resolve issues related to Peppol integration.
Original PR description
Before this commit, Peppol error messages (e.g. Schematron errors) were logged in the chatter as a single unformatted line and without any humanization. The errors were too technical and the user could not easily know what action to take. This PR splits the raw error payload into individual entries, maps known error codes to human-readable explanations, and renders them as an HTML list in the chatter. task-6144909 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
This update ensures the Odoo spreadsheet component is running the latest version, addressing potential bugs and improving performance. The changes include fixes for conditional formatting and updates to the underlying technology. This ensures the spreadsheet functionality continues to operate smoothly within Odoo.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/209fe7cdc [REL] 17.0.102 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/209fe7cdc [REL] 17.0.102 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/23f83e0cb [FIX] conditional_formatting: handle zero color scale midpoint [Task: 6312961](https://www.odoo.com/odoo/2328/tasks/6312961) https://github.com/odoo/o-spreadsheet/commit/b016fb42b [FIX] config: filter-out claude folder from prettier [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/bc58e58d7 [REL] Ghost-rel [](https://www.odoo.com/odoo/2328/tasks/) https://github.com/odoo/o-spreadsheet/commit/22a817fe5 [FIX] config: bump node version in GH action [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> 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: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya (rmbh) <rmbh@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@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> Co-authored-by: Marceline Thomas (matho) <matho@odoo.com>
This update fixes an issue where the Worldline Cofidis payment method was incorrectly mapped to an outdated payment product ID. The change updates the mapping to the latest ID specified in Worldline documentation, ensuring accurate payment processing and preventing potential payment failures. This improves the reliability of Worldline payments.
Original PR description
opw-6368979 Description of the issue/feature this PR addresses: Update the Worldline Cofidis payment method mapping to match the latest payment product ID defined in the Worldline documentation. Current behavior before PR: The Cofidis payment method was mapped to the outdated payment product ID (3012), causing payment requests to use an incorrect mapping. Desired behavior after PR is merged: The Cofidis payment method is mapped to the correct payment product ID (5129) as per the latest Worldline documentation, ensuring payment requests use the correct mapping.
This update fixes a problem where users were repeatedly receiving duplicate vendor bills. The system was incorrectly creating new invoices for each incoming message, leading to unnecessary processing. Now, the system checks for existing invoices before processing new ones, preventing duplicates and improving efficiency.
Original PR description
Many users were receiving duplicate vendor bills. The issue was that duplicates were never detected in the receiving flow. Every incoming message returned by the proxy was processed and turned into a new `account.move`, even if it had already been imported previously. This commit filters out messages whose UUID already matches an existing `account.move` before processing them, and acknowledges those duplicates on the IAP side so they are not received again on the next run. task-5930116 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a technical issue related to how the Odoo website modules (website, website_sale) process data. By replacing synchronous `forEach` loops with standard `for` loops, the system's performance has been enhanced. This ensures smoother operation and avoids potential errors within these key website functionalities.
Original PR description
*: website, website_sale `forEach` is a synchronous operation, so it doesn't support promises. We refactor its usage to use `for` loops. task-4794299
This update resolves an issue where Odoo incorrectly identified valid invoices with negative tax amounts as credit notes when importing UBL or Factur-X (CII) invoices. The change updates how Odoo interprets tax amounts during import, ensuring invoices are correctly recognized and processed. This improves data accuracy and prevents misclassification of financial documents.
Original PR description
Before this commit: - When importing a **UBL** or **Factur-X (CII)** invoice, Odoo determines whether the document should be imported as an invoice or a credit note based on the `TaxExclusiveAmount…
Before this commit: - When importing a **UBL** or **Factur-X (CII)** invoice, Odoo determines whether the document should be imported as an invoice or a credit note based on the `TaxExclusiveAmount (UBL)` /` TaxBasisTotalAmount (Factur-X)`. - In some rare cases, a valid invoice can contain a negative `TaxExclusiveAmount` / `TaxBasisTotalAmount` while still having a positive `TaxInclusiveAmount` / `GrandTotalAmount`. - In such situations, Odoo incorrectly imports the document as a credit note. Technical reason: - The method `_get_import_document_amount_sign()` uses `TaxExclusiveAmount` / `TaxBasisTotalAmount `to determine whether the imported document is an invoice or a refund. After this commit: - **UBL** now uses `TaxInclusiveAmount` instead of `TaxExclusiveAmount`, and **Factur-X** now uses `GrandTotalAmount `instead of `TaxBasisTotalAmount` to determine whether the document should be imported as an invoice or a credit note. - Prevent valid invoices with negative `TaxExclusiveAmount` / `TaxBasisTotalAmount` from being incorrectly converted into credit notes. Task-6321262
This update fixes an issue where self-billing invoices created in sales journals caused traceability problems. It now ensures unique invoice sequences are used per partner, aligning with recent versions and preventing confusion during accounting firm workflows with quick edit mode. This improves data accuracy and reporting.
Original PR description
This PR handles 2 cases : ===== PART 1 ===== Self-billing bill sequences should be unique per partner, as implemented in v19+. This PR backports that behavior to 17.0. ===== PART 2 ===== Previously, the `is_self_billing` option on `account.journal` was available only for purchase journals. This caused an issue when importing a self-billing invoice into a regular sales journal with quick edit mode (accounting firm) enabled. In such cases, the newly created invoices would use the self-billing sequence pattern, leading to traceability issues. This PR allows the creation of self-billing sales journals to prevent this issue. task-6103142 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a confusing error message related to zero amounts in account reconciliation settings. The change ensures that error messages accurately reflect the type of amount being validated, leading to a clearer and more user-friendly experience. This improves the accuracy of reconciliation processes.
Original PR description
In _validate_amount(), setting a "Percentage of balance" line to 0 raises "Statement line percentage can't be 0", and setting a "Percentage of statement line" to 0 raises "Balance percentage can't be 0". Align each error message with the amount type being validated. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Documentation and clarification updates
This update formally recognizes the contributions from Royal Import & Export Ltd and Colin Van den Akker by recording their signed Contributor License Agreements. This allows Odoo to accept code changes and features from this valuable contributor. The CLA signatures are now stored for future use and to ensure compliance with Odoo's open-source licensing.
Original PR description
Description of the issue/feature this PR addresses: Contributor License Agreement signatures for Royal Import & Export Ltd and Colin Van den Akker, per https://github.com/odoo/odoo/blob/17.0/doc/cla/sign-cla.md - Corporate CLA: `doc/cla/corporate/royalimport.md` - Individual CLA: `doc/cla/individual/colinvandenakker.md` Targeted at **17.0** (oldest supported LTS) so robodoo can forward-port to 18.0/19.0. Current behavior before PR: No corporate or individual CLA on file for Royal Import / Colin Van den Akker. Desired behavior after PR is merged: CCLA and ICLA are recorded so contributions from https://github.com/royalimport can be accepted. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr