Daily updates from Odoo
Wednesday, September 10, 2025
29 changes · master
New functionality added to Odoo
The KPI summary now includes the number of documents waiting in the Inbox and clearer status information for pending account returns. This helps teams quickly spot outstanding documents and upcoming or overdue filing work without navigating into each area separately.
Original PR description
With this commit, `kpi.provider.get_kpi_summary` will show how many documents are present in the Inbox folder, as well as the status of the `account.return.types` (`late`, `longterm`, `to_do`, `to_submit` and `done`) depending on which account.return are not completed and on their due date. Task-id: 5062431 Forward-Port-Of: odoo/enterprise#93720
Enhancements to existing features
The AI live chat website snippet was renamed and simplified, making it easier to maintain and configure. It now automatically assigns an AI agent, fixes chat focus and access checks, and limits public users to accessible reference links, improving reliability and visitor experience.
Original PR description
- Rename support_ai component to ai_livechat component. - Remove s_ai_livechat_data div: The config data of the `s_ai_livechat` website snippet was being stored twice, one in the dataset of the…
- Rename support_ai component to ai_livechat component. - Remove s_ai_livechat_data div: The config data of the `s_ai_livechat` website snippet was being stored twice, one in the dataset of the `ai_livechat` snippet element and another time as data attributes on the `s_ai_livechat_data` div. To clean this redundency, the `s_ai_livechat_data` div was removed along with all the references to it. - Group the options `fallbackButtonText` and `fallbackButtonURL` under `fallbackButton` category in snippet options. - Simplify the template/logic of the component. - Add agent automatically to livechat snippet: It is easy to forget to configure an AI Agent on the AI Livechat Snippet. So, an AI Agent is now set automatically on the livechat snippet. - Fix a bug: The ai_livechat component has 2 chat styles namely fullscreen and popup. The focus should be set on the textarea of the component only if the chat style is fullscreen. Steps to reproduce: 1. Set the chatstyle to popup on the ai_livechat component. 2. Enter a prompt. 3. A chatwindow pops up, and the AI response is shown in that window. 4. The focus is moved from the chatwindow to the textarea of the ai_livechat component. - Fix a bug: The condition that checks the agent presence and the access rights to it when creating a new ai chat channel for the ai livechat website snippet was incorrect. It should use or instead of and. - Fix a bug: The snippet options plugin (AILivechatOptionPlugin) of the ai_livechat website snippet should be added as part of the `website.website_builder_assets` instead of `html_builder.assets` because it is only valid in website context. See https://github.com/odoo/odoo/pull/225089
The Equity app is enhanced with new ultimate beneficial owner (UBO) capabilities and broader updates to equity records, transactions, valuations, cap tables, and portal communications. This helps businesses manage ownership structures more clearly and keep equity stakeholders better informed.
Original PR description
This commit is an improvement to the equity app. task-5043345
Documents and trash views now use the original creation date as the default sorting order instead of the last updated date. This keeps document lists more stable, so small metadata changes like tags or name edits do not unexpectedly move files around.
Original PR description
As the write_date can be reset by very small changes like adding a tag, updating its name and also during some upgrade, we set the default ordering to create_date. We do similarly for the trash. Task-5025453 Forward-Port-Of: odoo/enterprise#93952 Forward-Port-Of: odoo/enterprise#92840
The AI chat opened from the systray now shows three rotating example prompts tailored to the apps installed in the database. AI responses are also guided to use the user’s timezone when discussing dates and times, making calendar and scheduling answers more relevant.
Original PR description
Purpose: -------- When opening the ai chat using the systray button, one wants to show 3 different examples of prompts buttons, based on the current modules that are installed. In order to not create a lot of bridge modules that would each contain a a few lines of data, these data are installed with the ai module and the search method of the ai prompt button model has been overridden to skip records from uninstalled modules. Task-5008938
Users with Invoicing & Banks access can now start online bank synchronization when a bank journal is configured for online feeds and not yet connected. This makes bank connection setup available to the right business users directly from the dashboard.
Original PR description
Before this commit: - Users with "Invoicing & Banks" access rights could not create a bank synchronization, and the "Connect Bank" button was not visible. After this commit: - Users with "Invoicing & Banks" access rights can now create a bank synchronization if the journal has "Bank Feeds = Online Synchronization" and the bank is not yet connected. - The "Connect Bank" button is now visible to them. task-4840544 Forward-Port-Of: odoo/enterprise#87408
The Sign app now makes signing requests easier to understand and manage with a new View option, clearer cryptographic signature messaging, and a company-specific indicator. It also prevents users from trying to resend expired requests and makes uploaded PDF names cleaner by removing the unnecessary template prefix.
Original PR description
Before this commit - No "View" button in the sign request list. - Cryptographic signature was company-specific but had no clear icon/indicator. - "Resend" button still appeared even when a request was expired. - Uploaded PDFs always showed the "template" prefix. After this commit - Added "View" button in the list view. - Updated cryptographic signature description. - Added icon to indicate company-specific cryptographic signature. - Hide "Resend" button for expired requests. - Removed "template" prefix when uploading PDFs. impact: - Easier to follow the cryptographic signature process. - Clearer that signatures are company-specific. - Users won’t mistakenly try to resend expired requests. - Cleaner, more user-friendly UI. task-5015648
Financial return names and related validation checks are now translated into all available languages when they are created. This makes reporting workflows clearer for multilingual teams and helps users understand return checks consistently in their preferred language.
Original PR description
With this commit, return names are now translated to all languages available during creation. Another improvement is that the checks are also translated to all available languages, this includes the name, the message and the record name if there is. This is also supported using the check templates. task-4818751
Users can now create a new dashboard group directly from the dialog used to add a pivot, graph, or similar item to a dashboard. This reduces setup friction and helps teams organize dashboards without leaving their current workflow.
Original PR description
In the dialog to insert a pivot/graph/etc. into a new dashboard, allow the creation of a new dashboard group task-5075916
Signed documents created from uploaded PDFs with fillable fields are now converted so those fields can no longer be edited after download. This helps ensure signed PDFs behave as final documents and reduces the risk of accidental post-signature changes.
Original PR description
## Before - When users uploaded PDFs with fillable form fields (AcroForms), those fields stayed editable even after the document was signed and downloaded. - This caused confusion, as users expected signed documents to be final and non-editable. ## After Introduced a flatten_pdf method to make form fields read-only by: - Extracting the field values and rendering them as static text at the same positions. - Removing all interactive form definitions (/Annots, /AcroForm) from the PDF. - Re-encoding the updated PDF in base64. ## Impact - Ensures signed PDF's no longer contain editable fields. - Prevents accidental edits after signing, improving document integrity. --- task-4730732
The Italian VAT tax report layout has been updated to more closely match the official format from the Italian revenue authorities. Key context fields are now shown directly in the report, making them visible in PDF and XLSX exports and easier for users to review.
Original PR description
*: account_reports, l10n_it_reports, l10n_it_xml_export Improvement on the tax report layout, to make it more like officially documented by the Italian revenue authorities. See page 12: https://www.agenziaentrate.gov.it/portale/documents/20143/8487117/IVA_Annuale_2025_mod.pdf/f080de03-01f0-c4d6-8c80-8b5573797b89?t=1736949831826 For example, in the official docs some context information fields (those in VP1: Subcontracting, Exceptional Events, Extraordinary Operations) are directly shown on the report. We moved them in Odoo from our export wizard to the report itself to match that layout. This way they are also exported to PDF and XLSX. community pr: https://github.com/odoo/odoo/pull/223592 upgrade pr: https://github.com/odoo/upgrade/pull/8253 Task [link](https://www.odoo.com/odoo/967/tasks/5000725) task-5000725
Users can now access AI writing help directly from the smaller HTML message composer. This reduces context switching and makes composing messages faster and more convenient.
Original PR description
This commit allows the use of the AI plugin in the HTML composer, enhancing its functionality and user experience and hence, the user does not have to switch between different tools to access AI features. task-4772129
Helpdesk users can now create a credit note even when no invoice is selected, and the resulting credit note is linked back to the related ticket. This improves traceability between customer support cases and refunds while adding safeguards to prevent empty refunds.
Original PR description
- create a new move when pressing the refund button if no moves are selected - Link the credit note with the helpdesk ticket - Create a ticket stat button in the credit note form --- task-4781360
Managers and cashiers can now clock employees in or out directly from the cashier selection screen in Belgian POS. The popup also shows how long the current cashier has been clocked in, making shift status easier to track during daily operations.
Original PR description
This commit improves the cashier selection popup by allowing direct Clock In/Out actions from the screen. It displays the time since the current cashier’s last clock-in, and also allows the manager to clock in or out all employees. task-4877282
This update adds tax return support for Irish and UK EC Sales List and Intrastat reporting. Businesses operating in these countries can prepare the required tax-related declarations more directly in Odoo, improving compliance workflows and reducing manual effort.
Original PR description
Add the tax return for the irish and british EC Sales List and Intrastat reports. task-id: 4784433
Resolved issues and error corrections
The WhatsApp integration now uses the latest supported Meta Graph API version. This helps prevent service disruptions caused by older API versions being retired and reduces the need for frequent future updates.
Original PR description
As outlines in the version [changelog] v17 of the API which we are currently using will be converted to the next oldest supported version of the API as per [policy] We can migrate directly to the latest version and avoid any issue in the next few years instead of having to worry about potentially breaking changes every few months. [changelog]: https://developers.facebook.com/docs/graph-api/changelog/versions/ [policy]: https://developers.facebook.com/docs/graph-api/guides/versioning task-4971841 Forward-Port-Of: odoo/enterprise#94110 Forward-Port-Of: odoo/enterprise#93170
The German tax report XML export now keeps periods as decimal separators, matching Elster's current requirements. This prevents submitted VAT return amounts from being ignored because of an unsupported comma format.
Original PR description
**Steps to reproduce:** 1. Install `l10n_de_reports` module. 2. Configure a company with a valid SteuerNummer. 3. Post some vendor bills with `19% I` VAT. 4. Go to *Accounting → Reporting → Tax…
**Steps to reproduce:** 1. Install `l10n_de_reports` module. 2. Configure a company with a valid SteuerNummer. 3. Post some vendor bills with `19% I` VAT. 4. Go to *Accounting → Reporting → Tax Report*. 5. Export the report to XML from gear icon. **Observed behavior:** - The generated XML contains amounts with a comma `,` as the decimal separator. - Elster ignores values with commas, so amounts are missing from the submitted VAT return. **Root cause:** - The QWeb XML export replaced the decimal point `.` with a comma `,`. - Elster launched a new tax return application (*einfachELSTERplus*), which enforces `.` as the decimal separator. **Solution:** - Stop replacing `.` with `,` when exporting values to XML. - Keep amounts as floats with period separators, while still rounding or inverting values as required for specific Kz fields. **ref:** https://www.elster.de/eportal/helpGlobal?themaGlobal=osseust_import opw-4935738 Forward-Port-Of: odoo/enterprise#94130 Forward-Port-Of: odoo/enterprise#93623
This fix prevents subscription invoices from being generated or sent twice when customers pay through the portal and automatic invoicing is enabled. It helps avoid duplicate invoice documents, reducing confusion for customers and extra follow-up work for accounting teams.
Original PR description
Versions -------- - 18.0+ Steps ----- 1. Use a localization that uses EDI-signed invoices; 2. enable `sale.automatic_invoice` via `ir.config_parameter`; 3. pay for a subscription via the portal. Issue ----- Invoice is generated twice. Cause ----- Commit 7c5fd63729c1 added automatic EDI invoice signing for subscriptions paid via portal. This assumed that the `sale.automatic_invoice` parameter remained unset. If this parameter is set, the invoice is already generated when post-processing a transaction in `sale`. Solution -------- Don't send invoices whose `is_move_sent` field is set to `True`. Also, don't set `from_cron` to `True` on automatic payments, as this is only intended for moves that have `sending_data` filled by `account.move.send.batch.wizard`. opw-4648189 Forward-Port-Of: odoo/enterprise#93881
Portal users can no longer see controls that would let them try to change article sharing settings or other members' access rights. This prevents confusing errors and redirects users safely if leaving an article removes their own access.
Original PR description
Steps to reproduce =============== As an admin ---------------- 1. Go to knowledge 2. Open any article. 3. Add a portal user as a member with write access. As a portal user -------------------- 1. Open the shared article. 2. On the top right corner, click on members button --> List of members along with their rights will be shown. The portal user can open the dropdown to alter the rights of other members. Though doing so will raise an AccessError (in the logs). After this commit, the portal user will *no* longer see the 1. Toggle to share article to the web. 2. Dropdown to modify members' rights. Task-4863456 Forward-Port-Of: odoo/enterprise#89394
Fixed an issue where opening an embedded list view from a Knowledge article could unintentionally save internal view settings and later cause an error when editing the article. Users can now return to and edit Knowledge articles with embedded list views without hitting a traceback.
Original PR description
Steps to reproduce =================== 1. Insert any list view in the knowledge article. 2. Click on open view from the article. 3. Come back and click edit. -> Traceback occurs Technical…
Steps to reproduce =================== 1. Insert any list view in the knowledge article. 2. Click on open view from the article. 3. Come back and click edit. -> Traceback occurs Technical ============= When we open a view from an embedded view in the article, we add `orderBy` from the action context to the action props if it exists. As the action prop is initialized and assigned directly from `embeddedState.additionalViewProps` without copying, it mutates the original object, changing the `data-embedded-props` attribute in the DOM and marking the body of the article as unsaved from `StateManager.changeState`. The action continues, and the action service commits those unsaved changes to the article. Once it is saved and the action is executed, when we get back to the article and click on edit, we check for `additionalViewProps` to be undefined/empty for all other views except calendar. As the DOM already has saved data in attributes, we get `orderBy` in `additionalViewProps`, and thus a manual error is thrown in the `editView` function. After this commit =============== Clone `additionalViewProps` when preparing the view action props. Task-4921282 Forward-Port-Of: odoo/enterprise#91113
The Peru electronic invoicing module now installs more reliably on large databases by reducing memory use during setup. It also avoids an installation error when updating tax group information, helping customers complete deployments without failures.
Original PR description
### [PERF] l10n_pe_edi: Avoid OOM during installation ### Description: Installing `l10n_pe_edi` on large databases with many moves and move lines could cause out-of-memory (OOM) errors. This happens…
### [PERF] l10n_pe_edi: Avoid OOM during installation ### Description: Installing `l10n_pe_edi` on large databases with many moves and move lines could cause out-of-memory (OOM) errors. This happens because several stored fields need to be computed at installation. ### Fix: This fix adds the columns via SQL, preventing Odoo from computing and populating the field for all existing records. This reduces memory usage and avoids installation failures. ____ ### [FIX] l10n_pe_edi: Fix error during post-init hook ### Description: During installation, the `l10n_pe_edi` module's post-init hook attempts to update tax groups, setting the new `l10n_pe_edi_code` field. This can cause an error if a tax group doesn't exist and needs to be created, because the name field is missing in the list of values given to the `_load_records` function. ### Fix: This fix filters the tax groups to only update existing ones. This prevents `_load_records` from trying to create new groups, which avoids the installation error. ___ ### Reference: opw-4982181 Forward-Port-Of: odoo/enterprise#91997
This fix ensures that delivery providers disabled in UrbanPiper remain disabled when a point of sale session is resumed. It prevents providers from being automatically re-enabled and avoids unnecessary background update requests, helping staff keep delivery availability accurate.
Original PR description
Steps to reproduce: - Configure urban piper in pos.config - Open Register - You could see a notification that providers are online on your config - Disable any one provider. - Go to backend. - Click Continue Selling Issue: - Despite disabling the provider, all providers get enabled as soon as we resume the pos.config Cause: - Not updating togglestate properly while going to the backend. - Unnecessary api request when resuming session. Fix: - Not removing the toggleState from local storage as the user go to the backend - When the user resumes the session, restrict api request for location update. - Remove dependency from local storage and handling all through backend only. task- 4962969 Forward-Port-Of: odoo/enterprise#93691 Forward-Port-Of: odoo/enterprise#90987
The analytic account filter in accounting reports is now initialized after the options it depends on. This restores the missing filter so users can correctly narrow report results by analytic account.
Original PR description
The origin of the bug comes from this https://github.com/odoo/enterprise/pull/86716 It added a `_init_options_filters` function which was called with a default sequence of 200. The `_init_options_analytic_groupby` has a sequence of 995. The _init_options_filters basically ran before the analytic account options which it depends on. Th fix was to set a sequence large enough to `_init_options_filters` so that it would always run after everything.
Public users can now open shared signing links and copy sign requests without running into access errors. The change keeps permissions protected while allowing the system to handle the required recipient information in the background.
Original PR description
Issue: * When a sign request was copied via a public share link, the process failed with an `AccessError`. * This happened because the computed field `cc_partner_ids` (partners in CC) was read as the…
Issue:
* When a sign request was copied via a public share link, the process failed
with an `AccessError`.
* This happened because the computed field `cc_partner_ids` (partners in CC) was
read as the *Public user*, who does not have read rights on `res.partner`.
* With recent core changes, many2many writes now enforce read access on linked
records, making the error unavoidable.
Steps to reproduce:
1. Open the master on Runbot.
2. Upload a PDF to Sign.
3. Press the `Share` button.
4. Log out of the account.
5. Open the copied share link.
6. A traceback appears in the log with an access error on `res.partner`.
Fix:
* Compute the `cc_partner_ids` under `sudo()` in the copy.
* This ensures the system can read the CC partners with elevated rights and only
passes their IDs (safe to use) to `message_subscribe`.
Impact:
* Public users can now open and copy sign requests from share links without
triggering access errors.
* Preserves security: only the system uses `sudo()` for computing, while the
actual subscription still writes the partner IDs as normal.
task- 4067945
---
```yml
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/odoo/odoo/community/odoo/http.py", line 2740, in __call__
response = request._serve_db()
File "/home/odoo/odoo/community/odoo/http.py", line 2281, in _serve_db
raise self._update_served_exception(exc)
File "/home/odoo/odoo/community/odoo/http.py", line 2279, in _serve_db
return service_model.retrying(serve_func, env=self.env)
File "/home/odoo/odoo/community/odoo/service/model.py", line 184, in retrying
result = func()
File "/home/odoo/odoo/community/odoo/http.py", line 2326, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
File "/home/odoo/odoo/community/odoo/http.py", line 2541, in dispatch
result = self.request.registry['ir.http']._dispatch(endpoint)
File "/home/odoo/odoo/community/odoo/addons/base/models/ir_http.py", line 357, in _dispatch
result = endpoint(**request.params)
File "/home/odoo/odoo/community/odoo/http.py", line 788, in route_wrapper
result = endpoint(self, *args, **params_ok)
File "/home/odoo/odoo/enterprise/sign/controllers/main.py", line 498, in make_public_user
new_sign_request = sign_request.with_user(sign_request.create_uid).with_context(no_sign_mail=True, sign_request=sign_request).copy({
File "/home/odoo/odoo/enterprise/sign/models/sign_request.py", line 243, in copy
new_request.message_subscribe(partner_ids=old_request.with_user(old_request.create_uid).cc_partner_ids.ids)
File "/home/odoo/odoo/community/odoo/orm/fields_relational.py", line 45, in __get__
return super().__get__(records, owner)
File "/home/odoo/odoo/community/odoo/orm/fields.py", line 1738, in __get__
self.compute_value(record)
File "/home/odoo/odoo/community/odoo/orm/fields.py", line 1904, in compute_value
records._compute_field_value(self)
File "/home/odoo/odoo/community/addons/mail/models/mail_thread.py", line 468, in _compute_field_value
return super()._compute_field_value(field)
File "/home/odoo/odoo/community/odoo/orm/models.py", line 4913, in _compute_field_value
determine(field.compute, self)
File "/home/odoo/odoo/community/odoo/orm/fields.py", line 81, in determine
return needle(*args)
File "/home/odoo/odoo/enterprise/sign/models/sign_request.py", line 157, in _compute_cc_partners
sign_request.cc_partner_ids = sign_request.message_follower_ids.partner_id - sign_request.request_item_ids.partner_id
File "/home/odoo/odoo/community/odoo/orm/fields.py", line 1812, in __set__
self.write(protected_records, value)
File "/home/odoo/odoo/community/odoo/orm/fields_relational.py", line 727, in write
self.write_batch([(records, value)])
File "/home/odoo/odoo/community/odoo/orm/fields_relational.py", line 748, in write_batch
self.write_real(records_commands_list, create)
File "/home/odoo/odoo/community/odoo/orm/fields_relational.py", line 1475, in write_real
raise AccessError(model.env._("Failed to write field %s", self) + "\n" + str(e))
odoo.exceptions.AccessError: Failed to write field sign.request.cc_partner_ids
Uh-oh! Looks like you have stumbled upon some top-secret records.
Sorry, Public user (id=3) doesn't have 'read' access to:
- Contact (res.partner)
If you really, really need access, perhaps you can win over your friendly administrator with a batch of freshly baked cookies.
```After sending a document for signature from a record's chatter, users are now taken back to the original business record instead of staying on the signature document page. This keeps work flowing smoothly and reduces navigation friction after requesting a signature.
Original PR description
Version: - saas-18.4 Steps to reproduce: - Open the chatter of any app record. - Open PDF uploaded in chatter. - Click on sign button for signing. - Send document for signing by keeping signer other than yourself. Before: - After sending for sign, the user stays on the document view instead of returning to the originating record. After: - After sending for sign, the user is redirected back to the originating record linked to the signature request. impact: - Improves user workflow by keeping them on the record they were working on. - Provides a smoother navigation experience. task-5059410 Forward-Port-Of: odoo/enterprise#93717
The AI app now checks for the correct PDF extraction library and handles missing or poor-quality PDF text more safely. This helps prevent background errors and avoids creating unusable AI content from invalid attachments.
Original PR description
## Issue Running the AI app locally without the pdfminer.six library results in cron errors while extracting the pdf text and creating the chunks. Since `pdfminer.six` is required for PDF text extraction, it must be installed. Only `pdfminer` installed doesn't work well with the majority of the attachments. ## Solution Check for `pdfminer.six` to be used for the PDFs' content extraction. If not there, then show a warning and fallback to the content extracted by the outdated pdfminer if there. If it is valid content, create the chunks and embed them, otherwise mark the source as failed. task-19060
This fixes an error that could prevent sales orders from being validated in the Point of Sale when the Belgium Blackbox module was installed. Businesses using this setup can now complete POS transactions without encountering the validation crash.
Original PR description
Since this PR (https://github.com/odoo/odoo/pull/216523) there is a traceback when the module `pos_blackbox_be` is installed and the order is validated. Steps to reproduce: - Install the module `pos_blackbox_be` - Go to the POS (no need to configure the blackbox for the POS) - Create a new order and validate it - See the traceback
Code cleanup and technical improvements
The Manufacturing Planning Schedule suggestion flow is being moved into a guided wizard instead of storing a temporary selection on the main planning record. This reduces the risk of uninstall-related crashes and keeps the planning feature more stable for users.
Original PR description
This commit fixes the selection field `suggestion_period` in the MPS model to not store its value in the database. Storing this selection field can lead to crashes when MPS is uninstalled. Related PR: https://github.com/odoo/enterprise/pull/90553
The Documents app and related integrations now use the term “folder” instead of “workspace” across settings, screens, tests, and supporting data. This makes the product language clearer and more consistent for users without changing the underlying business workflows.
Original PR description
* includes: account, account_peppol, approvals, fleet, hr, hr_recruitment, product, project, project_sale, sign, spreadsheet. This commit replace all the occurences of workspace into folder. Task-4896922