Daily updates from Odoo
Monday, June 22, 2026
184 changes
13 changes
Enhancements to existing features
This update simplifies cash basis accounting in the French localization module by automatically disabling payment reconciliation. This change ensures that cash basis accounts align with standard French accounting practices and reduces potential user confusion. It's a minor improvement focused on clarity and consistency.
Original PR description
Cash basis accounts now have payment reconciliation set as false by default task-6226984
Resolved issues and error corrections
This update prevents users from changing the status of a check if they don't have the necessary permissions. Previously, users without access to the main company of a tax unit would receive an error. Now, the status change button is disabled, ensuring data integrity and preventing incorrect status updates.
Original PR description
Before this commit: Only main company of tax unit have write access on check, so when main company is not selected and user tries to change status of check, access error is thrown. After this commit: Disable check status button if user don't have write access on check. task-5951364 Forward-Port-Of: odoo/odoo#271331
This update resolves an issue where users were unable to simultaneously edit the names of multiple projects. The fix prevents a technical error that occurred when multiple project records were updated at once. Additionally, the code was updated to ensure analytic account names are correctly updated during multi-editing.
Original PR description
Currently, an error will occur when user multi edits name of projects. Steps to replicate: - Install `project` and open projects. - From the list view select multiple projects and edit their name.…
Currently, an error will occur when user multi edits name of projects.
Steps to replicate:
- Install `project` and open projects.
- From the list view select multiple projects and edit their name.
Error:
```
File '/home/odoo/src/odoo/saas-19.3/addons/project/models/project_project.py', line 754, in write
analytic_account_to_update.write({'name': self.name})
File '/home/odoo/src/odoo/saas-19.3/odoo/orm/fields.py', line 1728, in __get__
record.ensure_one()
File '/home/odoo/src/odoo/saas-19.3/odoo/orm/models.py', line 5341, in ensure_one
raise ValueError('Expected singleton: %s' % self)
ValueError: Expected singleton: project.project(8, 9, 10)
```
Cause:
- As multiple records were changed at the moment, `self` had multiple recordsets and trying to access `self.name` [1] causes this error.
Solution:
- Avoided accessing `self.name` on a multi-recordset during multi-edit.
- Updated analytic account names using the name recieved in the vals.
For test_orm changes:
- Added these fields to the translated field write whitelist to explicitly mark this usage as supported as both the fields are translated.
- Copied `field_names` so that removing values during the test does not mutate the original whitelist.
[1]: https://github.com/odoo/odoo/blob/a69ec43f490735f639292d116b0207182c5b2581/addons/project/models/project_project.py#L608
sentry-7452096418
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#269830
Forward-Port-Of: odoo/odoo#267620This update simplifies the process of applying Early Payment Discounts (EPD) to refund transactions. Previously, a technical issue prevented proper mapping of tax repartition lines, now this change ensures accurate tracking and reconciliation of EPDs on refunds. This improves the reliability of financial reporting.
Original PR description
This commit does not bring native support for EPD on credit notes, only makes custom support a little easier and cleaner. It is quite easy to support EPD (early payment discounts) on refunds by…
This commit does not bring native support for EPD on credit notes, only makes custom support a little easier and cleaner. It is quite easy to support EPD (early payment discounts) on refunds by extending - `_early_payment_discount_move_types` - `_is_eligible_for_early_payment_discount` However, this approach breaks when it reaches `inverse_tax_rep` in `_get_invoice_counterpart_amls_for_early_payment_discount_per_payment_term_line`, which assumes tax repartition lines with `document_type == 'invoice'` and raises when called on `tax_rep` lines of 'refund' type instead. This commit fixes that by selecting source and target repartition lines according to the `tax_rep`'s document type, which ensures: - the `.index()` no longer raises a `ValueError`, as `tax_rep` is now looked up in the matching set (`refund_` for refunds, `invoice_` otherwise) - `inverse_tax_rep` returns the corresponding line in the opposite set, preserving the original invoice->refund mapping while adding the refund->invoice one Since `inverse_tax_rep` is a closure, downstream modules cannot patch it without copying the whole ~170-line method. Making it symmetric here lets custom EPD-on-refund support work without that duplication. task-[6265601](https://www.odoo.com/odoo/all-tasks/6265601) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#271102
This update fixes an issue where the 'Consolidation' filter wasn't visible on the General Ledger report, particularly in multi-company environments. The change ensures the filter appears based on report-level configurations, providing users with more flexibility in their reporting.
Original PR description
The Consolidation filter doesn't appear on the General Ledger, even in multi-company. Since `user_groupby` can also be defined on the `account.report`, this commit adapts the logic for `show_consolidation`, to fallback to the report's groupby. no-task
This update fixes an issue where appointment filters were incorrectly persisting when switching between views (Kanban to Gantt). Now, filters are cleared when changing views, ensuring users always see accurate appointment listings. This improves the overall user experience and data accuracy.
Original PR description
In this commit: - When switching from Kanban to Gantt view, the POS-specific filters `date_filter` and `hour_filter` (added by `PosAppointmentSearchFilter`) were persisting on the shared SearchModel, incorrectly hiding bookings. - Now these filters are removed when activating the Gantt view. - Clear these filters when changing views and add a tour test to cover the Kanban → Gantt navigation flow. Also extract common appointment view tour helpers for reuse. Task:6276594
This update strengthens the security of Odoo by ensuring users only have read access to data. This prevents potential issues and unexpected behavior within the system, safeguarding data integrity. It's a routine maintenance update focused on stability.
Original PR description
Ensure that the user has read access to prevent any unexpected behavior. Task-6226863 Forward-Port-Of: odoo/odoo#267709
This update resolves a test failure in the GCC POS module, ensuring accurate order receipt formatting. The changes include adjustments to rounding configurations and test steps to pass assertions related to discounts and change calculations. This improves the reliability of the GCC POS testing environment.
Original PR description
- Fixed `TestGenericGCC.test_generic_localization` which was failing because some information was not rendered on the order receipt. - Added rounding configuration to the POS config so that the assertion for `Rounding` does not fail. - Added steps for `Discount` and `Change` in `generic_localization_tour` so that the assertions for `Discount` and `Change` do not fail. Error-237988 Task-5897376 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248193
This update fixes a discrepancy in the start date of semi-monthly payrolls. Previously, payslips were incorrectly aligned with the month's halves, leading to inaccurate pay periods. The change now ensures payslips begin on the 16th of the month, accurately reflecting the employee's pay schedule.
Original PR description
Issue: ---------------------------------------- The start date of semi-monthly payslips on second half of the month is the 15 which is also the end date of the first half of the month. Steps to reproduce: ---------------------------------------- - Have an employee with a semi-monthly payroll - When in the first half of the month, create a payslip for this employee - The payslip is from 1st to 15th - Do the same when in the second half of the month - The payslip is from 15th to end of the month Cause: ---------------------------------------- In `_schedule_period_start()` we set the start date to th 15th for semi-monthly payslips. Solution: ---------------------------------------- Set it to the 16th. opw-6281556 Forward-Port-Of: odoo/enterprise#120172
This update resolves an issue where demo data installation for the Russian localization module (`l10n_in`) failed when installed without pre-existing demo data. The fix ensures that company IDs are correctly converted into the required format, allowing users to successfully load demo data through the Settings menu.
Original PR description
## Description When loading demo data from **Settings** after installing `l10n_in` without demo data, the `_install_demo` method receives company IDs instead of a `res.company` recordset. As a…
## Description When loading demo data from **Settings** after installing `l10n_in` without demo data, the `_install_demo` method receives company IDs instead of a `res.company` recordset. As a result, the following line crashes: ```python companies.filtered(...) ``` with: ```text AttributeError: 'int' object has no attribute 'filtered' ``` This PR ensures that the received company IDs are converted into a `res.company` recordset before being processed, allowing demo data to be loaded successfully from the Settings menu. ## Steps to Reproduce 1. Install `l10n_in` **without demo data**. 2. Navigate to **Settings**. 3. Click **Load Demo Data**. ## Current Behavior Demo data installation fails with: ```text AttributeError: 'int' object has no attribute 'filtered' ``` ## Expected Behavior Demo data should be installed successfully without raising any exception. ## Solution Convert the received company IDs into a `res.company` recordset when the argument passed to `_install_demo` is not already a recordset. Forward-Port-Of: odoo/odoo#270523
This update fixes an issue where changing a company's country caused errors in Time Off management. Previously, Time Off records were linked to the old country, leading to access problems. Now, the system prevents country changes unless there are no related Time Off records, ensuring smoother operations.
Original PR description
When a Time Off Type is created, it inherits the country of the current company. If there are leaves or allocations created from this Time Off Type and the company's country is then changed, various…
When a Time Off Type is created, it inherits the country of the current company. If there are leaves or allocations created from this Time Off Type and the company's country is then changed, various parts of Time Off will throw access errors as the leaves and allocations are still tied to the former country. The goal of this PR is to constrain the company country from being changed unless there are no such leaves or allocations. **Steps to Reproduce on Runbot:** 1. Ensure the current company has a `country` set, e.g. "My Company (San Fransisco)" has country set to "United States". 2. Access Time Off as Mitchell Admin. 3. Create a new Time Off Type, for simplicity's sake without a need for allocation or approval, ex: "Gone Fishing". Note this Time Off Type will have the `country` set to the company country by default. 4. Take "Gone Fishing" time off. 5. Change or set blank the company's `country` value. 6. Ensure the record rules cache is flushed. 7. Try to access Time Off. opw-6206359, opw-6140496 closes #263950 Forward-Port-Of: odoo/odoo#270270 Forward-Port-Of: odoo/odoo#263950
This update resolves an issue where saving a job page description with all content removed resulted in a 'Document is empty' validation error. The fix ensures that empty, whitespace-only HTML fields are handled correctly during saving, preventing the error and allowing users to successfully update job page descriptions. This improves the user experience and prevents data loss.
Original PR description
Steps to reproduce: =================== 1. Edit a job page. 2. Delete every `s_rating` block. 3. Save. => Validation Error: Document is empty. Cause: ====== Deleting the last snippet inside an…
Steps to reproduce: =================== 1. Edit a job page. 2. Delete every `s_rating` block. 3. Save. => Validation Error: Document is empty. Cause: ====== Deleting the last snippet inside an editable HTML field (e.g. the last `s_rating` block in the `website_rating` field of a job page) leaves the field's editable container with only whitespace text nodes. On save, it writes that whitespace to the record and then calls `_copy_custom_snippet_translations`, which does `html.fromstring(lang_value)` on the whitespace and raises `lxml.etree.ParserError: Document is empty`, re-raised as `ValidationError`. The user sees a "Validation Error" dialog and can't finish saving. The previous fix for the analogous "Document is empty" symptom on product description editing (commit [1]) added a `cleanupEmptyStructures` `on_removed_handlers` that strips whitespace from `.oe_empty` containers after element removal. That selector covers `oe_structure.oe_empty` containers but not editable HTML field savables (`[data-oe-type="html"]`), which don't carry an `oe_empty` class when they originally had content. As a result, fields like `hr.job.website_rating` still hit the failing parse path. Solution: ========= Extend the cleanup selector to also include `[data-oe-type="html"]` so HTML-field editables are normalized to genuinely empty after the last inner snippet is removed. [1]: https://github.com/odoo/odoo/commit/53d5cc7eed635f64038bf0315f6863011879c529 opw-6244892 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#270466 Forward-Port-Of: odoo/odoo#267397
Documentation and clarification updates
This pull request formally records Adrien Didot's signature on the Odoo Individual Contributor License Agreement. It adds documentation confirming the CLA signing, ensuring compliance with Odoo's licensing terms. This update is a standard legal step for contributors to the Odoo project.
Original PR description
Individual Contributor License Agreement signature. Adds `doc/cla/individual/adridot.md` per the CLA signing instructions. Related contribution: #270196 Forward-Port-Of: odoo/odoo#270411 Forward-Port-Of: odoo/odoo#270197
23 changes
Enhancements to existing features
This update standardizes the font style for customer notes in the Point of Sale system to align with the appearance of line customer notes. This enhances visual consistency and improves the overall user experience for customers and staff.
Original PR description
We updated the general customer note font to match the line customer note's one. task-6294200
Resolved issues and error corrections
This update corrects a bug where custom styling of text inputs within Odoo wasn't working correctly. The previous version prevented users from applying their own styles to text inputs. This change ensures that styling options passed to text inputs now function as intended, providing greater flexibility in design.
Original PR description
BuilderTextInput's template hardcoded `inputClasses` to 'o-hb-input-text', dropping any `inputClasses` prop passed by callers. As a result, options trying to style their text input had no effect. Introduced in 0aba7f383c86dec00e9fc6d324a5bfdec7a19707. Concatenate caller-supplied `inputClasses` with the default `o-hb-input-text`. Forward-Port-Of: odoo/odoo#265156
This update corrects an issue where the link editor unexpectedly appeared when creating new tracked links. The fix ensures the editor only opens when a user actively wants to modify a link, preventing confusion and improving the user experience. This resolves a minor bug that could have caused frustration for users.
Original PR description
Steps to reproduce: - Go to the Link Tracker page - Generate a first tracked link - Click on the button to start editing the code - Click on "create another tracker" - Generate a second tracked link => When you access the screen to see/edit the tracked link url, the buttons "ok" and "cancel" are already present. Clicking on "ok" display a traceback. To fix this issue, this commit also cancels edition when clicking on "create another tracker". task-4531974 Forward-Port-Of: odoo/odoo#269886 Forward-Port-Of: odoo/odoo#268573
This update fixes an issue where the chatter in Odoo POS incorrectly displayed the employee who made changes to tracked orders. Now, the chatter accurately reflects the employee currently interacting with the order, ensuring accurate order tracking and communication. This improves order management and reduces potential confusion.
Original PR description
**Steps to reproduce:** - Enable "Track orders edits" in the settings - Enable "Log in with Employees" - Go to the Restaurant, log in with employee A - Go to a table, order 3 Sushis - Go back to the…
**Steps to reproduce:** - Enable "Track orders edits" in the settings - Enable "Log in with Employees" - Go to the Restaurant, log in with employee A - Go to a table, order 3 Sushis - Go back to the floor plan and change to employee B - Go back to the table and change the qty of 3 Sushis to 2 Sushis - Go to the order in the backend and check the chatter - It will indicate that employee A did the change, but it was employee B **Why the fix:** We always used the cashier set on the order to determine who should be put in the chatter, regardless of who is actually connected at that point. We now use the session's current employee to write who did the change in the chatter. We do not change the order's employee, because it will be done once the order has been paid. In the case where we are not logged in but pos_hr is installed, the employee_id might be the id of a res.user, and browsing it might return the wrong value. To avoid this, we check if the value exists as a hr.employee before assigning the name. The way we return the value has been changed because the linter wasn't happy about it. opw-6213504 Forward-Port-Of: odoo/odoo#270416 Forward-Port-Of: odoo/odoo#265582
This update fixes a visual issue in the spreadsheet dashboard where focused buttons were obscured by the surrounding container. The change ensures that buttons have their expected focus shadows, creating a cleaner and more professional user experience. This improves usability and overall appearance.
Original PR description
the searchbar container cropped the shadow of its button when they were focused. Task-6303342 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 Forward-Port-Of: odoo/odoo#270812
This update fixes a visual issue where the field selection popover overlapped with the dropdown in the HTML editor. By adjusting the z-index, the dropdown now correctly appears in front of the popover, providing a smoother and more intuitive user experience when selecting fields. This ensures consistent functionality for creating and editing content.
Original PR description
a4efb745e9f4ba24dfa01f1e17e65f1a7cac90a5 merged the web_studio dynamic field and the mass_mailing dynamic field into a single field selector, included from the HTML editor. This introduces a new flow…
a4efb745e9f4ba24dfa01f1e17e65f1a7cac90a5 merged the web_studio dynamic field and the mass_mailing dynamic field into a single field selector, included from the HTML editor. This introduces a new flow where the user has to first "activate" the field selector popover ( /field ), which appears as an overlay item; then open the ModelFieldSelector dropdown to select a field on its model, which appears as another overlay item. As both overlay items overlap, and they have the same "z-index" property, the last sibling in the overlay container appears first. In mass_mailing, the ModelFieldSelector selector dropdown's overlay item is introduced as the first child of that container; this results in the dropdown appearing behind the item through which it was opened. Fix: Overlay items holding a Dynamic Field Popover have their z-index property reduced by 1, ensuring they appear behind their ModelFieldSelectors at all times. Steps to reproduce: - Create a new mailing - Add in any text node - Type in /field - Press Enter - Click the [-] to select a field task-5477951
This update fixes a potential issue causing unpredictable behavior in the website's dynamic content rendering. By adding 'protection' to the snippet's callback, the system now handles changes more reliably, preventing unexpected errors. This ensures a smoother and more consistent user experience on the website.
Original PR description
Commit dcb070244dbcef59cae1e3b1e87ce9030608ce0d changed the registration of callback for re-render of dynamic snippet on window resize. But did not ensure the callback is "protected", like it was implicitely done with `t-on-` in `dynamicContent`. This commit uses `protectSyncAfterAsync` to register the callback, so that is it protected when called again. This lack of "protection" is suspected to cause a non-deterministic failure in `test_shop_editor_no_alternative_products_visibility` where mutations of dom are observed at unexpected times. runbot-939193 Forward-Port-Of: odoo/odoo#271011
This update prevents users from being added to member history when joining an already finished live chat through an invite link. This ensures that chat statistics are accurate and consistent with the latest Odoo version (19.3). It's a technical adjustment to improve data reliability.
Original PR description
Avoid adding users to member history when joining an already ended live chat via an invite link. This prevents skewed chat statistics and aligns behavior with 19.3. partial backported PR: [odoo/pull/224920/](https://github.com/odoo/odoo/pull/224920) task-6317650 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a bug that previously prevented the system from correctly calculating bill addresses when address fields were empty. Now, empty address fields are automatically set to blank strings, ensuring accurate billing information is processed. This improves the reliability of payment authorization transactions.
Original PR description
Fix bug introduced by commit https://github.com/odoo/odoo/pull/267592/changes/c4556637e8eeef07ce6e3cc3b3b4cf28fa10e468 that caused an error if an address field was not set, due to trying to cut a False field. Now, unset fields are set to empty strings. Forward-Port-Of: odoo/odoo#270295
This update corrects a visual issue where product images in the grid layout didn't appear in the expected left-to-right order. The change ensures that image navigation within the product image viewer now accurately reflects the visual arrangement of images, improving the user experience.
Original PR description
This commit ensures product images follow their visual order in the product image viewer when using the grid layout. Steps to reproduce: - Open a product page with multiple images (or add Extra Media…
This commit ensures product images follow their visual order in the product image viewer when using the grid layout. Steps to reproduce: - Open a product page with multiple images (or add Extra Media to the product) - Change layout mode to "Grid" and click save - Click any image to open the product image viewer - Navigate between images Images do not follow the visual left-to-right order. This regression was introduced by [commit], which replaced the row-based grid with a column-first layout. As a result, `querySelectorAll` returns images in DOM order, which no longer matches the visual order. To fix this, images are now reordered based on their visual placement in the grid so navigation matches the order seen by the user. Images are traversed in visual left-to-right order while also accounting for varying image heights and multi-column alignment. [commit]: https://github.com/odoo/odoo/commit/9a3628b9735550bf8ecc2252ea1b7338f68ab966 task-[4364143](https://www.odoo.com/odoo/project/974/tasks/4364143) Forward-Port-Of: odoo/odoo#270732 Forward-Port-Of: odoo/odoo#254077
This update fixes an issue where appointment invitations weren't always sent when appointments were in statuses other than 'booked' or 'request'. The change ensures that invitations are consistently sent for appointments, improving the user experience and preventing missed meeting notifications. This was originally identified and addressed in a related enterprise PR.
Original PR description
This PR adapts the code to fix the invitations at the appointments' update. See the enterprise PR to get more information about the issues. Enterprise PR: https://github.com/odoo/enterprise/pull/114304 Task-6139036 Forward-Port-Of: odoo/odoo#270925 Forward-Port-Of: odoo/odoo#260073
This update fixes an issue where the table of contents would obscure headings when the status bar was made sticky. The change adjusts how the table of contents scrolls to ensure headings remain visible, improving the user experience when navigating long documents.
Original PR description
Since [1] when the `o_form_statusbar` status bar was made `sticky` the table of content scrolls to a given heading without taking it into account. Because of this, when scrolling upwards the heading ends up behind the status bar. This commit fixes this by finding top-aligned sticky elements within the closest scrollable element impacted by the table of content. Steps to reproduce: - Go to a To do note - Define some headings - Have sufficient content so that reaching a heading requires scrolling - Define a table of content with `/toc` - Click on a heading => The heading ended up behind the status bar. [1]: https://github.com/odoo/odoo/commit/a3c63413825cf3492a10ade77a2c571c4eeb33a6 task-6302762 Forward-Port-Of: odoo/odoo#270043
This update fixes an issue where comment counts on course slides weren't accurately reflecting the number of active comments. The change adjusts how comments are tracked due to recent portal chatter updates, ensuring the displayed count matches the actual number of comments. This improves the user experience for course reviews.
Original PR description
Steps to reproduce: - Open a slide of a course in non fullscreen mode (website). - Go to the comments tab and add a comment in the chatter. - The comments count does not change in the tab. - The same thing happens when a comment is deleted. - Another way to see the incorrect counter is to add a note in the slide form view (backend). Before this change, `website_slides` used `website_message_ids` to calculate the comments. Since #138233 the old portal chatter has been replaced with the mail chatter and the way messages are displayed on the portal has changed. For example notes are no longer considered portal messages and also deleted messages should not be displayed or counted as such. This change ensures that comments calculations are based on a domain that considers those changes meaning that comments will be synced with the actual number of available comments. Forward-Port-Of: odoo/odoo#270800 Forward-Port-Of: odoo/odoo#260376
This update resolves a bug preventing Avatax exemption code synchronization. The issue stemmed from AvaTax returning '*' to indicate all countries, which was incorrectly interpreted as 'False' by the system. This fix ensures correct country ID handling, allowing successful synchronization and improved functionality.
Original PR description
Steps to reproduce: - Create a US company - Go to Accounting > Configuration > Settings - Activate `Avatax` > Set Credentials - Try to "Sync Parameters" Traceback: ```py File…
Steps to reproduce:
- Create a US company
- Go to Accounting > Configuration > Settings
- Activate `Avatax` > Set Credentials
- Try to "Sync Parameters"
Traceback:
```py
File "/home/odoo/src/enterprise/saas-19.2/account_avatax/models/res_company.py", line 113, in avatax_sync_company_params
'valid_country_ids': [(6, 0, get_countries(vals['validCountries']).ids)],
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/enterprise/saas-19.2/account_avatax/models/res_company.py", line 90, in get_countries
return self.env['res.country'].browse([country_cache[code] for code in code_list])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/saas-19.2/odoo/orm/models.py", line 5208, in browse
assert all(ids) or all(isinstance(x, NewId) or x for x in ids), "Invalid falsy real id"
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: Invalid falsy real id
```
The issue occurs because AvaTax return `*` in the `validCountries` field to indicate that an exemption code is valid for all countries. The synchronization logic stores this value in the country cache as `False` and later passes it to `res.country.browse()`. Since `browse()` does not accept a mix of valid IDs and falsy values, the operation crashes during the synchronization process.
This commit filter out falsy country IDs when resolving country codes to prevent crashes and allow exemption codes to be synchronized successfully.
opw-6298189
Forward-Port-Of: odoo/enterprise#120845This update prevents users from changing the status of checks when they don't have the necessary permissions. Previously, attempting to modify a check without selecting the main company would result in an error. Now, the status change button is disabled, ensuring data integrity and preventing unintended actions.
Original PR description
Before this commit: Only main company of tax unit have write access on check, so when main company is not selected and user tries to change status of check, access error is thrown. After this commit: Disable check status button if user don't have write access on check. task-5951364 Forward-Port-Of: odoo/odoo#271330
This update resolves a problem where users were incorrectly denied access to WhatsApp templates within the Event module. The fix prevents users from creating new WhatsApp templates, which was causing the 'User does not have access' error. This ensures proper WhatsApp communication functionality.
Original PR description
Issue: 1) User goes to Event.event Form -> communication tab -> add line 2) Select whatsapp -> type something -> create and edit -> create new template with any model event.registration -> save ( all the way including the event form) 3) reload page -> whatsapp event.mail displays "User does not have access to this record". Fix: add "'no_create_edit': True" to the associated field in the xml to block creation of new mail.templates opw-6037488 Forward-Port-Of: odoo/odoo#268641 Forward-Port-Of: odoo/odoo#259683
This update resolves an issue where loading demo data after installing the `l10n_in` module without pre-existing demo data would fail. The fix ensures that company IDs are correctly converted into a usable recordset, allowing users to successfully load demo data from the Settings menu. This improves the user experience and ensures consistent demo data setup.
Original PR description
## Description When loading demo data from **Settings** after installing `l10n_in` without demo data, the `_install_demo` method receives company IDs instead of a `res.company` recordset. As a…
## Description When loading demo data from **Settings** after installing `l10n_in` without demo data, the `_install_demo` method receives company IDs instead of a `res.company` recordset. As a result, the following line crashes: ```python companies.filtered(...) ``` with: ```text AttributeError: 'int' object has no attribute 'filtered' ``` This PR ensures that the received company IDs are converted into a `res.company` recordset before being processed, allowing demo data to be loaded successfully from the Settings menu. ## Steps to Reproduce 1. Install `l10n_in` **without demo data**. 2. Navigate to **Settings**. 3. Click **Load Demo Data**. ## Current Behavior Demo data installation fails with: ```text AttributeError: 'int' object has no attribute 'filtered' ``` ## Expected Behavior Demo data should be installed successfully without raising any exception. ## Solution Convert the received company IDs into a `res.company` recordset when the argument passed to `_install_demo` is not already a recordset. Forward-Port-Of: odoo/odoo#270523
This update resolves an issue where saving a job page description with only whitespace resulted in a validation error. The fix ensures that empty HTML fields are handled correctly during saving, preventing the 'Document is empty' error and allowing users to successfully update their job postings. This improves the user experience and prevents data loss.
Original PR description
Steps to reproduce: =================== 1. Edit a job page. 2. Delete every `s_rating` block. 3. Save. => Validation Error: Document is empty. Cause: ====== Deleting the last snippet inside an…
Steps to reproduce: =================== 1. Edit a job page. 2. Delete every `s_rating` block. 3. Save. => Validation Error: Document is empty. Cause: ====== Deleting the last snippet inside an editable HTML field (e.g. the last `s_rating` block in the `website_rating` field of a job page) leaves the field's editable container with only whitespace text nodes. On save, it writes that whitespace to the record and then calls `_copy_custom_snippet_translations`, which does `html.fromstring(lang_value)` on the whitespace and raises `lxml.etree.ParserError: Document is empty`, re-raised as `ValidationError`. The user sees a "Validation Error" dialog and can't finish saving. The previous fix for the analogous "Document is empty" symptom on product description editing (commit [1]) added a `cleanupEmptyStructures` `on_removed_handlers` that strips whitespace from `.oe_empty` containers after element removal. That selector covers `oe_structure.oe_empty` containers but not editable HTML field savables (`[data-oe-type="html"]`), which don't carry an `oe_empty` class when they originally had content. As a result, fields like `hr.job.website_rating` still hit the failing parse path. Solution: ========= Extend the cleanup selector to also include `[data-oe-type="html"]` so HTML-field editables are normalized to genuinely empty after the last inner snippet is removed. [1]: https://github.com/odoo/odoo/commit/53d5cc7eed635f64038bf0315f6863011879c529 opw-6244892 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#270466 Forward-Port-Of: odoo/odoo#267397
This update corrects an issue where the FEC export file generated for French companies sometimes contained empty lines with zero balances. This prevented accurate financial reporting and data exchange with tax authorities. The fix ensures all accounts have a valid balance when exporting, improving data reliability.
Original PR description
Steps to reproduce: - Use a French company (l10n_fr_account installed) - Post prior-year entries so that an account/partner nets to zero at the start of the next fiscal year (e.g. a customer invoice fully paid the same year, or a misc entry debiting and crediting the same balance-sheet account), and keep another account/partner with a non-zero opening - Open the FEC export wizard, set Start Date to the first day of the next year - Generate the FEC file and look at the "Balance initiale" (OUVERTURE) lines Issue: One of the exported line in as empty one with `...|0,00|0,00|..`` opw-6083991 Forward-Port-Of: odoo/odoo#270658 Forward-Port-Of: odoo/odoo#268510
This update fixes a minor UX issue where the spreadsheet filter dropdown remained open even when the selected filter value hadn't changed. The fix ensures the dropdown automatically closes after the filter button is clicked, providing a more consistent and intuitive user experience. This improves usability and reduces potential confusion for users.
Original PR description
Current behavior before PR: - In b4d5d1f, added early return when filter value is unchanged. - However, the dropdown was not closed in this case, leaving it open after clicking the filter button, resulting in inconsistent and unexpected UX. Desired behavior after PR is merged: - Ensure the dropdown is closed even when the filter value remains unchanged, restoring consistent and expected behavior. Task: [6304213](https://www.odoo.com/odoo/project/2328/tasks/6304213) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#270225
This update fixes an issue where the total invoice amount was not being displayed correctly in the order view. The change reintroduces a key field, ensuring accurate invoice amounts are shown to users. This improves clarity and accuracy in sales reporting.
Original PR description
This is a backport of 953e92b8bd79a39042c78ca7183ae73f90906c1e. `amount_to_invoice` is a technical field only used to trigger the credit limit warning on invoices/SOs and is not supposed to be shown in views. 6feba7b018e15738be145ce48be9761481e9e11a opw-6271335 Forward-Port-Of: odoo/odoo#270250
This update fixes an issue where clicking on an employee's avatar in the Discuss section displayed outdated information from archived records. The fix ensures that the correct, current employee details are shown, resolving a display inconsistency. This improves the user experience when accessing employee information.
Original PR description
*: hr_holidays,test_discuss_full **Steps to reproduce,** Create an employee linked to a user Archive the employee and remove the link to the user Create another employee for the same user Go to…
*: hr_holidays,test_discuss_full **Steps to reproduce,** Create an employee linked to a user Archive the employee and remove the link to the user Create another employee for the same user Go to Discuss > 'General' channel Open the member list and click on the user's avatar **Before this commit,** Clicking on the avatar opened a popover showing outdated information from the archived employee record instead of the new one. **Cause,** By default, the server sends employee data ordered by name. Since both records have the same name, the order is non-deterministic. The client then attempts to match the employee's company to the current user's company, falling back to the first record in the list if no match is found. **Fix,** Filter out archived records first (treating them as non-existent). Then, sort the remaining employee records to prioritize those that match the current user's active company. In case records share the same company, prioritize employees with a related user. Fall back to descending order of creation for identical results. **After this commit,** Clicking on the avatar shows the correct employee details in the popover. task-6175765 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#270169 Forward-Port-Of: odoo/odoo#252170
Documentation and clarification updates
This pull request formally records Adrien Didot's signature on the Odoo Individual Contributor License Agreement. It adds documentation confirming the CLA signing, ensuring compliance with Odoo's licensing terms. This update is a standard legal step for contributors.
Original PR description
Individual Contributor License Agreement signature. Adds `doc/cla/individual/adridot.md` per the CLA signing instructions. Related contribution: #270196 Forward-Port-Of: odoo/odoo#270411 Forward-Port-Of: odoo/odoo#270197
14 changes
Resolved issues and error corrections
This update resolves an error that occurred when syncing AvaTax exemption codes. The issue stemmed from a mismatch in how AvaTax represented 'all countries' values, causing a crash during synchronization. This fix ensures correct data handling and successful exemption code synchronization.
Original PR description
Steps to reproduce: - Create a US company - Go to Accounting > Configuration > Settings - Activate `Avatax` > Set Credentials - Try to "Sync Parameters" Traceback: ```py File…
Steps to reproduce:
- Create a US company
- Go to Accounting > Configuration > Settings
- Activate `Avatax` > Set Credentials
- Try to "Sync Parameters"
Traceback:
```py
File "/home/odoo/src/enterprise/saas-19.2/account_avatax/models/res_company.py", line 113, in avatax_sync_company_params
'valid_country_ids': [(6, 0, get_countries(vals['validCountries']).ids)],
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/enterprise/saas-19.2/account_avatax/models/res_company.py", line 90, in get_countries
return self.env['res.country'].browse([country_cache[code] for code in code_list])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/saas-19.2/odoo/orm/models.py", line 5208, in browse
assert all(ids) or all(isinstance(x, NewId) or x for x in ids), "Invalid falsy real id"
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: Invalid falsy real id
```
The issue occurs because AvaTax return `*` in the `validCountries` field to indicate that an exemption code is valid for all countries. The synchronization logic stores this value in the country cache as `False` and later passes it to `res.country.browse()`. Since `browse()` does not accept a mix of valid IDs and falsy values, the operation crashes during the synchronization process.
This commit filter out falsy country IDs when resolving country codes to prevent crashes and allow exemption codes to be synchronized successfully.
opw-6298189The Odoo team has partially reverted a recent code update due to unexpected changes introduced by Weblate. This ensures the translation updates made during the Weblate integration are preserved while correcting the unwanted code modifications. This resolves a technical issue impacting multiple modules.
Original PR description
For some reason Weblate reverted some code changes apart from the translations updates it did. We partially revert the commit here to fix the code, but keep the translation updates. This partially reverts commit 06c83da5410fd3869af0d9c3edddf9cc1a7d7c55.
This update resolves an issue where users couldn't link bank statement lines to child contacts when using the 'Set Partner' button. The fix aligns the system's logic to correctly recognize and select child contacts, ensuring accurate bank statement reconciliation. This improves the usability of the bank reconciliation process.
Original PR description
When creating a bank statement line, we can not set an individual contact that is a children of a company contact. However, when clicking on the 'Set Partner' button, all contacts are shown in the modal list view. This commit aligns the domain coming from the 'Set Partner' button with the domain from the 'partner_id' field of the auto reconcile wizard Steps: - Have a contact X, with a child contact Y - Create and confirm an invoice for contact Y, amount 1000 - Create a bank statement line for 1000 -> You can not select Y, only X - Click 'Add & Close' - Click on 'Set Partner' button -> Y is displayed opw-6205154 Forward-Port-Of: odoo/enterprise#118036
This update resolves an issue where sign templates with auto-filled fields would incorrectly display placeholders instead of the actual values, or fail to generate documents. The fix ensures falsy values from auto-fields are properly handled, preventing errors and guaranteeing accurate sign document generation.
Original PR description
Version: - 19.0 Steps to reproduce: - Create a sign template with a readonly sign item linked to an auto field. - Use a reference record where the linked field value is empty or False. - Send the…
Version: - 19.0 Steps to reproduce: - Create a sign template with a readonly sign item linked to an auto field. - Use a reference record where the linked field value is empty or False. - Send the document for signing. - Complete the signing flow. Issue: - Readonly sign items linked to auto-filled values could not properly handle falsy values. Empty values could trigger the error "Some required items are not filled" and completed sign requests displayed the sign item placeholder instead of the actual auto-filled value. - completed document generation could fail when rendering falsy values for textarea sign items. Cause: - Falsy auto-filled values were ignored during constant item population and replaced by the sign item placeholder. Additionally, readonly constant items were included in required field validation and completed sign requests continued to display placeholders when the stored value was empty. - document rendering assumed sign item values were always strings for textarea sign items but when auto field is empty it value can be False. Fix: - Preserve falsy values when populating readonly constant items, exclude constant items from signer validation, and hide placeholders for empty auto-filled constant items when displaying completed sign requests. - Normalize falsy values to prevent crashes and allow completed documents to be generated correctly. Forward-Port-Of: odoo/enterprise#121009
This update fixes a potential instability issue with dynamic website content snippets. The change ensures callbacks are properly protected during re-renders, preventing unexpected behavior and test failures. This improves the reliability of the website experience.
Original PR description
Commit dcb070244dbcef59cae1e3b1e87ce9030608ce0d changed the registration of callback for re-render of dynamic snippet on window resize. But did not ensure the callback is "protected", like it was implicitely done with `t-on-` in `dynamicContent`. This commit uses `protectSyncAfterAsync` to register the callback, so that is it protected when called again. This lack of "protection" is suspected to cause a non-deterministic failure in `test_shop_editor_no_alternative_products_visibility` where mutations of dom are observed at unexpected times. runbot-939193 Forward-Port-Of: odoo/odoo#271011
This update corrects a bug where custom styling of text input fields within Odoo wasn't working correctly. The previous version ignored styling instructions passed from the user. Now, styling options are properly applied, ensuring consistent and customizable text input appearances.
Original PR description
BuilderTextInput's template hardcoded `inputClasses` to 'o-hb-input-text', dropping any `inputClasses` prop passed by callers. As a result, options trying to style their text input had no effect. Introduced in 0aba7f383c86dec00e9fc6d324a5bfdec7a19707. Concatenate caller-supplied `inputClasses` with the default `o-hb-input-text`. Forward-Port-Of: odoo/odoo#265156
This update fixes an issue where the number of comments on course slides wasn't accurately displayed. Previously, the system incorrectly counted messages due to changes in how the portal chatter system works. This change ensures the comment counts now reflect the actual number of active comments, improving the user experience.
Original PR description
Steps to reproduce: - Open a slide of a course in non fullscreen mode (website). - Go to the comments tab and add a comment in the chatter. - The comments count does not change in the tab. - The same thing happens when a comment is deleted. - Another way to see the incorrect counter is to add a note in the slide form view (backend). Before this change, `website_slides` used `website_message_ids` to calculate the comments. Since #138233 the old portal chatter has been replaced with the mail chatter and the way messages are displayed on the portal has changed. For example notes are no longer considered portal messages and also deleted messages should not be displayed or counted as such. This change ensures that comments calculations are based on a domain that considers those changes meaning that comments will be synced with the actual number of available comments. Forward-Port-Of: odoo/odoo#270800 Forward-Port-Of: odoo/odoo#260376
This update simplifies the process of applying Early Payment Discounts (EPD) to refund transactions. Previously, a technical issue prevented correct mapping of tax repartition lines, now fixed by ensuring the system correctly identifies invoice and refund types. This enhancement improves the reliability of EPD calculations for refunds.
Original PR description
This commit does not bring native support for EPD on credit notes, only makes custom support a little easier and cleaner. It is quite easy to support EPD (early payment discounts) on refunds by…
This commit does not bring native support for EPD on credit notes, only makes custom support a little easier and cleaner. It is quite easy to support EPD (early payment discounts) on refunds by extending - `_early_payment_discount_move_types` - `_is_eligible_for_early_payment_discount` However, this approach breaks when it reaches `inverse_tax_rep` in `_get_invoice_counterpart_amls_for_early_payment_discount_per_payment_term_line`, which assumes tax repartition lines with `document_type == 'invoice'` and raises when called on `tax_rep` lines of 'refund' type instead. This commit fixes that by selecting source and target repartition lines according to the `tax_rep`'s document type, which ensures: - the `.index()` no longer raises a `ValueError`, as `tax_rep` is now looked up in the matching set (`refund_` for refunds, `invoice_` otherwise) - `inverse_tax_rep` returns the corresponding line in the opposite set, preserving the original invoice->refund mapping while adding the refund->invoice one Since `inverse_tax_rep` is a closure, downstream modules cannot patch it without copying the whole ~170-line method. Making it symmetric here lets custom EPD-on-refund support work without that duplication. task-[6265601](https://www.odoo.com/odoo/all-tasks/6265601) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#271102
This update resolves a bug that previously caused errors when address fields were missing in payment authorization requests. Now, missing address fields are automatically set to empty strings, ensuring the system functions correctly and avoids disruptions to payment processing. This improves the reliability of the payment authorization module.
Original PR description
Fix bug introduced by commit https://github.com/odoo/odoo/pull/267592/changes/c4556637e8eeef07ce6e3cc3b3b4cf28fa10e468 that caused an error if an address field was not set, due to trying to cut a False field. Now, unset fields are set to empty strings. Forward-Port-Of: odoo/odoo#270295
This update fixes an issue where the table of contents would obscure headings when the status bar was sticky. The change ensures headings remain visible by intelligently accounting for sticky elements during scrolling within the table of contents, improving usability.
Original PR description
Since [1] when the `o_form_statusbar` status bar was made `sticky` the table of content scrolls to a given heading without taking it into account. Because of this, when scrolling upwards the heading ends up behind the status bar. This commit fixes this by finding top-aligned sticky elements within the closest scrollable element impacted by the table of content. Steps to reproduce: - Go to a To do note - Define some headings - Have sufficient content so that reaching a heading requires scrolling - Define a table of content with `/toc` - Click on a heading => The heading ended up behind the status bar. [1]: https://github.com/odoo/odoo/commit/a3c63413825cf3492a10ade77a2c571c4eeb33a6 task-6302762 Forward-Port-Of: odoo/odoo#270043
This update fixes an issue where the sandwich rule incorrectly excluded public holidays from leave calculations. Now, when 'Include Public Holidays as Working Day' is enabled, the system accurately determines leave duration, including weekend days that fall on holidays. A new test case ensures this fix functions as expected.
Original PR description
Problem: When a time off type is configured with "Include Public Holidays as Working Day", the sandwich rule was still treating public holidays as non-working days. This caused the sandwiched weekend days to not be included in the leave duration. Example: Employee applies leave from May 15 (Friday, Public Holiday) to May 18 (Monday). Expected duration is 4 days since May 15 is a working day and May 16-17 (weekend) should be sandwiched. Instead, only 1 day was calculated. Fix: Now when "Include Public Holidays as Working Day" is enabled, the correct number of days are calculated in the sandwich rule. Also added a test case to verify that public holidays are correctly treated as working days during sandwich rule evaluation. Task-4570118 Forward-Port-Of: odoo/odoo#270254 Forward-Port-Of: odoo/odoo#266624
A recent issue prevented users from creating WhatsApp event templates, resulting in an 'access denied' error. This fix restricts the creation of new WhatsApp templates, ensuring users can only manage existing ones. This resolves a bug impacting event communication workflows.
Original PR description
Issue: 1) User goes to Event.event Form -> communication tab -> add line 2) Select whatsapp -> type something -> create and edit -> create new template with any model event.registration -> save ( all the way including the event form) 3) reload page -> whatsapp event.mail displays "User does not have access to this record". Fix: add "'no_create_edit': True" to the associated field in the xml to block creation of new mail.templates opw-6037488 Forward-Port-Of: odoo/odoo#268641 Forward-Port-Of: odoo/odoo#259683
This update fixes an issue where the spreadsheet filter dropdown remained open even when the selected filter value didn't change. The change ensures the dropdown automatically closes after a filter selection, providing a more consistent and user-friendly experience. This improves usability and reduces confusion for users.
Original PR description
Current behavior before PR: - In b4d5d1f, added early return when filter value is unchanged. - However, the dropdown was not closed in this case, leaving it open after clicking the filter button, resulting in inconsistent and unexpected UX. Desired behavior after PR is merged: - Ensure the dropdown is closed even when the filter value remains unchanged, restoring consistent and expected behavior. Task: [6304213](https://www.odoo.com/odoo/project/2328/tasks/6304213) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#270225
Documentation and clarification updates
This pull request formally records Adrien Didot's (Adridot) signature on the Odoo Individual Contributor License Agreement. Adding the associated documentation ensures compliance with Odoo's licensing terms. This update supports Adrien Didot's contribution to the Odoo project.
Original PR description
Individual Contributor License Agreement signature. Adds `doc/cla/individual/adridot.md` per the CLA signing instructions. Related contribution: #270196 Forward-Port-Of: odoo/odoo#270411 Forward-Port-Of: odoo/odoo#270197
5 changes
Resolved issues and error corrections
This update resolves a bug that previously prevented the system from correctly calculating bill addresses when address fields were empty. The fix ensures that empty address fields are now handled gracefully, preventing errors and improving the reliability of payment authorization processes. This change ensures accurate billing information is consistently processed.
Original PR description
Fix bug introduced by commit https://github.com/odoo/odoo/pull/267592/changes/c4556637e8eeef07ce6e3cc3b3b4cf28fa10e468 that caused an error if an address field was not set, due to trying to cut a False field. Now, unset fields are set to empty strings. Forward-Port-Of: odoo/odoo#270295
This update resolves an issue where the table of contents would obscure headings when the status bar was made sticky. The fix ensures headings remain visible by intelligently accounting for sticky elements during scrolling within the table of contents, improving usability.
Original PR description
Since [1] when the `o_form_statusbar` status bar was made `sticky` the table of content scrolls to a given heading without taking it into account. Because of this, when scrolling upwards the heading ends up behind the status bar. This commit fixes this by finding top-aligned sticky elements within the closest scrollable element impacted by the table of content. Steps to reproduce: - Go to a To do note - Define some headings - Have sufficient content so that reaching a heading requires scrolling - Define a table of content with `/toc` - Click on a heading => The heading ended up behind the status bar. [1]: https://github.com/odoo/odoo/commit/a3c63413825cf3492a10ade77a2c571c4eeb33a6 task-6302762 Forward-Port-Of: odoo/odoo#270043
This update removes a redundant step in a test related to bank account matching. Previously, the test required manually unlinking a bank account to prevent incorrect partner identification. Now that the system correctly identifies partners using VAT numbers, this step is no longer needed, streamlining the testing process.
Original PR description
Since `saas-18.3`, the partner is correctly found using the VAT number, so the test no longer needs to remove `partner_1`'s bank account to avoid a wrong match. Remove the unnecessary `self.partner_1.bank_ids.unlink()` from `test_xml_ubl_au.py`.
This update resolves a technical issue that caused the restaurant order tour to fail intermittently. The fix ensures the system waits for order processing to complete before proceeding, preventing duplicate requests and improving the reliability of the tour. This enhances the user experience for restaurant order setup.
Original PR description
The tour could fail because `sendOrderInPreparationUpdateLastChange` is asynchronous when sending the order to the kitchen. The test was continuing to the next steps before the request was fully resolved, which could lead to sending the order again while the previous call was still in progress. This commit updates the tour to explicitly wait for the async call to complete before continuing, by adding a delay step after clicking the order button. This prevents race conditions during the test. --- Runbot Error: https://runbot.odoo.com/odoo/runbot.build.error/181846 Forward-Port-Of: odoo/enterprise#120910 Forward-Port-Of: odoo/enterprise#110909
Documentation and clarification updates
This pull request formally records Adrien Didot's signature on the Odoo Individual Contributor License Agreement. It adds documentation confirming the CLA signing, ensuring compliance with Odoo's licensing terms. This update is a standard legal step for contributions to the Odoo project.
Original PR description
Individual Contributor License Agreement signature. Adds `doc/cla/individual/adridot.md` per the CLA signing instructions. Related contribution: #270196 Forward-Port-Of: odoo/odoo#270411 Forward-Port-Of: odoo/odoo#270197
2 changes
Resolved issues and error corrections
This update corrects a display issue in the list autofill feature of the Enterprise edition. Previously, a loading error was shown in tooltips when lists weren't immediately ready. Now, tooltips display the correct information, ensuring a smoother user experience when lists are loading.
Original PR description
The getter `getTooltipListFormula` would return the result of `getListHeaderValue` as the content of the tooltip, but this returned a loading error instead of a string if the list was not ready yet. Task: [6289944](https://www.odoo.com/web#id=6289944&cids=1&menu_id=4720&action=333&active_id=2328&model=project.task&view_type=form) Forward-Port-Of: odoo/enterprise#119876
This update resolves an issue where payslips weren't correctly identifying employees registered within branch companies. The fix adjusts the system's search criteria to include all child companies in the hierarchy, ensuring accurate payslip generation for all employees across the Odoo Enterprise system.
Original PR description
Bug: employees registered on branch companies don't appear in the
employee_id field when creating a payslip from the parent company.
Reason: the domain used ('company_id', '=', company_id) which only
matches the exact company, not its children.
Solution: replaced '=' with 'child_of' to include all descendant
companies in the hierarchy.
task - 6299634
Forward-Port-Of: odoo/enterprise#12097410 changes
New functionality added to Odoo
This update introduces an AI-powered tool to automatically rename documents, streamlining document management. The previous demo tool has been removed, and the new system uses a standardized naming convention ([ORIGIN]-[SENDER]-[DOC_TYPE]-[DATE]) to ensure consistent document organization. This improves data clarity and efficiency.
Original PR description
This commit introduces a new AI-powered tool for automatically renaming documents, replacing the previous demo tool which has been removed along with its data. Key changes: - Added a standard default prompt for document renaming that follows the naming convention: [ORIGIN]-[SENDER]-[DOC_TYPE]-[DATE]. - Removed the obsolete demo renaming tool and its associated demo data. - Updated demo data of `documents_ai` bridges to make the demo prompt more readible task-5860839
Enhancements to existing features
This update simplifies the systray check-in process by aligning it with backend attendance settings. Previously, check-in was triggered by attendance status, but now it's controlled solely through backend configurations. This change streamlines the process and reduces complexity.
Original PR description
[IMP] hr_work_entry_attendance: systray check_in appearance adjustment Systray check-in was available when the employee or user is attendance based but now, it will only depends on attendance check-in from backend setting. So, no need to look to attendance_based now. task - 6309593
This update improves reporting for Belgian payroll runs by renaming and reorganizing key data fields. Specifically, it adds information on NSSO contributions and withholding taxes, providing a more complete picture of Belgian pay run data. This change is limited to the Belgium localization.
Original PR description
This PR expected only applies to Belgium Localization. There are fews changes in this view: - Rename Employer cost to Total Cost - Remove Gross - Add NSSO Contribution - Add Witholding taxes This changes to provide important information on belgian pay run task: 6290433
Resolved issues and error corrections
This update ensures that cancelled and no-show appointment bookings now correctly appear as 'free' in the calendar, rather than 'busy'. Previously, the calendar incorrectly marked these bookings as occupied. This change improves the accuracy of appointment scheduling and reduces confusion for users.
Original PR description
When an appointment booking status is changed to `cancelled` or `no_show`, the calendar event could remain marked as `busy`. This commit updates the appointment event synchronization so `show_as` is set to `free` for cancelled and no-show bookings, and restored to `busy` when the booking goes back to an active appointment state. task-6108930
This update corrects a technical issue where the wage types menu domain wasn't updated after changes to payroll rules. This ensures the menu accurately reflects the new capabilities of wage types, allowing for correct payroll calculations. It's a minor fix to maintain payroll accuracy.
Original PR description
After the change to rules that allowed them to be used in multiple structures, the domain for the wage types menu was not updated. This commit fixes it.
This update resolves an issue preventing accurate wage calculations within the Chinese payroll module. The fix corrects a domain filter, ensuring that the correct wage types are applied to employee payrolls. This ensures payroll processing is functioning as intended.
Original PR description
Oversight of c2f18f3de7ebaa418ae24b73dd4be7483972bbaf
A recent update altered how Odoo designates the default website based on sequence number. This change caused a test to fail because a newly created website was incorrectly set as the default. This commit resolves the test by adjusting the website sequence number, ensuring the test continues to run successfully.
Original PR description
The community PR connected to this PR changed the website behaviour such that the website with the lowest sequence is considered to be the default one. After this change, `test_helpdesk_team_visibility` fails. This happens because the test creates a website with the lowest sequence number which now immediately becomes the default one. This was not intended, and it breaks the test. This commit fixes the test by using an higher sequence number such that the newly created website does not get set as the default website. Community PR: https://github.com/odoo/odoo/pull/225335 Upgrade PR: https://github.com/odoo/upgrade/pull/9434 task-5028180
This update resolves a minor issue with the Enterprise version of Odoo's VoIP system. Specifically, it adapts the system to ensure proper subscription handling during startup, improving reliability. This change ensures a smoother and more stable experience for users.
Original PR description
Enterprise counter-part. https://github.com/odoo/odoo/pull/270281
This update resolves a problem where the point-of-sale tour was incorrectly proceeding before order preparation data was fully synchronized. This prevented accurate testing and could lead to inconsistent results. The fix ensures preparation synchronization completes before the tour continues, improving the reliability of the testing process.
Original PR description
The `applyBestComboMultiQty` tour was proceeding before the order synchronization and preparation requests had completed. This introduced timing-related inconsistencies in `test_apply_best_combo_multi_qty`, causing assertions to occasionally run against incomplete data. Add the required `waitRequest` steps to ensure preparation synchronization is finished before advancing to the next tour actions. Runbot Error-[939058](https://runbot.odoo.com/odoo/error/939058)
Code cleanup and technical improvements
This update ensures that references to the fragment query string functionality are accurate as it's being reorganized within Odoo. This change is part of a larger effort to improve the internal structure of the code and maintain consistency across modules. It ensures the social media integrations continue to function correctly.
Original PR description
The aim of this commit is to keep referencing fragment_to_query_string correctly as it is moved into `http.py`. task-id: 6071808 Forward-Port-Of: odoo/enterprise#121195 Forward-Port-Of: odoo/enterprise#121019
5 changes
Enhancements to existing features
This update allows administrators to control when payslip PDFs are generated and emailed to employees – options include automatic delivery on validation or payment, or manual delivery. Previously, this setting was managed differently, requiring a migration script. This change simplifies management and avoids disruption for existing users.
Original PR description
Backport of odoo/enterprise#97957 adapted for stable 19.0 policy.
This commit adds a global setting that controls when payslip PDFs are generated and emailed to employees: on validation, on payment, or never (manual). The three modes are exposed in Payroll settings.
Difference from 19.1: the trigger is stored in ir.config_parameter ('hr_payroll.payslip_generate_and_send_trigger') instead of a new column on res.company, avoiding any migration script. When the parameter is absent the behaviour falls back to 'on_confirmed', preserving the existing behaviour for all current installations.
task-6268644Resolved issues and error corrections
This update resolves an issue where changes to roles within duplicated sign templates were unintentionally reflected across all instances. By copying the role data when duplicating a sign item, each template now has its own independent roles, ensuring data consistency and preventing conflicts.
Original PR description
When duplicating a sign template, its sign items were copied but their `responsible_id` was kept as a reference to the same `sign.item.role` records. As a result, editing a role on one template (e.g. assigning a partner through `assign_to`) leaked to the other template sharing it. Copy the role when copying a sign item so each template owns its own roles. task-6288951
This update removes an unnecessary 'external' tag from the SendCloud delivery module's tests. Previously, errors were only detected during nightly builds, not by the standard Continuous Integration process. Removing the tag now ensures all tests run correctly and efficiently.
Original PR description
Test class was tagged as external although calls are mocked. This means errors were only caught in nightly and not by CI. Removing the tag requires fixing some of the tests. For `test_multicollo`, we send the average weight of packages instead of the total since 97f82442c9fee7dcb3e8c5e9bacddcd6bb864e11. Forward-Port-Of: odoo/enterprise#118386 Forward-Port-Of: odoo/enterprise#111660
This update clarifies the Budget Report by adding more specific labels for budget lines. Previously, lines were grouped with generic names like 'Budget 2026 x', making it difficult to distinguish them. Now, the report includes the associated analytic accounts, providing a clearer and more informative view of budget data.
Original PR description
Budget report grouping by budget line displayed the budget name for every line, which made different lines indistinguishable and produced labels like "Budget 2026 x", "Budget 2026 x (2)", etc. Compute a more specific display name for budget lines by appending the analytic accounts concerned by the line to the budget name. Also expose Budget Line as a first-class group-by in the Budget Report search view and apply it by default when opening the report. task-6293065
This update resolves an issue where clicking the 'Documents' button on an employee form opened a new browser tab. The change adds a setting to ensure the button opens directly within the existing employee form, improving user experience and workflow efficiency.
Original PR description
Issue: ---------------------------------------- When on an employee form, clicking the "Documents" button opens a new page instead of staying on the same. Steps to reproduce: ---------------------------------------- - Install `documents_hr` - Go on an employee form - Click the "Documents" button - It opens a new page Cause: ---------------------------------------- The `'ir.actions.act_url'` opens a new page by default. Solution: ---------------------------------------- Add `'target': 'self',` to make it open the URL in the same page. opw-6284677
6 changes
Resolved issues and error corrections
This update resolves a bug that previously prevented the system from correctly calculating bill addresses when address fields were empty. Now, empty address fields are automatically set to empty strings, ensuring accurate billing information is processed. This improves the reliability of payment authorization transactions.
Original PR description
Fix bug introduced by commit https://github.com/odoo/odoo/pull/267592/changes/c4556637e8eeef07ce6e3cc3b3b4cf28fa10e468 that caused an error if an address field was not set, due to trying to cut a False field. Now, unset fields are set to empty strings. Forward-Port-Of: odoo/odoo#270295
This update fixes an issue where payslips weren't generating correctly for employees registered within branch companies of a larger organization. The fix ensures that all employees within a company's branch network are properly included when creating payslips, improving payroll accuracy and reporting.
Original PR description
Bug: employees registered on branch companies don't appear in the
employee_id field when creating a payslip from the parent company.
Reason: the domain used ('company_id', '=', company_id) which only
matches the exact company, not its children.
Solution: replaced '=' with 'child_of' to include all descendant
companies in the hierarchy.
task - 6299634
Forward-Port-Of: odoo/enterprise#120974This update replaces the Tenor GIF API key with a Klipy GIF API key to ensure continued functionality of the GIF sharing feature within Odoo. The Tenor API is scheduled to end on June 30, 2026, necessitating this change to avoid disruptions to GIF usage. Users should note that updating the API key is required for the GIF feature to remain operational.
Original PR description
Tenor API will be terminated on June 30, 2026: https://developers.google.com/tenor/guides/quickstart This commit makes the Tenor API key input settings use a Klipy GIF API key instead of a Tenor GIF API key. To keep GIF working after this commit, the API key must necessarily be changed to a Klipy GIF API key, as the old Tenor API key would be considered as an invalid Klipy API key. Task-5491965 Upgrade: https://github.com/odoo/upgrade/pull/10516 Forward-Port-Of: odoo/odoo#250113
This update fixes an issue where bank verification timestamps were incorrectly interpreted, leading to display errors for users in Poland. The change converts timestamps from the local Polish timezone to UTC, ensuring accurate display and preventing timezone-related problems with the government API.
Original PR description
The gov API returns a 'requestDateTime' in str format in PL timezone. This commit converts it back to UTC timezone for a better display in payment form. fields.Datetime assume the value is in UTC time and so when a field of this type is displayed, it's converted to the user timezone. This cause issue with the PL API call because the API will send us 9:25 PL TZ but if we store it directly, it will be interpreted by the ORM as 9:25 UTC and displayed to the user that's in UTC+2 as 11:25 task-6314380
This update resolves a technical issue in the POS system where a traceback error occurred when users initiated a 'Force Cancel' after a Pine Labs payment was cancelled. The fix ensures the system correctly handles payment line status transitions, preventing errors and improving the user experience during payment cancellation.
Original PR description
**Step to Reproduce:** 1. Open the POS. 2. Add any product to the order. 3. Proceed to the payment screen and select `Pine Labs` as the payment method. 4. Observe that the Pine Labs terminal does not…
**Step to Reproduce:** 1. Open the POS. 2. Add any product to the order. 3. Proceed to the payment screen and select `Pine Labs` as the payment method. 4. Observe that the Pine Labs terminal does not respond and no payment popup appears on the device. 5. Wait until the payment request is cancelled (either manually or due to timeout). 6. Click the `Force Cancel` button. 7. Observe that the POS throws a traceback. **Video:** https://drive.google.com/file/d/1A3QPdby-J12IWgOX_SfCLrauQ_QnbqvG/view **Issue:** When a Pine Labs payment request is cancelled (either through a cancel request or by timeout), clicking the `Force Cancel` button results in a traceback in the POS. **Reason:** During the cancellation flow, the payment line status is updated to `retry` so that the transaction can be marked as cancelled and retried if necessary. Later, when the user clicks `Force Cancel`, `_paymentCancelRequestHandler()` attempts to retrieve the pending Pine Labs payment line using: ```javascript const line = this.pendingPineLabsPaymentLine(); ``` However, `pendingPineLabsPaymentLine()` only returns payment lines whose status is not `retry`, as defined here: https://github.com/odoo/odoo/blob/19.0/addons/point_of_sale/static/src/app/services/pos_store.js#L1820 Since the payment line was already transitioned to the `retry` state during the cancellation flow, no `payment line` is found and `line` becomes `undefined`. The handler subsequently attempts to update the status of this `undefined` `payment line`, resulting in the traceback when `Force Cancel` is executed. **Solution:** Add a condition in `_paymentCancelRequestHandler()` to verify that a payment line is available before attempting to update its status. If no payment line is found, it indicates that the payment line has already been moved to the `retry` state during a previous cancellation attempt. In such cases we clear `pollingTimeout`, `inactivityTimeout` and reset `this.payment_stopped` to `false`. This prevents the traceback while ensuring that the `Force Cancel` flow properly cleans up the pending payment state. opw-6297135
This update fixes an issue where a product's serial number was incorrectly displayed twice after a page refresh in the Point of Sale (PoS) system. The root cause was a temporary lot number lingering in the system's database, leading to duplication. This change ensures accurate serial number display and a consistent user experience.
Original PR description
Steps to reproduce ------------------ 1. Have a product tracked by serial number, with stock to sell. 2. In PoS, sell one unit, set a serial number, and validate. 3. Refresh the page, then open the order again. -> the serial number is shown twice (after a second refresh it goes back to one). Why the issue ------------- When the order is synced, the server returns the real lot and it replaces the temporary one on the line. The temporary lot is not used anymore, but it stays in IndexedDB and still points to the line. So on the next reload it is loaded back, linked again to the line, and we get two lots on the same line. The fix ------- A lot that is not linked to any order line anymore is now considered removable, so it is not kept in IndexedDB and cannot be re-added on the next reload. opw-6092527
6 changes
Resolved issues and error corrections
This update corrects a technical issue where the average product review star rating was incorrectly displayed as an H1 element. The change now uses a more appropriate span tag with styling, ensuring better website accessibility and a cleaner design. This improves the overall user experience on product pages.
Original PR description
Problem: The average number of stars in the review on product pages is shown as an h1. This is not sementically valid. Solution: Use a span and apply an h1-like style. Task-6185328 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update ensures Odoo generates PDF invoices that fully comply with ZUGFeRD standards, a crucial requirement for electronic invoice processing. Specifically, it adds a necessary tag to the PDF file to accurately link the visual invoice with its underlying XML data, addressing a technical specification update. This ensures proper integration with Factur-X and supports future ZUGFeRD versions.
Original PR description
Adapt `add_attachment` to allow setting the "AFRelationship" tag on the PDF filespec object, In compliance with Factur-X/ZUGFeRD specs that require the AFRelationship tag in the PDF filespec object to reflect the relationship between the embedded XML and the visual PDF content: - /Data: the visual PDF contains more invoicing data than the XML. - /Alternative: the XML and the PDF are two equivalent representations of the same invoice. Additionally, update the embedded XML filename from `zugferd-invoice.xml` to `factur-x.xml`. The former is marked as deprecated since ZUGFeRD 2.0 Ref: sections 6.2.2, 6.3.1, 6.3.2 of the ZUGFeRD 2.4 specification: https://www.ferd-net.de/en/downloads/publications/details/zugferd-24-english opw-6252082
This update resolves a test failure related to database constraint violations (specifically `RESTRICT_VIOLATION`) when using PostgreSQL 18. The change involves updating a test to handle errors more generically, ensuring the email alias functionality continues to work correctly. This is a routine maintenance fix.
Original PR description
This commit is kind of a follow up of
odoo/odoo@39cd4ea856fe00f5674f8c44b2b66cbf2705426d (in 18.0).
In a nutshell, following a standard-compliance fix (postgres/postgres@086c84b) has led to `RESTRICT_VIOLATION` being emitted in cases which formerly emitted `FOREIGN_KEY_VIOLATION`. One such case is specifically being tested for by `test_alias_domain_setup`, leading to this test failing systematically when running pg18:
psycopg2.errors.RestrictViolation: update or delete on table "mail_alias_domain" violates RESTRICT setting of foreign key constraint "mail_alias_alias_domain_id_fkey" on table "mail_alias"
DETAIL: Key (id)=(191) is referenced from table "mail_alias".
This commit updates the test to use the more generic `IntegrityError` as it's probably more than sufficient for our purposes.This update fixes an error in the German (skr03) accounting template. The incorrect account codes for cash discounts have been replaced with the correct ones, ensuring accurate financial reporting for German businesses using Odoo. This ensures compliance with German tax regulations.
Original PR description
The default cash discout accounts referenced in the
German skr03 template used the wrong account codes.
The template has been updated with the right ones.
task-4915939
opw-4909059
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update fixes an error in the German (skr03) template for financial reports. The incorrect account codes for cash discounts have been corrected, ensuring accurate reporting for German businesses using this template. This ensures compliance and reliable financial data.
Original PR description
The default cash discount accounts referenced in the German skr03 template used the wrong account codes. The template has been updated with the right ones. task-4915939 opw-4909059
This update corrects a missing valid NUIT number in the MZ demo company setup. The change ensures the demo company accurately reflects MZ tax regulations, preventing potential errors during testing and demonstration. This fix resolves a Runbot error related to data validation.
Original PR description
Newer versions of stdnum (2.2) also test the number for MZ We did not have a valid NUIT number in the MZ demo company. Runbot error: https://runbot.odoo.com/runbot/build/114118067 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