Daily updates from Odoo
Thursday, September 25, 2025
83 changes
22 changes
Enhancements to existing features
Point of Sale receipts now align the QR code more neatly with the text beside it. This improves the printed receipt layout and makes customer-facing documents look more polished and easier to read.
Original PR description
This commit ensures that the QR code on the receipt is properly aligned with the text on the right. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change makes the automatic wave picking process easier to customize. It gives implementers cleaner extension points to adapt when transfers should be grouped automatically, without changing the core process.
Original PR description
This improvement just adds some hook methods that allow to decapsulate the logic of auto waves so its doable to extend the conditions for auto-waving. cc @moduon fyi @Shide TODO: for the sake of clarity I just inserted the hook method logic but a cleaner approach would be to extract the whole logic of each hook into their own separate method --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#227873
Resolved issues and error corrections
Opening a Knowledge activity now shows only the articles linked to that activity instead of the full article list. This helps users quickly find the relevant Knowledge article that needs their attention.
Original PR description
Currently, when the user tries to open any activity of the knowledge article, it opens all articles instead of the one which has an activity assigned to them. **Steps to reproduce this issue:** 1) Install the Knowledge module 2) Set up an activity for yourself on a Knowledge article 3) Open the activities from Activities (top left corner) **Issue:** You will end up in the all articles list, with no filters applied. **Cause:** When the user clicks on the activities, a default search filter is added in the context, which is then applied on the view. But in the knowledge article, we don't have any search filters for the activities. Therefore, it renders all knowledge article records. **Solution:** Add search filters for the knowledge articles. opw-4997201 Forward-Port-Of: odoo/enterprise#93609
General Ledger PDF footers now allow longer company names, so businesses with names over 24 characters will see their full name instead of a truncated version. The footer spacing was also increased to keep the report layout clean when longer names are printed.
Original PR description
**Steps to reproduce:** 1. Install the Accounting module. 2. Set a company name longer than 24 characters. 3. Go to Accounting → Reporting → General Ledger. 4. Print the report → in the PDF footer,…
**Steps to reproduce:** 1. Install the Accounting module. 2. Set a company name longer than 24 characters. 3. Go to Accounting → Reporting → General Ledger. 4. Print the report → in the PDF footer, the company name is truncated. **Issue:** - The company name in the General Ledger report footer is cut off if it exceeds 24 characters. **Cause:** - The footer uses a static value limited to 24 characters: https://github.com/odoo/enterprise/blob/08564f3312c255f2f3ab95cef5a9bfc57727bd1f/account_reports/models/account_report.py#L5850-L5860 **Solution:** - Increased the footer text limit from 24 to 80 characters. - Adjusted page margin by changing `'data-report-margin-bottom': 15` → `'data-report-margin-bottom': 20` to ensure proper spacing for longer company names in the PDF. **After Apply Solution** <img width="1038" height="86" alt="After solution" src="https://github.com/user-attachments/assets/51ece47c-1950-4a54-8be3-f7ac2bbd8a0d" /> **Before Without Solution** <img width="1050" height="66" alt="Before Solution" src="https://github.com/user-attachments/assets/a13b9132-bf04-422a-8e32-1db5225afc33" /> opw - 5025972 Forward-Port-Of: odoo/enterprise#94535
Users can no longer try to send a WhatsApp message without choosing a template. This prevents an error and gives a clearer, safer sending flow for customer communications.
Original PR description
Currently, an error occurs when the user attempts to send a whatsapp message without selecting a template. **Steps to Reproduce:** 1. Configure a WhatsApp Business Account and synchronize the…
Currently, an error occurs when the user attempts to send a whatsapp message without selecting a template. **Steps to Reproduce:** 1. Configure a WhatsApp Business Account and synchronize the templates. 2. Open any contact and click the **WhatsApp** button next to the phone number. 3. Remove the template and click **Send Message**. **Error:** `ValueError - Expected singleton: whatsapp.template()` **Cause:** At [1], it attempts to fetch the formatted body and header from the template ID. Since no template is selected, it results in an error. **Fix:** This commit makes the field `wa_template_id` required, preventing users from sending a whatsapp message without a template. In stable versions, raise a validation error if a user attempts to send a message without selecting a template. [1] - https://github.com/odoo/enterprise/blob/fff9ad7999d4ff13adf899b2517e750a36c1261a/whatsapp/wizard/whatsapp_composer.py#L319 sentry-6854466874 Forward-Port-Of: odoo/enterprise#93898
This fix prevents validation errors when editing the address of a Czech company that was installed with demo data. It aligns demo invoice dates with the required tax supply dates so accounting references remain consistent and users can save company details normally.
Original PR description
## [FIX] l10n_cz: prevent error with misaligned accounting date and sequence number of demo moves #### Description of the issue/feature this PR addresses: Editing CZ Company address while having demo…
## [FIX] l10n_cz: prevent error with misaligned accounting date and sequence number of demo moves #### Description of the issue/feature this PR addresses: Editing CZ Company address while having demo data throws Validation Error #### Current behavior before PR: When trying to change address of CZ Company while l10n_cz with demo data is present an error popup is displayed and it's not possible to to save the changes. Steps to reproduce: - Install l10n_cz with demo data - Open CZ Company in form view - Change address (e.g. change city Praha -> Brno) - Click Save #### Desired behavior after PR is merged: The address changes are saved without any error. #### Solution: This change adds `taxable_supply_date` date values for CZ demo moves that are compatible with `invoice_date` values to make sure that accounting date values are the same on each recomputatation and do not lead to new sequence numbers that are not aligned with the previous ones which would cause errors being raised by sequence mixin. Related to: #226152 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228157 Forward-Port-Of: odoo/odoo#227847
The bank reconciliation search dialog no longer triggers a crash when users tap the reconcile button on mobile devices. The custom reconciliation behavior is now limited to desktop views, where it is properly supported, improving reliability for mobile users.
Original PR description
When clicking on the reconcile button in mobile, the js_class of the custom list view is never triggered because, in small screens (aka. "mobile"), by default, kanban views are used instead of list views (or at least take precedence). To avoid having a traceback, we will keep the custom behavior in desktop only no task id Forward-Port-Of: odoo/enterprise#95145
This fixes automated online shop tour tests so browser redirect warnings no longer interrupt or delay them. It helps keep test runs reliable by allowing page reloads to complete smoothly and updates a few test selectors for better accuracy.
Original PR description
During page redirection in tours, the browser was showing a warning about unsaved/incomplete data loss. This warning is not relevant in the context of tours. To address this, the expectUnloadPage attribute is added to the tour test. It prevents unnecessary pauses/timeouts caused by the browser’s warning and ensures smooth redirection handling. Additionally, few tour selectors have been corrected to improved. runbot-231587 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an internal Inventory configuration issue by restoring a missing database index on stock rules by company. It helps upgrades run with clearer logs and avoids misleading warnings, with no expected change to day-to-day user workflows.
Original PR description
due to conflict on this forward port https://github.com/odoo/odoo/pull/113045 ``index=True`` was removed according to this pr https://github.com/odoo/odoo/pull/90531 So, adding it back during upgrade it shows misleading logs ``` 2025-08-26 22:19:25,039 23 INFO db_3112946 odoo.schema: Keep unexpected index stock_rule_company_id_index on table stock_rule ``` opw-5052223 upg-3112946 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226268
This fixes an issue where some users could see an empty employee list in manufacturing work orders because employee avatar access was blocked by HR permissions. The change hides that avatar field for users without the necessary HR access so the list can load normally.
Original PR description
HR use an access right on field. However they have an issue with the avatar field that return an error while it should not. Until they provide a fix limit the avatar field when the user don't have the hr user group. Forward-Port-Of: odoo/enterprise#95424
Scheduled account report sends now skip partners that were deleted after the send was prepared. This prevents the automatic job from failing and helps ensure remaining reports continue to be processed reliably.
Original PR description
When a partner included in a batch send is deleted before the cron "Send account reports automatically" runs, the cron fails because the partner no longer exists. Steps to reproduce: 1. Create partner A and a draft invoice linked to it 2. Go to Partner Ledger and select Customer Statement report 3. Click on Send and validate - Ensure the scheduled action is not executed immediately (e.g. by deactivating it) 4. Delete partner A 5. Run the cron "Send account reports automatically" -> Cron fails with "Record does not exist or has been deleted" This fix ensures only existing partners are kept for processing. opw-5085571 Forward-Port-Of: odoo/enterprise#95127
The kiosk online payment page now shows its background only once. This removes a duplicated visual layer on the QR code payment screen, making the checkout experience cleaner for customers.
Original PR description
pos_online_* = pos_online_payment_self_order This commit ensures that only one background is displayed on the kiosk online payment page. The background is correctly displayed in 'pos_self_order.PaymentPage', and it should not be displayed again in the “Scan the QR code to pay” subcomponent. <img width="688" height="485" alt="Screenshot 2025-09-24 at 13 49 00" src="https://github.com/user-attachments/assets/e521ffce-82db-4900-828a-5d086fa9b4ac" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix ensures timesheet reports correctly include helpdesk ticket information when it should be shown. It corrects a prior update that did not properly target the report field, helping users see complete ticket context in exported or printed timesheet reports.
Original PR description
Description of the issue/feature this PR addresses: The previous commit attempted to extend the timesheet report to display tickets by using position="attributes" on a new . This approach does not work in Odoo reports because position="attributes" can only modify existing elements. There is no indication that the behavior of not displaying tickets was intentional, so this PR corrects that implementation. Current behavior before PR: The previous fix did not correctly locate the existing element for task/project info. Desired behavior after PR is merged: The existing is correctly found and updated to include show_ticket in its t-if. Forward-Port-Of: odoo/enterprise#95206
Resetting a user's Odoo Calendar no longer fails because of permission checks on events they cannot edit. This prevents an unnecessary error during calendar cleanup and makes the Google Calendar reset process smoother for users.
Original PR description
Before this commit, when resetting the Odoo Calendar of an user, it would trigger a ValidationError for updating events that the current user wasn't able to update, even though it was not an updated per se, but just a deletion of it in Odoo. After this commit, we no longer trigger that ValidationError during resets of Odoo Calendars, fixing the error. task-5103918 Forward-Port-Of: odoo/odoo#228195 Forward-Port-Of: odoo/odoo#227991
This change speeds up installation and updates for the Danish Nemhandel module by preparing partner-related Nemhandel information during setup. It helps avoid long delays caused by recalculating these details later, improving reliability during module installation or upgrades.
Original PR description
To avoid lengthy update due to the compute of the records by the ORM, let's pre-compute the nemhandel fields on the install of the module. 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#228102
This update corrects an internal HR helper so it properly finds all versions linked to an employee contract. This helps ensure contract history is retrieved accurately, reducing the chance of incomplete HR contract information.
Original PR description
The helper method to get all versions related to a contract was missing an '='.
This fix ensures Swedish ISO 20022 payment processing passes all needed information when other payment modules extend the same behavior. It helps avoid compatibility issues in customized or extended accounting setups, with no expected change for most users.
Original PR description
Pass all arguments to super-call of _get_company_PartyIdentification32-method in account_iso20022/models/account_journal_iso20022_se.py so they can be passed correctly in other modules inheriting the method. Forward-Port-Of: odoo/enterprise#93883
This update removes a misplaced comment from the IoT Box service configuration that caused a warning during startup. It helps keep system logs clean and avoids confusion when checking whether the Odoo IoT Box service started correctly.
Original PR description
This PR fixes an error in Odoo journalctl logs: ``` Sep 12 01:11:48 iotbox systemd[1]: Starting odoo.service - Odoo IoT Box service... Sep 12 01:11:49 iotbox systemd[1]: /etc/systemd/system/odoo.service:5: Failed to parse sec value, ignoring: 0 # infinetely wait for Odoo to start Sep 12 ``` It looks like systemd attemps to interpret inline comments, which this PR removes task-5113737
The online store no longer crashes when a shopper reaches a product variant combination that cannot be sold and tries to use store pickup. The pickup location selector is now blocked in that case, preventing confusing errors and improving the shopping experience.
Original PR description
Steps to reproduce: 1. Configure 'pick up in store' delivery method 2. Open the page of the product with an impossible combination (e.g. Customizable desk) 3. Edit the url to have attribute values of the impossible combination (2,5) There is a traceback as there is no `inStoreStockData`. After fixing it, the widget was still clickable, but as there was no product, there was another traceback since the data was not present. After this commit, the location selector is prevented from being opened when the combitation is not possible. Forward-Port-Of: odoo/odoo#228336
Mobile shoppers using cash on delivery now see the correct "Place order" button text instead of "Pay now". This avoids confusion at checkout by clearly indicating that no immediate online payment is required.
Original PR description
Versions -------- - saas-18.4 No longer an issue in later versions due to the `_isPayLaterMethod` hook introduced in 7be832ce00be Steps ----- 1. Active cash-on-delivery on a published delivery method; 2. activate & publish the cash-on-delivery payment method; 3. add a deliverable item to your cart; 4. go to checkout > delivery > payment; 5. select the cash-on-delivery payment method; 6. activate mobile view. Issue ----- The payment button's label changes from "Place order" to "Pay now". Cause ----- Commit 260f3fc4397bf added a seperate cart summary for mobile, which duplicates the payment button. The `_expendInlineForm` override which modifies the button's label only modifies the first payment button. Solution -------- Select all cash-on-delivery buttons to modify their labels. opw-5061516
Code cleanup and technical improvements
Generic website builder tests were moved into the shared HTML builder area and updated to use common test tools. This helps reduce duplication, keeps testing better organized, and speeds up related test runs without changing customer-facing behavior.
Miscellaneous changes
Description of the issue/feature this PR addresses: When doing online payment in POS, customer may take some time and the POS may go to idle state. This causes when it goes to idle and back to alive, it will direct to the first screen. Steps to reproduce: - Create POS & setup POS online payment (use Demo online payment) - Open POS, add a product, go to payment screen, select the online payment method - Let it go to idle state (triggered by useIdleTimer) - Move the cursor, or at least make
Original PR description
Description of the issue/feature this PR addresses: When doing online payment in POS, customer may take some time and the POS may go to idle state. This causes when it goes to idle and back to alive,…
Description of the issue/feature this PR addresses: When doing online payment in POS, customer may take some time and the POS may go to idle state. This causes when it goes to idle and back to alive, it will direct to the first screen. Steps to reproduce: - Create POS & setup POS online payment (use Demo online payment) - Open POS, add a product, go to payment screen, select the online payment method - Let it go to idle state (triggered by useIdleTimer) - Move the cursor, or at least make it back to active state - You'll see the screen be redirected to first screen - Do the payment, it will redirect to TicketScreen with empty order info, and when you click new order the previous one is still hanging there Alternatively take a look at the recording: https://github.com/user-attachments/assets/b8e8ae81-df04-41e0-b122-002413714735 Current behavior before PR: - Because it bounces to first screen, when attempting payment the pos does not have the order state Desired behavior after PR is merged: - Do not redirect if in payment screen, so that order context won't be lost --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#205249 Forward-Port-Of: odoo/odoo#202220
13 changes
Enhancements to existing features
This update makes automatic stock wave creation easier to adapt for specific warehouse workflows. It adds extension points so businesses and implementation partners can adjust the conditions for auto-waving without rewriting the existing process.
Original PR description
This improvement just adds some hook methods that allow to decapsulate the logic of auto waves so its doable to extend the conditions for auto-waving. cc @moduon fyi @Shide TODO: for the sake of clarity I just inserted the hook method logic but a cleaner approach would be to extract the whole logic of each hook into their own separate method --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#227873
Resolved issues and error corrections
General Ledger PDF reports now show longer company names in the footer without cutting them off. The footer spacing was also adjusted so reports remain readable and professionally formatted when company names are longer.
Original PR description
**Steps to reproduce:** 1. Install the Accounting module. 2. Set a company name longer than 24 characters. 3. Go to Accounting → Reporting → General Ledger. 4. Print the report → in the PDF footer,…
**Steps to reproduce:** 1. Install the Accounting module. 2. Set a company name longer than 24 characters. 3. Go to Accounting → Reporting → General Ledger. 4. Print the report → in the PDF footer, the company name is truncated. **Issue:** - The company name in the General Ledger report footer is cut off if it exceeds 24 characters. **Cause:** - The footer uses a static value limited to 24 characters: https://github.com/odoo/enterprise/blob/08564f3312c255f2f3ab95cef5a9bfc57727bd1f/account_reports/models/account_report.py#L5850-L5860 **Solution:** - Increased the footer text limit from 24 to 80 characters. - Adjusted page margin by changing `'data-report-margin-bottom': 15` → `'data-report-margin-bottom': 20` to ensure proper spacing for longer company names in the PDF. **After Apply Solution** <img width="1038" height="86" alt="After solution" src="https://github.com/user-attachments/assets/51ece47c-1950-4a54-8be3-f7ac2bbd8a0d" /> **Before Without Solution** <img width="1050" height="66" alt="Before Solution" src="https://github.com/user-attachments/assets/a13b9132-bf04-422a-8e32-1db5225afc33" /> opw - 5025972 Forward-Port-Of: odoo/enterprise#94535
The WhatsApp message flow now prevents users from sending a message unless a template is selected. This avoids an unexpected error and gives users a clearer, more reliable experience when contacting customers through WhatsApp.
Original PR description
Currently, an error occurs when the user attempts to send a whatsapp message without selecting a template. **Steps to Reproduce:** 1. Configure a WhatsApp Business Account and synchronize the…
Currently, an error occurs when the user attempts to send a whatsapp message without selecting a template. **Steps to Reproduce:** 1. Configure a WhatsApp Business Account and synchronize the templates. 2. Open any contact and click the **WhatsApp** button next to the phone number. 3. Remove the template and click **Send Message**. **Error:** `ValueError - Expected singleton: whatsapp.template()` **Cause:** At [1], it attempts to fetch the formatted body and header from the template ID. Since no template is selected, it results in an error. **Fix:** This commit makes the field `wa_template_id` required, preventing users from sending a whatsapp message without a template. In stable versions, raise a validation error if a user attempts to send a message without selecting a template. [1] - https://github.com/odoo/enterprise/blob/fff9ad7999d4ff13adf899b2517e750a36c1261a/whatsapp/wizard/whatsapp_composer.py#L319 sentry-6854466874 Forward-Port-Of: odoo/enterprise#93898
Fixed an issue where some users could see an empty employee list in manufacturing work orders because an employee avatar field triggered HR access restrictions. The avatar is now limited for users without HR permissions, preventing the list from failing to load.
Original PR description
HR use an access right on field. However they have an issue with the avatar field that return an error while it should not. Until they provide a fix limit the avatar field when the user don't have the hr user group. Forward-Port-Of: odoo/enterprise#95424
Scheduled account report emails now skip partners that were deleted after being selected for batch sending. This prevents the automatic report-sending job from failing and helps ensure remaining customer statements continue to be processed.
Original PR description
When a partner included in a batch send is deleted before the cron "Send account reports automatically" runs, the cron fails because the partner no longer exists. Steps to reproduce: 1. Create partner A and a draft invoice linked to it 2. Go to Partner Ledger and select Customer Statement report 3. Click on Send and validate - Ensure the scheduled action is not executed immediately (e.g. by deactivating it) 4. Delete partner A 5. Run the cron "Send account reports automatically" -> Cron fails with "Record does not exist or has been deleted" This fix ensures only existing partners are kept for processing. opw-5085571 Forward-Port-Of: odoo/enterprise#95127
This fix restores a missing database setting for stock rules linked to companies. It prevents misleading upgrade messages and helps keep inventory-related upgrades cleaner and more reliable.
Original PR description
due to conflict on this forward port https://github.com/odoo/odoo/pull/113045 ``index=True`` was removed according to this pr https://github.com/odoo/odoo/pull/90531 So, adding it back during upgrade it shows misleading logs ``` 2025-08-26 22:19:25,039 23 INFO db_3112946 odoo.schema: Keep unexpected index stock_rule_company_id_index on table stock_rule ``` opw-5052223 upg-3112946 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226268
This fix ensures timesheet reports correctly include helpdesk ticket information when relevant. It corrects a prior report update that did not apply properly, helping users see complete ticket-related timesheet details.
Original PR description
Description of the issue/feature this PR addresses: The previous commit attempted to extend the timesheet report to display tickets by using position="attributes" on a new . This approach does not work in Odoo reports because position="attributes" can only modify existing elements. There is no indication that the behavior of not displaying tickets was intentional, so this PR corrects that implementation. Current behavior before PR: The previous fix did not correctly locate the existing element for task/project info. Desired behavior after PR is merged: The existing is correctly found and updated to include show_ticket in its t-if. Forward-Port-Of: odoo/enterprise#95206
The online store now handles product option combinations that are not actually available when shoppers use pickup in store. This prevents error screens and stops the pickup location selector from opening when no valid product exists.
Original PR description
Steps to reproduce: 1. Configure 'pick up in store' delivery method 2. Open the page of the product with an impossible combination (e.g. Customizable desk) 3. Edit the url to have attribute values of the impossible combination (2,5) There is a traceback as there is no `inStoreStockData`. After fixing it, the widget was still clickable, but as there was no product, there was another traceback since the data was not present. After this commit, the location selector is prevented from being opened when the combitation is not possible.
Fixed an issue in the HTML editor where images inserted from an empty formatted placeholder could vanish after the user clicked elsewhere. This helps prevent lost content while editing pages or documents.
Original PR description
Problem: When an image is added inside a `data-oe-zws-empty-inline`, it is removed along with its parent during normalization. Solution: During normalization, replace `data-oe-zws-empty-inline` with the image inside instead of removing both. Steps to reproduce: - Press CTRL+B in an empty line - Press Enter - Click on "Insert image, ..." from the placeholder - Choose an image - Click in the previous paragraph - The image disappears without this fix task-5051343 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix stops users from validating a stock transfer when all selected picked lines have zero quantity. Instead of opening a backorder wizard that cannot do anything, Odoo now shows a clear user error, avoiding confusion during warehouse operations.
Original PR description
### Steps to reproduce: - Create and confirm a delivery with 2 moves: - 1 x product 1 - 1 x product 2 - Set the quantity of product 2 to 0 and mark it as picked - Validate the transfer #### > The…
### Steps to reproduce:
- Create and confirm a delivery with 2 moves:
- 1 x product 1
- 1 x product 2
- Set the quantity of product 2 to 0 and mark it as picked
- Validate the transfer
#### > The backorder wizard open's even though there is nothing to validate. Creating a backorder does nothing.
#### Cause of the issue:
Since there is a picked move, the picking validation does not pick every moves in the `pre_action_done` hook keeping only moves with empty qty as picked:
https://github.com/odoo/odoo/blob/9b41eb38403e64091b74e1ae53c79488aa48b499/addons/stock/models/stock_picking.py#L1208-L1209 Then, only the picked moves are processed in there `_action_done`: https://github.com/odoo/odoo/blob/9b41eb38403e64091b74e1ae53c79488aa48b499/addons/stock/models/stock_move.py#L1914 https://github.com/odoo/odoo/blob/9b41eb38403e64091b74e1ae53c79488aa48b499/addons/stock/models/stock_move.py#L1929-L1937 Which leads to an empty picking validation.
opw-5076640
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#227995The project creation wizard now displays the Customer field neatly on one line when Billable is enabled. This improves visual consistency and makes the form easier to scan for users creating billable projects.
Original PR description
**Steps to Reproduce:** - Go to the Projects app - Click "Create" to open the wizard - Enable the "Billable" option - Observe the alignment of the "Customer" field that appears **Issue:** The "Customer" label and input field are stacked vertically, with the input's underline (green line) positioned below the label, leading to uneven spacing and misalignment compared to other fields. **Current behaviour:** - The "Customer" field is visually misaligned , its label and input are not horizontally aligned, causing UI inconsistency. **Expected behaviour:** - The "Customer" label and input field should align horizontally on a single line, with the input's underline matching the label's baseline. **Fix:** The layout is updated using proper flexbox classes to ensure the "Customer" label and input field appear on the same line with proper vertical alignment. Task-4949146 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix ensures Swedish ISO 20022 payment export logic passes all needed information when other payment modules extend it. It helps prevent compatibility issues in customized or extended payment setups without changing normal user workflows.
Original PR description
Pass all arguments to super-call of _get_company_PartyIdentification32-method in account_iso20022/models/account_journal_iso20022_se.py so they can be passed correctly in other modules inheriting the method. Forward-Port-Of: odoo/enterprise#93883
The IoT Box remote debugging dialog now always shows the option to generate a password. This removes unnecessary confusion after recent backend checks were removed, making the setup flow clearer for users who need remote support access.
Original PR description
Since we recently removed the check for the requests sent to the iot box controllers the generate password button being invisible doesn't make sense anymore. This PR makes it always visible
3 changes
Resolved issues and error corrections
General Ledger PDF reports now display longer company names in the footer instead of cutting them off. This improves report presentation for businesses with company names longer than 24 characters, with added spacing to keep the footer readable.
Original PR description
**Steps to reproduce:** 1. Install the Accounting module. 2. Set a company name longer than 24 characters. 3. Go to Accounting → Reporting → General Ledger. 4. Print the report → in the PDF footer,…
**Steps to reproduce:** 1. Install the Accounting module. 2. Set a company name longer than 24 characters. 3. Go to Accounting → Reporting → General Ledger. 4. Print the report → in the PDF footer, the company name is truncated. **Issue:** - The company name in the General Ledger report footer is cut off if it exceeds 24 characters. **Cause:** - The footer uses a static value limited to 24 characters: https://github.com/odoo/enterprise/blob/08564f3312c255f2f3ab95cef5a9bfc57727bd1f/account_reports/models/account_report.py#L5850-L5860 **Solution:** - Increased the footer text limit from 24 to 80 characters. - Adjusted page margin by changing `'data-report-margin-bottom': 15` → `'data-report-margin-bottom': 20` to ensure proper spacing for longer company names in the PDF. **After Apply Solution** <img width="1038" height="86" alt="After solution" src="https://github.com/user-attachments/assets/51ece47c-1950-4a54-8be3-f7ac2bbd8a0d" /> **Before Without Solution** <img width="1050" height="66" alt="Before Solution" src="https://github.com/user-attachments/assets/a13b9132-bf04-422a-8e32-1db5225afc33" /> opw - 5025972 Forward-Port-Of: odoo/enterprise#94535
Users can no longer try to send a WhatsApp message after removing the required template. This avoids an unexpected error and gives a clearer validation path, improving reliability when sending WhatsApp messages from contacts.
Original PR description
Currently, an error occurs when the user attempts to send a whatsapp message without selecting a template. **Steps to Reproduce:** 1. Configure a WhatsApp Business Account and synchronize the…
Currently, an error occurs when the user attempts to send a whatsapp message without selecting a template. **Steps to Reproduce:** 1. Configure a WhatsApp Business Account and synchronize the templates. 2. Open any contact and click the **WhatsApp** button next to the phone number. 3. Remove the template and click **Send Message**. **Error:** `ValueError - Expected singleton: whatsapp.template()` **Cause:** At [1], it attempts to fetch the formatted body and header from the template ID. Since no template is selected, it results in an error. **Fix:** This commit makes the field `wa_template_id` required, preventing users from sending a whatsapp message without a template. In stable versions, raise a validation error if a user attempts to send a message without selecting a template. [1] - https://github.com/odoo/enterprise/blob/fff9ad7999d4ff13adf899b2517e750a36c1261a/whatsapp/wizard/whatsapp_composer.py#L319 sentry-6854466874 Forward-Port-Of: odoo/enterprise#93898
Scheduled account report emails now skip customers that were deleted after being selected for batch sending. This prevents the automated send job from failing and helps ensure remaining customer statements are still processed smoothly.
Original PR description
When a partner included in a batch send is deleted before the cron "Send account reports automatically" runs, the cron fails because the partner no longer exists. Steps to reproduce: 1. Create partner A and a draft invoice linked to it 2. Go to Partner Ledger and select Customer Statement report 3. Click on Send and validate - Ensure the scheduled action is not executed immediately (e.g. by deactivating it) 4. Delete partner A 5. Run the cron "Send account reports automatically" -> Cron fails with "Record does not exist or has been deleted" This fix ensures only existing partners are kept for processing. opw-5085571 Forward-Port-Of: odoo/enterprise#95127
11 changes
Enhancements to existing features
The setting that controls whether tax details are handled as single lines has been moved from invoice OCR into the core accounting area. This makes the same behavior available for both OCR processing and electronic invoice imports, improving consistency across accounting workflows.
Original PR description
[IMP] account_invoice_extract: move field to account Move the extract_single_line_per_tax field to the account module: until now, this field was only used in the OCR, but we want to use it in the ubl import so to be accessible from both modules, we move it to account. task-5047859
Resolved issues and error corrections
The bank reconciliation action now avoids using desktop-only behavior on mobile screens, where a different view is shown. This prevents users from seeing an error when tapping the reconcile button on phones or small screens.
Original PR description
When clicking on the reconcile button in mobile, the js_class of the custom list view is never triggered because, in small screens (aka. "mobile"), by default, kanban views are used instead of list views (or at least take precedence). To avoid having a traceback, we will keep the custom behavior in desktop only no task id Forward-Port-Of: odoo/enterprise#95145
Users without HR permissions could see an empty employee list because an employee photo field triggered an access error. The view now limits that photo field for those users, keeping the work order employee list usable until the underlying HR issue is resolved.
Original PR description
HR use an access right on field. However they have an issue with the avatar field that return an error while it should not. Until they provide a fix limit the avatar field when the user don't have the hr user group. Forward-Port-Of: odoo/enterprise#95424
General Ledger PDF reports now show longer company names in the footer instead of cutting them off after a short limit. The footer spacing was also adjusted so the longer name fits cleanly on printed reports, improving document presentation for companies with longer legal names.
Original PR description
**Steps to reproduce:** 1. Install the Accounting module. 2. Set a company name longer than 24 characters. 3. Go to Accounting → Reporting → General Ledger. 4. Print the report → in the PDF footer,…
**Steps to reproduce:** 1. Install the Accounting module. 2. Set a company name longer than 24 characters. 3. Go to Accounting → Reporting → General Ledger. 4. Print the report → in the PDF footer, the company name is truncated. **Issue:** - The company name in the General Ledger report footer is cut off if it exceeds 24 characters. **Cause:** - The footer uses a static value limited to 24 characters: https://github.com/odoo/enterprise/blob/08564f3312c255f2f3ab95cef5a9bfc57727bd1f/account_reports/models/account_report.py#L5850-L5860 **Solution:** - Increased the footer text limit from 24 to 80 characters. - Adjusted page margin by changing `'data-report-margin-bottom': 15` → `'data-report-margin-bottom': 20` to ensure proper spacing for longer company names in the PDF. **After Apply Solution** <img width="1038" height="86" alt="After solution" src="https://github.com/user-attachments/assets/51ece47c-1950-4a54-8be3-f7ac2bbd8a0d" /> **Before Without Solution** <img width="1050" height="66" alt="Before Solution" src="https://github.com/user-attachments/assets/a13b9132-bf04-422a-8e32-1db5225afc33" /> opw - 5025972 Forward-Port-Of: odoo/enterprise#94535
Scheduled account report emails no longer fail when a partner included in a pending batch has been deleted before processing. The system now keeps only existing partners in the batch, helping automatic statement delivery continue reliably.
Original PR description
When a partner included in a batch send is deleted before the cron "Send account reports automatically" runs, the cron fails because the partner no longer exists. Steps to reproduce: 1. Create partner A and a draft invoice linked to it 2. Go to Partner Ledger and select Customer Statement report 3. Click on Send and validate - Ensure the scheduled action is not executed immediately (e.g. by deactivating it) 4. Delete partner A 5. Run the cron "Send account reports automatically" -> Cron fails with "Record does not exist or has been deleted" This fix ensures only existing partners are kept for processing. opw-5085571 Forward-Port-Of: odoo/enterprise#95127
This fix ensures helpdesk tickets appear correctly in timesheet reports when they should. It corrects a previous report update that did not target the existing report field properly, helping users see complete ticket-related time information.
Original PR description
Description of the issue/feature this PR addresses: The previous commit attempted to extend the timesheet report to display tickets by using position="attributes" on a new . This approach does not work in Odoo reports because position="attributes" can only modify existing elements. There is no indication that the behavior of not displaying tickets was intentional, so this PR corrects that implementation. Current behavior before PR: The previous fix did not correctly locate the existing element for task/project info. Desired behavior after PR is merged: The existing is correctly found and updated to include show_ticket in its t-if. Forward-Port-Of: odoo/enterprise#95206
Customers buying subscriptions through the e-commerce checkout are now informed that their payment details will be saved for automatic renewals. This aligns the online shop experience with the portal flow and improves transparency around recurring payments.
Original PR description
Before this commit, when the customers paid a subscription on the portal, they would get the following information: Your payment details will be saved for automatic renewals. When they would pay on the e-commerce, the token would be saved but they would not be notified. task 4808806
This fix ensures that using the left and right arrow keys inside a dropdown does not accidentally trigger actions elsewhere in the interface. It makes keyboard navigation more predictable and prevents unexpected UI changes while users are selecting dropdown options.
Original PR description
This commit prevents arrowleft and arrowright hotkeys to trigger on other parts of the UI when navigating a dropdown. Community: https://github.com/odoo/odoo/pull/226604 Task: [5048895](https://www.odoo.com/odoo/project.task/5048895) Forward-Port-Of: odoo/enterprise#94478
Quality checks now use the unit of measure entered on the receipt line when it differs from the product default. This helps teams review inspections with the correct operational quantity and avoids confusion during receiving.
Original PR description
Steps to reproduce: - Create a storable product “P1” with UoM = Unit - Create a quality point: - Control per: Quantity - Operation type: Receipt - Product: P1 - Create a receipt of 1 unit of P1 - Mark as "To Do" - Open the detailed operations (SML) and update the UoM to Dozen - Go to the quality check Issue: The UoM of the quality check is still "Unit" instead of "Dozen", because the field was related to `product_id.uom_id`. Fix: Compute the UoM from the stock move line if available, otherwise fall back to the product's default UoM. opw-5080657
Users can no longer try to send a WhatsApp message without selecting a template. This prevents an application error and guides users to complete the required message setup before sending.
Original PR description
Currently, an error occurs when the user attempts to send a whatsapp message without selecting a template. **Steps to Reproduce:** 1. Configure a WhatsApp Business Account and synchronize the…
Currently, an error occurs when the user attempts to send a whatsapp message without selecting a template. **Steps to Reproduce:** 1. Configure a WhatsApp Business Account and synchronize the templates. 2. Open any contact and click the **WhatsApp** button next to the phone number. 3. Remove the template and click **Send Message**. **Error:** `ValueError - Expected singleton: whatsapp.template()` **Cause:** At [1], it attempts to fetch the formatted body and header from the template ID. Since no template is selected, it results in an error. **Fix:** This commit makes the field `wa_template_id` required, preventing users from sending a whatsapp message without a template. In stable versions, raise a validation error if a user attempts to send a message without selecting a template. [1] - https://github.com/odoo/enterprise/blob/fff9ad7999d4ff13adf899b2517e750a36c1261a/whatsapp/wizard/whatsapp_composer.py#L319 sentry-6854466874 Forward-Port-Of: odoo/enterprise#93898
Code cleanup and technical improvements
The system now relies on a single built-in safeguard to prevent circular parent-child record links, removing duplicate checks in affected apps. Users may see clearer error messages when they accidentally create a loop, while behavior remains otherwise unchanged.
Original PR description
The ORM's `_parent_store` mechanism already prevents recursive loops by raising a `ValidationError` early on. This commit removes now-redundant (since https://github.com/odoo/odoo/pull/35659) Python constraints across various models that were performing the same check. Additionally, the generic ORM error message for recursion has been made more user-friendly to improve the user experience.
20 changes
Enhancements to existing features
This update improves the accounting tax calculation tools used for global discounts and down payments. It helps keep document totals stable during tax recomputation and prepares the accounting module for upcoming product bundle improvements.
Original PR description
--- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228440
Resolved issues and error corrections
General Ledger PDF footers now allow longer company names, preventing them from being cut off when reports are printed. The footer spacing was also increased so longer names display cleanly without crowding the page.
Original PR description
**Steps to reproduce:** 1. Install the Accounting module. 2. Set a company name longer than 24 characters. 3. Go to Accounting → Reporting → General Ledger. 4. Print the report → in the PDF footer,…
**Steps to reproduce:** 1. Install the Accounting module. 2. Set a company name longer than 24 characters. 3. Go to Accounting → Reporting → General Ledger. 4. Print the report → in the PDF footer, the company name is truncated. **Issue:** - The company name in the General Ledger report footer is cut off if it exceeds 24 characters. **Cause:** - The footer uses a static value limited to 24 characters: https://github.com/odoo/enterprise/blob/08564f3312c255f2f3ab95cef5a9bfc57727bd1f/account_reports/models/account_report.py#L5850-L5860 **Solution:** - Increased the footer text limit from 24 to 80 characters. - Adjusted page margin by changing `'data-report-margin-bottom': 15` → `'data-report-margin-bottom': 20` to ensure proper spacing for longer company names in the PDF. **After Apply Solution** <img width="1038" height="86" alt="After solution" src="https://github.com/user-attachments/assets/51ece47c-1950-4a54-8be3-f7ac2bbd8a0d" /> **Before Without Solution** <img width="1050" height="66" alt="Before Solution" src="https://github.com/user-attachments/assets/a13b9132-bf04-422a-8e32-1db5225afc33" /> opw - 5025972 Forward-Port-Of: odoo/enterprise#94535
This update prevents an employee list from appearing empty for users who do not have HR permissions. It avoids loading an employee avatar field that can trigger an access error, helping manufacturing users keep working without disruption.
Original PR description
HR use an access right on field. However they have an issue with the avatar field that return an error while it should not. Until they provide a fix limit the avatar field when the user don't have the hr user group. Forward-Port-Of: odoo/enterprise#95424
Users can no longer try to send a WhatsApp message without selecting a template, preventing an error that interrupted the sending process. This makes the WhatsApp messaging flow clearer and more reliable for users.
Original PR description
Currently, an error occurs when the user attempts to send a whatsapp message without selecting a template. **Steps to Reproduce:** 1. Configure a WhatsApp Business Account and synchronize the…
Currently, an error occurs when the user attempts to send a whatsapp message without selecting a template. **Steps to Reproduce:** 1. Configure a WhatsApp Business Account and synchronize the templates. 2. Open any contact and click the **WhatsApp** button next to the phone number. 3. Remove the template and click **Send Message**. **Error:** `ValueError - Expected singleton: whatsapp.template()` **Cause:** At [1], it attempts to fetch the formatted body and header from the template ID. Since no template is selected, it results in an error. **Fix:** This commit makes the field `wa_template_id` required, preventing users from sending a whatsapp message without a template. In stable versions, raise a validation error if a user attempts to send a message without selecting a template. [1] - https://github.com/odoo/enterprise/blob/fff9ad7999d4ff13adf899b2517e750a36c1261a/whatsapp/wizard/whatsapp_composer.py#L319 sentry-6854466874 Forward-Port-Of: odoo/enterprise#93898
Czech localization demo accounting entries now use dates that stay consistent when company details are updated. This prevents validation errors so users can save changes to a Czech company's address when demo data is installed.
Original PR description
## [FIX] l10n_cz: prevent error with misaligned accounting date and sequence number of demo moves #### Description of the issue/feature this PR addresses: Editing CZ Company address while having demo…
## [FIX] l10n_cz: prevent error with misaligned accounting date and sequence number of demo moves #### Description of the issue/feature this PR addresses: Editing CZ Company address while having demo data throws Validation Error #### Current behavior before PR: When trying to change address of CZ Company while l10n_cz with demo data is present an error popup is displayed and it's not possible to to save the changes. Steps to reproduce: - Install l10n_cz with demo data - Open CZ Company in form view - Change address (e.g. change city Praha -> Brno) - Click Save #### Desired behavior after PR is merged: The address changes are saved without any error. #### Solution: This change adds `taxable_supply_date` date values for CZ demo moves that are compatible with `invoice_date` values to make sure that accounting date values are the same on each recomputatation and do not lead to new sequence numbers that are not aligned with the previous ones which would cause errors being raised by sequence mixin. Related to: #226152 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228157 Forward-Port-Of: odoo/odoo#227847
This fix prevents an error when users tap the reconcile button from a mobile screen. The desktop-specific reconciliation behavior is now kept to desktop views, improving reliability for mobile accounting workflows.
Original PR description
When clicking on the reconcile button in mobile, the js_class of the custom list view is never triggered because, in small screens (aka. "mobile"), by default, kanban views are used instead of list views (or at least take precedence). To avoid having a traceback, we will keep the custom behavior in desktop only no task id Forward-Port-Of: odoo/enterprise#95145
Arrow keys used while navigating a dropdown now stay focused on that dropdown instead of triggering actions elsewhere on the page. This prevents unexpected navigation or behavior and makes the interface more predictable for users.
Original PR description
This commit prevents arrowleft and arrowright hotkeys to trigger on other parts of the UI when navigating a dropdown. Community: https://github.com/odoo/odoo/pull/226604 Task: [5048895](https://www.odoo.com/odoo/project.task/5048895)
This fix restores the ability to change icons in the Share snippet when it is placed after another website building block. It ensures website editors can customize social sharing elements reliably, avoiding a frustrating editing issue.
Original PR description
Steps to reproduce: - Add an "Image-Text" snippet on the page. - Drop the "Share" snippet below the image. - Double click on an icon to change it. -> Problem: the icon can not be changed Note: in the above steps to reproduce, an important think is that the "Share" snippet is not the first snippet that is dropped. The problem is that the icons and the title of the snippet were added in the `extra_contenteditable_handlers` resource. The handler of this resource takes the elements of `force_editable_selector` that are inside the `root` (that is the column of the snippet if the "Share" snippet is the second dropped snippet) and checks for other elements. Because they are no elements remaining after checking for elements of the `force_editable_selector` resource, the system does not correctly add the `contenteditable` attribute on those elements. task-5107669
This fix restores a missing database index for stock rules linked to companies. It prevents misleading upgrade messages and helps keep stock-related upgrade checks aligned with expected system behavior.
Original PR description
due to conflict on this forward port https://github.com/odoo/odoo/pull/113045 ``index=True`` was removed according to this pr https://github.com/odoo/odoo/pull/90531 So, adding it back during upgrade it shows misleading logs ``` 2025-08-26 22:19:25,039 23 INFO db_3112946 odoo.schema: Keep unexpected index stock_rule_company_id_index on table stock_rule ``` opw-5052223 upg-3112946 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226268
Scheduled customer statement sends now skip partners that were deleted before processing. This prevents the automatic account report job from failing and helps ensure remaining queued reports continue to be sent reliably.
Original PR description
When a partner included in a batch send is deleted before the cron "Send account reports automatically" runs, the cron fails because the partner no longer exists. Steps to reproduce: 1. Create partner A and a draft invoice linked to it 2. Go to Partner Ledger and select Customer Statement report 3. Click on Send and validate - Ensure the scheduled action is not executed immediately (e.g. by deactivating it) 4. Delete partner A 5. Run the cron "Send account reports automatically" -> Cron fails with "Record does not exist or has been deleted" This fix ensures only existing partners are kept for processing. opw-5085571 Forward-Port-Of: odoo/enterprise#95127
This update makes an internal website theme test wait for asset reloading to finish before completing. This reduces random test failures and helps keep development and release validation more stable, without changing the customer-facing website experience.
Original PR description
The goal of this commit is to fix an undetermined bug in the theme tab palette tests. Sometimes, ‘reload assets’ occurred before the end of the test. We will therefore wait to go through ‘reload assets’ before the end of the test in order to make it deterministic. Error: https://runbot.odoo.com/odoo/error/232650 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#228175
This fix ensures timesheet reports correctly include helpdesk ticket information where intended. It corrects a previous report update that did not properly target the existing report field, helping users see complete ticket-related timesheet details.
Original PR description
Description of the issue/feature this PR addresses: The previous commit attempted to extend the timesheet report to display tickets by using position="attributes" on a new . This approach does not work in Odoo reports because position="attributes" can only modify existing elements. There is no indication that the behavior of not displaying tickets was intentional, so this PR corrects that implementation. Current behavior before PR: The previous fix did not correctly locate the existing element for task/project info. Desired behavior after PR is merged: The existing is correctly found and updated to include show_ticket in its t-if. Forward-Port-Of: odoo/enterprise#95206
Resetting an Odoo Calendar connected to Google Calendar no longer fails because of permissions on events the user cannot edit. This prevents an unnecessary error during calendar resets and lets users complete the reset process smoothly.
Original PR description
Before this commit, when resetting the Odoo Calendar of an user, it would trigger a ValidationError for updating events that the current user wasn't able to update, even though it was not an updated per se, but just a deletion of it in Odoo. After this commit, we no longer trigger that ValidationError during resets of Odoo Calendars, fixing the error. task-5103918 Forward-Port-Of: odoo/odoo#228195 Forward-Port-Of: odoo/odoo#227991
A small fix ensures Swedish ISO 20022 payment journal processing passes all needed information when other Odoo modules extend it. This helps avoid errors or missing details in payment file generation for customized setups.
Original PR description
Pass all arguments to super-call of _get_company_PartyIdentification32-method in account_iso20022/models/account_journal_iso20022_se.py so they can be passed correctly in other modules inheriting the method. Forward-Port-Of: odoo/enterprise#93883
This fix ensures the cash movement popup in Point of Sale uses the translated text instead of the original untranslated variable. It improves the experience for users working in languages other than the default by showing localized wording consistently.
Original PR description
Makes changes for translation Description of the issue/feature this PR addresses: Error variable code for translation Current behavior before PR: The original variable is used Desired behavior after PR is merged: The translated variable is used --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents accounting reports from trying to refresh after the report view has already been closed or replaced. Users are less likely to encounter an error when navigating away while a currency rate filter dropdown is open.
Original PR description
For the currency rate filter, applyFilters is called when the dropdown is closed. It might heppen that we have the dropdown open then we click on something that trigger the destruction of the report view but that still trigger applyFilters which try to apply filter on a destroyed component which is illegal. To prevent this we check if the component is destroyed before reloading the controller. Forward-Port-Of: odoo/enterprise#94313
The kiosk online payment page now shows a single background instead of duplicating it behind the QR code payment section. This improves the visual clarity and polish of the self-order payment experience for customers.
Original PR description
pos_online_* = pos_online_payment_self_order This commit ensures that only one background is displayed on the kiosk online payment page. The background is correctly displayed in 'pos_self_order.PaymentPage', and it should not be displayed again in the “Scan the QR code to pay” subcomponent. <img width="688" height="485" alt="Screenshot 2025-09-24 at 13 49 00" src="https://github.com/user-attachments/assets/e521ffce-82db-4900-828a-5d086fa9b4ac" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228424
This fixes an issue where General Settings could crash if a company using GCC invoicing had no country set in its address. The system now safely checks that a country exists before applying GCC-specific invoice logic, allowing users to continue configuring company settings normally.
Original PR description
Steps to reproduce:-
- Install `l10n_gcc_invoice` module.
- Go to Companies and open current Company.
- Remove Country from company Address.
- Click on General Settings.
Error :-
Pastebin: https://pastebin.com/xWqVDWjB
```
File /home/odoo/odoo18/odoo/community/addons/l10n_gcc_invoice/models/res_company.py, line 13, in _compute_l10n_gcc_country_is_gcc
record.l10n_gcc_country_is_gcc = 'GCC' in record.country_id.country_group_codes
TypeError: argument of type 'bool' is not iterable
```
Root cause: At [1], `record.country_id.country_group_codes` is considered as iterable, but when no country is set on company it evaluates to False.
Solution: First check for `country_id` before checking `country_group_codes`.
[1]: https://github.com/odoo/odoo/blob/45fcd9716fe8cabd4db2ddbdf54caa8f69d5a013/addons/l10n_gcc_invoice/models/res_company.py#L13The web client now passes the action identifier into view settings so Odoo Studio can correctly tell whether an action can be edited. This prevents incorrect editability decisions in Studio and improves reliability without changing day-to-day workflows.
Original PR description
This information is required so that the studio can determine whether the action can be edited. opw-5066488 Forward-Port-Of: odoo/odoo#228371 Forward-Port-Of: odoo/odoo#227264
Documentation and clarification updates
This pull request records that Fomasoft has signed Odoo's Contributor License Agreement. It is an administrative legal update that enables their contributions to be accepted under the project’s contribution rules.
Original PR description
Signed by CLA --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
4 changes
Enhancements to existing features
This change improves how Odoo reports errors that happen during automated web actions by including the full error trace when available. This helps support and development teams identify the real source of failures faster, reducing time spent investigating unclear browser error messages.
Original PR description
Because it only embeds the error message, and because it ultimately gets `console.error`-ed, an error during a `run()` function is currently extremely unhelpful e.g.
Cannot read properties of undefined (reading 'ownerDocument')
might be all you get. And despite what one might assume, browsers (or at least chrome) don't seem to chain stacktraces when using `{cause}`, so even printing stacktraces on `console.error` does not yield useful information, the stacktrace point to `performAction` instead of a useful location.
So use the `Error#stack` if it's available. In chrome that includes both the error message and the full stack, so a formatted error message is unnecessary. Fall back on a formatted error message if the error has no stack for some reason.Resolved issues and error corrections
Users can no longer attempt to send a WhatsApp message after removing the required template. This prevents an unexpected error and gives a clearer validation path, improving reliability when messaging contacts.
Original PR description
Currently, an error occurs when the user attempts to send a whatsapp message without selecting a template. **Steps to Reproduce:** 1. Configure a WhatsApp Business Account and synchronize the…
Currently, an error occurs when the user attempts to send a whatsapp message without selecting a template. **Steps to Reproduce:** 1. Configure a WhatsApp Business Account and synchronize the templates. 2. Open any contact and click the **WhatsApp** button next to the phone number. 3. Remove the template and click **Send Message**. **Error:** `ValueError - Expected singleton: whatsapp.template()` **Cause:** At [1], it attempts to fetch the formatted body and header from the template ID. Since no template is selected, it results in an error. **Fix:** This commit makes the field `wa_template_id` required, preventing users from sending a whatsapp message without a template. In stable versions, raise a validation error if a user attempts to send a message without selecting a template. [1] - https://github.com/odoo/enterprise/blob/fff9ad7999d4ff13adf899b2517e750a36c1261a/whatsapp/wizard/whatsapp_composer.py#L319 sentry-6854466874 Forward-Port-Of: odoo/enterprise#93898
This fixes a Sales module issue where automated product configurator checks could fail when sales order line columns were customized. The change makes the test flow more robust for businesses that adapt sales order screens to their needs.
Original PR description
To reproduce: 1. Manually modify the SO view `view_order_form` notebook SO lines list view to make visible any column before `product_id` For example:…
To reproduce:
1. Manually modify the SO view `view_order_form` notebook SO lines list view to make visible any column before `product_id` For example:
https://github.com/odoo/odoo/blob/18.0/addons/sale/views/sale_order_views.xml#L521 making the field `display_type` visible
2. Run the tests of `sale` module
=> `sale` module tests will fail on test `test_sale_combo_configurator_preconfigure_unconfigurable_ptals`
```
FAILED: [18/22] Tour sale_combo_configurator_preconfigure_unconfigurable_ptals → Step Verify that configurable ptals are now configured (trigger:
.sale-combo-configurator-dialog
.combo-item-grid
.product-card:has(.card-title:contains("Test product"))
:contains("Attribute B: B")).
Element (
.sale-combo-configurator-dialog
.combo-item-grid
.product-card:has(.card-title:contains("Test product"))
:contains("Attribute B: B")) has not been found.
TIMEOUT step failed to complete within 10000 ms.
```
see runbot build fail at:
https://runbot.odoo.com/runbot/build/89552334
The issue happen as - for some dark magic JS/XML reason - adding the field before product_id make fail the step to click the checkbox using the span.
Fix was suggested by PIPU to solve/workaround the issue
In practice, this issue was discovered accidentally with a customisation which was willing to add a custom field at the start of the list
opw-5068699This fix replaces a technical crash with a clear user-facing message when an Argentine invoice document number has an invalid format. It helps users understand and correct the issue during invoice reversal or processing instead of seeing a system traceback.
Original PR description
Description of the issue/feature this PR addresses: This pull request improves error handling in the `_l10n_ar_get_document_number_parts` method in `account_move.py`. The main change is to provide a…
Description of the issue/feature this PR addresses:
This pull request improves error handling in the `_l10n_ar_get_document_number_parts` method in `account_move.py`. The main change is to provide a user-friendly error message when the document number does not match the expected Argentine format.
Error handling improvement:
* Added a `try/except` block to catch `ValueError` when splitting the `document_number`, raising a `UserError` with a localized message if the format is incorrect.
Current behavior before PR:
If the user tries to reverse a document that does not match the argentinean format, a traceback an error such as the following is generated:
`File "/home/odoo/src/enterprise/l10n_ar_edi/models/account_move.py", line 588, in _get_related_invoice_datawskey[afip_ws]['number']: self._l10n_ar_get_document_number_parts(File "/home/odoo/src/repositories/ingadhoc-odoo-argentina/l10n_ar_ux/models/account_move.py", line 101, in _l10n_ar_get_document_number_partsreturn super()._l10n_ar_get_document_number_parts(document_number, document_type_code)File "/home/odoo/src/odoo/addons/l10n_ar/models/account_move.py", line 21, in _l10n_ar_get_document_number_partspos, invoice_number = document_number.split('-')ValueError: not enough values to unpack (expected 2, got 1)as`
Desired behavior after PR is merged:
An `UserError` is raised.
<img width="1553" height="419" alt="image" src="https://github.com/user-attachments/assets/b47dc205-6997-4117-a768-d6241d33b158" />
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr10 changes
Enhancements to existing features
The tax search view now includes the tax amount field, making it easier for users to find taxes by their configured percentage or fixed amount. This reduces time spent locating the right tax record and improves day-to-day accounting usability.
Original PR description
This commit improves the usability of the tax search view by including the `amount` field. Users can filter taxes based on their configured percentage or amount directly from the search bar. task-5088050
Resolved issues and error corrections
This fix swaps two Mexican DIOT report columns so exempt imports and exempt amounts appear in the correct positions. The values were already calculated correctly, but the corrected ordering helps ensure exported reports match the expected official layout.
Original PR description
Description of the issue/feature this PR addresses: The description of the columns “exempt imports” and “exempt” is somewhat ambiguous, so when developing the diot, there was a small error in the order of the columns. The values are calculated correctly, but columns 49 and 50 were inadvertently swapped. Current behavior before PR: “exempt” is column 49 “exempt imports” is column 50 Desired behavior after PR is merged: “exempt” is column 50 “exempt imports” is column 49 Task-id: 5096808 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Mexican DIOT report export now places the “exempt imports” and “exempt” values in the correct columns. This fixes a formatting issue in the downloaded TXT file so businesses can submit reports with the expected column layout, while the underlying calculated values remain unchanged.
Original PR description
The description of the columns “exempt imports” and “exempt” is somewhat ambiguous, so when developing the diot, there was a small error in the order of the columns. The values are calculated correctly, but columns 49 and 50 were inadvertently swapped. This Pr changes the order of the columns in the downloadable file (txt) and corrects the tests due to the change. Task-id: 5096808 I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Fixed an issue where users could see raw HTML text instead of a properly formatted help message when no bank transactions were found. This makes the bank journal experience clearer and more professional when fetching transactions or changing filters.
Original PR description
Before this commit: - The help message displayed raw HTML tags when no transactions were returned after clicking 'Fetch Transactions' in the Bank journal. - Also, removing a filter (without reloading) and applying another filter that resulted in no matches, the same issue occurred. After this commit: - The help message is now consistently rendered with proper markup task-4942234
Point of Sale self-order sessions now remove their temporary numbering data when a session is closed. This helps keep the database tidier over time and avoids buildup from repeated sessions, with no expected change to the checkout experience.
Original PR description
to avoid having too many postgres sequences, this make sure the sequence used by the pos session is cleaned up after being closed. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix makes a purchase stock test use the intended type of product regardless of other installed localization modules. It helps prevent false test failures and keeps quality checks reliable without changing day-to-day business workflows.
Original PR description
The test `test_receive_negative_quantity` is failing when run with the `l10n_ke` module installed. The failure occurs during the validation of the picking created from a negative-quantity purchase…
The test `test_receive_negative_quantity` is failing when run with the `l10n_ke` module installed. The failure occurs during the validation of the picking created from a negative-quantity purchase order. The test assumes the product is of type `consu`, which bypasses stock reservation. However, the following [XML default](https://github.com/odoo/enterprise/blob/17.0/l10n_ke_edi_oscu_stock/data/ir_default.xml#L5) in l10n_ke forces the product type to `product` (stockable), triggering reservation logic. Since the ordered quantity is negative, no reservation occurs, and the `_sanity_check()` fails with: `You cannot validate a transfer if no quantities are reserved.` We fix this by explicitly setting a product with the type `consu` in the test. This ensures that reservation is skipped regardless of which modules are installed or what defaults they apply. runbot:[108147](https://runbot.odoo.com/odoo/error/108147) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Scanning a product or lot in the Barcode app now opens the same kanban-style view used elsewhere in barcode workflows. This makes the experience more consistent and helps warehouse users avoid switching from an unexpected list view.
Original PR description
This commit is to show the kanban view as a default when scanning a product or a lot in barcode. Before PR: All views in barcode are in kanban view except when scanning a product or a lot, it appears in list view. After PR: Now barcode also shows kanban view when scanning a product or a lot.
This fixes an issue where borders added to images in email designs disappeared after sending. Email recipients will now see image borders as intended, improving consistency between the editor preview and delivered emails.
Original PR description
Problem: When adding a border to an image and sending an email, the border is not visible in the received email. Solution: Ensure a `border-style` is set if missing, otherwise keep the existing one. Steps to reproduce: - Open email marketing. - Add an image snippet. - Add a border to the image. - Send the email. - The received image has no border. opw-5004824 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Documentation and clarification updates
This update adds new members to the Adhoc corporate contributor license agreement records. It keeps Odoo's legal contributor documentation current so contributions remain properly covered.
Original PR description
--- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226715
Miscellaneous changes
This work touches the website module's dynamic snippet behavior, which controls how selected content blocks appear on website pages. Because the pull request is still marked as work in progress and lacks a detailed description, the expected business impact appears limited until more information is provided.
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