Daily updates from Odoo
Saturday, July 18, 2026
31 changes · master
Enhancements to existing features
The website builder now avoids repeated database checks when showing imported footer options. This makes the footer customization flow more efficient without changing what users see or how they work.
Original PR description
The imported footer template provider queried the database every time the footer options was used. This commit caches the lookup so it only runs once, and check existence with a `search` limit=1 rather than a `searchCount`. task-6018501
The Mexican payroll localization now includes the latest SAT perception and deduction concepts for CFDI payroll documents. This helps companies keep payroll reporting aligned with current Mexican tax authority requirements.
Original PR description
Adds the new SAT perception and deduction concepts to the Mexican payroll CFDI concept catalog. task-6295124 Forward-Port-Of: odoo/enterprise#121568
The payment form no longer shows the Payment Identifier field because it did not provide useful information for end users. This reduces visual clutter and helps users focus on relevant payment details.
Original PR description
- The Payment Identifier field has been permanently hidden from the payment form view, as it does not provide actionable or useful information to the end user. community pr - https://github.com/odoo/odoo/pull/266072 task- 6237870 Forward-Port-Of: odoo/enterprise#118183
The point of sale IoT debug window no longer shows the rarely used button for refreshing the customer display. This simplifies the debug interface and reduces clutter without affecting normal checkout operations.
Original PR description
We remove the "refresh" button used to refresh the customer display screen from the debug windows as it's almost never used. see odoo/odoo#274986 task-6357970 Forward-Port-Of: odoo/enterprise#123483
Users can now move through the journal creation wizard using keyboard arrow keys. This improves accessibility and makes setup faster for users who prefer keyboard navigation.
Original PR description
This commit aims to allow for navigation through the journal create wizard via keybaord arrows. Related Odoofin PR: https://github.com/odoo/odoofin/pull/502 task-5796200 Forward-Port-Of: odoo/enterprise#105541
Draft bank statement lines now appear in blue in the bank reconciliation view. This helps accounting users quickly identify which lines are not yet finalized, reducing review time and potential confusion.
Original PR description
This commit will put the text in blue when the statement line is in draft to be able to see quickly which lines are in draft. task-6327308 Forward-Port-Of: odoo/enterprise#124418 Forward-Port-Of: odoo/enterprise#121775
Resolved issues and error corrections
This fix prevents an account reports screen from continuing to load data after the user has already left or closed the view. It helps avoid unnecessary errors and improves reliability without changing how users work with the feature.
The rental schedule Gantt view now loads all information needed to display status indicators and popover details. This prevents display errors and missing values when users review rental planning information.
Original PR description
Before this change, the rental schedule Gantt view only declared some fields inside the `popover` element. As a result, they were not fetched with the Gantt records, even though they were also used by Gantt decorations and the popover templates. Depending on which field was missing, this could result in evaluation errors when rendering the Gantt view or missing values in the popover. This commit restores these fields as top-level Gantt fields so they are loaded with the record data and available wherever they are referenced. causing pr: https://github.com/odoo/enterprise/pull/123693 task-6398205
Previously skipped checks for stock valuation have been re-enabled and updated after recent valuation changes. This helps ensure rental stock flows and Kenya electronic stock reporting continue to calculate and report values consistently.
Original PR description
*: sale_stock_renting, l10n_ke_edi_oscu_stock Re-enable and adapt the tests skipped to fast merge the valuation refactoring made in 08b62a4bbcc6f9a391b2cc00a621ef4c76100229. The stock IO now values the receipt from the vendor bill, so the shared purchase fixtures `l10n_ke_edi_oscu` need to match the values provided in `l10n_ke_edi_oscu_stock` see for instance: https://github.com/odoo/enterprise/blob/ce68644f97ac28568b9497a18079a4ad5ce4a125/l10n_ke_edi_oscu/tests/expected_requests/save_purchase_2.json#L11-L13 Forward-Port-Of: odoo/enterprise#123165 Forward-Port-Of: odoo/enterprise#122857
The timesheet assistant now shows the envelope icon again for existing email-related rules. This prevents users from seeing missing or incorrect icons while preserving support for Gmail activities.
Original PR description
Issue: The email activity icon (fa-envelope) is not displayed for matched email rules. Cause: The email icon mapping was replaced with gmail_activity to support Gmail events. However, existing aw.rule records still use the email activity type, causing an icon key mismatch. Fix: Restore the email icon mapping while keeping the gmail_activity mapping so both activity types display the email icon. Task-6370391 Forward-Port-Of: odoo/enterprise#123967 Forward-Port-Of: odoo/enterprise#123438
The update request for POS pricing items now uses the expected data structure again. This prevents synchronization or update errors caused by inconsistent request data, helping price-related operations run reliably.
Original PR description
odoo/enterprise#120226 FW port introduced an inconsistency in the data passed to the items update request. This commit fixes it. Forward-Port-Of: odoo/enterprise#124282
The AI conversation view now waits until the chat has finished loading before showing its start message. This prevents users from briefly seeing an empty conversation screen, making the experience feel smoother and more consistent with other Discuss channels.
Original PR description
Only display the AI thread start message once the thread has finished loading, matching the behavior of regular Discuss channels and preventing a brief flash of the empty conversation. Update the AI-specific `showStartMessage` implementation to respect the base Thread loading state instead of always displaying the start message for AI channels. Community PR : https://github.com/odoo/odoo/pull/273991 task-6352578 Forward-Port-Of: odoo/enterprise#124252 Forward-Port-Of: odoo/enterprise#122808
Rental pickup and return receipts now include the separate invoicing and shipping address details when customer addresses are enabled. This ensures printed rental documents contain the right address information for customers and operations teams.
Original PR description
**Steps to Reproduce:** 1. Install sale_renting and enable "Customer Addresses" in the settings 2. Confirm a rental order with shipping address and invoice address 3. Print the Pickup and Return Receipt **Issue:** Only the general partner address is printed; the invoicing/shipping `information_block` is missing **Why this happens:** The 19.2 layout rework (abf18ba250bae2f390f93f70abef1d7fb601c524) switched `web.external_layout` calls to accept macro arguments (e.g. `address="address"`). report_rental_order_document was only partially migrated: `address` was set above the t-call and passed as an argument, but `information_block` was left as a t-set inside the call body, which was the old convention. Once external_layout is called with explicit arguments, content t-set nodes in the body no longer populate the callee's scope, so address_layout's `t-if="information_block"` never triggers. opw-6366091 Forward-Port-Of: odoo/enterprise#124077
The Social Demo setup now uses the standard demo contact data after its old demo contact was removed. This fixes comments in demo mode so feed replies display the correct author image, making demonstrations look consistent and reliable.
Original PR description
Bug === Since ce264a2 , we remove the demo partner in the social_demo module, but we didn't update the code to use the demo data in base. Task-6293738 Forward-Port-Of: odoo/enterprise#124151 Forward-Port-Of: odoo/enterprise#120821
This fix ensures Norwegian SAF-T exports use the official account grouping code when account numbers have been extended. It prevents incorrect grouping in exported general ledger data, helping businesses produce more accurate compliance reports.
Original PR description
Steps to reproduce: - change 1920 Banck account to 19204321 - go in general ledger and export to "SAF-T" Issue: The grouping code is 4321 Grouping code should match official grouping code. As a matter of fact the chart of account seems to match thos grouping account if we slice them correctly. opw-6285078 Forward-Port-Of: odoo/enterprise#122213 Forward-Port-Of: odoo/enterprise#121932
Fixed an issue in Belgian payroll where calculating seniority could fail when multiple employee contract versions were processed at once. This helps payroll teams avoid interruptions when reviewing or computing seniority-related pay details.
Original PR description
Before this commit, _compute_l10n_be_computed_seniority looped over cp200_versions but still read self.employee_id and self.l10n_be_scale_seniority, so when Odoo batched multiple CP200 versions…
Before this commit, _compute_l10n_be_computed_seniority looped over cp200_versions but still read self.employee_id and self.l10n_be_scale_seniority, so when Odoo batched multiple CP200 versions together, the whole recordset was passed to _get_first_version_date(), crashing with a singleton error.
After this commit, the loop correctly uses version.employee_id and version.l10n_be_scale_seniority instead.
Traceback (important part):
```py
File "/home/odoo/src/enterprise/l10n_be_hr_payroll/models/hr_version.py", line 1508,
in _compute_l10n_be_computed_seniority
company_seniority = relativedelta(fields.Date.today(),
self.employee_id._get_first_version_date()).years
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/addons/hr/models/hr_employee.py", line 621, in
_get_first_version_date
versions = self._get_last_consecutive_versions(date_limit)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/addons/hr/models/hr_employee.py", line 595, in
_get_last_consecutive_versions
self.ensure_one()
File "/home/odoo/src/odoo/odoo/orm/models.py", line 5406, in ensure_one
raise ValueError("Expected singleton: %s" % self)
ValueError: Expected singleton: hr.employee(30, 1)
```
task-6377630
Forward-Port-Of: odoo/enterprise#123753The Timesheet Assistant now checks whether a project allows timesheets before offering to add time entries. This prevents users from being guided into creating timesheets for projects where time tracking has been disabled, reducing confusion and incorrect entries.
Original PR description
Before this commit, the Timesheet Assistant would display the "Add" button and attempt to prefill timesheet forms for activities matched to projects where the `allow_timesheets` setting was set to `False`. This commit updates the Timesheet Assistant logic to evaluate the project's configuration. When an activity is matched to a project that has `allow_timesheets=False`: - The "Add" button is hidden from the suggestion list. - The system prevents prefilling the timesheet creation form. Task: 6306203 Forward-Port-Of: odoo/enterprise#123071 Forward-Port-Of: odoo/enterprise#120890
New employee contracts created from a template now correctly inherit the template's analytic distribution. This helps ensure payroll-related costs are allocated as intended without manual re-entry or correction.
Original PR description
Problem: When creating a new contract from a template, the analytic distribution field is not copied from the template to the contract. Steps to reproduce: 1. Create a contract template with an analytic distribution. 2. Create a new contract for an employee from the template. 3. Check the analytic distribution field on the new contract. 4. Notice how the analytic distribution field is empty, even though it was set on the template. Cause: The field is not included in the list of whitelisted fields to copy from the template. https://github.com/odoo/odoo/blob/0133e46f89df7dce8c39d2bacd29579d57a83fad/addons/hr/models/hr_version.py#L443 opw-6370781 Forward-Port-Of: odoo/enterprise#123955
A new automated test verifies that overtime is calculated correctly for employees on flexible schedules when leave is involved. This helps prevent payroll and attendance errors from reappearing in future updates.
Original PR description
For PR: https://github.com/odoo/odoo/pull/274831 This commit adds a test case to ensure that overtime is correctly calculated for the flexible employee opw-6259328,6284145 Forward-Port-Of: odoo/enterprise#124051 Forward-Port-Of: odoo/enterprise#123830
The Dutch reports module information no longer shows an outdated website link that now points to unrelated content. This prevents users from being directed to the wrong external site and keeps the module details accurate.
Original PR description
The URL leads to a website that has nothing to do with what it used to be so it needs to be removed. Task-6360682 Forward-Port-Of: odoo/enterprise#124380 Forward-Port-Of: odoo/enterprise#123019
Fixes an error that could appear when users returned from an individual budget report entry to the report list using breadcrumbs. Budget reports now use a safe default date-based order, keeping navigation smooth and preventing an unexpected RPC error.
Original PR description
Problem:
The `budget.report` model had its default sorting (`_order`) set to False. When a user navigates back to the report list view via the breadcrumbs, the web client invokes `web_read_group`, which runs `self._order.split(',')`. Because `_order` is a boolean rather than a string, this raises an AttributeError and throws an RPC_ERROR.
Solution:
Set `_order = 'date desc'` on `budget.report`. Both queries within the `_table_query` UNION ALL expose a `date` column, providing a semantically correct and safe default ordering constraint.
Steps to replicate:
- Go to Accounting > Accounting > Analytic Budgets.
- Select any budget.
- Click 'Audit' on any budget line to land on the budget report view.
- Click to open any individual record.
- Navigate back using the breadcrumbs.
- -> RPC_ERROR: AttributeError: 'bool' object has no attribute 'split'
opw-6372610
Forward-Port-Of: odoo/enterprise#124191The AI chatbox now appears above key website editor controls, including the toolbar and snippet selector. This prevents the chatbox from being hidden while editing, especially when mass mailing features are installed.
Original PR description
This PR addresses two problems relative to the AI chatbox z-index. 1. AI chatbox should appear above the toolbar, but used to appear below instead. 2. AI chatbox should appear above snippet selector dialog, but used to appear below if `mass_mailing` was installed. task-6366360 Forward-Port-Of: odoo/enterprise#123719
The test setup for Odoo Cloud Notifications now only registers devices for internal users, matching how the product works in practice. This reduces misleading test results and helps keep notification-related quality checks accurate without changing end-user functionality.
Original PR description
Only devices of internal users are registered in order to send them Odoo Cloud Notifications (OCN). However, the test setup registers devices for non-internal users as well. This commit ensures devices are only registered for internal users. Forward-Port-Of: odoo/enterprise#119956
This fix removes unintended blank lines when Uruguayan electronic invoices include both addenda text and terms and conditions. It helps prevent addenda content from being pushed onto a separate page unnecessarily, keeping invoice PDFs more compact and correctly formatted.
Original PR description
## Context When generating a CFE (Comprobante Fiscal Electrónico) that contains both a configured addenda (e.g. bank account details stored in `l10n_uy_edi_addenda_ids`) and terms & conditions from…
## Context
When generating a CFE (Comprobante Fiscal Electrónico) that contains both a configured addenda (e.g. bank account details stored in `l10n_uy_edi_addenda_ids`) and terms & conditions from the invoice's `narration` field, the resulting addenda string could end up with unnecessary blank lines between the two sections, causing the addenda to be rendered on a separate page even when the logical content fits within the 6-line threshold.
## Root Cause
`_l10n_uy_edi_get_addenda` joins both parts without stripping whitespace from either of them first, and adds two lines between addendas and terms and conditions:
addenda = addenda + "\n\n" + term_and_conditions if addenda else term_and_conditions
Two sources independently introduce extra newlines around the separator:
1. **Addenda content** — `_get_legends` returns the raw `content` field value of each addenda record. These fields commonly end with a trailing `\n`, so the addenda string already ends with a newline before the `"\n"` separator is concatenated.
2. **`html2plaintext`** — the `narration` field is stored as HTML. When converted to plain text, `html2plaintext` typically wraps paragraph content in leading/trailing newlines.
The combination of the trailing `\n` from the addenda, the explicit `"\n\n"` separator, and the leading/trailing `\n` from `html2plaintext` produces 2–3 consecutive newlines, which `splitlines()` counts as blank lines.
A realistic 4-line addenda + 1-line narration thus produces **7 lines** instead of the expected 5, crossing the 6-line threshold in `_get_report_params` and triggering `adenda=true` — which forces the addenda onto a separate page unnecessarily.
## Steps to Reproduce
1. Configure a `l10n_uy_edi.addenda` record of type `addenda` with multi-line content (4 lines)
2. Create and confirm an invoice with `narration` set to a short single-line term
3. Generate the CFE PDF via Uruware.
4. Observe that the addenda is rendered on a separate page despite the logical content being only 5 lines.
<img width="1042" height="448" alt="image" src="https://github.com/user-attachments/assets/b538211c-5f37-4648-979d-99cd75cf31c2" />
## Fix
Strip leading and trailing whitespace (including newlines) from both parts before joining them. The ternary is also replaced with an explicit `if/else` for clarity:
def _l10n_uy_edi_get_addenda(self):
addenda = self.l10n_uy_edi_document_id._get_legends("addenda", self)
if self.narration:
term_and_conditions = html2plaintext(self.narration).strip()
if addenda:
addenda = addenda.strip() + "\n" + term_and_conditions
else:
addenda = term_and_conditions
return self._l10n_uy_edi_clean_non_ascii_chars(addenda)
This guarantees exactly one `\n` separator between sections regardless of how the content fields were stored or how `html2plaintext` formatted the narration.
The threshold logic in `_get_report_params` is unchanged: addendas that genuinely exceed 6 lines (after wrapping at 140 chars) continue to be printed on a dedicated page.
Result
<img width="1117" height="456" alt="image" src="https://github.com/user-attachments/assets/3a2d942c-8c37-40f6-bc25-470c0bd25b08" />
Forward-Port-Of: odoo/enterprise#119283This fix prevents an error when opening Studio from the Working Files menu and view. Users can now access that area without being interrupted by a technical crash.
Original PR description
Open Studio while on "Working Files" menu and view. Before this commit, the python raised an error becaude at some point `record[False]` (returning the current virtual record) was put in the return values of the onchange. After this commit, there is no error. runbot-error-941248 Forward-Port-Of: odoo/enterprise#124613 Forward-Port-Of: odoo/enterprise#124239
Belgian payroll payslip reports now correctly show the Eco Vouchers line again. This prevents missing benefit information on employee payslip documents after a recent payroll change.
Original PR description
Since changing Eco vouchers to property input, the eco vouchers line on the report does not appear, this commit fixes it by calling the correct method in the template task-6370164 Forward-Port-Of: odoo/enterprise#124515 Forward-Port-Of: odoo/enterprise#123498
Managers will no longer see the Print option twice in the Planning Gantt view. This keeps the interface cleaner and reduces confusion when choosing actions.
Original PR description
Issue: - Managers see the "Print" action twice in the Gantt view: once as a standalone button and once in the Actions dropdown. Cause: - The standalone Print button is guarded on `!this.isManager`, but `isManager` lives on the model. The expression is therefore always truthy, so the button always renders. Fix: - Use `!this.model.isManager` instead. task-6364971 Forward-Port-Of: odoo/enterprise#123442
French DAS2 reporting now always formats the fiscal year end date with two digits for the month. This prevents invalid report values such as a single-digit month being combined incorrectly, helping ensure files meet the required Aspone format.
Original PR description
Aspone force the end fiscal year in zone AD to follow the format MMdd. Before this commit, fiscalyear_last_month could be only one number and so we would end up with something like '930'. We will now add :02d to format the integer with a width of 2. task-6253745 Forward-Port-Of: odoo/enterprise#123925
The Colombian electronic invoicing flow now correctly hides the reset-to-draft option for credit notes once they have been accepted by DIAN. This prevents users from changing legally accepted documents back to draft, reducing compliance risk and data inconsistencies.
Original PR description
Issue: The reset button would still appear for credit notes that were already accepted by the DIAN. Steps to reproduce: Create a credit note, confirm it and send it to DIAN. You will be able to select Reset to Draft even though it shouldn't be possible to convert to draft after accepted by DIAN. Cause: The function to compute if the reset button would appear or not was only taking into account Invoices. Solution: Added credit notes, to the function that verifies if the reset button should appear. opw-6219265 Forward-Port-Of: odoo/enterprise#123961 Forward-Port-Of: odoo/enterprise#119696
After a worksheet is signed, the Back to Shift button now uses a more prominent style. This helps field service users more easily see the next step and return to their shift workflow.
Original PR description
Apply the primary button style to the Back to Shift button after the worksheet is signed, making the next step more visible to users. Task: 6358752 Forward-Port-Of: odoo/enterprise#124469
Belgian payroll contract templates now correctly copy three previously missing fields when creating contracts. This helps ensure employee contract data is complete and avoids triggering Dimona-related actions for simulation versions.
Original PR description
Three fields were missing in the copying process from the contract template Forward-Port-Of: odoo/enterprise#124429 Forward-Port-Of: odoo/enterprise#124235