Daily updates from Odoo
Navigate
Branch
Thursday, October 30, 2025
205 changes
12 changes
Enhancements to existing features
This update makes the bank reconciliation widget look and behave more consistently across versions. It also prevents users from choosing accounts that cannot produce useful reconciliation rules and removes duplicate partner information in expanded transaction details.
Original PR description
[IMP] account_accountant: css backport To have a consistent css across all version of the new bank rec widget, we decided to backport few changes. backport of:…
[IMP] account_accountant: css backport To have a consistent css across all version of the new bank rec widget, we decided to backport few changes. backport of: https://github.com/odoo/enterprise/commit/524a7a46a0c2888b591de7ad1a0a6d744e345f5a https://github.com/odoo/enterprise/commit/2a83c85cb2c9a7a5da3d4a8483120eeda6b2e6cb https://github.com/odoo/enterprise/commit/e3cb3ab3ec8c64297d8e97d941e0d2eea3e64667 https://github.com/odoo/enterprise/commit/fdbb93abbf831cfa2fdc75e79aa76c094d6e522a https://github.com/odoo/enterprise/commit/f9725d7b01cbd1235f022821a6861adb2955e49e [FIX] account_accountant: restrict some account in the set_account Before this commit, we could select the liquidity account or bank suspense account which could create a reco model for it that would do nothing. [FIX] account_accountant: partner_name Before this commit, when a transaction had no partner_name and some lines with the same partner. When unfolded, we had the info of the partner on the statement line and on the line itself which was a duplicate of information. This commit will change when the line is unfolded so that the partner is visible on the statement line only when there is a partner_name [FIX] account_accountant: payable and receivable button Before this commit, the payable and receivable buttons where on the top line only when the reconcile button was not there anymore. Now We decided to always have them present in secondary next to the reconcile button. no task-id Forward-Port-Of: odoo/enterprise#96852
Inventory users can now reset cached links between printers and reports directly from the Inventory app. This makes it easier to resolve printer-report connection issues without navigating to more technical IoT settings.
Original PR description
In order to simplify resetting the link between printers and reports in cache, we added the "Reset Linked Printers" button to the Inventory app. Forward-Port-Of: odoo/enterprise#98364 Forward-Port-Of: odoo/enterprise#98028
Resolved issues and error corrections
Opening the duplicate transaction view without a linked journal no longer causes an error. This prevents an accounting setup or administration screen from crashing in this edge case, improving reliability for users managing bank synchronization data.
Original PR description
When user opens the ``account.duplicate.transaction.wizard.form`` view, a traceback appears.
Steps to reproduce the error:
- Install ``Accounting`` module
- Using Open View, Open ``account.duplicate.transaction.wizard.form`` view
Traceback:
```py
UndefinedFunction: operator does not exist: integer = boolean
LINE 5: WHERE st_line.journal_id = false
^
```
https://github.com/odoo/enterprise/blob/8146cfc7b47ba8536f0fa5208cc69685371b55b8/account_online_synchronization/models/account_journal.py#L278
When the view is opened, the ``_compute_provider_duplicate_ids`` method is triggered,
which calls ``_get_provider_duplicate_transactions`` method.
Since no journal is linked to the wizard, it will raise the traceback from the above line.
ref: 218e8a365b153a202d062152ff69234482bcccf2
sentry-6943450225
Forward-Port-Of: odoo/enterprise#97196This fix prevents users from disabling required Peppol electronic invoicing services, reducing the risk of compliance problems. It also corrects invoice format labels and improves access to print-related invoice actions so accounting workflows behave more reliably.
Original PR description
#### [FIX] account_peppol: disallow disabling services Currently it is possible to disallow any services in the configuration. This can lead to complicance issues; i.e. if someone disables "BIS…
#### [FIX] account_peppol: disallow disabling services Currently it is possible to disallow any services in the configuration. This can lead to complicance issues; i.e. if someone disables "BIS Billing 3.0". 1. Ensure Peppol is activated (test mode or production; not demo) 2. Settings -> Accounting -> PEPPOL Electronic Invoicing -> Configure Peppol Services 3. Any service can be disabled. This commit hides the button to open the service wizard. (Also in the wizard it is now not possible to disable services anymore.) #### [FIX] account: generation of print-related entries in cog menu Before this commit: The dynamic generation of the print related entries in the cog menu does not work correctly. Problem / Solutions: There is a check in the javascript that does not work as intended. Thus the entries are not added to the cog menu in all cases. The check was intended to only block it for "new" records (not saved yet); to avoid issues in case the move has no id yet. After this commit we just check the id directly. #### [FIX] account_edi_ubl_cii: missing parenthesis in invoice_edi_format Follow-up to commit 860c0974f9b541be63f4079ef52366f91c1994ce . There we improved the eInvoice format labels for clarity. But 2 label were formatted differently than the others. This commit fixes that. #### References task-4737164 Forward-Port-Of: odoo/odoo#233629 Forward-Port-Of: odoo/odoo#233382
Restoring a database no longer breaks when the built-in OAuth provider record has previously been deleted. This prevents avoidable restore failures and helps administrators recover or duplicate databases more reliably.
Original PR description
**Description of the issue/feature this PR addresses:** When a user has deleted the Odoo Oauth provider, an error occurs when restoring the database. **Current behavior before PR:** You'll get this…
**Description of the issue/feature this PR addresses:**
When a user has deleted the Odoo Oauth provider, an error occurs when restoring the database.
**Current behavior before PR:**
You'll get this error:
```
odoo.service.db.restore_db(dbname, backup, copy, **extra_kwargs)
File "<decorator-gen-27>", line 2, in restore_db
File "/opt/ou/odoo/odoo/service/db.py", line 44, in if_db_mgt_enabled
return method(self, *args, **kwargs)
File "/opt/ou/odoo/odoo/service/db.py", line 360, in restore_db
env['ir.config_parameter'].init(force=True)
File "/opt/ou/odoo/addons/auth_oauth/models/ir_config_parameter.py", line 13, in init
oauth_oe = self.env.ref('auth_oauth.provider_openerp')
File "/opt/ou/odoo/odoo/api.py", line 611, in ref
res_model, res_id = self['ir.model.data']._xmlid_to_res_model_res_id(
File "/opt/ou/odoo/odoo/addons/base/models/ir_model.py", line 2059, in _xmlid_to_res_model_res_id
return self._xmlid_lookup(xmlid)[1:3]
File "<decorator-gen-43>", line 2, in _xmlid_lookup
File "/opt/ou/odoo/odoo/tools/cache.py", line 90, in lookup
value = d[key] = self.method(*args, **kwargs)
File "/opt/ou/odoo/odoo/addons/base/models/ir_model.py", line 2052, in _xmlid_lookup
raise ValueError('External ID not found in the system: %s' % xmlid)
ValueError: External ID not found in the system: auth_oauth.provider_openerp
Error: External ID not found in the system: auth_oauth.provider_openerp
```
**Desired behavior after PR is merged:**
No error will occur
The afflicted versions are AFAIK, **16.0**, **17.0**, **18.0**, and **19.0**
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#233633This commit is a follow-up of this commit [[1]]. The aim of this commit is improving the Finnish translations for the localization. no task id Co-authored-by: [sahak-fin](https://github.com/sahak-fin) <sahak@odoo.com> [1]: https://github.com/odoo/odoo/commit/d0017410646500928bf8fe08077f21569c1fa47e --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233482 Forward-Port-Of: odoo/odoo#233042
Original PR description
This commit is a follow-up of this commit [[1]]. The aim of this commit is improving the Finnish translations for the localization. no task id Co-authored-by: [sahak-fin](https://github.com/sahak-fin) <sahak@odoo.com> [1]: https://github.com/odoo/odoo/commit/d0017410646500928bf8fe08077f21569c1fa47e --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233482 Forward-Port-Of: odoo/odoo#233042
This fixes an issue that prevented website editors from changing the main heading on the blog landing page. Businesses can now update the default blog title directly in the website editor, keeping public-facing content easier to customize.
Original PR description
*: html_builder, website Since [1] and [2] reverting it by mistake, the blog landing title was not editable anymore. Steps to reproduce: - Open /blog in the website editor. - Try to edit the "Our Latest Posts" heading. After this commit the heading becomes editable in the website editor. [1]: https://github.com/odoo/odoo/commit/ec49429d0d405948fcb93228e7350dfea585246f [2]: https://github.com/odoo/odoo/commit/f503f98915ab39efff80a5904494c879805bb057
The Chilean electronic invoicing flow now selects only one matching company when several share the same tax ID. This prevents processing errors for businesses with branches or duplicate company records using the same RUT.
Original PR description
Before this commit, if multiple companies shared the same RUT (VAT), for example companies with branches, searching a recipient could return more than one company record. This could lead to errors when accessing variables that expect a single record. To prevent this issue, the search is now limited to one company record. OPW-5128543 Forward-Port-Of: odoo/enterprise#98352
The attendance management filter for items needing approval now also shows records with no overtime. This helps managers review, edit, or approve all relevant attendance entries instead of missing some because they had zero overtime.
Original PR description
Currently attendances having 0 overtime are hidden by the filter "To approve", which is weird because managers might want to manually edit them, or approve them. task-5189190 Forward-Port-Of: odoo/odoo#232796
This fix restores Swedish POS blackbox validation so orders can be properly checked and synced under current POS flows. It also corrects receipt reprint tracking and organisation number formatting, helping Swedish businesses stay compliant and avoid failed order validation.
Original PR description
Before this commit, the Swedish blackbox was completely broken in 18.0 because the `push_single_order` function is no longer used. To fix this, the same approach as `pos_blackbox_be` was used, where the `preSyncAllOrders` function was overridden instead. In addition, the old receipt reprinting logic was no longer working, and so it now uses the `nb_print` field to keep track of the number of reprints. Finally, we also forward port a fix from 17.0 (ddbc1fc) to correct the format of the organisation number, which for some reason was not forward ported originally. task-5077448 Forward-Port-Of: odoo/enterprise#98179 Forward-Port-Of: odoo/enterprise#98139
This fix prevents an error when saving a changed cost on an expense category that uses vendor taxes from multiple companies. It helps users working in multi-company setups update expense categories without being blocked by company-specific tax settings.
Original PR description
Steps to reproduce: - Create 2 companies - Create a tax one each - Create an expense category - Set the 2 taxes as Vendor Taxes - Select only one of the companies - Change the cost of the expense category - Try saving --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232291
Deleting a signer role from a Sign template now works correctly even when that role has radio buttons on the template. This prevents an unexpected error and lets users clean up or adjust signing templates without interruption.
Original PR description
Before this commit, when deleting a Signer role that already had a radio button dropped in the Template, it would trigger a traceback since the were trying to delete radio buttons individually. This was problematic because radio buttons are deleted in chain, so when deleting the first, we already delete all the remaining radio buttons and its chain link. After this commit, no issue is raised anymore when deleting a signer role, as radio buttons already deleted are now skipped in the code. task-5130925 Forward-Port-Of: odoo/enterprise#96097
7 changes
Resolved issues and error corrections
Opening the duplicate transaction wizard without a linked journal no longer causes an error. This improves reliability for Accounting users and avoids a disruptive traceback when accessing the view.
Original PR description
When user opens the ``account.duplicate.transaction.wizard.form`` view, a traceback appears.
Steps to reproduce the error:
- Install ``Accounting`` module
- Using Open View, Open ``account.duplicate.transaction.wizard.form`` view
Traceback:
```py
UndefinedFunction: operator does not exist: integer = boolean
LINE 5: WHERE st_line.journal_id = false
^
```
https://github.com/odoo/enterprise/blob/8146cfc7b47ba8536f0fa5208cc69685371b55b8/account_online_synchronization/models/account_journal.py#L278
When the view is opened, the ``_compute_provider_duplicate_ids`` method is triggered,
which calls ``_get_provider_duplicate_transactions`` method.
Since no journal is linked to the wizard, it will raise the traceback from the above line.
ref: 218e8a365b153a202d062152ff69234482bcccf2
sentry-6943450225
Forward-Port-Of: odoo/enterprise#97196This fixes a database restore error that could happen if the default Odoo OAuth provider had been deleted. Restores can now complete normally in that case, reducing avoidable downtime and support intervention.
Original PR description
**Description of the issue/feature this PR addresses:** When a user has deleted the Odoo Oauth provider, an error occurs when restoring the database. **Current behavior before PR:** You'll get this…
**Description of the issue/feature this PR addresses:**
When a user has deleted the Odoo Oauth provider, an error occurs when restoring the database.
**Current behavior before PR:**
You'll get this error:
```
odoo.service.db.restore_db(dbname, backup, copy, **extra_kwargs)
File "<decorator-gen-27>", line 2, in restore_db
File "/opt/ou/odoo/odoo/service/db.py", line 44, in if_db_mgt_enabled
return method(self, *args, **kwargs)
File "/opt/ou/odoo/odoo/service/db.py", line 360, in restore_db
env['ir.config_parameter'].init(force=True)
File "/opt/ou/odoo/addons/auth_oauth/models/ir_config_parameter.py", line 13, in init
oauth_oe = self.env.ref('auth_oauth.provider_openerp')
File "/opt/ou/odoo/odoo/api.py", line 611, in ref
res_model, res_id = self['ir.model.data']._xmlid_to_res_model_res_id(
File "/opt/ou/odoo/odoo/addons/base/models/ir_model.py", line 2059, in _xmlid_to_res_model_res_id
return self._xmlid_lookup(xmlid)[1:3]
File "<decorator-gen-43>", line 2, in _xmlid_lookup
File "/opt/ou/odoo/odoo/tools/cache.py", line 90, in lookup
value = d[key] = self.method(*args, **kwargs)
File "/opt/ou/odoo/odoo/addons/base/models/ir_model.py", line 2052, in _xmlid_lookup
raise ValueError('External ID not found in the system: %s' % xmlid)
ValueError: External ID not found in the system: auth_oauth.provider_openerp
Error: External ID not found in the system: auth_oauth.provider_openerp
```
**Desired behavior after PR is merged:**
No error will occur
The afflicted versions are AFAIK, **16.0**, **17.0**, **18.0**, and **19.0**
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#233633This commit is a follow-up of this commit [[1]]. The aim of this commit is improving the Finnish translations for the localization. no task id Co-authored-by: [sahak-fin](https://github.com/sahak-fin) <sahak@odoo.com> [1]: https://github.com/odoo/odoo/commit/d0017410646500928bf8fe08077f21569c1fa47e --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233482 Forward-Port-Of: odoo/odoo#233042
Original PR description
This commit is a follow-up of this commit [[1]]. The aim of this commit is improving the Finnish translations for the localization. no task id Co-authored-by: [sahak-fin](https://github.com/sahak-fin) <sahak@odoo.com> [1]: https://github.com/odoo/odoo/commit/d0017410646500928bf8fe08077f21569c1fa47e --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233482 Forward-Port-Of: odoo/odoo#233042
The Chilean electronic invoicing process now selects a single matching recipient company when multiple companies share the same tax ID. This avoids processing errors for businesses with branches or duplicate RUT records.
Original PR description
Before this commit, if multiple companies shared the same RUT (VAT), for example companies with branches, searching a recipient could return more than one company record. This could lead to errors when accessing variables that expect a single record. To prevent this issue, the search is now limited to one company record. OPW-5128543 Forward-Port-Of: odoo/enterprise#98352
The attendance management "To approve" filter now shows records even when they have zero overtime. This lets managers review, edit, or approve all relevant attendances instead of missing entries that may still need attention.
Original PR description
Currently attendances having 0 overtime are hidden by the filter "To approve", which is weird because managers might want to manually edit them, or approve them. task-5189190 Forward-Port-Of: odoo/odoo#232796
Fixes Swedish point-of-sale fiscal blackbox validation so orders are correctly checked and synced again. It also restores reliable receipt reprint tracking and corrects the organization number format, helping businesses stay compliant with Swedish POS requirements.
Original PR description
Before this commit, the Swedish blackbox was completely broken in 18.0 because the `push_single_order` function is no longer used. To fix this, the same approach as `pos_blackbox_be` was used, where the `preSyncAllOrders` function was overridden instead. In addition, the old receipt reprinting logic was no longer working, and so it now uses the `nb_print` field to keep track of the number of reprints. Finally, we also forward port a fix from 17.0 (ddbc1fc) to correct the format of the organisation number, which for some reason was not forward ported originally. task-5077448 Forward-Port-Of: odoo/enterprise#98179 Forward-Port-Of: odoo/enterprise#98139
This fixes an issue where users could not save a changed cost on an expense category when vendor taxes from multiple companies were configured. Businesses using multiple companies can now update expense category costs without being blocked by company-specific tax settings.
Original PR description
Steps to reproduce: - Create 2 companies - Create a tax one each - Create an expense category - Set the 2 taxes as Vendor Taxes - Select only one of the companies - Change the cost of the expense category - Try saving --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232291
2 changes
Enhancements to existing features
VoIP now tries to unregister a browser tab when it is closed and shortens how long unused phone registrations remain active. This helps customers avoid hitting provider registration limits when users have multiple Odoo tabs open.
Original PR description
Some providers like OnSIP allow for a limited number of registrations per user. This is a problem in Odoo because each tab opened creates a new registration for one hour. This commit mitigates the problems in two ways: - Sends an "unregister" request onbeforeunload to try to invalidate the registration upon closing the tab. - Reduces the TTL of registrations so that they get invalidated quicker in case the unregistration failed. Forward-Port-Of: odoo/enterprise#98305 Forward-Port-Of: odoo/enterprise#97963
Resolved issues and error corrections
The Chilean electronic invoicing process now selects only one matching company when several share the same tax ID. This avoids processing errors for businesses with branches or duplicate company records using the same RUT.
Original PR description
Before this commit, if multiple companies shared the same RUT (VAT), for example companies with branches, searching a recipient could return more than one company record. This could lead to errors when accessing variables that expect a single record. To prevent this issue, the search is now limited to one company record. OPW-5128543 Forward-Port-Of: odoo/enterprise#98352
42 changes
New functionality added to Odoo
The recruitment AI feature has been separated into its own bridge module. This keeps the recruitment app cleaner while preserving AI-assisted candidate refusal workflows where the new module is installed.
Original PR description
Task-5079755 Forward-Port-Of: odoo/enterprise#95167
Spreadsheet users can now apply a fiscal year filter to narrow dashboard and spreadsheet data to a specific financial year. This makes reporting and analysis easier for businesses that track performance by fiscal periods rather than calendar dates.
Original PR description
This commit adds the fiscal year global filter, that can be used to filter the data source based on the given fiscal year. Task: [4942255](https://www.odoo.com/odoo/2328/tasks/4942255)
Enhancements to existing features
Egyptian payroll benefits are now managed through flexible salary rules instead of older fixed payroll inputs and employee fields. This aligns the localization with the newer benefits system while preserving the familiar employee form layout and required legal social insurance reference.
Original PR description
purpose: adapting the new system of flexible benefits coming from salary rules for eg localization - adapted the fields in `hr.version` to become salary rules with `condition_select` as `property_input` which makes it appear in the input section - removed the records in `hr.payslip.input.type` and converted them into corresponding salary rules - added 2 `hr.salary.rule.section` to preserve the old look of the employee form view - changed the allowance benefits in the salary configurator to be linked to salary rules instead of removed fields - changed the tests in `test_salary_rules` to use salary rules instead of hardcoded fields - Note: the field `l10n_eg_social_insurance_reference` is kept because it's mandatory by the law and will have constraints for it's bounds task-id: 5122336
Bank statement corrections now support statements that show separate credit and debit columns. Users can select those amounts directly from the attached document, making manual corrections faster and reducing entry errors.
Original PR description
Previously, there was no way to use the manual correction tool on a bank statement that displayed the lines using credit/debit columns. Now, the debit/credit amounts can be selected on the attachment to fill in the amount of each line. task-[5126902](https://www.odoo.com/odoo/project/2068/tasks/5126902) Forward-Port-Of: odoo/enterprise#97374
The bank reconciliation screen now reopens the chatter on the last statement line the user selected when moving back and forth. This saves time and reduces friction for accounting teams reviewing or reconciling bank statement lines.
Original PR description
This commit ensures that the bank reconciliation widget chatter shows the last selected statement line when the user navigates back and forth to the widget chatter. It does so by storing the statement line in the session storage. task-5114688 Forward-Port-Of: odoo/enterprise#96051
VoIP searches now match phone numbers even when they include spaces, hyphens, parentheses, or other formatting characters. This makes it easier for users to find contacts and call history entries using only the digits they know, while also improving server-side handling of search text.
Original PR description
Introduces the `matchPhoneNumber` function, a new utility designed to match search terms against fully formatted phone numbers. The function converts a digit string like "123" into a flexible regex (e.g., /1\D*2\D*3/i) that matches digits regardless of any non-digit characters (spaces, hyphens, parentheses) between them. **Example:** * **SearchTerms**: "123" * **Target**: "+1 (2)-345" * **Match**: "1 (2)-3" Task-5160296 Forward-Port-Of: odoo/enterprise#98341 Forward-Port-Of: odoo/enterprise#97711
HR teams can now add employee salary inputs directly to Belgian payroll contract templates. This makes template setup more complete and helps ensure recurring payroll-related inputs are applied consistently when preparing contracts.
Original PR description
Add a button in the contract template form view so salary inputs applicable on employees can also be added to a contract template. [task-5156839](https://www.odoo.com/odoo/project/1251/tasks/5156839)
This update improves Saudi payroll WPS file generation by simplifying payment dates, using clearer payment descriptions, and requiring the correct employee identification before files are created. It also adds missing bank identifiers and changes WPS downloads to the expected .SIF format, reducing errors and improving compliance readiness.
Original PR description
* Added tooltip to Value Date * Removed Debit Date field; using Payment Date only. * Fixed Payment Description to use PayRun or Payslip name instead of the employee record. * Updated demo data to include Bank SARIE ID for all banks. * Added Bank SARIE ID and Bank Establishment ID to the bank info tab; fixed traceback when Bank Establishment ID is missing. * Made Saudi National/IQAMA ID required for WPS file generation. * WPS file downloads in .SIF format; Excel version logged in chatter. task-4946564
Demo employee data for Egypt, Jordan, Saudi Arabia, and Turkey payroll has been updated to include work addresses. This makes sample payroll setups more complete and realistic for testing, demonstrations, and evaluation.
Original PR description
Added the work address for employees in demo data of eg, jo, tr, and sa hr payroll. Task-5075966
The Referral app now presents configuration options in a clearer structure and improves how hired candidates are linked to referral contacts. Dashboards better support larger teams by showing repeated referral contacts when relevant, making profile images easier to manage, and limiting the dashboard to a manageable set of up to 8 friends.
Original PR description
Purpose: Better UX for the referral app especially for big teams Previous behavior: - the configuration menu wasn't nested - some hired applicants could exist without being linked to a friend - when 2 hired applicants had the same friend linked, it showed the friend image only once in the dashboard - the head image was required in friend creation New behavior: - added nesting to the configuration menu (recruitment, referrals, dashboard) - always checks if new applicant is hired and allows to link a friend to it even if it's chosen for another applicant - the friend image is show multiple times for all hired applicants linked to it - the head image is not required and takes default value from the dashboard image - the head image is now editable by clicking on it - the dashboard is limited to have at most 8 friends task-id: 5008726
Time off that is cancelled, refused, or only partially approved will no longer be treated as something payroll needs to defer. This reduces unnecessary warnings during payslip validation and keeps payroll screens focused on actionable leave items.
Original PR description
When a leave is cancelled, refused or partially approved,
we shouldn't care about deferring it.
This commit:
- Sets the `payslip_state` to "done" when the leave is refused.
- Hides the `payslip_state` field within the leave form view when the leave is cancelled, refused or partially approved.
- Adjusts the domain of the "To Defer" filter, to not show cancelled, refused nor partially approved leaves.
- When validating payslips:
= Don't show the error "Employee has time off to defer" on the payslip, if it overlaps a blocked leave that is partially approved (or cancelled/refused).
Task-5103880The Indian GSTR2B reporting process now matches late vendor bills more precisely by using invoice reference details differently depending on whether an IRN is available. This helps reduce duplicate or incorrect reconciliation matches and improves confidence in tax reporting.
Original PR description
- Adjusted domain construction in GSTR2B late bill matching logic. - Split condition to handle the presence or absence of IRN separately: - If IRN exists, match on both `ref` and `l10n_in_irn_number`. - If IRN is missing, match only on `ref`. - Improves the accuracy of bill reconciliation and avoids redundant matches. Forward-Port-Of: odoo/enterprise#98370 Forward-Port-Of: odoo/enterprise#97469
Inventory users can now reset the cached links between reports and IoT printers directly from the Inventory app. This makes it easier to resolve printer/report pairing issues without navigating through more technical IoT settings.
Original PR description
In order to simplify resetting the link between printers and reports in cache, we added the "Reset Linked Printers" button to the Inventory app. Forward-Port-Of: odoo/enterprise#98364 Forward-Port-Of: odoo/enterprise#98028
Changes made to POS categories, such as names or display order, are now sent to UrbanPiper when menus are synced again. This helps keep online menus aligned with the latest in-store point-of-sale setup and reduces manual corrections.
Original PR description
Before this commit: ----------------------------------------- - After syncing the menu, changes in a POS category (e.g., name or sequence) were not reflected in UrbanPiper when the menu was synced again. After this commit: ----------------------------------------- - Category updates (name or sequence) are now synced with UrbanPiper on subsequent menu syncs. Task-5122804 Forward-Port-Of: odoo/enterprise#96270
This update adjusts payroll localization tests to match the current employee contract template workflow. It helps ensure contract templates continue loading correctly across multiple country payroll modules, reducing the risk of payroll setup regressions.
Original PR description
Update contract template whitelist unit tests to stop using hr.version.wizard and assert contract template loading via the employee’s contract_template_id onchange instead. task-5022102
Tax reports no longer show a general warning banner when archived tags are found in the selected period. Instead, this issue is handled through tax return checks, making the review process more targeted and aligned with how returns are validated.
Original PR description
Currently, when there are archived tags used on move lines in the selected period, the tax report shows a warning banner. The idea behind that is that such tags are likely to come from an outdated version of a report, after a -u was performed on the database, and the related move lines might need to be reallocated to some other tags. Though, it's a bit old-fashioned and we'd prefer a check on the tax returns for that ! The check cannot be created if it successes and cannot be deleted when it exists and successes. task-5163963
The employee form no longer shows a separate extra hours checkbox because overtime is already managed through company settings. The extra hours field now appears only when an overtime ruleset is configured, making employee setup simpler and less redundant.
Original PR description
The extra hours checkbox in the employee form view was redundant, since overtime rules are already configured through the settings. This change removes the checkbox and makes the visibility of the extra hours field dependent on whether an overtime ruleset is defined. task-5082639 Forward-Port-Of: odoo/enterprise#94572
Saudi payroll overtime now uses the correct work entry type and reads overtime values directly from workday records. This helps payroll teams calculate overtime more accurately and consistently for Saudi Arabia payroll.
Original PR description
- add the right work enty type to the SA overtime rules - update the overtime salary rule to read the value from the workdays Task: 5102385
The product form now shows UrbanPiper-specific options only after an UrbanPiper point of sale is selected. This reduces clutter and makes setup clearer with improved labels and placeholders for food delivery-related details.
Original PR description
In this commit: --- - Improved visibility logic for UrbanPiper-related fields. - Now, fields like Meal Type, Is Recommended, Is Alcoholic, and Aggregators are only visible once a UrbanPiper: Point of Sale is selected. - Updated field labels and placeholders for better clarity. task-5215536
Accounting teams now get clearer warnings when bank statements are invalid, including dashboard alerts, reconciliation warnings, and form-level messages. The update also prevents risky transaction deletions and ignores empty or locked statements in balances, helping users avoid reconciliation mistakes.
Original PR description
* accountant|bank_statement_import This commit brings more clarity on invalid statements. The reflected changes are : - Hiding Last Statement if its date is <= Lock Date - "Invalid Statement(s)" alert on the journal dashboard - Red balance amount and warning in the BankRecW when it contains invalid statements (clicking on the warning applies the filter) - Possibility to choose a statement when creating a transaction - Invalid statement warning in the statement creation form - Displays all warnings in the statement form view - When a file generate a statement, it is kept in its attachments - Prevent deletion of transactions if they belong to a valid statement - Empty statement are not taken into account for the dashboard Last Statement and the BankRecW balance task-4413473 Forward-Port-Of: odoo/enterprise#97552 Forward-Port-Of: odoo/enterprise#92078
Resolved issues and error corrections
A supporting spreadsheet filter check was moved to the shared Odoo codebase where it is now needed. This prevents issues when community features use spreadsheet-style global filter operators without the enterprise-only declaration.
Original PR description
THe method `has_searchable_parent_relation` was declared in spreadsheet_edition but it's been used in Odoo community since the introduction of operators for the global filters in http://github.com/odoo/odoo/pull/215217. Task-5189262 Forward-Port-Of: odoo/enterprise#97938
Quality checks linked to a camera now correctly trigger the connected IoT Box to take a picture instead of opening a manual file upload. The update also improves retrieval of measurements from IoT devices, helping shop floor checks run as intended.
Original PR description
Even after linking a camera to a quality control point, we still ended up in the file uploader instead of calling the *take picture* action on the IoT Box. This commit fixes the issue by restoring the call to the IoT Box, updating it to use the `iot_http` service. It also ensures measurements are correctly fetched from the IoT Box. Forward-Port-Of: odoo/enterprise#98071
A payroll accounting test for the United Arab Emirates localization was updated so its test user always has the needed payroll permissions. This prevents environment-specific test failures when demo data is not installed, improving reliability of automated validation.
Original PR description
The test `TestPayslipValidation` in `l10n_ae_hr_payroll_account` was failing on runbot without demo data:
AccessError: You are not allowed to access 'HR Work Entry Type'
This happens because the test user does not belong to a group with access to `hr.work.entry.type`. With demo data, the user inherits the necessary rights, but without demo data it fails.
This commit explicitly grants the test user the `hr_payroll.group_hr_payroll_user` group to ensure consistent access across environments.
[RB-232462](https://runbot.odoo.com/odoo/error/232462)
Forward-Port-Of: odoo/enterprise#96102Companies in Belgium that are not subject to VAT can now connect to CodaBox even when their VAT number is marked as non-applicable. The system will use the company registry number instead, reducing setup issues for eligible businesses.
Original PR description
If a company is not subject to taxes, they may not have a VAT number. In that case, the field can be left empty, such that the Company Registry is used instead for the CodaBox connection. However, the case where "/" (Non Applicable) was used as the VAT number was handled. This commit now handles VAT="/" in the same way it handles no VAT at all by using the company registry as a fallback. The commit also cleans up how the company ID is used to avoid duplicated code by creating a computed field. opw-5164155 Forward-Port-Of: odoo/enterprise#98277 Forward-Port-Of: odoo/enterprise#98025
Batch payments now show a clear warning when SEPA Credit Transfer partners are missing required country or city details for structured addresses. This helps users fix partner records before generating payment XML files that would become invalid under the upcoming rules.
Original PR description
Starting from November 15th, 2026, SEPA Credit Transfer (SCT) payments require both the partner's country and city to be defined when using structured addresses. If missing, the generated XML file will be invalid. This change adds a non-blocking red banner on the batch payment form to warn users and provide a link to review the affected partners. task-5156613 Forward-Port-Of: odoo/enterprise#97598
Opening the duplicate transactions wizard without a linked journal no longer causes an error. This improves reliability for Accounting users and prevents an unexpected crash in a setup or administrative view.
Original PR description
When user opens the ``account.duplicate.transaction.wizard.form`` view, a traceback appears.
Steps to reproduce the error:
- Install ``Accounting`` module
- Using Open View, Open ``account.duplicate.transaction.wizard.form`` view
Traceback:
```py
UndefinedFunction: operator does not exist: integer = boolean
LINE 5: WHERE st_line.journal_id = false
^
```
https://github.com/odoo/enterprise/blob/8146cfc7b47ba8536f0fa5208cc69685371b55b8/account_online_synchronization/models/account_journal.py#L278
When the view is opened, the ``_compute_provider_duplicate_ids`` method is triggered,
which calls ``_get_provider_duplicate_transactions`` method.
Since no journal is linked to the wizard, it will raise the traceback from the above line.
ref: 218e8a365b153a202d062152ff69234482bcccf2
sentry-6943450225
Forward-Port-Of: odoo/enterprise#97196This fix aligns Enterprise and Studio navigation behavior with a related core platform change. It helps ensure page state is updated at the right time when screens load, reducing the risk of inconsistent navigation in the web interface.
Original PR description
*web_enterprise,web_studio This commit is the counter-part of odoo/odoo#233446 which changes the way the router state is updated by the action service when an action is mounted into the DOM. Some tests could be adapted and/or simplified.
This fix prevents users from creating a new workplace directly from certain employee and contract screens when that shortcut could trigger an error. Users can still select existing workplaces, reducing confusion and avoiding failed data entry in Swiss payroll workflows.
Original PR description
The _rec_name was previously set to partner_id, causing type errors when typing a new workplace name in a Many2one field. Couldn't change it to anything else, as one should have to create a new field in that stable version and this is not the best practice. As a workaround, the corresponding field in the l10n_ch_hr_contract_views.xml is removed from it the quick_create to prevent the creation of new names on the fly. task-5043056 Forward-Port-Of: odoo/enterprise#98173 Forward-Port-Of: odoo/enterprise#93424
The Chilean electronic invoicing process now selects a single matching company when multiple companies share the same tax ID. This avoids processing errors for organizations with branches or duplicate tax identifiers.
Original PR description
Before this commit, if multiple companies shared the same RUT (VAT), for example companies with branches, searching a recipient could return more than one company record. This could lead to errors when accessing variables that expect a single record. To prevent this issue, the search is now limited to one company record. OPW-5128543 Forward-Port-Of: odoo/enterprise#98352
Default values set on salary input rules now appear automatically when those rules are selected for employees or payslips. This prevents payroll teams from having to re-enter expected default amounts and reduces the risk of incorrect payroll data.
Original PR description
## Steps to reproduce 1. Make a new salary rule with condition based on 'salary input'. 2. Enable 'Input on' employee and payslip both and set a default value. 3. Go to employees 'Payroll tab' and 'add inputs', then select the rule. 4. Similary in 'Payslip' on 'Salary inputs' tab, 'add inputs' and select the rule. ## Issue - The default values on the employee and payslips were not being reflected on selection of the rule. ## Fix - Modified '_update_payroll_properties'. It now fetches active_id and updates properties based on the default values of input rules. - Updated '_compute_payslip_properties'. Ensures that payslips without common payroll properties fall back to the default values of the related input rules. task-5072646
Deleting a signer role from a Sign template now works correctly even when that role includes linked radio buttons. This prevents an error that could interrupt template editing and improves reliability for users preparing documents for signature.
Original PR description
Before this commit, when deleting a Signer role that already had a radio button dropped in the Template, it would trigger a traceback since the were trying to delete radio buttons individually. This was problematic because radio buttons are deleted in chain, so when deleting the first, we already delete all the remaining radio buttons and its chain link. After this commit, no issue is raised anymore when deleting a signer role, as radio buttons already deleted are now skipped in the code. task-5130925 Forward-Port-Of: odoo/enterprise#96097
The Sign app now creates new signer fields in a more reliable order, avoiding occasional display issues caused by timing delays. This helps users add signers without inconsistent or missing form elements.
Original PR description
Refactor setTimeout usage in sign_template_sidebar.js to prevent non-deterministic behavior. The previous implementation introduced potential timing issues by relying on a fixed 100ms delay, causing span and input components to not render consistently. The refactored code ensures proper rendering order and resolves the timing-related problem. task-4926187 Forward-Port-Of: odoo/enterprise#89741
Assets created from vendor bills now calculate their original value using only the deductible portion of the related bill line. This prevents overstating asset values when part of an expense is not deductible, improving accounting accuracy.
Original PR description
We allow the user to create an asset from a bill with lines which are not fully deductible but the created asset's original value is the based on the entire balance of the journal item. It should be only the deductible part. task-5156256 Forward-Port-Of: odoo/enterprise#98327 Forward-Port-Of: odoo/enterprise#97505
Changing a contact's email address only from uppercase to lowercase, or the reverse, no longer triggers previously sent signature requests to be emailed again. This prevents duplicate messages to customers and reduces confusion around already issued signing requests.
Original PR description
Before this commit, when changing the partner email to uppercase or lowercase, it would resend sign requests emails for each previously sent signed request to that email. After this commit, we don't resend anymore the sign requests emails after a case sensitive email change of a partner. task-4844230 Forward-Port-Of: odoo/enterprise#87112
Appointment shared links now handle invalid booking URL entries gracefully instead of triggering an error. This prevents users from being blocked by a crash when an incorrect extra link is entered, improving reliability during appointment setup.
Original PR description
This error occurs when a user provides an invalid URL (e.g., one containing characters like “:”, “..”, etc.) in the link field. Steps to reproduce: --- - Install `appointment` module - Appointment >…
This error occurs when a user provides an invalid URL (e.g., one containing characters like “:”, “..”, etc.) in the link field. Steps to reproduce: --- - Install `appointment` module - Appointment > Shared Links > New - Fill `Appointment Types` > Link: `testurl:` (provide wrong link in Extra link) Traceback: --- `ValueError: Extra URL must use same scheme and host as base, and begin with base path` At [1], this error occurs because during computation, the method calls `urljoin`. If the URL contains a colon (e.g., ‘:’), it is compared with the base URL, and when they differ, a `ValueError` is intentionally raised at [2]. This leads to the observed error. This commit resolves the issue by catching the error when an invalid URL is provided. [1]: https://github.com/odoo/enterprise/blob/fc931c81ca7b2ebad220cf057e15583e046810b9/appointment/models/appointment_invite.py#L280 [2]: https://github.com/odoo/odoo/blob/9900375bc0bac2754150fd8cd6a1e45ecad8da83/odoo/tools/urls.py#L55-L58 sentry-6941171133 Forward-Port-Of: odoo/enterprise#97353
This fixes an automated test that was failing because it depended on parts of the system that were not actually available in its test setup. The test now uses available related apps, helping keep the validation pipeline reliable without changing customer-facing behavior.
Original PR description
Purpose: -------- Commit [1] added a test tour relying on the ai_app app which is not a dependency of test_discuss_full_enterprise (only ai is). This commit replaces usages of the views of the ai_app by the views of crm and im_livechat, which are dependencies of the module. Fixes https://runbot.odoo.com/odoo/runbot.build.error/233603 [1]: https://github.com/odoo/enterprise/commit/a7b6eb985e85477f38f15c0e269c2b5ae10d37f6 Forward-Port-Of: odoo/enterprise#98371
This update adjusts spreadsheet edition tests so they remain reliable after recent styling changes. It helps ensure list and pivot spreadsheet autofill behavior continues to be validated without affecting day-to-day users.
This fix prevents the Italian Point of Sale from crashing when a cashier deletes a product line from an order. It improves checkout reliability for Italian POS setups using fiscal printer localization, avoiding interruptions during sales.
Original PR description
Currently POS crashes with the Italian localization if they delete a product line. Steps to reproduce: ------------------- * Install l10n_it_pos and switch to the IT company * Create a pos and…
Currently POS crashes with the Italian localization if they delete a product line. Steps to reproduce: ------------------- * Install l10n_it_pos and switch to the IT company * Create a pos and configure Italian printer * Open shop * Add a product to cart * On the numpad try deleting the line > Observation, pos crashes Traceback: TypeError: Cannot read properties of undefined (reading 'tax_details') Why the fix: ------------ When first hitting the delete button we will put the price unit to 0. With that we have ``` const reduced_base_lines = Object.values(base_line_map).filter( (base_line) => !floatIsZero(base_line.price_unit, base_line.currency_id.decimal_places)); ``` returning an empty list. Utlimately making `reduce_base_lines_to_target_amount` return an empty list. `[][0]` returns `undefined` and we were passing `[undefined]` in parameters of `fix_base_lines_tax_details_on_manual_tax_amounts`, we enter the loop with undefined and try to access some variables. We also set `l10n_it_epson = False` in order to avoid recursively looping. opw-5184113 Forward-Port-Of: odoo/enterprise#98229
Code cleanup and technical improvements
This update cleans up automated test files by removing unnecessary grouping labels that duplicated file names or could be misleading. It does not change product behavior, but makes the test suite easier for developers to read and maintain.
Original PR description
This commit removes test files using a single 'describe' call to wrap its tests, with a name being either redundant with the test file itself or is too misleading.
Regular expression used to find isolated suites:
```js
/^\s*import.*(?:\n(?!describe\()(?!test\().*)+\ndescribe\("[\w\s.]+",.*(?:\n(?!describe\().*)+\n\}\);\n(?!\n)/
```
Tip for reviewers: tick **"Hide whitespace"** when reviewing diff
<img width="237" height="205" alt="image" src="https://github.com/user-attachments/assets/373f7cc6-5e0e-4599-968a-39aad8fac2f0" />
Community: https://github.com/odoo/odoo/pull/233006
Forward-Port-Of: odoo/enterprise#98254
Forward-Port-Of: odoo/enterprise#98046IoT communication has been streamlined so websocket and WebRTC messages are handled consistently. Messages now target one IoT Box or device at a time, reducing complexity and making behavior easier to maintain across connected devices.
Original PR description
We extracted websocket/webrtc message handeling in a commont method from a parent class, in order to be able to send the same messages through both protocols and observe the same behaviour. We also removed the possibility to target multiple IoT Boxes/IoT devices in a single websocket message. Now, we'll need to send one message per IoT Device/Box. We also simplified the websocket onMessage method to get rid of the listeners logic, which was meant to add multiple listeners on the same device (originally used for the recently removed "last value sent" field). Community PR: odoo/odoo#230131
Point of Sale tax calculations are now handled consistently at the full order level instead of separately in different modules. This improves accuracy for complex tax cases, cash rounding, invoices, and certified/localized PoS flows, reducing discrepancies at checkout and in accounting.
Original PR description
*: l10n_de_pos_cert, l10n_eu_iot_scale_cert, l10n_it_pos, l10n_se_pos, pos_appointment, pos_blackbox_be, pos_settle_due, pos_tyro Before this commit taxes computation was a mess in PoS, with…
*: l10n_de_pos_cert, l10n_eu_iot_scale_cert, l10n_it_pos,
l10n_se_pos, pos_appointment, pos_blackbox_be, pos_settle_due,
pos_tyro
Before this commit taxes computation was a mess in PoS, with differents
implementations in different places, and some of them not taking into
account all the complexity of the tax system (taxes included in price,
taxes on taxes, etc.).
This commit aims to unify all the tax computation logic in a single
place, and to make it more robust and easier to understand.
---
What's changes:
Rounding methods available in PoS are now:
1) Rounding applied only on cash payments
In this case the remaining due is rounded only if there is at least
one cash payment line and the remaining due is less than the
rounding tolerance.
2) Rounding applied on all payment methods
In this case the remaining due is always rounded even if a card
payment method is used. The remaining due is rounded if it is less
than the rounding tolerance. No payment method is rounded in this
case, the whole order is rounded instead.
Taxes computation is now done globally on the order, and not on each
line. This way we ensure that the total tax amount is always correct,
even if there is some rounding issues on the lines.
---
Changes in tests:
`test_cash_rounding_down_add_invoice_line_not_only_round_cash_method_with_residual_rounding`
`test_cash_rounding_up_add_invoice_line_not_only_round_cash_method`
Are removed because the tested behavior is not longer present. Now when
rounding is enabled with only_round_cash_method=False, the whole order
is always rounded.
Accounting tests are now principally tested with Hoot instead of tours.
---
Developer note:
No prices should be calculated manually in the code base. Getters have
been created for this purpose in the following files:
- `product_template_accounting.js`
- `pos_order_accounting.js`
- `pos_order_line_accounting.js`
In the future, all PRs containing tax calculations must justify them.
taskId: 5143758
Forward-Port-Of: odoo/enterprise#96123Unused Python code was removed from Point of Sale and related localization and integration modules. This cleanup reduces maintenance overhead without changing expected business behavior.
Original PR description
Remove useless python dead code in point_of_sale and submodules. task-id: 5006039 community PR: https://github.com/odoo/odoo/pull/224984
25 changes
New functionality added to Odoo
The AI assistance used in recruitment has been separated into a dedicated bridge module. This keeps the recruitment app better organized and makes it easier to manage AI-related functionality independently in future updates.
Original PR description
Task-5079755 Forward-Port-Of: odoo/enterprise#95167
Enhancements to existing features
Barcode users can now open the return wizard directly from the barcode interface and choose between returning items, returning all products, or returning products for exchange. This makes warehouse return handling more flexible and consistent with the standard stock picking workflow.
Original PR description
Currently, when a user wants to return a product using the barcode interface, The user can either return a single product or return all products. However, there is no option to exchange products directly from the barcode interface. After this commit, the user has access to all options - `Return` - `Return All Products` - `Return for Exchange` through the return wizard, similar to the one available on the stock picking form view. When the user clicks the `Return Products` button in the barcode interface, the return wizard will open directly in the barcode view. This improvement provides a smoother and more consistent user experience within the barcode interface, offering users more flexibility and options. Task - 5144914
The Indian tax reporting workflow now matches delayed vendor bills more precisely by using the invoice reference together with the IRN when available. This reduces duplicate or incorrect reconciliation matches and helps improve the reliability of GSTR2B bill processing.
Original PR description
- Adjusted domain construction in GSTR2B late bill matching logic. - Split condition to handle the presence or absence of IRN separately: - If IRN exists, match on both `ref` and `l10n_in_irn_number`. - If IRN is missing, match only on `ref`. - Improves the accuracy of bill reconciliation and avoids redundant matches. Forward-Port-Of: odoo/enterprise#97469
Marketing users can now show or hide parts of an email based on recipient criteria, making campaigns more personalized without creating separate mailings. The editor also adds visual cues that help users understand these rules while designing, without affecting the final sent email.
Original PR description
This commit adds an option in the new Mail Builder to enable users to only show elements based on a domain on the recipients. This option uses the DomainSelectorDialog so that the user has an easier…
This commit adds an option in the new Mail Builder to enable users to only show elements based on a domain on the recipients. This option uses the DomainSelectorDialog so that the user has an easier time working on it. The resModel is the model chosen by the user for the whole mailing limiting the choice of fields to a limited list. The option populates a data attribute: `data-filter-domain` that is supposed to contain a valid domain notation. When processing the htmlField to be inlined, we process each elements that contains the data attribute and set the `t-if` attribute accordingly. If the domain stored isn't valid, the attribute is set to `false`. We prefer to not show elements that could be reserved to a subset of a recipients. If the domain is valid, then the attribute is set to `object.filtered_domain([data-filter-domain])`. This enables us to easily create QWeb conditions on the mailing that will be interpreted by the render mixin on each recipients. The resulting processed body is then returned to be fed to the rest of the sending process. task-4599334 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
Fixes a checkout editor issue where adding a field to the Extra Info form could crash after the form's dedicated submit button was removed. New fields are now placed at the end of the form when the usual insertion point is unavailable, allowing website editors to continue configuring checkout forms reliably.
Original PR description
Steps to reproduce: =================== 1. Add an element to the cart. 2. Enable the “Extra Info” step. 3. Try to add a field in the “Extra Info” form. → Traceback occurs. Cause: ====== In previous versions, the “Extra Info” form contained a submit button, and when adding a new field, the code attempted to insert it relative to that button. Starting from version 19.0, this button was removed and replaced by the common “Confirm” button used in other checkout steps. As a result, the element used to determine the field insertion location (`locationEl`) was `null`, causing a crash when trying to insert a new field. Solution: ========= If no target element is found, the field is now inserted relative to the last element of the form instead, preventing the traceback. opw-5160322 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The website shop editor now keeps product list page options visible when switching to the Style tab. This removes the need for users to click on the page first, making shop page customization more predictable and easier to use.
Original PR description
Before this PR, the ProductsListPageOption component only became visible after clicking on the web page (By example, clicking on a product). Now, by adapting the selector to target <main>, the page options remain visible when navigating to the "Style" tab.
Assets created from vendor bills with partially deductible lines now use only the deductible portion to calculate their original value. This prevents overstated asset values and helps keep depreciation and accounting records accurate.
Original PR description
We allow the user to create an asset from a bill with lines which are not fully deductible but the created asset's original value is the based on the entire balance of the journal item. It should be only the deductible part. task-5156256 Forward-Port-Of: odoo/enterprise#97505
Batch payments now show a clear warning when SEPA Credit Transfer partners are missing required country or city information for structured addresses. This helps users fix affected partner records before generating payment XML files that would become invalid under the upcoming SEPA rules.
Original PR description
Starting from November 15th, 2026, SEPA Credit Transfer (SCT) payments require both the partner's country and city to be defined when using structured addresses. If missing, the generated XML file will be invalid. This change adds a non-blocking red banner on the batch payment form to warn users and provide a link to review the affected partners. task-5156613 Forward-Port-Of: odoo/enterprise#97598
Requests for quotation created from approvals now use the currency configured for the selected vendor instead of defaulting to the company currency. This keeps purchasing amounts consistent with other RFQ creation flows and avoids currency mismatches when updating existing purchase orders.
Original PR description
Issue: When creating an RFQ from an approval, the created purchase order does not use the currency set on the vendor of the product. Rather, it uses the currency of the company, with the value converted based on the vendor's currency to get the price. This is not consistent with other ways we create RFQs, which all respect the vendor currency. Solution: Pass the vendor's currency into the values sent when creating the purchase order. In the case of modifying an existing purchase order, only modify purchase orders matching vendor's currency. opw-4549937 Forward-Port-Of: odoo/enterprise#97069
Opening the duplicate transactions wizard without a linked journal no longer causes an error. This prevents an unnecessary crash in Accounting setup or administrative workflows and lets users access the view normally.
Original PR description
When user opens the ``account.duplicate.transaction.wizard.form`` view, a traceback appears.
Steps to reproduce the error:
- Install ``Accounting`` module
- Using Open View, Open ``account.duplicate.transaction.wizard.form`` view
Traceback:
```py
UndefinedFunction: operator does not exist: integer = boolean
LINE 5: WHERE st_line.journal_id = false
^
```
https://github.com/odoo/enterprise/blob/8146cfc7b47ba8536f0fa5208cc69685371b55b8/account_online_synchronization/models/account_journal.py#L278
When the view is opened, the ``_compute_provider_duplicate_ids`` method is triggered,
which calls ``_get_provider_duplicate_transactions`` method.
Since no journal is linked to the wizard, it will raise the traceback from the above line.
ref: 218e8a365b153a202d062152ff69234482bcccf2
sentry-6943450225
Forward-Port-Of: odoo/enterprise#97196Restoring a database could fail if the built-in Odoo OAuth provider had been deleted. This fix makes the restore process handle that missing provider gracefully, avoiding an unnecessary restore error.
Original PR description
**Description of the issue/feature this PR addresses:** When a user has deleted the Odoo Oauth provider, an error occurs when restoring the database. **Current behavior before PR:** You'll get this…
**Description of the issue/feature this PR addresses:**
When a user has deleted the Odoo Oauth provider, an error occurs when restoring the database.
**Current behavior before PR:**
You'll get this error:
```
odoo.service.db.restore_db(dbname, backup, copy, **extra_kwargs)
File "<decorator-gen-27>", line 2, in restore_db
File "/opt/ou/odoo/odoo/service/db.py", line 44, in if_db_mgt_enabled
return method(self, *args, **kwargs)
File "/opt/ou/odoo/odoo/service/db.py", line 360, in restore_db
env['ir.config_parameter'].init(force=True)
File "/opt/ou/odoo/addons/auth_oauth/models/ir_config_parameter.py", line 13, in init
oauth_oe = self.env.ref('auth_oauth.provider_openerp')
File "/opt/ou/odoo/odoo/api.py", line 611, in ref
res_model, res_id = self['ir.model.data']._xmlid_to_res_model_res_id(
File "/opt/ou/odoo/odoo/addons/base/models/ir_model.py", line 2059, in _xmlid_to_res_model_res_id
return self._xmlid_lookup(xmlid)[1:3]
File "<decorator-gen-43>", line 2, in _xmlid_lookup
File "/opt/ou/odoo/odoo/tools/cache.py", line 90, in lookup
value = d[key] = self.method(*args, **kwargs)
File "/opt/ou/odoo/odoo/addons/base/models/ir_model.py", line 2052, in _xmlid_lookup
raise ValueError('External ID not found in the system: %s' % xmlid)
ValueError: External ID not found in the system: auth_oauth.provider_openerp
Error: External ID not found in the system: auth_oauth.provider_openerp
```
**Desired behavior after PR is merged:**
No error will occur
The afflicted versions are AFAIK, **16.0**, **17.0**, **18.0**, and **19.0**
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#233633Odoo now blocks attempts to unbuild manufacturing orders created through subcontracting. This prevents incorrect accounting entries and helps keep stock valuation and financial records balanced.
Original PR description
**Problem:** unbuilding a Manufactring order created through a subcontracting process gives the wrong account move lines **Steps to reproduce:** - create a storable product (the comp) and set a cost…
**Problem:** unbuilding a Manufactring order created through a subcontracting process gives the wrong account move lines **Steps to reproduce:** - create a storable product (the comp) and set a cost - create a storable product (the final product), set a cost and set a vendor - for the final product set the category as avco and automated - for the final product create a bill of materials subcontracted and set the same vendor - for the components add the comp for a quantity of 1 - create a Purchase order for the final product and the same vendor and confirm - validate the receipt - From the receipt click on the valuation smart button and click on the book widget of the line of the final product - notice how there is 3 journal items line including one crediting "stock interim (Received)" - unarchive the operation type "subcontracting" - open Manufacturing/Manufacturing Orders, delete the "to do" filter and search for a Manufacturing order with your final product - unbuild it - Open accounting/journal entries and select the journal entry for the unbuild **Current behavior:** There is only two account lines. There is no line balancing the "Stock Interim" line of the manufacturing order. **Cause of the issue:** The override of _generate_valuation_lines_data in mrp_subcontracted_account adds the stock interim line on the manufacturing order. However when unbuilding, the qty is negative so we exit the function https://github.com/odoo/odoo/blob/1358f93a4c73de5a28cda72ec78769625c863efd/addons/mrp_subcontracting_account/models/stock_move.py#L20 **fix** Because subcontracted Manufacturing orders are not meant to be unbuilt, we prevent it opw-4998137 Forward-Port-Of: odoo/odoo#230062
Fixes a small typo in the Manufacturing split process that prevented the wizard from completing. This helps users split manufacturing orders without encountering the reported endpoint-related error.
Original PR description
Description of the issue/feature this PR addresses: Issue Mentioned on #233410 Current behavior before PR: Issue Mentioned on #233410 Desired behavior after PR is merged: The split wizard completes successfully. <img width="1920" height="903" alt="mrp_split_wizard_solved" src="https://github.com/user-attachments/assets/9a693ecd-f84f-4d71-b861-902d46276258" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Fixed an issue where creating a new user from a project task could accidentally turn that user's onboarding todo into a project task. This keeps onboarding reminders separate from project work, avoiding confusion in task lists and reporting.
Original PR description
Before this commit, when the user creates a new user from the user_ids field of a task, an onboarding todo will be created with the context given by Framework JS, which means, if the context contains `default_project_id` the onboarding todo will become a task inside the project instead of being a real todo (task with no project set). This commit makes sure the context is reset before creating the onboarding todo. task-5217306
This fix updates an internal automated test so it uses apps that are already included with the test module. It helps prevent false build failures and keeps quality checks reliable without changing customer-facing features.
Original PR description
Purpose: -------- Commit [1] added a test tour relying on the ai_app app which is not a dependency of test_discuss_full_enterprise (only ai is). This commit replaces usages of the views of the ai_app by the views of crm and im_livechat, which are dependencies of the module. Fixes https://runbot.odoo.com/odoo/runbot.build.error/233603 [1]: https://github.com/odoo/enterprise/commit/a7b6eb985e85477f38f15c0e269c2b5ae10d37f6
Appointment shared links now handle incorrectly formatted booking URLs without causing an error. This prevents users from hitting a crash when an invalid extra link is entered, improving reliability for appointment setup.
Original PR description
This error occurs when a user provides an invalid URL (e.g., one containing characters like “:”, “..”, etc.) in the link field. Steps to reproduce: --- - Install `appointment` module - Appointment >…
This error occurs when a user provides an invalid URL (e.g., one containing characters like “:”, “..”, etc.) in the link field. Steps to reproduce: --- - Install `appointment` module - Appointment > Shared Links > New - Fill `Appointment Types` > Link: `testurl:` (provide wrong link in Extra link) Traceback: --- `ValueError: Extra URL must use same scheme and host as base, and begin with base path` At [1], this error occurs because during computation, the method calls `urljoin`. If the URL contains a colon (e.g., ‘:’), it is compared with the base URL, and when they differ, a `ValueError` is intentionally raised at [2]. This leads to the observed error. This commit resolves the issue by catching the error when an invalid URL is provided. [1]: https://github.com/odoo/enterprise/blob/fc931c81ca7b2ebad220cf057e15583e046810b9/appointment/models/appointment_invite.py#L280 [2]: https://github.com/odoo/odoo/blob/9900375bc0bac2754150fd8cd6a1e45ecad8da83/odoo/tools/urls.py#L55-L58 sentry-6941171133
The Add to Cart button in the product options popup now appears in the shopper's selected website language. This improves the buying experience for non-English customers and keeps the checkout flow consistent across languages.
Original PR description
- t-out is used for variables, so static text inside it isn’t picked up for translation. - Replaced it with a direct <span> so the text is automatically translatable **Before Fix:** <img width="1185" height="915" alt="image" src="https://github.com/user-attachments/assets/dc035e6a-25d1-4b88-9b8f-c013a0aeb75b" /> **After Fix:** <img width="1185" height="915" alt="image" src="https://github.com/user-attachments/assets/80bd5e7b-c705-49a8-a785-86e32bc54daf" /> **Steps to reproduce before the fix:** Go to Website → change the website language to any non-English language. Add any product to the cart. A Product Configuration wizard (for options) will open. The “Add to Cart” button for options is not translated. 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 restores the demo company data needed by the Mexican payroll module when it is installed on its own. It prevents installation errors caused by payroll demo records referring to a company that was no longer included.
Original PR description
In the pr #95221 the data from the demo company where no new fields were added was deleted. This decision was made to standardize the demo data in the smallest number of modules. However, the l10n_mx_hr_payroll module does not depend on any other l10n_mx module, as it does not need any of the information added by the other modules, but it does add information about departments and other items based on the company's demo data. This caused an error when installing this module alone, as it attempted to add this information to a company that did not exist. To fix this, the company information is also added as demo in this module, as it was before. I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change removes an outdated upgrade step that could block database upgrades for French point-of-sale certification. The needed sequence update is already handled elsewhere, so upgrades can proceed without hitting missing-field errors.
Original PR description
- In Odoo 19, the pos.config fields sequence_id and sequence_line_id were renamed to order_seq_id and order_line_seq_id. The removed migration script…
- In Odoo 19, the pos.config fields sequence_id and sequence_line_id were
renamed to order_seq_id and order_line_seq_id. The removed migration script
https://github.com/odoo/odoo/commit/2ead34e974f55dadf791ff6b2924edbf43442b34#diff-4c6e412c7d8f4df2a05831547e7df93d0b91f510d03b7b3ed0d689a18f5dae44R98-L132
still referenced the old field names, causing UndefinedColumn errors during
upgrade. The logic is already handled by the main migration script using the
https://github.com/odoo/upgrade/pull/8197/files#diff-d415d26b86040ad22ab82c184e6db20ec4e9a61058d9a9dbf3668ca21bcbaf19R42-R50
new field names, so this file is no longer required.
```python3
Traceback (most recent call last):
File "/home/odoo/src/odoo/19.0/odoo/service/server.py", line 1509, in preload_registries
registry = Registry.new(dbname, update_module=update_module, install_modules=config['init'], upgrade_modules=config['update'], reinit_modules=config['reinit'])
File "/home/odoo/src/odoo/19.0/odoo/tools/func.py", line 88, in locked
return func(inst, *args, **kwargs)
File "/home/odoo/src/odoo/19.0/odoo/orm/registry.py", line 185, in new
load_modules(
File "/home/odoo/src/odoo/19.0/odoo/modules/loading.py", line 449, in load_modules
load_module_graph(
File "/home/odoo/src/odoo/19.0/odoo/modules/loading.py", line 217, in load_module_graph
migrations.migrate_module(package, 'post')
File "/home/odoo/src/odoo/19.0/odoo/modules/migration.py", line 220, in migrate_module
exec_script(self.cr, installed_version, pyfile, pkg.name, stage, stageformat[stage] % version)
File "/home/odoo/src/odoo/19.0/odoo/modules/migration.py", line 257, in exec_script
mod.migrate(cr, installed_version)
File "/home/odoo/src/odoo/19.0/addons/l10n_fr_pos_cert/upgrades/1.1/post-sequence-no-gap.py", line 2, in migrate
cr.execute("""
File "/home/odoo/src/odoo/19.0/odoo/sql_db.py", line 426, in execute
self._obj.execute(query, params)
psycopg2.errors.UndefinedColumn: column pconfig.sequence_id does not exist
LINE 9: AND (pconfig.sequence_id = iseq.id or pconfig.sequen...
^
```
opw-5152559
upg-3179288
tbg-2205
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-prThe mailbox search panel now uses the full screen width on mobile instead of appearing squeezed beside the message list. This makes searching inbox, starred, and history messages easier and more usable on phones.
Original PR description
Before this commit, the search panel in mailboxes (inbox, starred, history) took only part of the screen in mobile. This happens because the template being used in mobile for mailbox is the same as…
Before this commit, the search panel in mailboxes (inbox, starred, history) took only part of the screen in mobile. This happens because the template being used in mobile for mailbox is the same as desktop UI for discuss app. This component `DiscussContent` is used because mailboxes are not supported in chat windows, and full-screen conversations in discuss on mobile are actually chat windows. Reusing the `DiscussContent` component is almost the desired UX/UI. The side panel however was not designed for small screen, thus action panel is very narrow and is hard to use in mobile. This commit fixes the issue by making the action panel mutually exclusive to message list in mobile, so that when search panel is open it takes the whole width of screen. We don't need to see message list in mobile, and thanks to chat window also using search panel that takes the whole screen, the search panel is already designed to auto-close itself and jump to a message. Part of Task-4967066 Before / After <img width="383" height="672" alt="Screenshot 2025-10-28 at 18 16 10" src="https://github.com/user-attachments/assets/f7a0bd0d-33ff-4e65-8b0e-0d3a0611b82c" /> <img width="382" height="673" alt="Screenshot 2025-10-28 at 18 15 52" src="https://github.com/user-attachments/assets/79f85cf1-e758-43fd-bc02-8e809e9795e3" />
The Chilean electronic invoicing process now uses only one matching company when several records share the same tax ID. This avoids processing errors for organizations with branches or duplicate company records using the same RUT.
Original PR description
Before this commit, if multiple companies shared the same RUT (VAT), for example companies with branches, searching a recipient could return more than one company record. This could lead to errors when accessing variables that expect a single record. To prevent this issue, the search is now limited to one company record. OPW-5128543 Forward-Port-Of: odoo/enterprise#98352
Lithuanian payroll now avoids charging the pension contribution twice when an employee participates in the pension accumulation system. This helps ensure payslips reflect the expected employee social security contribution and prevents overstated deductions.
Original PR description
**Issue**
When generating a payslip for an employee with the `l10n_lt_pension` setting enabled on the contract ("Participate to pension accumulation system"):
- the SSC is raised from 19.5% to 22.5%
- a 3% pension contribution ("Pension Scheme") is added This effectively doubles the expected contribution.
Various sources (e.g. https://taxsummaries.pwc.com/lithuania/individual/other-taxes) seem to show this is not correct.
opw-5067664
Forward-Port-Of: odoo/enterprise#98276
Forward-Port-Of: odoo/enterprise#95880Users can now open the inventory valuation report for future dates without hitting an error. This matters for businesses reviewing projected or forward-dated inventory values, especially when purchases use lot tracking and average costing.
Original PR description
Currently, an error occurs when a user attempts to access the stock valuation report for a date beyond today. **Steps to replicate:** - Install `stock_account`, `purchase_stock`, `accountant`. - Go…
Currently, an error occurs when a user attempts to access the stock valuation report for a date beyond today. **Steps to replicate:** - Install `stock_account`, `purchase_stock`, `accountant`. - Go to settings, set `Inventory Cost Method` to Average Cost(AVCO) and Turn on `Lots and Serial Numbers`. - Go to Products and create a new one with name `test`, set `Track Inventory` - `by lots`. - On the `Inventory` page turn on `Valuation by Lots/Serial`. - Open RFQs, Create a new one with test product and Click `Confirm Order` > Click `Receive`. - Set the Lot name by clicking the `Details` button on the move lines. - Click `Validate`, go to `Purchase > Orders > Purchase Orders`. - Select the currently made Purchase Order (It will be in the `Waiting Bills` state) and Click on the `Create bills` Button, Confirm it (it should be in the paid state now). - Now go to `Accountant > Review > Inventory Evaluation` and select and date ahead of today, the error will occur. **TL;DR:** - Install `stock_account, purchase_stock, and accountant`. - Create a product tracked by lots with AVCO costing and `Valuation by Lots/Serial` enabled. - Create a Purchase order and receive it (assign a lot), then create and confirm the bill for the same. - Finally, go to `Accountant > Review > Inventory Valuation`, select a future date — the error occurs. **Error:** `TypeError: can't compare datetime.datetime to datetime.date` **Cause:** - The error occurs because of recent commit [PR] where `aml.date` is typecasted from `datetime.date` to `datetime.datetime`, but the `at_date` is received as `datetime.date` [1] and this causes the error. - The `at_date` is converted to `datetime.date` from string at line [2]. **Solution:** - Now we don't convert `aml.date` to datetime since both `aml.date` [3] and `at_date` [4] are instances of `datetime.date`. Additionally, `account.move` are based on date rather than datetime. [PR]: https://github.com/odoo/odoo/pull/227567/commits/aec7d3244aa25af626cefd875f021d0d24ce418d [1]: https://github.com/odoo/odoo/blob/7e0cc5ec686a52b8c1f8270213acac54575ed469/addons/purchase_stock/models/stock_move.py#L157 [2]: https://github.com/odoo/odoo/blob/7e0cc5ec686a52b8c1f8270213acac54575ed469/addons/stock_account/report/stock_valuation_report.py#L32 [3]: https://github.com/odoo/odoo/blob/385d8473952eeaa9dcc7740bacfc2c9cbdc2d1e2/addons/account/models/account_move_line.py#L69-L73 [4]: https://github.com/odoo/odoo/blob/385d8473952eeaa9dcc7740bacfc2c9cbdc2d1e2/addons/stock_account/report/stock_valuation_report.py#L32 sentry-6933268158 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Dimona-related employee fields are now shown only for Belgian employees instead of appearing for everyone. This reduces confusion for companies managing employees in multiple countries and keeps employee forms relevant to each worker's location.
Original PR description
Before this commit, the fields about dimona were shown for all employees, now these fields will be displayed only for belgian employees. task-5148931 Forward-Port-Of: odoo/enterprise#96703
This fixes electronic invoicing settings so required Peppol services can no longer be disabled, reducing the risk of compliance issues. It also corrects invoice format labels and restores some print menu entries so users see the expected invoice actions.
Original PR description
#### [FIX] account_peppol: disallow disabling services Currently it is possible to disallow any services in the configuration. This can lead to complicance issues; i.e. if someone disables "BIS…
#### [FIX] account_peppol: disallow disabling services Currently it is possible to disallow any services in the configuration. This can lead to complicance issues; i.e. if someone disables "BIS Billing 3.0". 1. Ensure Peppol is activated (test mode or production; not demo) 2. Settings -> Accounting -> PEPPOL Electronic Invoicing -> Configure Peppol Services 3. Any service can be disabled. This commit hides the button to open the service wizard. (Also in the wizard it is now not possible to disable services anymore.) #### [FIX] account: generation of print-related entries in cog menu Before this commit: The dynamic generation of the print related entries in the cog menu does not work correctly. Problem / Solutions: There is a check in the javascript that does not work as intended. Thus the entries are not added to the cog menu in all cases. The check was intended to only block it for "new" records (not saved yet); to avoid issues in case the move has no id yet. After this commit we just check the id directly. #### [FIX] account_edi_ubl_cii: missing parenthesis in invoice_edi_format Follow-up to commit 860c0974f9b541be63f4079ef52366f91c1994ce . There we improved the eInvoice format labels for clarity. But 2 label were formatted differently than the others. This commit fixes that. #### References task-4737164 Forward-Port-Of: odoo/odoo#233629 Forward-Port-Of: odoo/odoo#233382
6 changes
Enhancements to existing features
This update adds the stock movement identifier to Romanian EDI export data. It makes it easier for businesses to trace electronic delivery records back to the exact stock movements they represent.
Original PR description
Added `move_id` field in the export structure for EDI documents to include the stock move identifier. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: This enhances traceability and allows better linkage between stock moves and their corresponding EDI records. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
The Chilean electronic invoicing flow now only selects one recipient company when multiple company records share the same tax ID. This prevents errors in cases such as branch structures where duplicate RUT values exist, helping email-based document processing run more reliably.
Original PR description
Before this commit, if multiple companies shared the same RUT (VAT), for example companies with branches, searching a recipient could return more than one company record. This could lead to errors when accessing variables that expect a single record. To prevent this issue, the search is now limited to one company record. OPW-5128543 Forward-Port-Of: odoo/enterprise#98352
This fix ensures Turkish Nilvera e-invoice tax setup only runs for main companies, not their branch companies. It prevents duplicate tax records during setup, reducing accounting configuration errors for businesses using branch structures.
Original PR description
Adds parent_id check on the domain to ensure taxes are only loaded for root companies. This prevents duplicate tax creation on branch (child) companies when initializing tax templates. task-5176333 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Restoring a database no longer fails if the default Odoo OAuth provider was previously deleted. This prevents an avoidable restore error and helps keep database recovery operations reliable.
Original PR description
**Description of the issue/feature this PR addresses:** When a user has deleted the Odoo Oauth provider, an error occurs when restoring the database. **Current behavior before PR:** You'll get this…
**Description of the issue/feature this PR addresses:**
When a user has deleted the Odoo Oauth provider, an error occurs when restoring the database.
**Current behavior before PR:**
You'll get this error:
```
odoo.service.db.restore_db(dbname, backup, copy, **extra_kwargs)
File "<decorator-gen-27>", line 2, in restore_db
File "/opt/ou/odoo/odoo/service/db.py", line 44, in if_db_mgt_enabled
return method(self, *args, **kwargs)
File "/opt/ou/odoo/odoo/service/db.py", line 360, in restore_db
env['ir.config_parameter'].init(force=True)
File "/opt/ou/odoo/addons/auth_oauth/models/ir_config_parameter.py", line 13, in init
oauth_oe = self.env.ref('auth_oauth.provider_openerp')
File "/opt/ou/odoo/odoo/api.py", line 611, in ref
res_model, res_id = self['ir.model.data']._xmlid_to_res_model_res_id(
File "/opt/ou/odoo/odoo/addons/base/models/ir_model.py", line 2059, in _xmlid_to_res_model_res_id
return self._xmlid_lookup(xmlid)[1:3]
File "<decorator-gen-43>", line 2, in _xmlid_lookup
File "/opt/ou/odoo/odoo/tools/cache.py", line 90, in lookup
value = d[key] = self.method(*args, **kwargs)
File "/opt/ou/odoo/odoo/addons/base/models/ir_model.py", line 2052, in _xmlid_lookup
raise ValueError('External ID not found in the system: %s' % xmlid)
ValueError: External ID not found in the system: auth_oauth.provider_openerp
Error: External ID not found in the system: auth_oauth.provider_openerp
```
**Desired behavior after PR is merged:**
No error will occur
The afflicted versions are AFAIK, **16.0**, **17.0**, **18.0**, and **19.0**
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#233633This fix lets Point of Sale users settle customer balances when Saudi ZATCA e-invoicing is enabled. Settlement payments will no longer be incorrectly treated as new invoices, avoiding blocked payments and duplicate e-invoice attempts.
Original PR description
## Dependent PR https://github.com/odoo/enterprise/pull/98353 ## Description of the issue/feature this PR addresses: Users are blocked when trying to use the **Settle Due** feature in Point of Sale…
## Dependent PR https://github.com/odoo/enterprise/pull/98353 ## Description of the issue/feature this PR addresses: Users are blocked when trying to use the **Settle Due** feature in Point of Sale if the ZATCA (l10n_sa_edi_pos) integration is enabled. ## Current behavior before PR: When a PoS order is created using a "Pay Later" payment method, an invoice is correctly generated and sent to ZATCA. However, when the user later tries to settle that customer's due balance (using the **Settle Due** option), the l10n_sa_edi_pos module incorrectly forces the Invoice option to be enabled and makes the field read-only. This blocks the user because: - Settlement orders do not contain any lines, so a new invoice cannot be generated. - The original invoice was already sent to ZATCA, and the settlement payment should not be sent as a new e-invoice. Thus, the user cannot proceed with the settlement. ## Desired behavior after PR is merged: After this fix, the **Invoice** checkbox will no longer be forced or marked as read-only during **Settle Due** operations. The field will default to False, aligning with standard Odoo behavior for settlements and allowing the user to complete the payment. task-5144679 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix ensures that when a cashier starts a Settle Due payment in Point of Sale but backs out before completing it, the order is no longer treated as an account settlement. This prevents normal sales from being incorrectly flagged, reducing checkout and compliance issues in related integrations.
Original PR description
## Description of the issue/feature this PR addresses: The `is_settling_account` flag on a Point of Sale order is not reset to False if the user cancels a **Settle Due** operation. ## Current…
## Description of the issue/feature this PR addresses: The `is_settling_account` flag on a Point of Sale order is not reset to False if the user cancels a **Settle Due** operation. ## Current behavior before PR: When a user initiates a **Settle Due** payment for a customer, Odoo creates a new order and sets the `is_settling_account` flag to True. If the user proceeds to the payment screen but then navigates back (to the product screen) instead of completing the payment, the flag remains True. This is problematic because the user can then add regular products to this same order and check out. The order is processed as a normal sale, but it is incorrectly flagged as a settlement, which can lead to error on codes depending on this. ## Desired behavior after PR is merged: After this fix, if a user leaves the payment screen during a **Settle Due** operation, the `is_settling_account` flag on the order will be correctly reset to False. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
6 changes
Enhancements to existing features
This update adds identifiers to two stock transfer status fields so they can be customized separately. It helps teams and implementers adjust stock workflows more precisely without changing the visible business process.
Original PR description
IDs were incorporated into the two state fields to facilitate the process of inheriting these distinct states individually. 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 update improves how an error is handled in the stock forecast report, making debugging more precise when an unexpected value is encountered. It helps support and development teams identify the cause faster, with minimal direct impact on day-to-day users.
Original PR description
Description of the issue/feature this PR addresses: Address the Exception precisely for debugging(Optional) Current behavior before PR: exception caused by calling field from Bool Desired behavior after PR is merged: Adresse issue when debugging --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Stock moves are now marked as picked only when every related move line has been picked. This prevents partially completed stock operations from appearing fully picked, improving inventory accuracy and operational clarity.
Original PR description
### Current behavior before PR: The stock move is marked as picked also if only one move line is picked ### Desired behavior after PR is merged: The stock move will be marked as picked only if all stock move lines are "picked" --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
This fixes an issue where undoing or reverting edits in the web editor could restore text or child elements in the wrong sequence in some Firefox cases. The change helps preserve the original content order, reducing confusing editing results for users.
Original PR description
Problem: Reverting history sometimes restores children in the wrong order (e.g. `acb` instead of `abc`). Cause: In `historyRevert`, node reinsertion relied on `nextId` / `previousId` only if the…
Problem:
Reverting history sometimes restores children in the wrong order (e.g. `acb` instead of `abc`).
Cause:
In `historyRevert`, node reinsertion relied on `nextId` / `previousId` only if the referenced sibling was connected to the live DOM (`.isConnected`).
When that check failed, the fallback was `parent.append()`. On some Firefox versions, mutation events list the parent removal *after* its children’s, meaning the parent is reinserted first while the children’s siblings still exist but are detached. Because `.isConnected` returned false, the fallback `append()` misplaced nodes and broke the order.
Example (processed in reverse order):
```js
[
{ type: 'remove', id: 'p', parentId: 'root', node: { tagName: 'P' } },
{ type: 'remove', id: 'b1', parentId: 'p', nextId: 'b2',
node: { textValue: 'b' } },
{ type: 'add', id: 'b1', append: 'x', node: { textValue: 'b' } },
{ type: 'remove', id: 'c1', parentId: 'p', node: { textValue: 'c' } },
{ type: 'add', id: 'c1', append: 'x', node: { textValue: 'c' } },
]
```
During revert:
- Child removals (b1, c1) are processed first.
- Their sibling nodes exist but are detached → .isConnected false.
- Fallback append() used → "b" inserted after "c" → acb.
- `<p>` restored last with children in wrong order.
Solution:
Remove the `.isConnected` condition.
`before()` and `after()` work even on detached nodes, preserving the original child order regardless of browser mutation sequence.
Steps to reproduce:
- Open todo.
- Have this:
```html
<p>a[]</p>
<p>b<br>c</p>
```
- Press Delete.
- Observe "b" and "c" are not in the right order.
opw-5139795
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThe website header now only creates the language selector area when more than one language is available. This prevents an empty menu spot from adding unwanted borders or spacing, keeping the header cleaner for single-language sites.
Original PR description
This PR calls the language selector placeholder only when multiple languages exist, avoiding an empty header list item that creates an unnecessary border or empty space. task-5150808 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Reordering from a past portal order no longer changes the customer on an existing shopping cart to OdooBot. This prevents incorrect cart ownership and helps customers continue checkout without unexpected account or order details changing.
Original PR description
Versions -------- - 16.0 - 17.0 - 18.0 Steps ----- 1. Have a product that cannot be sold out of stock (but is in stock); 2. have a confirmed sales order for a portal user with said product; 3. as…
Versions -------- - 16.0 - 17.0 - 18.0 Steps ----- 1. Have a product that cannot be sold out of stock (but is in stock); 2. have a confirmed sales order for a portal user with said product; 3. as portal user, add the product to your cart; 4. go to My Account / Your Orders; 5. open the confirmed sales order; 6. click Order Again. Issue ----- The cart that was opened by the portal user now has OdooBot as Customer. Cause ----- The `_document_check_access` method returns a sale order record with `SUPERUSER_ID` in its env[^1]. Meanwhile, the `website.sale_get_order` method checks the current user's partner, and if it's different from the order's partner, it gets reassigned, assuming an address change[^2]. [^1]: https://github.com/odoo/odoo/blob/9eb0b12/addons/portal/controllers/portal.py#L439-L459 [^2]: https://github.com/odoo/odoo/blob/9eb0b12/addons/website_sale/models/website.py#L386-L404 Because `SUPERUSER_ID` is the user in the environment, the order's partner gets changed to OdooBot. Solution -------- After `_document_check_access`, add the request's user to the record's env. opw-5097915 Forward-Port-Of: odoo/odoo#233204