Wednesday, September 9, 2026
20 changes · saas-18.4
Enhancements to existing features
When a product’s type is changed, the system now clears its stock valuation layers so recorded inventory quantities and valuation quantities both restart from zero. This prevents reporting inconsistencies in inventory and accounting after product configuration changes.
Original PR description
Commit 680488cca2344 relax the constrain on product type change. but this can lead to inconsistencies between the quant and the quantity displayed on stock layers. To avoid this, we empty the valuation at the type change to start both the quant and the valuation at 0 quantity. 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
The Finnish electronic invoicing module now includes support for the Finvoice 3.0 XML format required by current Finnish invoicing rules. This prepares invoice sending and import flows to produce compliant documents and improves readiness for future Finvoice EDI use.
Original PR description
This commit add a new invoice xml format, following Finvoice 3.0 requirements. See legal requirements in the task. task-4500798 Forward-Port-Of: odoo/enterprise#80590
The website payment donation flow now supports fiscal attestation legal information, helping organizations collect and display the details needed for donation-related compliance. This improves clarity for donors and administrators when handling donation forms and related partner records.
This update makes the Discuss and live chat action menus look and behave more consistently across messages, threads, attachments, and chat windows. It improves visual polish and usability with clearer buttons, better alignment, rounded panels, and more predictable menu placement.
The website configurator now preserves direct links to specific setup steps and keeps optional information passed in the URL. This helps guided website setup flows open the right configurator screen with the needed context instead of falling back to the default start page.
Original PR description
Description of the issue/feature this PR addresses: Since https://github.com/odoo/odoo/pull/216067, we have to use router as a way to get the URL parameters. This change adds the optional 'info' URL parameters to the website configurator. This is an additional way to communicate information to website_configurator sub component when accessed by a URL. Current behavior before PR: Going to /website/configurator/6 redirects to /website/configurator/, so it ends up in the normal configurator rather than the website generator (for example). It is not possible to keep URL parameters when accessing the configurator at a specific step. Desired behavior after PR is merged: Going to /website/configurator/6 redirects to /website/configurator/6. It is now possible to add an 'info' url parameter which is kept when accessing the configurator at a specific step. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
New websites created by companies based in Europe will now automatically include a Privacy Policy page to support GDPR compliance. The option is no longer manually selected during setup, and the page is linked from the website footer so visitors can easily find it.
Original PR description
To comply with GDPR regulations, this update ensures that when a customer from a European country creates a new website, a privacy policy page is automatically generated. Previously this was possible via website configurator and there the privacy policy page content was not relevant After this merge, For companies based in Europe, the Privacy Policy page is automatically created. The feature is removed from the configurator to prevent manual selection, and a link to the page is added to the footer after the copyright section. task-4551879 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update helps prevent users from applying style combinations to images that do not work well together in the website editor. It should make image customization more reliable and reduce confusing or broken visual results when building pages.
Original PR description
WIP --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
Point of Sale users without administrator settings rights could be blocked by an access error when an optional installation-request component was not installed. This fix prevents that unnecessary permission check, allowing authorized Point of Sale users to access the app normally.
Original PR description
Fixes https://github.com/odoo/odoo/issues/238503 Avoid access error if `base_install_request` is not installed Example use case: - Install point_of_sale (without having `base_install_request` installed) - Give user Marc Demo Point of Point of Sale permission but NOT Administration > Settings - Go to Point of Sale ``` Access Error You are not allowed to access 'Module' (ir.module.module) records. This operation is allowed for the following groups: - Administration/Settings Contact your administrator to request access if necessary ``` Please @pedrobaeza and @christian-ramos-tecnativa can you review it? @Tecnativa TT57146 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#240587
This fixes the UAE corporate tax report setup so tax returns keep the expected Review, Submit, and Pay workflow after upgrades. It helps prevent upgraded databases from showing only the Review step or triggering an error when opening tax returns that were already submitted.
Original PR description
The report is missing a root report that is common in reports from other localizations. Withouth it, the states workflow changes from Review, Submit, Pay in 18.4 to just Review in 19. <img…
The report is missing a root report that is common in reports from other localizations. Withouth it, the states workflow changes from Review, Submit, Pay in 18.4 to just Review in 19.
<img width="594" height="159" alt="image" src="https://github.com/user-attachments/assets/8362e293-0677-45df-bac1-c613ef313a52" />
<img width="571" height="146" alt="image" src="https://github.com/user-attachments/assets/b26a3a7e-c3ca-4512-809f-3db0fc597ba2" />
---
It can also trigger an error after upgrading to 19. To reproduce:
- Install accountant and l10n_ae_reports in 18.4.
- Using an AE company, change a Corporate Tax' state to Submitted.
- Upgrade to 19.
- Navigate to Tax returns.
You will get the error
```
File "/home/odoo/src/enterprise/19.0/account_reports/models/account_return.py", line 926, in _compute_next_state
next_state_index = state_keys.index(record.state) + 1
ValueError: 'submitted' is not in list
```
Since the report linked to return type lacks a root report, it got assigned `generic_state_review` as `states_workflow` that only allows for Review.
---
Please note: I'm not an expert in accounting or localization. I saw an upgrade failing on this, looked at the problem and took an educated guess. I don't know if the root report is missing on purpose for some functional reason. If that's the case, let me know and I will try to do something on the ugprade script for these cases.Employee start and end date searches now better reflect the dates shown by the system instead of relying only on contract dates. This improves calendar-related filtering and makes employee date information more reliable when contracts are not the main reference point.
Original PR description
Currently the computed fields `date_start` and `date_end` don't have a properly matching search function. Instead the search is based on purely the contract start and end date, which makes searching on these fields somewhat useless. Now we attempt to match the computation by picking the min/max start and end date respectively. This is notably useful in calendar where contracts are somewhat irrelevant. task-5079021
Egyptian payroll now calculates basic salary from the employee's contract wage and handles out-of-contract days using actual worked days from the payslip. This prevents incorrect salary amounts when contracts start mid-month, improving payroll accuracy for affected employees.
Original PR description
**Steps:** 1. Install the l10n_eg_hr_payroll module. 2. Create an employment contract starting from 15 Jan, 2026 and generate the payslip for that month. **Issue:** The basic salary is not being computed correctly, It's showing 12k, That will be attendance worked days amount In the Out of Contract calculation, the salary is divided by the total number of days in the month instead of the actual worked days. **Fix:** The basic salary will now be based on the `version.wage`, For the Out of Contract, we will use the total worked days from the payslip instead of the total days in the month. Task-5485615
The Turkish e-Ledger export now fills in line numbers automatically and keeps them continuous across the full fiscal period, including monthly filings. This helps businesses meet GİB expectations and avoids manual numbering errors or inconsistent exports.
Original PR description
Before: the `LineNumber` column of the e-Ledger CSV was always empty, left to be filled after the export. Since the ledger is filed monthly, whatever filled it restarted at 1 every month, while GİB expects the numbering to start once, at the beginning of the fiscal period, and to run unbroken until its end. Now: the column is written by the export. An export starting after the first day of the fiscal period is offset by the number of rows that period already counts, so February continues where January stopped, and a full-year export numbers the same rows identically. The lines are also read in ascending date order. They were sorted by the default order of `account.move.line`, the most recent first, so the first row of the file was the last entry of the period and could not be numbered 1. This reverses `EntryNumberCounter` as well, which now counts from the oldest entry. task-6424730 Forward-Port-Of: odoo/enterprise#130486 Forward-Port-Of: odoo/enterprise#127518
Odoo now blocks bulk archiving when it would leave an employee with no active version. This keeps employee records accessible and ensures the same safeguard applies whether versions are archived one at a time or together.
Original PR description
Version: saas-18.4 (first affected version) **Issue** When archiving versions for an employee, Odoo correctly prevents archiving the last remaining version when done individually. However, when…
Version: saas-18.4 (first affected version)
**Issue**
When archiving versions for an employee, Odoo correctly prevents archiving
the last remaining version when done individually.
However, when multiple versions are selected and archived at once from the
employee history view, all versions are archived without any validation error.
This leads to an invalid state where an employee has no active versions.
**Steps to Reproduce**
1. Create an employee
- A first version is automatically created.
2. Try to archive this version
- An access error is raised (correct behavior).
3. Create two additional versions for the same employee.
4. Go to Employee History, select all versions, and click Archive.
5. All versions are archived without any error (unexpected behavior).
**Expected Behavior**
Archiving all versions of an employee should always be blocked, regardless of
whether the action is performed on a single version of multiple version at once.
### Solution
Before archiving, the system now verifies that at least one active version will remain for each employee.
If an archive action would remove all active versions, it is prevented with a validation error.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update makes action menus in Discuss and Live Chat look and behave more consistently across messages, threads, attachments, and chat windows. It also adds small visual refinements that make conversations easier to scan and controls easier to recognize.
Original PR description
In discuss, thread / message / composer / call / attachments actions dropdown style all differ visually. This comes from each defining their own template. This becomes hard to fix and improve visual…
In discuss, thread / message / composer / call / attachments actions dropdown style all differ visually. This comes from each defining their own template. This becomes hard to fix and improve visual of action to make discuss more intuitive. This commit defines a generic `mail.DiscussActions` that renders (dropdown) actions. This centralized template allows to put more effort in a nicer look, and is a step towards harmonizing the definition of discuss action registries. TODO: inline style for chat window quick part + message quick part, thread inline actions use "large" mode mobile message actions is not yet considered in this PR. This commit also makes miscellaneous style improvements: - chat bubble message preview uses bubble color of last message - fixes minor discuss sidebar option / actions alignment - chat window thread panel back button is chevron rather than arrow - chat bubble in mobile do not move on click - chat window header "more action" has better visual feedback - message action dropdown orientation takes message alignment in conversation - hashtag / globe channel icon have reduced opacity to match other discuss status icon - image actions button is "..." rather than chevron to be consistent with other discuss "options" buttons' icon. - rounded panels and button
Website live chat now shows the right conversation participants and gives internal users access to more of the same chat options they use in the main system. In the website builder, only one chat panel appears at a time, preventing duplicate conversations and reducing confusion while previewing or editing pages.
Original PR description
Before this commit, chat hub in website was confusing for internal users: - correspondent + avatar for live chat conversations was wrongly computed (e.g. self-operator was considered a visitor) -…
Before this commit, chat hub in website was confusing for internal users: - correspondent + avatar for live chat conversations was wrongly computed (e.g. self-operator was considered a visitor) - many thread and message actions are not available compared to web client. This commit fixes both issues as follow: - many features in web client chat hub are now available for internal users in website chat hub. - computation of correspondent and livechat actors is correct for operators in website chat hub. Making the website chat hub almost feature full-fledged is helpful to solve the duplicated chat hub in the website builder, so that using the website chat hub is barely a regression over the web client chat hub. ---- Before this commit, website builder page was showing 2 chat hubs at once: - chat hub from the web client - chat hub from the live chat on website The website builder is in web client so makes sense to enable chat windows from web client. Some feature are specific to backend and need to be shown while editing the website. The website builder also previews how the website look. Therefore it makes sense to show live chat hub because it's part of the actual website page being previewed. The problem with showing the 2 chat hubs is that chats are duplicated due to being shown in both hubs. The chats are intended to be seen from the website so the underlying problem is showing both chat hubs at once. This commit fixes the issue as follow in website builder: - when not editing the website, show the live chat hub and hide the web client chat hub - when editing the website, show the web client chat hub and hide the live chat hub. This works because web client chat features at desired when actually editing the website. Viewing live chat hub when not editing the website works because this is the actual showing of website with the live chat hub. There's also no feature on website editor that affects the website live chat hub.
The purchase order suggestion wizard now handles actual demand more accurately. It can include products even when no price is set, and it considers overdue outgoing deliveries that still need to be fulfilled, helping buyers avoid missing needed items.
Original PR description
This commit fixes 2 bugs in the purchase order suggestion wizard when it's based on actual demand: 1- it now allows the suggestion wizard to add products without prices to the PO. 2- it now takes into account outgoing deliveries with scheduled date in the past, as long as it's not validated yet. Task-4877088
This fix prevents older background notifications from overwriting newer message edits in Discuss and chatter. Users should see the latest message content more reliably, especially when the system is under heavy load or notifications are delayed.
Original PR description
Before this commit, discuss RPCs like update_content were prone to race-condition that can lead to UI showing outdated content of a message that was just edited. This happens because some store data…
Before this commit, discuss RPCs like update_content were prone to race-condition that can lead to UI showing outdated content of a message that was just edited. This happens because some store data are exclusively feed from return data of RPC whereas some store data are feed from bus notifications. Ordering of data are essentially sound among RPC returns and bus notifications, but not between the 2 groups. Therefore RPC return or bus notifications can come before or after the other one, and the ordering may be wrong and result in wrong store data. In practice bus notifications usually before return of RPCs. Most of discuss code is robust against this ordering, even though there's likely many potential of race conditions that may happen and are genuine bugs. When bus notifications come after returned RPCs, however, problems are more apparent. This may happen when the bus notification queue is slow, but also in tests this is likely to happen because RPCs are simulated with single micro-tick whereas handling of bus notification is usually more than 1 micro-tick. The test "Can edit message comment in chatter" is showing this problem: it's a relatively long test that interacts a lot with message edition, which has the message content being obtained from both bus notifications and RPC returns. When the CPU load is high, test takes much more time to run, e.g. 400ms becomes 2500ms. This CPU load affects barely RPC returns but bus notifications are heavily throttled and therefore causes bus notifications to come much later than expected. Test edits message twice with different content and then once without any change. The high CPU load can make test fail after 3rd edit step because the content of message is the 1st edited content instead of the last. The last edition is coming later in the bus notification, but due to timing constraints of 3 seconds assertion can lead to timeout of test because the message is not showing the most recent edited content. Roughly: 1. message is "original message" 2. message is edited to "edited message" 3. message shows "edited message (edited)" 4. message is edited to "edited again" 5. message shows "edited again (edited)" 6. message editing is started => message content in composer is "edited message" instead of "edited again", so crash after 3 seconds Step 6 fails because message content between 5 and 6 is changed to "edited message" from the bus notification. All previous steps had the message edited relatively quickly (500ms each) by returned RPC. The bus notifications are throttled to about 3 seconds, thus the "edited message" bus notification arrived very late when starting edition in step 5. The composer content is wrong and the contains wait for at least 3 seconds, but due to heavy throttle of bus notifications from CPU load, the test fails. This commit fixes the issue by introducing a `busRpc()` function on bus_service and have message edition flow use this busRpc() rather than `rpc()`. This `busRpc()` function is a special flavour of `rpc()` that awaits until the RPC and related notifications have been received. `busRPC()` works by forging a UUID bus_rpc_uuid that the RPC sends back at end of RPC. The `busRPC()` function waits until this notification is received. This commit ensures ordering of store data received from server is good, because RPC properly awaits bus notification. Store data of RPC return makes sense after these bus notifications, but ideally it should also be sent to bus notification and business code should ignore returned data from RPC, so that ordering of store data is always good even with interleaving if discuss actions. This also solves the race condition in the test "Can edit message comment in chatter", because each assertion of message content ensures we are in the window of data feed by related bus notifications. When a message is being edited the composer is not affected by new message content from store data of bus notifications, but the save of the message edition should necessarily have to await related bus notifications, ensuring no previous bus notifications can be feed after this store data state. Fixes runbot 227618
This fix ensures accounting entries imported for one company are not accidentally matched with entries from another company when both have similar document numbers. It prevents multi-company posting errors and helps keep accounting data properly separated between companies.
Original PR description
Steps to reproduce: [account_winbook_import] - create Company A - import winbook file (from ticket) - create Company B - Import same Winbook file - Archive Company A - Post entry ACHAT/2024/12/0001 Issue: Multicompany error Cause: The issue is that we have entries with matching numbers. Since we import multiple times the same winbook archive This block https://github.com/odoo/odoo/blob/6cef5cb2375c223551dc27b3a27927388527f63b/addons/account/models/account_move_line.py#L3164-L3168 retrieves the account_move_line from the other company opw-4980059
SEPA Direct Debit XML files no longer include a bank-specific identifier field for all countries. This prevents rejections by Italian banks while keeping the required field for Nordea countries such as Sweden.
Original PR description
### Issue: An unexpected `<SchmeNm><Cd>CUST</Cd></SchmeNm>` node was added inside `<InitgPty><Id><OrgId><Othr>` for all countries Some Italian banks reject SDD files containing this node ### Cause:…
### Issue: An unexpected `<SchmeNm><Cd>CUST</Cd></SchmeNm>` node was added inside `<InitgPty><Id><OrgId><Othr>` for all countries Some Italian banks reject SDD files containing this node ### Cause: https://github.com/odoo/enterprise/commit/3c3c64b511d07fc1ba33c30363972f5b0f7283d6 added `<SchmeNm><Cd>CUST</Cd></SchmeNm>` unconditionally for all countries The original fix was intended for Nordea (Sweden) only, which requires this node explicitly The assumption that other countries would accept it was incorrect ### Steps to reproduce: - Install `account_sepa_direct_debit` and `l10n_it` - Switch to the IT company - In Settings, set SEPA Direct Debit Creditor Identifier to `BE30ZZZ300D000000042` - Create and confirm a Payment (Method: SEPA Direct Debit, any customer and amount) - Create and validate a Batch Payment with that payment - Open the generated PAIN008 XML Before the fix, `<SchmeNm><Cd>CUST</Cd></SchmeNm>` is present opw-6530996 Forward-Port-Of: odoo/enterprise#130304
Pivot report measure options now remain available after users change filters or refresh the view. This prevents configured measures, such as POS order counts, from disappearing from the Measures menu and helps reporting stay consistent.
Original PR description
TL;DR - we lose the measures from arch after a reload, if removed from activeMeasures Step to reproduce: - install pos, create few orders - go to reporting> orders> switch to pivot view - click the…
TL;DR - we lose the measures from arch after a reload, if removed from activeMeasures Step to reproduce: - install pos, create few orders - go to reporting> orders> switch to pivot view - click the `Measures` dropdown, `Order` is already selected - untick it, then apply some filter so that view reloads (ex order date) - reopen `Measures` dropdown, notice `Order` is missing form measures Cause: - view `view_report_pos_order_pivot` has `<field name="order_id" type="measure"/>` in its pivot view https://github.com/odoo/odoo/blob/f5c68cf0eb2ce6ec96dd4006b28466044af10e33/addons/point_of_sale/views/pos_order_report_view.xml#L10 - `order_id` is M2O field - Measure is compute from present `activeMeasure` and fields of type `["integer", "float", "monetary"]` https://github.com/odoo/odoo/blob/f5c68cf0eb2ce6ec96dd4006b28466044af10e33/addons/web/static/src/views/utils.js#L89-L120 - when the view is first loaded, `activeMeasure` all the fields with `type="measure"` which is directly passed to pivot's model as a metadata https://github.com/odoo/odoo/blob/f5c68cf0eb2ce6ec96dd4006b28466044af10e33/addons/web/static/src/views/pivot/pivot_arch_parser.js#L59-L60 https://github.com/odoo/odoo/blob/f5c68cf0eb2ce6ec96dd4006b28466044af10e33/addons/web/static/src/views/pivot/pivot_view.js#L41 - when we toggled the `order_id` from measure and reloaded, `order_id` is popped from `activeMeasure` and as it's field type is `many2one` it is not considered for `measures` in `computeReportMeasures` Fix: - maintain the measures from arch separately and feed it to `computeReportMeasures` opw-6416196 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#285686 Forward-Port-Of: odoo/odoo#278850