Friday, July 3, 2026
29 changes · saas-19.4
Enhancements to existing features
This update ensures the font style for general customer notes in Point of Sale matches the font used for line customer notes. This improves the visual consistency of sales receipts and enhances the overall user experience for customers.
Original PR description
We updated the general customer note font to match the line customer note's one. task-6294200 Forward-Port-Of: odoo/odoo#271344 Forward-Port-Of: odoo/odoo#270060
Resolved issues and error corrections
This update ensures the website always displays the default cookie policy page when the cookies bar is enabled and the policy field is cleared. Previously, clearing the policy field without disabling the cookies bar resulted in the page disappearing, requiring a workaround. This fix maintains a consistent and compliant user experience.
Original PR description
Steps to reproduce: - enable the cookies bar in the website settings and save - clear the "Cookie Policy Page" field and save The website was left without a cookie policy page while the cookies bar was still enabled. Since the settings view only displays the field when it has a value, it disappeared with no way to set it back, other than toggling the cookies bar off and on again. The default policy page was only restored when the `cookies_bar` flag itself changed, so a write clearing only `cookie_policy_id` slipped through. Restore the default page whenever the policy is emptied while the cookies bar remains enabled, so the field reappears with the default page after saving. task-6356766
Features or functions removed from Odoo
This update removes a QR code that displayed product prices from gift receipts. This change ensures gift receipts maintain their intended purpose of concealing pricing information from the recipient, protecting customer privacy and preventing misuse of pricing details.
Original PR description
Gift receipts are intended to be given to the gift recipient and are designed to hide product prices. The self-service invoicing QR code could expose pricing information through the generated invoice, defeating the purpose of the gift receipt. Therefore, remove the self-invoicing QR code from gift receipts. task-6299597 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#269812
This update ensures that only complete and accurate buyer address data is sent to Fiskaly, our payment processing partner. Previously, placeholder values like 'N/A' were included, which is now corrected to only send available information, streamlining the process and improving data quality. This change avoids unnecessary data transmission and potential issues with Fiskaly.
Original PR description
In this commit: ------------------- - Buyer address fields are optional and should only be sent to Fiskaly when they are actually available. - Avoid sending placeholder values like "N/A". If the data is not present, the fields should simply be omitted from the request. task: 6113133 Forward-Port-Of: odoo/enterprise#122188 Forward-Port-Of: odoo/enterprise#113621
This update ensures the website correctly displays the cookie policy page even after it's cleared through the settings. Previously, clearing the field only worked when the cookies bar was toggled off and on, creating a confusing user experience. This fix guarantees the policy page is always visible when the cookies bar is enabled.
Original PR description
Steps to reproduce: - enable the cookies bar in the website settings and save - clear the "Cookie Policy Page" field and save The website was left without a cookie policy page while the cookies bar was still enabled. Since the settings view only displays the field when it has a value, it disappeared with no way to set it back, other than toggling the cookies bar off and on again. The default policy page was only restored when the `cookies_bar` flag itself changed, so a write clearing only `cookie_policy_id` slipped through. Restore the default page whenever the policy is emptied while the cookies bar remains enabled, so the field reappears with the default page after saving. task-6356766
This update resolves an issue where the Odoo logging system was not correctly configured in version 19.4. Specifically, a necessary argument was missing from a key function, ensuring accurate logging data capture. This ensures consistent and reliable logging performance.
Original PR description
During the forwardport, it was missed that get_log_metadata needs an argument starting from 19.0. Forward-Port-Of: odoo/odoo#273694
This update fixes an issue where customer addresses were excessively long in form view titles and breadcrumbs, making them difficult to read. The change ensures only the customer's name is displayed, aligning with how other fields are formatted, resulting in a cleaner and more user-friendly navigation experience.
Original PR description
- Create a new Invoice; - Assign a Customer with a multiline address; - Click on the internal link (arrow icon) of the Customer field. Before this commit, the form view title and the breadcrumb would contain not only the customer's name but also their full address. This resulted in an excessively large and unreadable breadcrumb. Now, only the name is retained. This commit applies the same behavior already used in many2one fields: the display name is split by line breaks, and only the first line is kept for the title and breadcrumb. task-id 6329662 Forward-Port-Of: odoo/odoo#272550 Forward-Port-Of: odoo/odoo#272059
This update resolves an issue where self-ordering table references were being lost when a self-order was created from a QR code. The fix ensures that the original table link is maintained, allowing users to seamlessly validate and pay their orders, even when the table is initially empty. This improves the reliability of the self-ordering mobile experience.
Original PR description
Steps to reproduce: --------------- - Enable QR Menu & Ordering in POS - Enable Service at Table - Create a self-order from a table QR - Validate/pay the order from the POS Cause: ----------- The write override unconditionally `table_id` to `self_ordering_table_id`, even when `table_id` was falsy, clearing the original self-order table link. Fix: ---------- Only update `self_ordering_table_id` when `table_id` is explicitly set and truthy. Task-6272642 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#268459
This update fixes a minor issue with the website event quiz where users weren't receiving a clear confirmation message after completing a quiz. The change ensures a positive and informative message is displayed, enhancing the user experience. This improves the overall impression of the event tracking feature.
Original PR description
opw-6332274 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#272593 Forward-Port-Of: odoo/odoo#272371
This update corrects a warning message within the Odoo Enterprise system related to data constraints. The change ensures the system functions correctly without impacting user workflows. It involved adjusting the trigger for a key constraint to focus on warehouse assignments, aligning with how the system is designed.
Original PR description
The `@api.constrains` decorator was listening to `company_id`, which is a readonly related field. This triggers an ORM warning ("parameter 'company_id' is not writeable").
Swapped the constraint trigger from `company_id` to `warehouse_id`. Since the company is fully dependent on the warehouse, this safely achieves the exact same trigger logic.
build: [940408](https://runbot.odoo.com/odoo/runbot.build.error/940408)This update ensures users can only define default values for fields they are authorized to access within Odoo. Previously, this wasn't properly enforced, leading to potential inconsistencies in data. This change improves data accuracy and reliability by aligning default values with user permissions.
Original PR description
Users should be able to set default values only for fields they have access to. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#273619 Forward-Port-Of: odoo/odoo#273089
This update fixes a visual issue in the translate dialog, ensuring consistent styling across both debug and non-debug modes. Specifically, the background color and selection behavior have been adjusted for a cleaner and more reliable translation experience. The fix also addresses a bug where the last translator's translation was automatically selected in debug mode.
Original PR description
Before the commit: the translated text is with green background color. In debug mode, the translation generated by the last translator is selected by default. After this commit: In non-debug mode, the translated text is now wrapped in a div and with a similar style as the previous versions. In debug mode, when there are multiple translators, the translated text is no longer automatically selected. When there's no translation selected, the confirm button is disabled. The translated texts are now wrapped inside gray/dark gary background color. task-6250193 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#267934
This update fixes a display issue in the Intrastat report where bill names were being cut off before hyphens. The fix adjusts a regular expression to allow hyphens in bill names, ensuring complete and accurate reporting of Intrastat transactions. This improves the clarity and usability of the report for accounting and reporting teams.
Original PR description
**Steps to reproduce:** - Install Accounting - In Accounting settings, activate "Intrastat" - Create a product with Intrastat info - Create a bill: * Product: [the created Intrastat product] *…
**Steps to reproduce:** - Install Accounting - In Accounting settings, activate "Intrastat" - Create a product with Intrastat info - Create a bill: * Product: [the created Intrastat product] * Intrastat Country: [any] * Intrastat Transport Mode: [any] - Confirm the bill - Make sure that the bill name contains a hyphen character (i.e. "-") For example, "BILL/2026-06/0001". Use the "Resequence" action from the bills list view if needed. - Go to "Accounting / Reporting / Audit Reports / Intrastat Report" - Expand the line to display the bill name **Issue:** The bill name is not fully displayed. It is cropped right before the hyphen character (i.e. BILL/2026). **Cause:** A regex is used to retrieve the bill name from the report line name, but it is only allowing "/" character. **Solution:** Just allow "-" character in addition. No other character is allowed to limit the risk of matching something that should not. opw-6299854 Forward-Port-Of: odoo/enterprise#120979
This update fixes a labeling issue with the French e-invoicing module. The disconnect button previously referenced 'peppol,' which was confusing for users. It has now been renamed to 'Disconnect French electronic invoicing' for clarity and accuracy.
Original PR description
The name of the disconnect button for the France e-invoicing was incorrect as it referenced peppol and was fixed in this pr to be called Disconnect French electronic invoicing task-6266337 Forward-Port-Of: odoo/odoo#273092 Forward-Port-Of: odoo/odoo#268536
This update fixes an issue where project settings within the Timesheet systray were not saved when closing the window. The previous code prevented data loss by temporarily disabling saving during systray closure, but this is no longer needed. This change ensures that project selections made within the Timesheet systray are reliably saved.
Original PR description
## Issue When using the Timesheets systray, if we set a project after clicking the *Save* or *Reset* button, the project is not saved after closing the systray. ## Steps to reproduce 1. Install…
## Issue When using the Timesheets systray, if we set a project after clicking the *Save* or *Reset* button, the project is not saved after closing the systray. ## Steps to reproduce 1. Install *Timesheets* (`timesheet_grid`) 2. Open the Timesheets systray 3. Click *Reset* and set a description, a project and/or a task, then close the systray 4. Open the systray again 5. **The description/project/task set in step 3 do(es) not appear anymore.** ## Cause Commit https://github.com/odoo/enterprise/commit/b9b7f8a0acf7a1c545c6613cf8bbc29871632e26 introduced the `preventUnmountSave` attribute. The attribute is set to `true` after saving and discarding an entry. When the systray is unMounted, the manual values (e.g., description, project and task) are not saved if the attribute is set to `true`: https://github.com/odoo/enterprise/blob/7cd8dd008eb88d6c12f3e65fb8d311058290a301/timesheet_grid/static/src/components/timesheet_timer_inline_form/timesheet_timer_inline_form.js#L171-L174 ## Fix After discussing with the author of the previous commit, it appears this was done to prevent an issue with values stored in cache, but that issue does not seem to occur anymore, which leads to believe that the attribute is not required anymore. opw-6284016 Forward-Port-Of: odoo/enterprise#122332 Forward-Port-Of: odoo/enterprise#121605
This update cleans up error logging within the IoT drivers, specifically for devices connected to the FDM (Financial Data Management) system. By removing unnecessary stack traces and using a more targeted error catch, the system's logs are now cleaner and more focused on relevant issues. This improves overall system stability and reduces noise in the logs.
Original PR description
We remove the stack trace from the exception reading FDM response to avoid polluting the logs when probing non FDM ports. We also now catch a more precise `IndexError` instead of `Exception` as it wasn't necessary to catch this wide. We also caught the opportunity to ruff the file. Forward-Port-Of: odoo/odoo#272078
This update resolves a test failure related to how methods were being overridden in the Point of Sale and Loyalty modules. By using a specific testing technique, the system now cleans up after itself, preventing errors and ensuring the stability of the core Odoo code. This improves test reliability and overall system health.
Original PR description
Avoid polluting the Odoo model registry and failing `test_lint_override_signature` by using `patch.object` instead of manual assignment. This ensures the injected method is properly torn down after the test block, keeping the registry clean and bypassing static analysis failure as the patched method is only used for tests. runbot-939298 Forward-Port-Of: odoo/odoo#273151 Forward-Port-Of: odoo/odoo#273096
This update resolves a test failure within the Point of Sale (POS) module. The change uses a more reliable testing technique to ensure test data is properly reset after each test, preventing errors in static analysis. This ensures the POS functionality continues to operate correctly.
Original PR description
Avoid polluting the Odoo model registry and failing `test_lint_override_signature` by using `patch.object` instead of manual assignment. This ensures the injected method is properly torn down after the test block, keeping the registry clean and bypassing static analysis failure as the patched method is only used for tests. runbot-939298 Forward-Port-Of: odoo/enterprise#122331 Forward-Port-Of: odoo/enterprise#122283
This update corrects a technical issue preventing multiple pension fund taxes from being applied to a single invoice line in Italy. The fix aligns with Italian electronic invoicing regulations that permit more than one tax on a line. This ensures accurate tax calculations and compliance for IT companies using the Odoo system.
Original PR description
### Steps to reproduce the issue: 1. Download Accounting and l10n_it_edi_withholding 2. Switch to IT company 3. Create 2 taxes with a Pension fund type set (in Advanced Options) 4. Create an invoice…
### Steps to reproduce the issue: 1. Download Accounting and l10n_it_edi_withholding 2. Switch to IT company 3. Create 2 taxes with a Pension fund type set (in Advanced Options) 4. Create an invoice and set on the same line the 2 taxes created 5. Click on send and print and see the error: Invoices must have at most one Pension Fund tax set per line. (even if it's not true) ### Cause of the issue: The following function check how many taxes we have per line but this limit is incorrect because it is accepted by the Italian electronic invoicing specifications to have also more than 1 tax. https://github.com/odoo/odoo/blob/bd095fe286930acc54d85bdf7f92af15569f5b82/addons/l10n_it_edi/models/account_move.py#L1268-L1273 ### Reference documentation: 1. [Art. 10 della Legge n. 183_2011, successivamente integrato dal D.L. n. 1_2012 (art. 9-bis)..pdf](https://github.com/user-attachments/files/29056003/Art.10.della.Legge.n.183_2011.successivamente.integrato.dal.D.L.n.1_2012.art.9-bis.pdf) 2. Following image: <img width="823" height="580" alt="estrattoEppi" src="https://github.com/user-attachments/assets/e79be16f-651e-467a-84f4-8400185ceea4" /> opw-6264685 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#273040 Forward-Port-Of: odoo/odoo#269456
This update resolves an issue where payroll rules weren't being updated correctly in the AE (UAE) version of Odoo. The change adds necessary data structures to ensure that all relevant payroll rule files are properly refreshed, maintaining accurate financial reporting and compliance.
Original PR description
. Add hr_rule_parameter_data & hr_salary_rule_data to _get_data_files_to_update() task-6347544 Forward-Port-Of: odoo/enterprise#122304
This update removes the ability to quickly create new journals from the POS payment method form. The accounting team requested this change to ensure journals are created only within the dedicated accounting application, improving data integrity and process control. This change applies locally and enhances the overall accounting workflow.
Original PR description
Currently on the pos payment method form, if you click "Select more" on the journal field, you will see two buttons 'New' & 'Create New'. Steps to reproduce: ------------------- * Open any pos…
Currently on the pos payment method form, if you click "Select more" on the journal field, you will see two buttons 'New' & 'Create New'. Steps to reproduce: ------------------- * Open any pos payment method * Select the journal field * Select "Search more" > See two creation buttons Why the fix: ------------ One button is the standard "On search more" button which can be hidden using options such as no_create, no_create_edit, ... The second button is defined on the list view for journals and since the search more uses the list view it shows the button as well. Currently we can do that with a context key to ensure that on the "real" list view it's still visible. Why do we want to hide those buttons? Asked the R&D accounting team, it should not be allowed to create journals on the fly. You should only be able to create them inside accounting app. This behavior is not limited to this view but will only be applied locally. The fix can however be applied everywhere where needed. Before the fix: ------------------- <img width="700" height="417" alt="image" src="https://github.com/user-attachments/assets/ca11ea13-c38e-40a1-9848-cbc5edc6226e" /> <img width="1507" height="887" alt="image" src="https://github.com/user-attachments/assets/1cde5d3b-3372-4aca-b5d0-2319bd82c1de" /> After the fix: ---------------- <img width="707" height="474" alt="image" src="https://github.com/user-attachments/assets/01dc7b42-43d6-4b18-a12d-54330d51b92b" /> <img width="1457" height="870" alt="image" src="https://github.com/user-attachments/assets/ff387d3f-f59c-47ad-abfe-a2003669db1a" /> opw-6131231 Forward-Port-Of: odoo/enterprise#120379
This update resolves a technical error in the payroll calculation process for Belgium. Specifically, when a required salary scale wasn't found, the system was failing. This fix ensures accurate wage calculations and prevents potential disruptions to payroll processing.
Original PR description
When computing _get_student_min_wage and the specific salary scale is not found, it returns None and then fails in the tuple compression as None is not an interable. task-6318004 Forward-Port-Of: odoo/enterprise#121392
This update fixes a technical issue that caused Odoo builds to fail under certain testing conditions. The team moved assertions to their proper location, ensuring consistent build behavior across all testing environments – specifically resolving a discrepancy between 'all apps' and 'single app' modes. This improves the stability and reliability of the Odoo Enterprise platform.
Original PR description
Oversight of: https://github.com/odoo/enterprise/pull/98569 Some assertions were put in the wrong module, making the builds work in "all apps" mode but fail in "single app" mode. This commit moves assertions where they belong. Task-6353709 Forward-Port-Of: odoo/enterprise#122486
A recent update to the SEPA XML processing for Sweden (l10n_se_bban) caused a test failure when combined with the account_iso20022 module. This commit resolves the test issue by temporarily skipping the failing test and adding a replacement, ensuring continued functionality for Swedish payment processing.
Original PR description
Here https://github.com/odoo/enterprise/pull/114662 we changed the way the CdtrAgt node is used in the SEPA XML file for Sweden. But this change broke a test when both account_iso20022 & l10n_se_bban are installed, leading to a Non-expected child error. This commit skip the failling test if l10n_se_bban is installed, and add a new one to replace it. runbot-938366 runbot-938367 Forward-Port-Of: odoo/enterprise#122599 Forward-Port-Of: odoo/enterprise#121485
This update fixes an issue where email attachments with unusual Content-Type headers were being corrupted, leading to data loss. The change ensures attachments are stored correctly by handling these cases gracefully, aligning with industry standards and preventing data corruption. No new functionality was added.
Original PR description
[[REF] mail: consolidate attachment Content-Type normalization](https://github.com/odoo/odoo/pull/273097/changes/ad4e34c5c79450b1e976d9ba7047487218690585) Two separate spots handled malformed…
[[REF] mail: consolidate attachment Content-Type normalization](https://github.com/odoo/odoo/pull/273097/changes/ad4e34c5c79450b1e976d9ba7047487218690585)
Two separate spots handled malformed Content-Type headers. Merge them
into one block, read the raw header once with partition(';') to have
both the type and its parameters available without re-fetching the
header for each case.
No behavior change.
[[FIX] mail: handle attachment Content-Type with no subtype](https://github.com/odoo/odoo/pull/273097/changes/7b410fbe606b7e476f0005485e42783834983b75)
Some mailers send attachments with a bare token as Content-Type instead
of a valid 'type/subtype' pair, e.g.:
Content-Type: base64; name="foo.pdf"
Content-Transfer-Encoding: base64
Python's email library normalises any MIME type without a '/' to
'text/plain'. get_content() then decodes the base64 payload as UTF-8
text, replacing invalid byte sequences with U+FFFD. The subsequent
encode('utf-8') bakes those replacements in, permanently corrupting
the stored file.
Per Postel's law [RFC 761], be liberal in what we accept: detect these
non-standard types via `not all(mimetype.partition('/'))` and fall back
to application/octet-stream, keeping the original parameters (filename,
charset, etc.) so the attachment is stored intact.
opw-6227526
Forward-Port-Of: odoo/odoo#273097This update corrects a minor issue in how overtime hours are calculated and stored, ensuring more accurate payment calculations. Previously, rounding introduced small errors due to the way decimal numbers are handled, which could lead to slight discrepancies in overtime pay. This fix maintains greater precision for financial accuracy.
Original PR description
Overtime duration computed as fractional hours was rounded to 3 decimal places before being stored on the overtime line. Since 1 decimal hour = 3600 seconds, this gives only 3.6 seconds of precision and the rounding can go in the wrong direction due to floating-point representation. The fix consists in replacing the duration rounding to 4 decimals when building overtime work entries so stored durations keep sub-second precision needed for money computation. task-6212231 Forward-Port-Of: odoo/enterprise#120786 Forward-Port-Of: odoo/enterprise#119721
This update resolves a recurring issue in the Odoo presence subscription test, which previously failed due to timing dependencies. By removing a batching delay, the test now reliably logs every subscription call, ensuring consistent and accurate test results. This improves the stability of the Odoo system.
Original PR description
Since [1], the `subscribe to presence channels according to store data` test is sometime failing as it heavily depends on timings. This commit removes the `OUTGOING_BATCH_DELAY` in order to remove batching. This way, we can ensure every call to `subscribe` is actually logged instead of guessing how they will be batched. runbot-941301,941304,941303 [1]: https://github.com/odoo/odoo/pull/272199 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects a small issue where email notifications weren't being properly sent after a call activity was marked as complete. The change ensures that users receive the expected email updates, improving communication around call interactions. This fix was implemented as part of a broader update to how call activities are managed.
Original PR description
In [1], we removed `action_call_done` for call activity, and to use `action_feedback` to mark a call activity done like other activities. However, we forgot to assign `activity_mail_message_id` for later mail message update. Add this in `action_feedback`. [1]: 70ba1812812596e00509415cedcc8f4bdf6c6e37 COMPR: https://github.com/odoo/odoo/pull/267663 Forward-Port-Of: odoo/enterprise#122687 Forward-Port-Of: odoo/enterprise#118396
A technical bug prevented the successful display of a notification after activating Peppol. This update corrects a validation error in the system's code that was triggered by a specific configuration, ensuring that users receive confirmation when Peppol is properly set up.
Original PR description
**Steps to reproduce:** * Install the **account_peppol** and **l10n_be** module. * Switch to BE Company. * Create and confirm a BE customer invoice. * Open the "Send & Print" dialog. * Activate…
**Steps to reproduce:**
* Install the **account_peppol** and **l10n_be** module.
* Switch to BE Company.
* Create and confirm a BE customer invoice.
* Open the "Send & Print" dialog.
* Activate Peppol (register as a Peppol participant) in developer mode and demo mode by clicking on `Why should you use it ?` on the banner in wizard.
**Observed behavior:**
* An Uncaught Promise OwlError trace is thrown on the screen: `TypeError: Cannot use 'in' operator to search for 'toString' in null`.
* The success notification indicating that Peppol was activated fails to appear.
**Cause:**
* Upon successful registration, the `peppol.registration` wizard triggers a client action to display a success notification via `display_notification`.
* The backend Python code explicitly passed `title=None` in the notification parameters, which is serialized to `null` in the JavaScript frontend.
* In previous versions (like 19.2), the `Notification` component's `title` prop validation was defined loosely as `{ type: [String, Boolean, { toString: Function }] }`. OWL did not strictly validate this shape, allowing `null` to pass through without error.
* In 19.3, the prop validation was updated to strictly enforce the object shape: `{ type: [String, Boolean, { type: Object, shape: { toString: Function } }] }`. Because JavaScript evaluates `typeof null` as `"object"`, the OWL validation schema now attempts to verify the shape by evaluating `'toString' in null`. Using the `in` operator on `null` is illegal in JavaScript and immediately crashes the application.
**Fix:**
* Replace `title=None` with `title=False` in the `_action_send_notification` method.
* This translates to `false` in the JavaScript frontend, which seamlessly satisfies the `Boolean` prop type validation for the OWL component and allows the notification to render safely without errors.
opw-6333224
Forward-Port-Of: odoo/odoo#272974