Monday, August 24, 2026
14 changes · saas-18.3
Resolved issues and error corrections
Users can now open credit card and cash journal statements directly from the accounting dashboard list views. This fixes a navigation issue that prevented reviewing individual statements from those lists.
Original PR description
Issue: When opening the credit card statements list view from clicking the "Statements" button in the accounting dashboard of a credit card journal, the resulting list view does not allow clicking on any of the items to enter the form view Steps to reproduce: 1. Create a credit card journal and some credit card statements 2. Go to the accounting dashboard, and click on the button with three dots to the upper right of the credit card journal card and click "Statements" 3. Try to click on any of the statements in the list view and it won’t open any of them Cause: The window action for credit card journals (action_credit_statement_tree) was missing the form view in the view_mode Solution: Add form to the view_mode of action_credit_statement_tree. The cash journal bank statements window action (action_view_bank_statement_tree) was also missing the form view, so it was added as well opw-6449315 Forward-Port-Of: odoo/odoo#282816
The Indian localization now correctly shows the “View Journal Item(s)” link in lower TCS tax warnings. This helps users quickly open the related accounting entries from the warning instead of having to search for them manually.
Original PR description
The `lower_tcs_tax` warning was using the "actions" key instead of "action". As a result, the warning message was displayed correctly, but the "View Journal Item(s)" action link was not shown.
The accounting dashboard now shows the full invoice or bill amount for documents marked "To Check" instead of only the unpaid balance. This avoids understating the value of documents that still require review, especially when they have been partially paid.
Original PR description
Currently, the "To Check" links on the dashboard display the residual amount of invoices and bills. Since the entire document needs to be checked regardless of partial payments, showing the remaining balance is misleading. This commit updates the `selects` list in `_get_to_check_payment_query` to use `amount_total` instead of `amount_residual`, ensuring the dashboard reflects the full value of the documents. Task-6478415 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents temporary wizard screens from being treated as available targets for mass mailings. It keeps mailing recipient choices cleaner and avoids users selecting internal setup flows that should not receive campaigns.
Original PR description
The search function ` _search_is_mailing_enabled` mistakenly used `model.is_transient()` (where the model is the `ir.model` record itself) to filter the transient models, which always returns `False` since `ir.model` is a regular persistent model. As a result, transient models (wizards) were never filtered out. This commit fixes it by using`self.env[model.model].is_transient()` to call `is_transient` on the actual model. Task-6458883 Forward-Port-Of: odoo/odoo#282783
Clicking a table of contents entry now positions the selected heading at the top of the page instead of near the bottom. This makes long Knowledge articles easier to navigate and ensures readers immediately see the start of the chosen section.
Original PR description
Root cause: Since https://github.com/odoo/odoo/commit/f5cf856 the table of contents uses the scrollTo helper from web to reach the clicked heading. The helper only makes the element visible. When the…
Root cause: Since https://github.com/odoo/odoo/commit/f5cf856 the table of contents uses the scrollTo helper from web to reach the clicked heading. The helper only makes the element visible. When the heading is below the screen it is placed at the bottom border of the scrollable area, so the reader sees the heading but not the section under it. The second scrollTo call that was meant to correct this does nothing because the heading is already visible after the first scroll, so no branch of the helper runs. Fix: Pass isAnchor to the scrollTo call in scrollIntoView of table_of_content_manager.js. With this option the helper always places the element at the top of the scrollable area in both scroll directions, and the offset computed for sticky elements keeps working. The second scrollTo call is removed since one call is enough. This method is the one changed by the commit above and it is used by the editor and the readonly viewer, so both are fixed. Steps to reproduce: 1. Open the Knowledge app and create an article 2. Add several headings with paragraphs between them so the article is longer than the screen 3. Type /table and insert a Table of Contents at the top of the article 4. Click an entry of the table of contents that points to a heading below the visible part of the page => the page scrolls so the heading is at the bottom of the page instead of the top Ticket [link](https://www.odoo.com/odoo/project/49/tasks/6376092) opw-6376092
The accounting dashboard now shows the full invoice or bill amount for documents marked “To Check,” rather than only the remaining unpaid balance. This gives users a clearer view of the total value that still needs review, even when partial payments have already been made.
Original PR description
Currently, the "To Check" links on the dashboard display the residual amount of invoices and bills. Since the entire document needs to be checked regardless of partial payments, showing the remaining balance is misleading. This commit updates the `selects` list in `_get_to_check_payment_query` to use `amount_total` instead of `amount_residual`, ensuring the dashboard reflects the full value of the documents. Task-6478415 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Emails sent from mail groups now show the mail group name in the Reply-To field instead of the individual author's name. This makes group communications clearer for recipients and helps replies go to the expected group identity.
Original PR description
Steps to reproduce: -------------------------------------- 1. Install the `mail_group` module 2. Go to Settings > Technical > Email > Alias Domains 3. Create an alias domain, for example,…
Steps to reproduce: -------------------------------------- 1. Install the `mail_group` module 2. Go to Settings > Technical > Email > Alias Domains 3. Create an alias domain, for example, `localsystem.com` 4. Go to Settings > Technical > Discuss > Mail Groups 5. Open a mail group, for example, My Company News 6. Click the Emails smart button. 7. Create a new email, set the subject, author, and content, and accept the message 8. Go to Settings > Technical > Email > Emails and click Send Now if necessary 9. Inspect the Reply-To header of the received email. Current Behavior: -------------------------------------- The Reply-To address uses the display name of the author. `Reply-To: 'Mitchell Admin' <newsletter@localsystem.com>` Expected Behavior: -------------------------------------- The Reply-To address should use the display name of the mail group. `Reply-To: 'My Company News' <newsletter@localsystem.com>` Issue: --------------------------------------- When email notifications were sent from a mail group (`mail.group`), the `Reply-To` header incorrectly used the author's display name instead of the mail group's name (`self.name`) https://github.com/odoo/odoo/blob/8990a10aa786be4c124ba3d228e7e23c50886fad/addons/mail/models/models.py#L693-L696 Solution: --------------------------------------- 1. Extracted display name logic into a separate `_notify_get_reply_to_name` method, which is overridden in `mail.group` to use the group's name as the Reply-To display name. 2. Updated `_notify_get_reply_to_batch` to browse the specific `res_id` before calling `_notify_get_reply_to_formatted_email`, since the method only needs the record being processed instead of the entire multi-record in self. 3. Ensured safe batch processing by providing a singleton record to the `mail.group` override, allowing it to safely access `self.name` without causing Expected singleton errors. opw-6379281 Before: -------------- <img width="930" height="354" alt="image" src="https://github.com/user-attachments/assets/ef8a297b-28c4-4601-8c5f-b69e9ed43296" /> After: -------------- <img width="996" height="359" alt="image" src="https://github.com/user-attachments/assets/bd83a7ac-2026-4ad8-ac02-c167417fec7c" />
This fixes an edge case where a company sending an electronic invoice to itself could have the incoming copy incorrectly treated as a duplicate. The vendor bill can now be created as expected, avoiding missed documents in Peppol workflows.
Original PR description
Edge case: self-addressed messages (sender == receiver). i.e. a company genuinely invoicing itself. The outgoing invoice already carries the message UUID, so the duplicate check would wrongly discard the incoming document. Exclude those messages from the check so the vendor bill can still be created. task-no --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#283663 Forward-Port-Of: odoo/odoo#283574
This update prevents a rare crash when Belgian Intrastat reporting logic is run in contexts where a user cannot access root company data. It has little day-to-day impact in the standard interface, but improves reliability for tests, customizations, and future flows.
Original PR description
Due to some trouble with tests, we found that in some cases, this function is called on the root company, and if the user does not have the access rights to read data from the company (users with system rights have them by default), it will cause a crash. This situation is not possible with the standard UI, but we fix it in case it becomes possible in a future version or customization.
UPS shipping now follows UPS documentation by allowing phone numbers between 1 and 15 digits instead of requiring at least 10. This prevents valid customers in countries with shorter phone numbers, such as Luxembourg, from being blocked when requesting shipping rates.
Original PR description
**Steps to reproduce:** - Create a contact with a phone number that has 9 characters - Setup an UPS carrier, a configuration that works is UPS Saver as Service Type and UPS Package/customer supplied…
**Steps to reproduce:** - Create a contact with a phone number that has 9 characters - Setup an UPS carrier, a configuration that works is UPS Saver as Service Type and UPS Package/customer supplied as a package type - Create a quotation, put the created contact as a client - Try adding a shipping and getting the rates - An User Error appears, the phone number is too short **Why the fix:** Before this commit, any phone number that was less than 10 characters would raise an User Error, but some countries, such as Luxembourg, use phone numbers that are nine characters long or even less. If we check the official UPS documentation (https://developer.ups.com/tag/Shipping?loc=en_EN#operation/Shipment), we can see in the Ship_to/Phone section, that the phone number should be a number between 1 and 15, not saying it should be 10 characters or more. <img width="495" height="473" alt="image" src="https://github.com/user-attachments/assets/fed82987-ffb8-4b84-b282-6c3d3b4f304e" /> After this commit, we adapt the way we prevent the user from inputing phone numbers to fit the official UPS documentation. opw-6307577 Forward-Port-Of: odoo/enterprise#122831
The LinkedIn social integration now handles cases where LinkedIn returns no account statistics. This prevents refresh failures and keeps social account data updates running smoothly even when LinkedIn has no stats available.
Original PR description
Bug === When the LinkedIn API returns no statistics for the account, the refresh crashes. Task-6425391 Forward-Port-Of: odoo/enterprise#126326
Code cleanup and technical improvements
The GCC invoice module was simplified by removing internal custom code that no longer does anything useful. This reduces maintenance risk while keeping existing invoice behavior unchanged for users.
Original PR description
Remove create() and _compute_narration() method overrides from l10n_gcc_invoice as they only existed to call _load_narration_translation(), which has already been disabled. The parent class implementations handle all required functionality. Keeps the codebase clean by removing unnecessary method overrides. Forward-Port-Of: odoo/odoo#281565 Forward-Port-Of: odoo/odoo#281395
Documentation and clarification updates
A contributor submitted their Individual Contributor License Agreement for Odoo. This legal step confirms the contributor's permission to contribute code and helps keep the project's contribution process compliant.
Original PR description
This pull request submits my Odoo Individual Contributor License Agreement signature. Forward-Port-Of: odoo/odoo#282045
This update records that GitHub user kshitij-nariya has signed the Odoo Individual Contributor License Agreement. This is an administrative legal step that allows their future contributions to be accepted and merged into the project.
Original PR description
Description of the issue/feature this PR addresses: Signed the Odoo Individual Contributor License Agreement to contribute to the Odoo repository. Current behaviour before PR: The CLA signature is missing for GitHub user `kshitij-nariya`, which will prevent future contributions from being accepted and merged. Desired behaviour after PR is merged: The CLA signature for `kshitij-nariya` is recorded in the repository, allowing future pull requests and contributions to be successfully merged. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#282808