Monday, August 10, 2026
8 changes · 19.0
Resolved issues and error corrections
This update fixes issues in Odoo's structured logging so ignored fields and test-related information are handled correctly. It also adds automated checks to prevent these logging problems from returning, improving reliability for monitoring and troubleshooting.
Original PR description
The JsonFormatter has two bugs - the ignore list is not working as expected - in 18.0-18.4 the 'test' key is broken This commit add tests to ensure those behavior works as expected While on it, also…
The JsonFormatter has two bugs - the ignore list is not working as expected - in 18.0-18.4 the 'test' key is broken This commit add tests to ensure those behavior works as expected While on it, also adds a `additional_record_keys` parameter to allow to specifically add keys to the default list, without having to override the whole list, and add additional default keys (exc_info and test) The previous `ignored_record_keys` default value was possible to remove by calling `JSONFormatter(ignore_record_keys=[])` The purpose was to be able to easily include all keys and ignore the default ingnore list, but this makes the additional blacklisting of a few keys more tedious, and the general usage and implementation more complex `JSONFormatter(ignore_record_keys=[*JSONFormatter.DEFAULT_IGNORED_RECORD_KEYS, 'other key'])` To simplify the logic, **this is not the case anymore**, so to include all keys something like this would be needed `JSONFormatter(additional_record_keys=JSONFormatter.DEFAULT_IGNORED_RECORD_KEYS)` Or an hardcoded list. Forward-Port-Of: odoo/odoo#279344 Forward-Port-Of: odoo/odoo#279049
Employee list filters now ignore archived employees when checking whether someone has direct subordinates. This keeps manager search results accurate after team members are archived, reducing confusion in HR records.
Original PR description
Steps to reproduce: ------------------- 1. Install `hr` module 2. Create two employees (e.g., emp1 and emp2) and assign emp1 as the manager of emp2 → emp2 is now a direct subordinate of emp1 3. In…
Steps to reproduce: ------------------- 1. Install `hr` module 2. Create two employees (e.g., emp1 and emp2) and assign emp1 as the manager of emp2 → emp2 is now a direct subordinate of emp1 3. In the employee list view, apply the custom filter "Direct subordinates is set" (child_ids != False) → emp1 appears in the results as expected 4. Archive emp2 5. Apply the same filter again → emp1 still appears in the results even though it has no active subordinates Issue: ------ When an employee (e.g., `emp2`) is archived, their manager (`emp1`) should no longer appear in the "Direct subordinates is set" (child_ids != False) filter — since `emp1` no longer has any active subordinates. However, `emp1` still appears in the search results after `emp2` is archived, because the underlying EXISTS subquery checks all subordinates regardless of their active state. Cause: -------- Before this commit 5ef007a, `osv.expression`, filtering on a One2many field would automatically search against [active co-records ](https://github.com/odoo/odoo/blob/5f65e92d7fa341193df53f5aba1620b596f9a1ec/odoo/osv/expression.py#L1260-L1265)only by default. After that commit, the `condition_to_sql` method in `_RelationalMulti` constructs the comodel with [active_test=False](https://github.com/odoo/odoo/blob/463ca4cf867812890c17d1e1abf7640b04f70ad0/odoo/orm/fields_relational.py#L672-L686) when resolving relational field conditions. This causes the EXISTS subquery generated for `child_ids != False` to compare against all subordinates. (including archived ones rather than active ones only). Solution: --------- Added a callable `domain` attribute on the `child_ids` field definition so that only active subordinates are considered by default. This ensures [get_comodel_domain()](https://github.com/odoo/odoo/blob/2d8b24a791b6fe6bb214c32d4fb58b3d46eca70b/odoo/orm/fields_relational.py#L75-L85) returns a server-side domain that filters out archived subordinates, making the `child_ids != False` filter behave as expected. opw-6193104 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#280659 Forward-Port-Of: odoo/odoo#266658
Malaysian e-invoices now use the required fixed state code for customers outside Malaysia instead of sending a non-Malaysian state name. This helps ensure invoices are accepted by MyInvois and reduces compliance-related submission errors.
Original PR description
MyInvois expects the CountrySubentityCode to be fixed as '17' for customers located outside Malaysia, since Malaysian state codes don't apply to them. Set it to '17' instead of the raw state name for non-Malaysian customers. task-6388521 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#281095 Forward-Port-Of: odoo/odoo#280550
This update prevents errors when older time zone names are encountered on newer Ubuntu systems. It keeps scheduling and localization behavior reliable by mapping retired time zone labels to their current official equivalents and updating related checks.
Original PR description
In ubuntu 26.04 the time zone database contents changed. A couple of timezone names are not available anymore, causing runtime exceptions. This mapping links old with new time zone naming conventions to prevent future (test) breakdown. The mapping WET to Europe/Lisbon is imperfect, and the localizations for the fixed date inside the test did not match. There exists no better nor correct mapping for WET. The mapping to Europe/Lisbon comes from the IANA tzdb-2026c and is official, so it is kept unchanged. The fixed date inside the test is changed to a recent one that aligns the test outcome with expectations: - Offsets match for recent history and future time - Match daylight savings time (DST) observation --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#280691
This update removes duplicated conditions from several Mexican DIOT tax report rules without changing the report results. It makes the reporting setup easier to read and maintain, reducing the chance of future configuration mistakes.
Original PR description
## Merge method squash --- ## Problem The five `wnc` (with non-creditable) domain expressions in `account_report_diot.xml` each use 3 `|` OR operators but only 2 distinct conditions — the other 2 are…
## Merge method
squash
---
## Problem
The five `wnc` (with non-creditable) domain expressions in `account_report_diot.xml` each use 3 `|` OR operators but only 2 distinct conditions — the other 2 are exact duplicates:
```xml
<!-- Before: paid_8_n_wnc — 4 conditions, but only 2 are unique -->
<field name="formula" eval="['|', '|', '|',
('tax_tag_ids', '=', 'DIOT: 8% N.'),
('tax_tag_ids', '=', 'DIOT: 8% N.'), <!-- duplicate -->
('tax_tag_ids', '=', 'DIOT: 8% N. NO ACREDITABLE'),
('tax_tag_ids', '=', 'DIOT: 8% N. NO ACREDITABLE') <!-- duplicate -->
]"/>
```
This pattern repeats across all 5 `wnc` expressions:
- `paid_8_n_wnc`
- `paid_8_s_wnc`
- `paid_16_wnc`
- `paid_16_imp_wnc`
- `paid_16_imp_int_wnc`
## Fix
Simplify each expression to use a single `|` with 2 unique conditions:
```xml
<!-- After: clean and correct -->
<field name="formula" eval="['|',
('tax_tag_ids', '=', 'DIOT: 8% N.'),
('tax_tag_ids', '=', 'DIOT: 8% N. NO ACREDITABLE')
]"/>
```
## Impact
- **No change in results** — the logical outcome is identical since `A OR A OR B OR B` ≡ `A OR B`
- Removes copy-paste error from original authoring
- Expressions are now readable and correctly represent the intended 2-condition OR logic
- Consistent domain structure across all 5 wnc expressions
## Files changed
- `addons/l10n_mx/data/account_report_diot.xml`Portal users now see their pending signature count decrease after they sign a document. This prevents confusion by ensuring the portal dashboard only counts documents still awaiting action from that specific user.
Original PR description
Version: 18.0 Steps to reproduce: - Create a sign request with two signers. - Assign the first signature to a portal user. - Log in as the portal user and sign the document. Issue: After signing, the to-sign count in the portal does not decrease. This is because the query only checks the overall sign request state instead of the individual signer's item state, so the count remains unchanged Fix: Added an item level state check to the count query so it only counts items that are still pending for that specific user. Task ID: 6412976 Forward-Port-Of: odoo/enterprise#125632
This fixes an issue where Indian payroll fields were calculated and shown in employee change logs even when Belgium was the active localization. The change ensures Indian payroll calculations only apply to Indian employee records, keeping payroll tracking relevant and avoiding confusing chatter entries.
Original PR description
[FIX] l10n_in: fix some l10n_in fields computed for other localizations
Bug reproduction:
1 - in localhost install below modules:
→ l10n_in_hr_payroll,l10n_be_hr_payroll,l10n_be_hr_contract_salary
2 - Select BE, IN localizations, but as active one select Belgium. 3 - Go to employee, Laura.
4 - Change her wage to 8000
5 - In the chatter, you will see some indian fields are tracked.
→ Shouldn't be, Laura is Belgium, only BE fields should be tracked
Bug cause:
1 - In the hr.version of l10n_in_hr_payroll:
→ there isn't enough caution in compute methods for other l18ns.
→ e.g., _l10n_in_get_montly_wage returns self.wage
→ self.wage is 8000 and that function leads to positive computations
Bug solution:
1 - Non-indian versions are carefully handled in compute methods
task-6411960This fix helps Odoo use an existing database shortcut when looking for unreconciled accounting entries tied to known accounts. As a result, bank statement matching and reconciliation-related searches can run more efficiently without changing user workflows.
Original PR description
We have a very efficient index for searching unreconciled lines on known accounts. Let's use it.
```python
_unreconciled_index = models.Index("(account_id, partner_id) WHERE reconciled IS NOT TRUE")
```
Before this change, the query planner didn't recognize the index because of its definition being slightly different wrt the null values.