Tuesday, September 9, 2025
20 changes · 18.0
New functionality added to Odoo
This change adds a shared way for Odoo modules to provide key performance indicators, making KPI reporting easier to extend over time. Accounting now contributes draft document counts by type, giving future dashboards or summaries a consistent source for these business metrics.
Original PR description
This commit introduces a new abstract model `kpi.provider` that allows different modules to contribute their Key Performance Indicators (KPIs) in a modular and extensible way. The `kpi.provider` model defines a base structure for KPI reporting and includes a `get_kpis_summary` method that should be overridden in inheriting models. This method is responsible for returning a list of KPI data specific to the module. KPI data are identified by a unique name and a type allowing for the caller to know how to present the corresponding value. The `account` module inherits from `kpi.provider` to include the amount of draft `account.move` for each `move_type`. Task-id: 5062431 Forward-Port-Of: odoo/odoo#225153
The Documents app now includes the number of items in the Inbox folder in the KPI summary. This gives users and managers a quicker view of pending document workload without opening the folder separately.
Original PR description
With this commit, `kpi.provider.get_kpi_summary` will show how many documents are present in the Inbox folder. Task-id: 5062431 Forward-Port-Of: odoo/enterprise#93720
Enhancements to existing features
The Peppol registration wizard now includes more helpful explanations for some company registration fields. This helps users understand why the information is requested and how it will be used during Peppol setup.
Original PR description
…ion wizard. Give move information on what the registration information are used for. task-none
Resolved issues and error corrections
Product images in the quotation catalog now display without being stretched when they are not square. This keeps product visuals accurate and improves the catalog browsing experience for sales users.
Original PR description
Versions -------- - 18.0+ Steps ----- 1. Have products with non-square images available for sale; 2. open a quotation; 3. open the product catalog. Issue ----- The product images appear stretched. Cause ----- Commit e8836b42200e3 replaced the `div.kanban_image` element with a `field` element using the `image` widget. It maintained the same size limit of 55x55 via the widget's options, but without additional input, this causes the widget to stretch the images to fill the area. Solution -------- Add the `object-fit-contain` as `img_class` to the options. This class contains the image to the area instead of stretching it. opw-5007629
Users can now rename online bank synchronization links directly from the form view. This helps businesses distinguish between multiple connections to the same bank, reducing confusion when managing banking integrations.
Original PR description
With some provider, you can have several links to the same bank. This can be confusing for the user. Allowing to edit the sync name from the form view can help the user sort out its links. Not a FIX, but suggestion is from opw-5004182 Forward-Port-Of: odoo/enterprise#93538
The Spanish Modelo 130 report now uses a date selector that matches how the report is calculated. Users choose the period end date instead of a custom range, avoiding confusion where results unexpectedly included entries from the start of the fiscal year.
Original PR description
Currently mod130 report is configured to compute from the beginning of the fiscal period, however the date filter widget is in range mode. This means that when a user open the report and select a date range, the entries will not be just in the selected range but span from the beginning of the fiscal year to the end of the range, creating confusion. We should disable filter date range, so the date widget allow to set an end date to the current period Enterprise PR: https://github.com/odoo/enterprise/pull/90044 opw-4933241 Forward-Port-Of: odoo/odoo#218544
Fixes an Accounting issue where creating an analytic item linked to a zero-value invoice could crash the system. This helps users handle no-cost or fully balanced invoices without interruption.
Original PR description
The system will crash with error when try to create a analytic item. **Steps to Produce:-** 1. Install the `Accounting` module with demo data. 2. Go to `Settings > enable Analytic Accounting`. 3.…
The system will crash with error when try to create a analytic item. **Steps to Produce:-** 1. Install the `Accounting` module with demo data. 2. Go to `Settings > enable Analytic Accounting`. 3. Navigate to `Accounting > Customers > Invoices`. 4. Create a new invoice with total amount = 0 and confirm it. 5. Go to Accounting > Accounting > Transactions > Analytic Items. 6. Create a new Analytic Item and: - Set a value in the `Project` field. - Under the `Accounting` section, select the `Journal Item` linked to the last created 0-amount invoice and save. **Error:-** `ZeroDivisionError: float division by zero` **Cause:-** - At [1], when `line.balance` is 0.0 (for example, when a journal item is defined with a total of 0.0), the system raises an error. **Solution:-** - Added a condition to compute only when line.balance exists; otherwise,set the value to 100. [1]: https://github.com/odoo/odoo/blob/dff2423ac320fdb97d6bf1f106dc84be1d71cac2/addons/account/models/account_move_line.py#L3248-L3251 **sentry-6844926153** --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
When loading older messages fails once, the conversation no longer keeps showing an error after a later successful retry. This prevents users from seeing a stale failure message when their messages have already loaded correctly.
Original PR description
**Description of the issue this PR addresses:** When a thread fails to fetch its messages (e.g., due to a network error), the `hasLoadingFailed` flag is set to `true`. However, even if the next fetch…
**Description of the issue this PR addresses:** When a thread fails to fetch its messages (e.g., due to a network error), the `hasLoadingFailed` flag is set to `true`. However, even if the next fetch attempt succeeds, the flag is not reset. As a result, the UI may continue to show an error state even though the data has successfully loaded. **Steps to Reproduce:** - Open a thread with many messages. - Go offline. - Scroll up to load older messages → failure message appears. - <img width="311" height="68" alt="image" src="https://github.com/user-attachments/assets/e18832cb-5d37-4add-a126-fdc301131721" /> - Go back online and click Retry → messages load successfully. - Scroll again → failure message still appears, even though you’re online. - <img width="311" height="68" alt="image" src="https://github.com/user-attachments/assets/e18832cb-5d37-4add-a126-fdc301131721" /> **Current behavior before PR:** After a failed attempt to fetch messages in a thread, the `hasLoadingFailed` flag remains set to `true`. Even if the user goes back online and the subsequent fetch succeeds, the UI continues to show a failure state. **Desired behavior after PR is merged:** After a successful fetch of a thread’s messages, the `hasLoadingFailed` flag is reset to `false`, ensuring the UI no longer shows a failure state once the data has been correctly loaded. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
When a payment memo is changed, the related accounting entry reference is now updated to match. This prevents inconsistent payment and accounting records, reducing confusion during reconciliation or audits.
Original PR description
Issue: In previous versions, the memo field of account payments and ref field of account move were related Now that payments do not required to have generated account move's when the memo is updated the ref remains unchanged. Purpose of this PR: To update the account move ref when the payment memo is updated. Steps to Reproduce on Runbot: install accounting go to bank account and assign outstanding accounts for manual payment methods create a payment -- a related account move should be created update the memo on the payment -- the ref on the related account move is unchanged. opw-4989260 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The accounting setup now ignores localization chart templates from modules that are not currently installable. This prevents unnecessary error logs when a custom localization module is present but not yet ready to be installed or upgraded.
Original PR description
* Problem: if having a custom module that add extra tax to current localization module, ex: l10n_x inherit l10n_vn module, but the l10n_x module is not installable because it hasn't upgraded yet, the _get_chart_template_mapping include it as well, there for will log error in https://github.com/odoo/odoo/blob/18.0/addons/account/models/chart_template.py#L1219 * Solution: only get available template code for module that installable Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents the mail module from failing when it encounters an empty value while preparing email records. It improves reliability by safely ignoring invalid empty entries before continuing processing.
Original PR description
Browse breaks when given a bool, so the solution is to filter the list from false values before browsing --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Users in secondary companies can now save Documents settings even when no Sign folder has been configured for that company. This removes an unnecessary validation error that blocked changes such as choosing a spreadsheets workspace.
Original PR description
**Steps to reproduce** - On a fresh DB, have multiple companies - Install documents_sign - With a company other than the main one, go to Settings > Documents > try to change a setting (e.g. Spreadsheets Workspace) - Error: "Invalid fields: Sign Base Folder" **Cause** Issue after commit https://github.com/odoo/enterprise/commit/a47cad41b1537b0c90b6a0ab9bf498a160f88b72 The `documents_sign_folder_id` is only set on the main company and since it is required on the view, saving the view is impossible if the field is invisible. **Change** Since the folder serves no purpose, make it non required in the view. opw-5048447
The bank reconciliation report now excludes exchange rate adjustment entries that do not represent real bank inflows or outflows. This prevents currency revaluation differences from being incorrectly shown under miscellaneous operations, giving finance teams a clearer reconciliation view.
Original PR description
**Steps to reproduce** - Have foreign currency with rates for date 1 and date 2 - Have a Bank journal in foreign currency - Register a transaction in date 1 - In date 2 open the unrealized currency report - Create the adjustment entry - From the Accounting dashboard Bank[EUR] > Reconciliation report **Issue** The adjustment entry difference is present under the 'Misc. operations' line. This occurs because we look for journal entries hitting the bank account but that specific entry should not be reported as it does not represent a bank in/out operation A solution is to exclude the exchange entry journal, so any operation reported there is not taken into account in the report opw-4867870 [Ticket link](https://www.odoo.com/odoo/project/49/tasks/4867870) Forward-Port-Of: odoo/enterprise#93999
This update adds automated coverage for the Spanish Modelo 130 report to help ensure it stays accurate in future updates. It reduces the risk of regressions in a tax reporting area without changing day-to-day user workflows.
Original PR description
opw-4933241 Forward-Port-Of: odoo/enterprise#90044
This fix prevents Uruguay electronic invoice generation from failing when an invoice line has no product and no line description. In those cases, the system now safely sends a fallback value instead of blocking CFE document creation.
Original PR description
This pull request makes a minor adjustment to the logic for extracting item names and descriptions in the `_l10n_uy_edi_get_line_nom_and_desc` method. The change ensures that the presence of `aml.name` (the line description) is checked directly, rather than relying on the truthiness of the entire `aml` object. Before this PR, if the aml of an invoice only have the `account_id` field filled and no `product_id`, the `_l10n_uy_edi_get_line_nom_and_desc` will raise an error message like `TypeError: 'bool' object is not subscriptable` when trying to create de CFE document. <img width="1254" height="828" alt="image" src="https://github.com/user-attachments/assets/eaadad4c-46c3-4e3b-be52-9fcd146f2c22" /> <img width="1526" height="795" alt="image" src="https://github.com/user-attachments/assets/1b831f41-9774-4ed5-9a9d-9777ee0633e9" /> With this fix, we ensure there is a name to grab or the '-' will be send instead.
Studio exports no longer fail when they include binary fields that are not stored as attachments. This prevents an error during export and helps users reliably extract their Studio data.
Original PR description
**Before:** Attempting to export non-attachment binary fields using the `Studio Export` would cause a traceback. **After:** Non-attachment binary fields can now be successfully exported from `Studio` without error. task-4888937
The Documents app Kanban view no longer shows an unnecessary second scrollbar. This makes browsing documents cleaner and easier for users by removing a confusing visual glitch.
Original PR description
This commit fix the useless double scroll bar in kanban view. Task-4844661
Fixed an issue where clicking the dashboard header after changing the Publish toggle could accidentally reverse the publish setting. The publish control now responds only to the checkbox or its label, making dashboard editing more predictable for users.
Original PR description
**Steps to reproduce:** - Open a dashboard in edit mode. - Click the “Publish” toggle to change its state. - Click elsewhere on the header (outside the toggle). → The publish state flips back unexpectedly. **Before this PR:** The wrapper container (.o_sp_publish_dashboard) had a click handler, causing clicks on the header to re-toggle the publish state. The CheckBox was rendered with a no-op onChange, so both elements competed for control. **After this PR:** Interaction is handled exclusively by the CheckBox component. toggleDashboardPublished is bound directly to its onChange. Clicking the label text now correctly toggles the checkbox and publish state. Container clicks outside the checkbox no longer affect the state. Task: [5062368](https://www.odoo.com/odoo/project/2328/tasks/5062368)
Belgian payroll work entry UCM codes now preserve trailing spaces and are padded when needed to meet the required three-character format. This prevents valid UCM codes such as "PR " from being shortened incorrectly, helping payroll configuration match UCM specifications.
Original PR description
#### Issue: - UCM work entry code should be 3 characters long and allow spaces to get this length #### Step to reproduce: - In a Belgian company - Go to Payroll > Settings > Work Entry Types > New - Add a name - Add a Payroll Code - In the `Country` field fill Belgium - In the field `UCM Code` enter "PR " - Select another field - Select `UCM Code` again #### Current behavior: - The field `UCM Code` was updated to "PR" #### Expected behavior: - The field should stay to "PR " #### Solution: - Don't trim the field and add a spaces if needed opw-5014372
The Belgian salary configurator now prevents employees from entering fuel card amounts when they have selected a reimbursed private bike option. This avoids incompatible benefits being combined and keeps salary configurations compliant with the intended rules.
Original PR description
The Belgian salary configurator allows employees to declare a private bike cost. When the "Private Bike" option is checked and its reimbursement value is greater than zero, the fuel card inputs must be reset to 0 and disabled. task-5062963 Forward-Port-Of: odoo/enterprise#93884