Daily updates from Odoo
Navigate
Branch
Monday, October 20, 2025
211 changes
16 changes
Enhancements to existing features
The website editor now detects when a browser cannot support image filters and disables that option instead of showing an error. This improves editing reliability for users on systems where WebGL is unavailable, such as some recent Chrome on Linux setups.
Original PR description
On recent versions of Chrome for Linux (v140+), the old SwiftShader software fallback for WebGL has been removed. As a result, new window.WebGLImageFilter() now throws if no GPU context is available, typically when WebGL is disabled or unsupported. Since the application cannot enable WebGL from JavaScript, this commit improves the user experience by detecting the absence of a WebGL context early and disabling image filters in edit mode. Instead of raising a traceback, the editor now skips the filter feature and can optionally display a friendly message explaining that WebGL is required to use image filters. This avoids runtime errors and ensures a more robust behavior on platforms where WebGL is unavailable. task-5117584 Forward-Port-Of: odoo/odoo#232009 Forward-Port-Of: odoo/odoo#229705
Odoo now supports Uruguay's reduced VAT category for applicable sales, helping businesses meet local electronic invoicing and tax reporting requirements. The update adds the needed tax reporting grid and ensures reduced-rate VAT amounts are represented correctly in official tax data.
Original PR description
To fully comply with regulatory requirements, we need to support an additional category called "Reduced Tax Rate" when a product line has a Reduced VAT rate (e.g., 20%) for sales of goods and…
To fully comply with regulatory requirements, we need to support an additional category called "Reduced Tax Rate" when a product line has a Reduced VAT rate (e.g., 20%) for sales of goods and services to final consumers when payment is made by debit card or electronic money instrument (and other specific reductions in similar cases).
1. Detecting "Reduced Tax Rate":
* Identify product lines with a VAT rate that is neither 0% (exempt), 10% (minimum), nor 22% (basic). Any VAT rate outside these three should be considered "Reduced Tax Rate".
2. Modifying XML Output:
* In the <Totales> section of the XML, include the total amount of VAT under the "Reduced Tax Rate" in the <MntIVAOtra> tag.
* Example: xml <MntIVAOtra>140</MntIVAOtra> (where 140 corresponds to the VAT calculated at the reduced tax rate, e.g., 20%).
* For each product line using "Reduced Tax Rate," set the <IndFact> tag to 4: xml <IndFact>4</IndFact>
*Ensure the total amount reflects the base amount plus the VAT under "Reduced Tax Rate".
3. Tax Grid for Configuration:
*Add a new tax grid called Sales Reduced VAT to be used for the tax configuration of the "Reduced Tax Rate."
* This will ensure proper reporting and consistency in tax declarations.
* The new tax grid should be selectable when configuring other taxes.
Odoo Implementation Considerations:
* The tax computation logic in Odoo already supports defining taxes at different rates.
* Adapt the XML generation logic to check for product lines with a non-standard VAT rate and apply the necessary modifications. Ensure the final totals in the XML align with Odoo's computed tax amounts.
Task latam side: 1330
Task Adhoc side: 52999
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#231642
Forward-Port-Of: odoo/odoo#221073Uruguayan electronic invoices can now identify and report VAT rates outside the standard exempt, minimum, and basic rates. This improves tax declaration accuracy by including reduced-rate VAT totals in the official invoice XML and adding a dedicated tax grid for configuration.
Original PR description
1) Detecting "Reduced Tax Rate": * Identify product lines with a VAT rate that is neither 0% (exempt), 10% (minimum), nor 22% (basic). Any VAT rate outside these three should be considered "Reduced…
1) Detecting "Reduced Tax Rate":
* Identify product lines with a VAT rate that is neither 0% (exempt), 10% (minimum), nor 22% (basic). Any VAT rate outside these three should be considered "Reduced Tax Rate".
2) Modifying XML Output:
* In the `<Totales>` section of the XML, include the total amount of VAT under the "Reduced Tax Rate" in the `<MntIVAOtra>` tag.
* Example: ```xml <MntIVAOtra>140</MntIVAOtra> ``` (where 140 corresponds to the VAT calculated at the reduced tax rate, e.g., 20%).
* For each product line using "Reduced Tax Rate," set the `<IndFact>` tag to `4`: ```xml <IndFact>4</IndFact> ```
* Ensure the total amount reflects the base amount plus the VAT under "Reduced Tax Rate".
3) Tax Grid for Configuration:
* Add a new tax grid called Sales Reduced VAT to be used for the tax configuration of the "Reduced Tax Rate."
* This will ensure proper reporting and consistency in tax declarations.
* The new tax grid should be selectable when configuring other taxes.
Odoo Implementation Considerations:
* The tax computation logic in Odoo already supports defining taxes at different rates.
* Adapt the XML generation logic to check for product lines with a non-standard VAT rate and apply the necessary modifications. Ensure the final totals in the XML align with Odoo's computed tax amounts.
Task latam side: 1330
Task Adhoc side: 52999
Forward-Port-Of: odoo/enterprise#97223
Forward-Port-Of: odoo/enterprise#91392Peruvian customer records no longer require a ZIP code, reflecting that ZIP codes are not commonly used in Peru. This makes customer data entry easier and helps avoid unnecessary validation issues for Peruvian addresses.
Original PR description
As ZIP codes are not widely used in Peru, the requirement for a ZIP code to be provided for a Peruvian customer should not be present. task-5012593 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#223157
Resolved issues and error corrections
Starshipit shipping requests now include the customer city or suburb information required by some carriers. This prevents supported services such as NZ Post Domestic from being incorrectly unavailable during shipping setup.
Original PR description
Current behaviour: --- When using Starshipit, city is not included in the payload sent to the API. This causes an error for some delivery services. Steps to reproduce: --- 1. Install delivery_starshipit 2. Create starshipit Shipping Method (using Starshipit API key) 3. Set up only "NZ Post Domestic" in Starshipit portal. 4. Click on "Select a service linked to your starshipit account" 5. Error: There are no shipping services available Cause of the issue: --- Some delivery services (like NZ Post Domestic) require a city/suburb field. In Australia/New Zealand suburb is used in the city field. opw-5155401 Forward-Port-Of: odoo/enterprise#97212
The customer preview for shared projects now matches what portal customers actually see. When billing is limited to validated timesheets, draft or unvalidated timesheets are no longer shown in the preview, reducing confusion and preventing misleading customer-facing information.
Original PR description
### Issue: Due to this issue, in the project sharing, the customer preview doesn't reflect the actual behaviour of the portal view. It shows non-validated timesheets even if invoicing policy is…
### Issue: Due to this issue, in the project sharing, the customer preview doesn't reflect the actual behaviour of the portal view. It shows non-validated timesheets even if invoicing policy is validated timesheets only. #### To reproduce: 1- Create a db with sale_project and sale_timesheet_enterprise 2- Configure invoicing policy to validated timesheets only 3- Create a service product: - Create on Order: Project & Task - Invoicing policy: Based on Timesheets 4- Create a Quotation for the product and confirm it 5- Open project from smart button 6- Share project with a portal user with Edit access 7- Open tasks, and add two timesheets to the task 8- Open timesheet app, and validate one of the timesheets 9- From project page, click on Customer preview 10- In preview, open the task. You can see both timesheets which is a different behaviour if you view the project using portal user. Using portal user, only validated timesheets are shown. ### Cause: The timesheets are filtered here to only show validated timesheets: https://github.com/odoo/enterprise/blob/8223ed0765c6064b88280656a5ab6b13ca9a431f/sale_timesheet_enterprise/models/project_task.py#L73-L91 However, it is filtered only if user is portal. In customer preview the user is still the internal user, as a result the timesheets will not be filtered. To fix that we can check if project_sharing_id exist in context to filter timesheets. opw-5093339 Forward-Port-Of: odoo/enterprise#97470
This fix restores the bank account selection field when creating NACHA payments. It ensures users can choose the correct bank account, preventing payment setup issues for U.S. NACHA workflows.
Original PR description
Accidentally removed in a061a2b82a967ca2 which caused the bank account selection field to not show when doing a NACHA payment. (Found when working on task 5052996) Forward-Port-Of: odoo/enterprise#97319
The website shop search box now displays product search text with apostrophes correctly, such as “desk's lamp” instead of showing encoded characters. This removes a small but visible display issue and improves the shopping experience.
Original PR description
currently, we use `t-out` to set the placeholder, which escapes HTML so `desk's lamp` becomes `desk's lamp` Fix: - replace `t-out` with `t-value` to properly store placeholder. **Before** <img width="513" height="270" alt="image" src="https://github.com/user-attachments/assets/92046e41-e471-4eba-9510-a9ea91eeccd8" /> **After** <img width="472" height="252" alt="image" src="https://github.com/user-attachments/assets/79157a51-adac-4c95-8e39-a0caa7cf1537" /> opw-5136972 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#230961
A test helper now checks whether the editor component is available before trying to use it. This prevents automated website form tests from getting stuck, improving reliability without changing customer-facing behavior.
Original PR description
Steps to reproduce
==================
Run the test test_contactus_form_email_stay_dynamic
The ready "odoo.isTourReady('...')" code was always falsy
Cause of the issue
==================
website_form_editor.js import @html_editor/../tests/tours/helpers/editor
it itself import @html_editor/editor
Since the editor is not part of the bundle when loading the tour, nothing is loaded
Solution
========
As it not that easy to include the editor in the web.assets_tests bundle,
we check if the editor module is present before patching it.
When actually running the tour, it will be present.
runbot-231561This fix prevents marketing cards from being marked as synced when their image could not be generated, avoiding empty cards being treated as ready. It also ensures all cards tied to an updated campaign are marked for resync, so reused campaigns correctly refresh every selected card.
Original PR description
If wkhtmltoimage fails for any reason we currently keep going as if an image was actually rendered. Instead if the result of the image render is `None`, raise a generic error. This avoids issues with cards being marked "synced" even though they are actually empty. Additionally, when the campaign gets reused: - preview two records - update cards on a mailing - preview a record again - modify one of the fields on the card - update the cards on a mailing again - the card that was previewed is not updated ALL cards must require sync after a change to the campaign not just active ones. Otherwise they will keep their "synced" status and not be synced when they're selected for update later on. task-5048534 Forward-Port-Of: odoo/odoo#232005 Forward-Port-Of: odoo/odoo#224629
Signatures now generate correctly when a person's name contains a non-breaking space. This prevents broken signature images and restores initials-based signature creation for affected users.
Original PR description
Before this commit: Names containing a non-breaking space would break the generated svg file. This is because the inserted ' ' is not valid XML. This also broke the initials signature generation. After this commit: The getCleanedName method actually returns the cleaned name and the signature svg files is correct. Related ticket: opw-4927425 Forward-Port-Of: odoo/odoo#231517
This fixes an issue in the mail module where extra information prepared for one record could accidentally be reused for other records. The change helps ensure messages and discussion data stay consistent and avoids unexpected cross-record behavior.
Original PR description
Before this commit, the `extra_fields` kwarg of Store.Relation would be mutated in place, causing unexpected behavior where the `dynamic_fields` of a record would be used for others. This commit fixes the shared list mutation issue by making a copy of the `extra_fields` and appending to that.
Payment QR codes now use the payment reference instead of the customer reference in the free communication field. This helps ensure payment instructions match the intended payment details and reduces confusion during payment reconciliation.
Original PR description
The aim of this commit is replacing the usage of customer reference for the free communication in EPC SEPA QR Code for the payment reference. task-5122875 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#231401
Point of Sale receipts, customer displays, and self-order payment pages now create QR codes directly in the browser. This prevents QR code printing or display issues when the POS is offline and keeps receipt layouts consistent.
Original PR description
Import the `qrcode` JS library and render QR codes directly in the browser instead of requesting them from the backend. This allows receipts with QR codes to be generated and printed even when the POS is offline. Problem was that we cannot use `ZXing.BrowserQRCodeSvgWriter();` (which is a library already used in the POS that can generate QR code) because it generates an unpredictable padding, which cause some issues in the receipt layout. task-id: 5060246 task-id: 5060246 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228242
Documentation and clarification updates
The Camptocamp corporate contributor agreement record was updated to include Tomasz Walter. This supports proper contributor authorization and keeps Odoo's legal contributor records current.
Original PR description
Please add me as a member of the Camptocamp organization. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#230780
This pull request records that contributor arch-fan has signed Odoo's Contributor License Agreement. This is an administrative legal update that helps ensure future contributions can be accepted under Odoo's contribution rules.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232057
14 changes
Security fixes and vulnerability patches
IoT Boxes now must confirm the database has a valid token before connecting. This helps prevent unauthorized or misconfigured devices from linking to a company database, improving connection safety.
Original PR description
We added a check to prevent IoT Boxes from connecting to a database if the database doesn't have a valid token. Task: 5177501 Forward-Port-Of: odoo/enterprise#97531
Enhancements to existing features
The website editor now detects when a user's browser or device cannot support the technology needed for image filters. Instead of showing an error, it disables those filters and can show a clearer message, making editing more reliable on affected systems.
Original PR description
On recent versions of Chrome for Linux (v140+), the old SwiftShader software fallback for WebGL has been removed. As a result, new window.WebGLImageFilter() now throws if no GPU context is available, typically when WebGL is disabled or unsupported. Since the application cannot enable WebGL from JavaScript, this commit improves the user experience by detecting the absence of a WebGL context early and disabling image filters in edit mode. Instead of raising a traceback, the editor now skips the filter feature and can optionally display a friendly message explaining that WebGL is required to use image filters. This avoids runtime errors and ensures a more robust behavior on platforms where WebGL is unavailable. task-5117584 Forward-Port-Of: odoo/odoo#232009 Forward-Port-Of: odoo/odoo#229705
This improves the reliability of automated test runs by ensuring Chrome is still closed even when a rare shutdown error occurs. It helps prevent stuck build environments and reduces unnecessary build failures or manual cleanup.
Original PR description
In some instances, Chrome can apparently fail CDTP calls with "Execution context was destroyed". According to the internet this mostly happens because of navigation events, here it's not clear if…
In some instances, Chrome can apparently fail CDTP calls with "Execution context was destroyed". According to the internet this mostly happens because of navigation events, here it's not clear if this is in response to `stop`-ing the page, or a pre-existing navigation directive interfereing with the stop-ing of the browser. I tried reproducing locally under the assumption that the `Page.stopLoading` might be the cause but got nowhere[^1]. This issue seems extremely infrequent, and in most cases is but a minor annoyance, an error appears on the corresponding build, and that's it. However if the error occurs during `ChromeBrowser.stop` then the browser is not terminated, which on runbot prevents the docker image from shutting down properly, and leaves zombie builds. Therefore make `ChromeBrowser.stop` more resilient to errors in the initial section so that we do terminate the browser even if the "graceful CDTP shutdown" fails. While at it, add a fallback to kill the browser if it does not terminate gracefully. https://runbot.odoo.com/odoo/error/233442 [^1]: and the error only happening in 18.0 and later when `Page.stopLoading` was present long before that makes it likely the proximal cause is in the code being run, especially as all the errors sampled from the builds list are related to pos and the failure are immediately preceded by ongoing HTTP requests Forward-Port-Of: odoo/odoo#232117 Forward-Port-Of: odoo/odoo#232060
Resolved issues and error corrections
Starshipit shipping requests now include the city or suburb information required by some carriers. This prevents services such as NZ Post Domestic from failing to appear, helping businesses offer the correct delivery options to customers.
Original PR description
Current behaviour: --- When using Starshipit, city is not included in the payload sent to the API. This causes an error for some delivery services. Steps to reproduce: --- 1. Install delivery_starshipit 2. Create starshipit Shipping Method (using Starshipit API key) 3. Set up only "NZ Post Domestic" in Starshipit portal. 4. Click on "Select a service linked to your starshipit account" 5. Error: There are no shipping services available Cause of the issue: --- Some delivery services (like NZ Post Domestic) require a city/suburb field. In Australia/New Zealand suburb is used in the city field. opw-5155401 Forward-Port-Of: odoo/enterprise#97212
Bank reconciliation now correctly applies a partial payment when a bank transaction is smaller than the total invoice installments. This prevents invoices from being incorrectly marked as fully paid and avoids creating misleading suspense account balances.
Original PR description
Steps: - Have a payment term making 3 installments (33.33%, 33.33% and 33.34%) - Create and confirm an invoice for $200 with the previously created payment term - Create a bank transaction for $90…
Steps: - Have a payment term making 3 installments (33.33%, 33.33% and 33.34%) - Create and confirm an invoice for $200 with the previously created payment term - Create a bank transaction for $90 -------- Option 1 -------- - Reconcile the statement line with the three invoice lines from the reconcile button on the stmt line itself -------- Option 2 -------- - From the invoice, add the stmt line from the outstanding payments widget -> The invoice is marked as fully paid and the bank entry looks like this: | account | debit | credit | | ------- | ----- | ------ | | Bank account | 90.00 | 0.00 | | Receivable account | 0.00 | 66.66 | | Receivable account | 0.00 | 66.66 | | Receivable account | 0.00 | 66.68 | | Suspense account | 110.00 | 0.00 | It should look like this: | account | debit | credit | | ------- | ----- | ------ | | Bank account | 90.00 | 0.00 | | Receivable account | 0.00 | 66.66 | | Receivable account | 0.00 | 23.34 | This is because we're calculating the partial amount only when looping over the last move line, which result with no partial amount since the transaction amount is already exceeded, therefore we end up adding all the line and balancing it with the suspense account line, which is wrong. With this commit, we add some conditions to check wether the amount is exceeded or will be exceeded, and we calculate the partial amount accordingly. opw-5076498
The customer preview for shared projects now matches what portal users actually see when invoicing is limited to validated timesheets. This prevents customers or staff using preview from seeing draft or unvalidated timesheet entries that should not appear in the portal view.
Original PR description
### Issue: Due to this issue, in the project sharing, the customer preview doesn't reflect the actual behaviour of the portal view. It shows non-validated timesheets even if invoicing policy is…
### Issue: Due to this issue, in the project sharing, the customer preview doesn't reflect the actual behaviour of the portal view. It shows non-validated timesheets even if invoicing policy is validated timesheets only. #### To reproduce: 1- Create a db with sale_project and sale_timesheet_enterprise 2- Configure invoicing policy to validated timesheets only 3- Create a service product: - Create on Order: Project & Task - Invoicing policy: Based on Timesheets 4- Create a Quotation for the product and confirm it 5- Open project from smart button 6- Share project with a portal user with Edit access 7- Open tasks, and add two timesheets to the task 8- Open timesheet app, and validate one of the timesheets 9- From project page, click on Customer preview 10- In preview, open the task. You can see both timesheets which is a different behaviour if you view the project using portal user. Using portal user, only validated timesheets are shown. ### Cause: The timesheets are filtered here to only show validated timesheets: https://github.com/odoo/enterprise/blob/8223ed0765c6064b88280656a5ab6b13ca9a431f/sale_timesheet_enterprise/models/project_task.py#L73-L91 However, it is filtered only if user is portal. In customer preview the user is still the internal user, as a result the timesheets will not be filtered. To fix that we can check if project_sharing_id exist in context to filter timesheets. opw-5093339 Forward-Port-Of: odoo/enterprise#97470
Payment QR codes now use the payment reference in the free communication field instead of the customer reference. This helps ensure payment details match the intended invoice reference and reduces confusion during payment reconciliation.
Original PR description
The aim of this commit is replacing the usage of customer reference for the free communication in EPC SEPA QR Code for the payment reference. task-5122875 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#231401
This fix restores a missing dependency needed for NACHA payment processing. Users creating NACHA payments will once again see the bank account selection field, preventing payment setup confusion or blockage.
Original PR description
Accidentally removed in a061a2b82a967ca2 which caused the bank account selection field to not show when doing a NACHA payment. (Found when working on task 5052996) Forward-Port-Of: odoo/enterprise#97319
Marketing cards will no longer be treated as successfully updated when image generation fails, preventing empty cards from being marked as synced. Campaign changes also now correctly require all related cards, including previews, to sync again so mailings use the latest card content.
Original PR description
If wkhtmltoimage fails for any reason we currently keep going as if an image was actually rendered. Instead if the result of the image render is `None`, raise a generic error. This avoids issues with cards being marked "synced" even though they are actually empty. Additionally, when the campaign gets reused: - preview two records - update cards on a mailing - preview a record again - modify one of the fields on the card - update the cards on a mailing again - the card that was previewed is not updated ALL cards must require sync after a change to the campaign not just active ones. Otherwise they will keep their "synced" status and not be synced when they're selected for update later on. task-5048534 Forward-Port-Of: odoo/odoo#232005 Forward-Port-Of: odoo/odoo#224629
This fixes an issue where names containing non-breaking spaces could cause generated signature images to fail or show incorrect initials. Users can now create valid signatures reliably even when their names include this type of spacing.
Original PR description
Before this commit: Names containing a non-breaking space would break the generated svg file. This is because the inserted ' ' is not valid XML. This also broke the initials signature generation. After this commit: The getCleanedName method actually returns the cleaned name and the signature svg files is correct. Related ticket: opw-4927425 Forward-Port-Of: odoo/odoo#231517
Fixed an issue that could cause an error when refreshing appointment availability based on a selected staff member. This helps customers and staff continue booking appointments smoothly without interruption.
Original PR description
This commit fixes an issue where the refresh with appointment based on staff user was raising a traceback as it also tried to compute the max capacity possible. Related commit 3cca7e47ab58f8a7d4e9196dbf60f7068348216b task-5118860 Forward-Port-Of: odoo/enterprise#95862
Companies using the Turkey and Jordan local accounting setups will again receive a default cash journal when initialized. This restores a compliance-related accounting setup that had been removed during earlier cleanup work, helping affected businesses meet local requirements.
Original PR description
This commits adds back default cash journal for companies intializing with l10n_tr and l10n_jr. In our efforts to cleaning the UX/UI of accounting (PR #192031 task-4430969) We removed the default cash journal, however, some locatizations, such as l10n_tr and l10n_jo, require them for compliance reasons task-4991218 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#231200
Documentation and clarification updates
Tomasz Walter has been added to Camptocamp's corporate contributor license agreement record. This keeps the legal contributor documentation up to date so contributions from the organization can be properly recognized.
Original PR description
Please add me as a member of the Camptocamp organization. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#230780
This pull request records that the contributor arch-fan has signed the required contributor license agreement. It supports legal compliance for accepting their future contributions and has no direct impact on product features or users.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232057
7 changes
Enhancements to existing features
Swedish batch payments can now include both IBAN and BBAN, Bankgiro or Plusgiro payments in the same batch. When mixed account types are used, the system generates a ZIP file containing separate payment files, reducing manual work and avoiding blocked payment batches.
Original PR description
This commit add a new behaviour for batch payments in Sweden. Before this commit: batch payment with mixed payment for iban and bban/bankgiro/plusgiro wasn't allowed After this commit: now if the user create a batch payment with both type of account, we create a zip file with 2 xml files, one for iban and one for bban/bankgiro/plusgiro. Linked:https://github.com/odoo/odoo/pull/230104 [task-5107240](https://www.odoo.com/odoo/project/967/tasks/5107240) Forward-Port-Of: odoo/enterprise#95463
Resolved issues and error corrections
Starshipit shipping requests now include the customer city or suburb when checking available delivery services. This prevents carriers such as NZ Post Domestic from failing service selection because required address information was missing.
Original PR description
Current behaviour: --- When using Starshipit, city is not included in the payload sent to the API. This causes an error for some delivery services. Steps to reproduce: --- 1. Install delivery_starshipit 2. Create starshipit Shipping Method (using Starshipit API key) 3. Set up only "NZ Post Domestic" in Starshipit portal. 4. Click on "Select a service linked to your starshipit account" 5. Error: There are no shipping services available Cause of the issue: --- Some delivery services (like NZ Post Domestic) require a city/suburb field. In Australia/New Zealand suburb is used in the city field. opw-5155401 Forward-Port-Of: odoo/enterprise#97212
The customer preview for shared projects now matches what portal customers actually see when billing is limited to validated timesheets. This prevents internal draft or unvalidated timesheet entries from appearing in the preview, giving staff a more accurate view before sharing with customers.
Original PR description
### Issue: Due to this issue, in the project sharing, the customer preview doesn't reflect the actual behaviour of the portal view. It shows non-validated timesheets even if invoicing policy is…
### Issue: Due to this issue, in the project sharing, the customer preview doesn't reflect the actual behaviour of the portal view. It shows non-validated timesheets even if invoicing policy is validated timesheets only. #### To reproduce: 1- Create a db with sale_project and sale_timesheet_enterprise 2- Configure invoicing policy to validated timesheets only 3- Create a service product: - Create on Order: Project & Task - Invoicing policy: Based on Timesheets 4- Create a Quotation for the product and confirm it 5- Open project from smart button 6- Share project with a portal user with Edit access 7- Open tasks, and add two timesheets to the task 8- Open timesheet app, and validate one of the timesheets 9- From project page, click on Customer preview 10- In preview, open the task. You can see both timesheets which is a different behaviour if you view the project using portal user. Using portal user, only validated timesheets are shown. ### Cause: The timesheets are filtered here to only show validated timesheets: https://github.com/odoo/enterprise/blob/8223ed0765c6064b88280656a5ab6b13ca9a431f/sale_timesheet_enterprise/models/project_task.py#L73-L91 However, it is filtered only if user is portal. In customer preview the user is still the internal user, as a result the timesheets will not be filtered. To fix that we can check if project_sharing_id exist in context to filter timesheets. opw-5093339 Forward-Port-Of: odoo/enterprise#97470
This fix restores a required payment component so users can select a bank account when creating NACHA payments. It prevents confusion and blocked payment processing caused by the missing bank account field.
Original PR description
Accidentally removed in a061a2b82a967ca2 which caused the bank account selection field to not show when doing a NACHA payment. (Found when working on task 5052996) Forward-Port-Of: odoo/enterprise#97319
Fixed an issue that could cause an error when refreshing appointment availability for bookings assigned to a staff member. This helps customers and staff see appointment slots reliably without interruptions.
Original PR description
This commit fixes an issue where the refresh with appointment based on staff user was raising a traceback as it also tried to compute the max capacity possible. Related commit 3cca7e47ab58f8a7d4e9196dbf60f7068348216b task-5118860 Forward-Port-Of: odoo/enterprise#95862
App icons created in Studio are now automatically resized before being saved. This prevents unnecessarily large icon files from increasing database size, cache usage, and request payloads.
Original PR description
Before this commit, the IconCreator images were sent as is in their full size. Downstream it was problematic because apps' icons were bigger than necessary, bloating the different caches, the database, and the request. After this commit, icon are resized to a max of 64x64 pixels. Forward-Port-Of: odoo/enterprise#97050 Forward-Port-Of: odoo/enterprise#94480
Fixes automatic printing during delivery validation so shipping labels and related documents are included in the normal validation flow. This helps ensure connected IoT printers receive all required documents reliably, avoiding missed prints caused by a page reload.
Original PR description
The `button_validate` method called clicking "Validate" returns a list of client actions to call. After these clients actions are executed, the page reloads. This reload makes our broadcasted action not to be caught by the client if there is only one connected. Anyway, this flow was overcomplicated and has been simplified overriding the method returning the client actions, adding the "shipping labels" and "shipping documents" to it. Forward-Port-Of: odoo/enterprise#97524 Forward-Port-Of: odoo/enterprise#97462
33 changes
Security fixes and vulnerability patches
IoT Boxes now check that a database has a valid token before connecting. This helps prevent unauthorized or incorrectly configured connections, improving the security and reliability of IoT deployments.
Original PR description
We added a check to prevent IoT Boxes from connecting to a database if the database doesn't have a valid token. Task: 5177501 Forward-Port-Of: odoo/enterprise#97579 Forward-Port-Of: odoo/enterprise#97531
New functionality added to Odoo
This update adds the ability to import Norwegian SAF-T XML accounting data, helping businesses move audit and accounting information into Odoo more easily. It also improves the existing SAF-T import process by handling Norwegian account code differences and avoiding conflicts when journal codes already exist.
Original PR description
[ADD] l10n_no_saft_import: Allow the import of saft data This commit adds a new module to allow the import of the saft xml data for norway. Plus adding a test for the import. [IMP] account_saft_import: adding hook for account code + fix bug This commit adds a hook method for the account code since in l10n_no_saft, the accountCodes is replaced in the saft_report.xml Correcting a bug when importing the saft and that the code of the journal is already existing. task-5144005
Enhancements to existing features
WhatsApp conversations now manage offline participants in the main discussion channel data, making chat information more consistent across the app. This should improve reliability for WhatsApp-related discussions and reduce inconsistencies in how correspondents are displayed or handled.
Chat contact information is now handled through the channel member record for AI and WhatsApp conversations. This keeps conversation behavior more consistent across messaging features and reduces the risk of mismatched contact details.
Original PR description
task-4675831 PR community: https://github.com/odoo/odoo/pull/230067
This update reorganizes how chat and channel membership information is stored and accessed across Discuss, AI, Live Chat, and WhatsApp. It improves consistency behind the scenes, helping messaging features remain reliable and easier to maintain without changing the core user experience.
WhatsApp discussions now align with the updated way Odoo tracks offline members in chat channels. This keeps WhatsApp-related conversations consistent with the main messaging system and helps avoid display or availability mismatches after the underlying platform change.
Original PR description
This commit adapt the whatsapp code to the move of offlineMembers to discuss channel model. PR community: https://github.com/odoo/odoo/pull/231395
Spreadsheet border handling has been reorganized to make spreadsheet editing behavior more reliable and easier to maintain. This supports consistent autofill behavior in list and pivot spreadsheet views, reducing the chance of formatting issues as the feature evolves.
The Monster recruitment integration apps now use updated icons that match company icon guidelines and Monster's official brand colors. This improves visual consistency and makes the related apps easier to recognize in Odoo.
Original PR description
*: hr_recruitment_integration_skills_monster, hr_recruitment_integration_website_monster Prior to this change, the module icons did not comply with our icon guidelines. They have now been updated to use the Monster logo with official branding colors. task-4724804 | Before | After | |--------|--------| | <img width="1021" height="162" alt="image" src="https://github.com/user-attachments/assets/baf8bff0-deca-49f7-999e-750617302331" /> | <img width="1040" height="184" alt="Capture d’écran 2025-09-29 à 15 45 31" src="https://github.com/user-attachments/assets/9edd5023-9a1e-40c0-806f-01def0c84462" /> |
The Hong Kong payroll form now shows the employer return year only for Original forms. This reduces confusion by hiding an unnecessary field when other form types are selected.
Original PR description
- made the field `year_of_employer_return` only visible when `type_of_form` is Original task-id: 5050409
The payroll menu previously labeled “Resume” has been renamed to “Salary Summary” so users can more easily understand its purpose. This improves clarity and consistency when navigating salary-related information.
Original PR description
The 'Resume' menu label was misleading, as it did not accurately reflect its purpose. It has been renamed to 'Salary Summary' for better clarity and consistency. task-5172597
The IoT module now uses a clearer and consistent name for request session identifiers. This reduces ambiguity in internal communication between IoT components and supports easier maintenance across related systems.
Original PR description
In order to standardize the session id (id to the request received), we renamed all occurrences of old "owner" key to "session_id" Community PR: odoo/odoo#225190
WhatsApp conversations now use the dedicated channel loading method directly. This is a small internal improvement that should make the code path clearer and help maintain reliable access to WhatsApp chats without changing the user experience.
Original PR description
This PR use `discuss.channel` getOrFetch method directly instead of `mail.thread`
Odoo now uses the original line descriptions for most Mexican CFDI credit notes, aligning refund documents with SAT requirements. The fixed generic description is kept only for point-of-sale global invoice refunds, reducing compliance risk while preserving the required PoS behavior.
Original PR description
The SAT specifies how the description of redunded product should be set. Currently, Odoo uses the lines' names as the description for credit notes of normal invoices, but a forced text for the credit notes of global invoices. The actual need is to leave the forced text for credit notes of global invoices made from the PoS. Otherwise, the lines' names should be used. task-5170675
The mail composer now recognizes and highlights links correctly while users write messages. This makes shared URLs clearer and easier to use, while also simplifying the underlying editor setup for easier maintenance.
Original PR description
This commit enables the link plugin in the mail composer so that the link will be properly parsed and hightlighted. This commit also improves the plugin set and clean up the duplicated plugin lists. task-5172795 https://github.com/odoo/odoo/pull/232119
Swedish payment batches can now include both IBAN and local BBAN, Bankgiro, or Plusgiro accounts. When mixed account types are used, the system automatically creates a zip file containing separate payment files, helping businesses process more payments together without manual splitting.
Original PR description
This commit add a new behaviour for batch payments in Sweden. Before this commit: batch payment with mixed payment for iban and bban/bankgiro/plusgiro wasn't allowed After this commit: now if the user create a batch payment with both type of account, we create a zip file with 2 xml files, one for iban and one for bban/bankgiro/plusgiro. Linked:https://github.com/odoo/odoo/pull/230104 [task-5107240](https://www.odoo.com/odoo/project/967/tasks/5107240) Forward-Port-Of: odoo/enterprise#97556 Forward-Port-Of: odoo/enterprise#95463
Links entered in the mail composer are now recognized and highlighted more reliably. The update also simplifies the underlying editor setup, making future maintenance easier without changing the user workflow.
Original PR description
This commit enables the link plugin in the mail composer so that the link will be properly parsed and hightlighted. This commit also improves the plugin set and clean up the duplicated plugin lists. task-5172795 backport - https://github.com/odoo/enterprise/pull/97504 https://github.com/odoo/odoo/pull/232347 Forward-Port-Of: odoo/enterprise#97666
Resolved issues and error corrections
This fix prevents Mexican CFDI and invoice generation from failing when a landed cost linked to a lot has not been validated and therefore has no date. It also stops users from creating landed costs directly from the lot form, reducing the chance of incomplete records causing later document errors.
Original PR description
Previous this commit you are able to create and set a landed cost through the lot form view without validating the landed cost. This caused a traceback later on when generating the CFDI or invoice document when trying to get the formatted dates. Since a non validated landed cost might not have a date, this raised an error. This commit targets to fix this issue by expecting that a landed cost might not have a date and also not allow through the form lot view to create a landed cost target: 19.0 -> master Forward-Port-Of: odoo/enterprise#95476
Starshipit shipping requests now include the customer city or suburb when checking available delivery services. This prevents eligible carriers such as NZ Post Domestic from being incorrectly unavailable due to missing address information.
Original PR description
Current behaviour: --- When using Starshipit, city is not included in the payload sent to the API. This causes an error for some delivery services. Steps to reproduce: --- 1. Install delivery_starshipit 2. Create starshipit Shipping Method (using Starshipit API key) 3. Set up only "NZ Post Domestic" in Starshipit portal. 4. Click on "Select a service linked to your starshipit account" 5. Error: There are no shipping services available Cause of the issue: --- Some delivery services (like NZ Post Domestic) require a city/suburb field. In Australia/New Zealand suburb is used in the city field. opw-5155401 Forward-Port-Of: odoo/enterprise#97212
The project customer preview now hides non-validated timesheets when the invoicing policy only allows validated timesheets. This prevents internal preview users from seeing a different task view than customers see in the portal, improving billing transparency and consistency.
Original PR description
### Issue: Due to this issue, in the project sharing, the customer preview doesn't reflect the actual behaviour of the portal view. It shows non-validated timesheets even if invoicing policy is…
### Issue: Due to this issue, in the project sharing, the customer preview doesn't reflect the actual behaviour of the portal view. It shows non-validated timesheets even if invoicing policy is validated timesheets only. #### To reproduce: 1- Create a db with sale_project and sale_timesheet_enterprise 2- Configure invoicing policy to validated timesheets only 3- Create a service product: - Create on Order: Project & Task - Invoicing policy: Based on Timesheets 4- Create a Quotation for the product and confirm it 5- Open project from smart button 6- Share project with a portal user with Edit access 7- Open tasks, and add two timesheets to the task 8- Open timesheet app, and validate one of the timesheets 9- From project page, click on Customer preview 10- In preview, open the task. You can see both timesheets which is a different behaviour if you view the project using portal user. Using portal user, only validated timesheets are shown. ### Cause: The timesheets are filtered here to only show validated timesheets: https://github.com/odoo/enterprise/blob/8223ed0765c6064b88280656a5ab6b13ca9a431f/sale_timesheet_enterprise/models/project_task.py#L73-L91 However, it is filtered only if user is portal. In customer preview the user is still the internal user, as a result the timesheets will not be filtered. To fix that we can check if project_sharing_id exist in context to filter timesheets. opw-5093339 Forward-Port-Of: odoo/enterprise#97470
This fix restores a missing dependency needed for NACHA payments. Users can once again see and choose the bank account field when preparing NACHA payment files, preventing payment setup issues.
Original PR description
Accidentally removed in a061a2b82a967ca2 which caused the bank account selection field to not show when doing a NACHA payment. (Found when working on task 5052996) Forward-Port-Of: odoo/enterprise#97319
This update adjusts many enterprise module tests so legacy installation behavior is set automatically. It helps keep post-install checks consistent by default, reducing maintenance work and avoiding mismatches in automated validation.
The Belgian payroll salary configurator now checks the active company before applying Belgian-specific salary calculations. This prevents gross salary information from being hidden when users are working outside the relevant Belgian company context.
Original PR description
Gross Salary did not appear previously as the extending function _get_compute_results in 10n_be_hr_contract_salary was returning the l10n_be_wage_with_mobility_budget right away without checking which company we are in. This change made sure before proceeding that we are in the correct active company, Belgian one in our case. task-4987491 Forward-Port-Of: odoo/enterprise#97176 Forward-Port-Of: odoo/enterprise#94905
Reference and selection field values are now sorted in test simulations the same way they are defined, rather than alphabetically by the stored value. This makes automated Gantt-related tests more reliable and better aligned with real expected behavior.
Original PR description
selection and reference fields are not sorted according to the selection value index, but using the value itself. Note: this could be fixed in earlier version, but since it's an API change (of the mock server, but still...), it could break tests of existing custom modules built by the community. Task: 5102923
German POS certification exports now remain valid even when an order has no assigned user. The system falls back to the person who created the order, preventing session closing from being blocked by this recurring data issue.
Original PR description
Before this commit, closing a session was blocked if an order was missing the user_id field during DSFinV-K export generation. Although the exact reproduction steps are not consistently found, this issue is recurrent. This change makes the code more robust by defaulting to the order's create_uid when the user_id is empty or missing, ensuring the transaction export data remains valid. opw-5123890 Forward-Port-Of: odoo/enterprise#97450 Forward-Port-Of: odoo/enterprise#96002
Restaurant owners can now print POS sales reports directly during an active session instead of having to use the backend. This makes daily operations faster and gives managers immediate access to sales information when they need it.
Original PR description
- Restaurants owners need to be able to print a sales report during a session. Before this commit, they were only available to print the report via the backend. task-id: 5076080 Forward-Port-Of: odoo/enterprise#94181
Fixed an issue where opening a tax report from a Luxembourg return for a previous month incorrectly reset the date filter to the current month. This helps users review and file past-period returns with the correct reporting dates.
Original PR description
This commit solve an issue when being on the Luxembourg and doing a return on a previous month like may and clicking on the link to the tax report on the return, the date filter was wrongly set to this month. no task id
Asset names can now be shown and imported in the user's selected language. This improves usability for companies operating in multilingual environments and helps keep asset records understandable across teams.
Original PR description
To support multilingual environments, this commit refactors the 'name' field on the asset model with `translate=True`, converting it to a standard, translatable text field. This allows asset names to be imported and displayed in the user's selected language. task-5122900
Bank reconciliation now applies early payment discounts even when the bank statement balance is higher than the invoice amount, reducing manual adjustment work. Batch payments also handle eligible discounts, partial payments, and currency differences more reliably, improving accuracy in payment matching.
Original PR description
It is now possible to have an EPD applied when adding an invoice in the bank rec widget when the invoice amount is less than the statement line remaining balance (no need to have the exact amount than the invoice + EPD anymore). Also, when adding a batch payment with payments with no moves, it will also check if the invoice covered a payment is eligible for EPD, and apply it if it's the case. task-4681366
The asset list was changed back so users can open the full creation form when they click New. This restores the expected workflow and avoids confusion when creating new assets.
Original PR description
The previous change to make the asset list view editable caused a problem where the "New" button no longer opens the form view. This commit reverts that change to restore the intended functionality. Forward-Port-Of: odoo/enterprise#97483
Error messages in US payroll and NACHA payment flows now use the same bank field label that users see on the form. This makes it easier for users to identify which bank detail needs to be completed or corrected.
Original PR description
The label shown in the res.partner.bank form view depends on the show_aba_routing field. If we don't show the correct label in these error messages it's not clear to the user what field they have to fill. task-5052996 Forward-Port-Of: odoo/enterprise#97510 Forward-Port-Of: odoo/enterprise#97318
This update makes IoT payment terminal logs more complete and consistent. Each transaction step now includes identifying details, making it easier for support teams to trace issues and resolve payment problems faster.
Original PR description
This PR improves the logging of terminals used with iot box. We will now get a log for every step of a transaction along with some information identifying the transaction Forward-Port-Of: odoo/enterprise#97216
Code cleanup and technical improvements
AI agents are now identified separately from regular user activity, so they no longer appear as if they have a live presence status. This keeps availability indicators focused on real users while still allowing the interface to recognize AI agents correctly.
Original PR description
The `im_status` field should only hold information regarding the activity of a user, and AI agents don't have activity in that sense as they are always online. We therefore set the `im_status` of ai agents to `bot` (signifies opting out of the activity tracking) and pass the `agent_ids` field client side as a mean of identifying AI agent partners.
The Knowledge app no longer uses a custom attachment-sharing step for article discussions because that token handling is now covered by the standard platform behavior. This reduces duplicated logic and helps keep access handling consistent for public and portal users.
Original PR description
This commit removes the `_to_store` override on `ir_attachment` which adds an access_token for public/portal users in knowledge article threads. Token handling is managed by the _to_store_defaults raw_access_token since [1]. [1] https://github.com/odoo/odoo/pull/204830 task-4676413
17 changes
Resolved issues and error corrections
Project profitability now shows the full expected purchase cost when purchase orders are billed across multiple vendor bills. This prevents project cost forecasts from being understated and excludes canceled credit notes from the calculation.
Original PR description
## Issue: When a Purchase Order is linked to a Project and its quantity is billed through multiple vendor bills, the "Expected" amount in the project profitability view was incorrect ## Cause: When…
## Issue: When a Purchase Order is linked to a Project and its quantity is billed through multiple vendor bills, the "Expected" amount in the project profitability view was incorrect ## Cause: When at least one invoice line exists for a PO line, `_get_profitability_items()` computes `to_bill` and `billed` amounts without using the purchase order's ordered quantity This causes the computation to only consider the quantities already billed, ignoring the remaining quantity that still needs to be billed: https://github.com/odoo/odoo/blob/cdb8370647ca4b07f89edaf5fcc687508f6af16d/addons/project_purchase/models/project_project.py#L155-L178 Additionally, the code included all credit notes, even those that were canceled ## Steps to reproduce: - Ensure the "Sales" app is installed to display project profitability - Create a new Project "Profitability" and mark it as Billable - Create and confirm a PO (any product, quantity: 5, unit price: 100, Taxes: None, Other Information > Project: "Profitability") - Check the project dashboard for Purchase Orders (Expected: -500, To Bill: 0, Billed: 0) - Create and confirm a Vendor Bill (Quantity: 2) - Check the project dashboard for Purchase Orders (Expected: -200, To Bill: 0, Billed: -200) - Create and confirm a Vendor Bill linked to the PO using Auto-Complete (Quantity: 3) - Check the project dashboard for Purchase Orders (Expected: -500, To Bill: 0, Billed: -500) opw-5077609 Forward-Port-Of: odoo/odoo#229221
This fixes an issue where confirmed validation payments could skip part of the normal completion process. Sales payment validation now still avoids unnecessary emails while ensuring all required follow-up actions run correctly.
Original PR description
Versions -------- - 18.0+ Issue ----- `super` isn't called on `_post_process` for confirmed validation transactions. Cause ----- A fix that prevented the sending of mail for validation transactions added a `continue` in a loop, which skips over the `super` call in the loop. Solution -------- Instead of `continue`, add an `if` check to see if we want to send mail. Forward-Port-Of: odoo/odoo#231972
Starshipit delivery requests now include the customer city or suburb when checking available services. This prevents supported carriers such as NZ Post Domestic from being incorrectly unavailable, helping users configure shipping methods successfully.
Original PR description
Current behaviour: --- When using Starshipit, city is not included in the payload sent to the API. This causes an error for some delivery services. Steps to reproduce: --- 1. Install delivery_starshipit 2. Create starshipit Shipping Method (using Starshipit API key) 3. Set up only "NZ Post Domestic" in Starshipit portal. 4. Click on "Select a service linked to your starshipit account" 5. Error: There are no shipping services available Cause of the issue: --- Some delivery services (like NZ Post Domestic) require a city/suburb field. In Australia/New Zealand suburb is used in the city field. opw-5155401 Forward-Port-Of: odoo/enterprise#97212
The user form now shows the phone field with the correct label, “Phone,” instead of mistakenly displaying “Email.” This prevents confusion when viewing or editing user contact details.
Original PR description
…sers is displayed as email Description of the issue/feature this PR addresses: In Odoo 19, the phone field label in the user form view was incorrectly displayed as “Email” instead of “Phone”. Current behavior before PR: The phone field in the user form view showed the wrong title — “Email”. Desired behavior after PR is merged: The phone field now correctly displays the title “Phone” in the user form view. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an issue where editing a product variant on a sales order could reset the chosen packaging, such as a pack of 6, back to standard units. Sales teams can now adjust or confirm variants without accidentally changing the customer’s ordered unit or packaging.
Original PR description
## Versions
18.2+
Note: 18.4 needs `product.uom_id` to be replaced by `product.uom.id` to work properly.
## Issue
On a SO, if a product has variants and packaging is allowed, modifying the variant resets the packaging to units.
## Steps to reproduce
*Ensure "Units of Measure & Packagings" is enables in Sales' app's settings*
- Create a new product
- Under "Attributes & Variants" tab, add the following:
- Color: add 2 colors;
- Legs: add 2 legs;
- Under "Sales" tab, select "Pack of 6" for "Packagings" (under "Upsell & Cross-Sell" section);
- Create a new quote and add that new product:
- Change its "Unit" for "Pack of 6";
- Modify the product variant by clicking the pen button next to the product name (appear on hover):
- Click "Confirm" (no changes needed);
- See the order line's product's units change back to "Units".
opw-4814166
Forward-Port-Of: odoo/odoo#224574The customer preview for shared projects now matches what portal customers actually see when timesheet invoicing is limited to validated entries. This prevents internal users from accidentally previewing draft or unvalidated timesheets as if they were visible to customers.
Original PR description
### Issue: Due to this issue, in the project sharing, the customer preview doesn't reflect the actual behaviour of the portal view. It shows non-validated timesheets even if invoicing policy is…
### Issue: Due to this issue, in the project sharing, the customer preview doesn't reflect the actual behaviour of the portal view. It shows non-validated timesheets even if invoicing policy is validated timesheets only. #### To reproduce: 1- Create a db with sale_project and sale_timesheet_enterprise 2- Configure invoicing policy to validated timesheets only 3- Create a service product: - Create on Order: Project & Task - Invoicing policy: Based on Timesheets 4- Create a Quotation for the product and confirm it 5- Open project from smart button 6- Share project with a portal user with Edit access 7- Open tasks, and add two timesheets to the task 8- Open timesheet app, and validate one of the timesheets 9- From project page, click on Customer preview 10- In preview, open the task. You can see both timesheets which is a different behaviour if you view the project using portal user. Using portal user, only validated timesheets are shown. ### Cause: The timesheets are filtered here to only show validated timesheets: https://github.com/odoo/enterprise/blob/8223ed0765c6064b88280656a5ab6b13ca9a431f/sale_timesheet_enterprise/models/project_task.py#L73-L91 However, it is filtered only if user is portal. In customer preview the user is still the internal user, as a result the timesheets will not be filtered. To fix that we can check if project_sharing_id exist in context to filter timesheets. opw-5093339 Forward-Port-Of: odoo/enterprise#97470
This update removes default OK buttons that appeared in some dialogs without serving a clear purpose, especially in Point of Sale screens. It makes popups cleaner and less confusing while preserving keyboard accessibility so dialogs can still be closed without a mouse.
Original PR description
*: point_of_sale, pos_* Since the commit [1] simplifying the method to hide the base Dialog's default button (aka. the "Ok" button) and the cleanup of the ControlPanel's buttons, this "Ok" is…
*: point_of_sale, pos_* Since the commit [1] simplifying the method to hide the base Dialog's default button (aka. the "Ok" button) and the cleanup of the ControlPanel's buttons, this "Ok" is displayed on some dialog (like containing a list view) with no real purpose. While this behavior/appearance was actually willingfull and more deterministic than the previous one, it showed us that those default buttons didn't provide a meaningful user experience and are more disturbing than anything else. This commit removes the Dialog's default "Ok" button. But, this removal has a side-effect: dialog's without any "tabbable" element (input, button...) doesn't get the focus anymore... and can't be closed via keyboard navigation. To circumvent this issue, this commit also adapts the `useActiveElement` hook to focus the referenced element itself it is focusable and it doesn't contain any "tabable" element. task-5082826 [1]: https://github.com/odoo/odoo/commit/1cf179bbf1c49a6d69588911c2a3d98dbeadd3d9
This fixes an issue where users could not see the bank account selection field when creating NACHA payments. Restoring the missing payment component helps ensure businesses can choose the correct bank account for US electronic payment files.
Original PR description
Accidentally removed in a061a2b82a967ca2 which caused the bank account selection field to not show when doing a NACHA payment. (Found when working on task 5052996) Forward-Port-Of: odoo/enterprise#97319
The user form now shows the phone field with the correct label instead of displaying it as email. This avoids confusion when viewing or editing user contact details.
Original PR description
… is displayed as email [BUG] https://github.com/odoo/odoo/issues/232233 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
Marketing cards now stop and show an error when image generation fails, instead of being treated as successfully synced while empty. Campaign changes also correctly mark all related cards as needing an update, so reused or previewed cards are refreshed when mailings are updated.
Original PR description
If wkhtmltoimage fails for any reason we currently keep going as if an image was actually rendered. Instead if the result of the image render is `None`, raise a generic error. This avoids issues with cards being marked "synced" even though they are actually empty. Additionally, when the campaign gets reused: - preview two records - update cards on a mailing - preview a record again - modify one of the fields on the card - update the cards on a mailing again - the card that was previewed is not updated ALL cards must require sync after a change to the campaign not just active ones. Otherwise they will keep their "synced" status and not be synced when they're selected for update later on. task-5048534 Forward-Port-Of: odoo/odoo#232005 Forward-Port-Of: odoo/odoo#224629
Error messages now use the same bank account field label that users see on the form. This helps payroll and payment users quickly identify which routing or clearing number information needs to be completed.
Original PR description
The label shown in the res.partner.bank form view depends on the show_aba_routing field. If we don't show the correct label in these error messages it's not clear to the user what field they have to fill. task-5052996 Forward-Port-Of: odoo/enterprise#97318
The project sharing page now hides a chat expand option that was not supported for portal users. This prevents an error when external users open a shared project task and interact with the task chat.
Original PR description
Steps to reproduce: === - Create a project. - Share the project with access to edit rights to the portal user. - Log in as the portal user. - Open the shared project and then open a task. - Click on the expand button in the chat. Issue: === A traceback occurs when trying to expand the chatter in a project sharing task. Cause: === `inFrontendPortalChatter` not being set in `useSubEnv` is the reason for button appearance, and we don't have the necessary composer for it to render in the project sharing bundle. Fix: === Define missing `inFrontendPortalChatter` to hide the expand chatter composer action as it was not meant to be available in the portal/front-end. task-5049129 Forward-Port-Of: odoo/odoo#231360
The website shop search box now shows search suggestions with apostrophes correctly, such as “desk's lamp,” instead of displaying code-like characters. This avoids confusing shoppers and makes the storefront search experience look cleaner.
Original PR description
currently, we use `t-out` to set the placeholder, which escapes HTML so `desk's lamp` becomes `desk's lamp` Fix: - replace `t-out` with `t-value` to properly store placeholder. **Before** <img width="513" height="270" alt="image" src="https://github.com/user-attachments/assets/92046e41-e471-4eba-9510-a9ea91eeccd8" /> **After** <img width="472" height="252" alt="image" src="https://github.com/user-attachments/assets/79157a51-adac-4c95-8e39-a0caa7cf1537" /> opw-5136972 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#230961
This fixes an issue where names containing non-breaking spaces could cause generated signature images to fail or display incorrectly. Users can now create signatures and initials reliably even when names include these special spaces.
Original PR description
Before this commit: Names containing a non-breaking space would break the generated svg file. This is because the inserted ' ' is not valid XML. This also broke the initials signature generation. After this commit: The getCleanedName method actually returns the cleaned name and the signature svg files is correct. Related ticket: opw-4927425 Forward-Port-Of: odoo/odoo#231517
Payment QR codes now use the payment reference instead of the customer reference in the free communication field. This helps ensure payment instructions carry the intended reference, reducing confusion during payment matching and processing.
Original PR description
The aim of this commit is replacing the usage of customer reference for the free communication in EPC SEPA QR Code for the payment reference. task-5122875 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#231401
Documentation and clarification updates
The Camptocamp corporate contributor agreement record has been updated to include Tomasz Walter. This supports compliance by confirming the contributor is covered under the organization’s signed CLA before contributing to Odoo.
Original PR description
Please add me as a member of the Camptocamp organization. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#230780
This pull request records that the contributor arch-fan has signed Odoo's Contributor License Agreement. This supports legal compliance for accepting their contributions and does not change product functionality.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232057
10 changes
Enhancements to existing features
This update simplifies how accounting tax calculations handle grouped tax details in the browser. It reduces the need for extra manual setup in the code, making tax-related interfaces easier to maintain and less prone to implementation mistakes.
Original PR description
--- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update improves and fixes Odoo's Hoot unit testing tools while keeping changes limited to the test ecosystem. It helps maintain more reliable automated testing without affecting normal business workflows or end-user features.
Original PR description
## Pull Request HOOT 38 This pull requests brings various improvements and fixes to Hoot and the Odoo unit test ecosystem. See the different commit messages for more details. Note: these changes are made in stable to avoid having to support multiple versions of the HOOT API. As such, these changes are intended to be strictly limited to unit tests as to not put the rest of the code base at risk. Community: https://github.com/odoo/odoo/pull/231263 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
This fix avoids adding extra partner identifiers to electronic invoice files when local validation rules only allow one. It helps prevent rejected invoices or refunds in affected EDI formats, improving reliability for businesses using electronic invoicing.
Original PR description
odoo/odoo#206655 added the partner ref in the party identification nodes, but most rule sets don't accept multiple ids for a single partner party identification. Commit 4e22e6b already fixed the issue for malaysian edi. so instead of calling super and extending, we do full overriding with no delegation for `_get_partner_party_identification_vals_list`. enterprise: https://github.com/odoo/enterprise/pull/87298 no-task
Payment registration now looks up saved payment methods using the customer linked to the invoice, rather than the company partner shown on the payment line. This ensures previously saved payment tokens are offered correctly when registering payments for company users, reducing failed or manual payment processing.
Original PR description
Currently, when user A from company AA records a payment method, a payment token is stored for that user. However, when an invoice is issued for that user, the payment token cannot be used because the payment registration form uses the partner AA instead of the user linked to the move, partner A. Step to reproduce: 1. Create a user A in company AA 2. Create an invoice for user A 3. Register a payment on the invoice and save the payment method (token) 4. Create another invoice for user A 5. Try to register a payment on the invoice: the payment token is not proposed This fix updates the logic to use the user linked to the move instead of the partner on the line, allowing proper selection of a payment token. opw-5036106 Forward-Port-Of: odoo/odoo#230105
This fix ensures Swiss payroll ELM transmission employee information works correctly when more than one company or country setup is used. It helps businesses avoid incorrect or missing payroll-related data in multi-company Switzerland configurations.
Original PR description
task-5159023 Forward-Port-Of: odoo/enterprise#96733
Fixed an issue that could cause an error when appointment availability was refreshed for bookings assigned to a staff member. This improves reliability for customers and staff using appointment scheduling by ensuring capacity checks do not interrupt the booking flow.
Original PR description
This commit fixes an issue where the refresh with appointment based on staff user was raising a traceback as it also tried to compute the max capacity possible. Related commit 3cca7e47ab58f8a7d4e9196dbf60f7068348216b task-5118860 Forward-Port-Of: odoo/enterprise#95862
This update removes a browser option that was causing Point of Sale connections to IoT devices to fail on some older Chrome versions. It keeps the intended local device communication working while reducing avoidable errors for businesses using POS hardware.
Original PR description
This reverts commit 1a934ae which added the `"targetAddressSpace": local` option to IoT fetch requests. This is because of two reasons: 1. It caused errors on older versions of Chrome that implemented the obsoleted 'Private Network Access' standard. 2. It was not actually required in the first place, it is only needed in situations where a HTTP resource is accessed from HTTPS using a domain that resolves to a local IP. In Odoo we only ever do this for HTTPS -> HTTPS requests, where it works automatically. task-5157145 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232110
This change removes an unnecessary browser request option from IoT and point-of-sale IoT communication. It prevents errors in older Chrome versions while keeping local device communication working as before.
Original PR description
This reverts commit 6d09dc6 which added the `"targetAddressSpace": local` option to IoT fetch requests. This is because of two reasons: 1. It caused errors on older versions of Chrome that implemented the obsoleted 'Private Network Access' standard. 2. It was not actually required in the first place, it is only needed in situations where a HTTP resource is accessed from HTTPS using a domain that resolves to a local IP. In Odoo we only ever do this for HTTPS -> HTTPS requests, where it works automatically. task-5157145 Forward-Port-Of: odoo/enterprise#97500
Documentation and clarification updates
Acsone has added Tobias Zehntner to Odoo's contributor records after confirming the required contributor agreement. This is an administrative legal update that helps keep contribution permissions and acknowledgements accurate.
Original PR description
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update records that contributor arch-fan has signed the required Contributor License Agreement. It supports legal compliance for accepting their contributions and has no direct impact on product features or users.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232057
3 changes
Resolved issues and error corrections
Fixed an issue in Point of Sale where loyalty points did not refresh when a global discount was applied after selecting a customer. This ensures customers see accurate loyalty rewards without staff needing to remove and re-select them.
Original PR description
In V17, when a global discount was applied to an order after adding the customer, loyalty points were not updated. Steps to reproduce: ------------------- * Open POS. * Select a customer. * Add products to the order. * Apply a global discount. * Check loyalty points → not updated. > Observation: Points are updated if you remove and re-select the customer. Why the fix: ------------ The `add_product` method, called when adding the global discount did not trigger a rewards recalculation. By overriding `add_product` to call `_updateRewards()` after the super call, the loyalty points are now correctly updated in such cases. opw-5072604
Order validation will no longer fail when automatic carrier label printing is enabled but no shipment label was created. Instead of stopping the process with an error, the system logs a warning so users can continue their workflow.
Original PR description
If auto print carrier labels is enabled but no shipment is added to the sales order, then no shipping label document will be generated resulting in a `UserError`. We replaced the `UserError` by a logger warning to avoid blocking the validation.
Documentation and clarification updates
This pull request records that contributor arch-fan has signed Odoo's Contributor License Agreement. It is an administrative legal update that helps confirm contribution rights and does not change product behavior.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232057