Wednesday, May 28, 2025
20 changes · saas-18.3
Resolved issues and error corrections
A previously disabled website test for reordering image gallery snippets has been restored. This helps ensure the website editor continues to handle gallery image ordering correctly and reduces the risk of regressions.
Original PR description
runbot-159805
Helpdesk tickets now keep their existing action buttons when the live chat button is added. This prevents users from losing quick access to other ticket actions while still allowing them to view related chats.
Original PR description
Before this commit, the adding of View chat stat button has erased the other stat buttons instead of adding the stat buttons after the existing ones in helpdesk.ticket form view. This commit adds the view chat stat button after the other stat buttons displayed instead of replacing them.
Miscellaneous changes
DGI only wants units without any decimals. That was already done. But they want these amounts to be the base for the other computations. For instance tax amount is simply ratio * total base for this tax. So we need all the lines to take the rounding into account, which is done with the subformula. We also add the possibility for the client to fix some values by adding an editable second column. The idea is that the sum of the bases for the rates must be equal to the sum of the bases
Original PR description
DGI only wants units without any decimals. That was already done. But they want these amounts to be the base for the other computations. For instance tax amount is simply ratio * total base for this tax. So we need all the lines to take the rounding into account, which is done with the subformula. We also add the possibility for the client to fix some values by adding an editable second column. The idea is that the sum of the bases for the rates must be equal to the sum of the bases for the types. We can't guarantee it due to the rounding and we can't fix it automatically. The client then needs to modify the lines himself. opw-4590719 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#211106 Forward-Port-Of: odoo/odoo#203227
This pull requests brings various improvements and fixes to Hoot and the Odoo unit test ecosystem. See the different commit messages for more details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#211912 Forward-Port-Of: odoo/odoo#211426
Original PR description
This pull requests brings various improvements and fixes to Hoot and the Odoo unit test ecosystem. See the different commit messages for more details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#211912 Forward-Port-Of: odoo/odoo#211426
Steps to reproduce =================== 1. Install l10n_pe or l10n_se 2. Switch to the newly installed company. 3. Open the contact form. The address fields are misaligned. Technical ========== With commit https://github.com/odoo/odoo/commit/4dd27bba346e50f40769d1412fbca0b5f65bb5a6, the contact form renders address fields dynamically based on the selected country. The `_view_get_address` method in the `format.address.mixin` replaces the default address `div` with the XML arch of the vi
Original PR description
Steps to reproduce =================== 1. Install l10n_pe or l10n_se 2. Switch to the newly installed company. 3. Open the contact form. The address fields are misaligned. Technical ========== With commit https://github.com/odoo/odoo/commit/4dd27bba346e50f40769d1412fbca0b5f65bb5a6, the contact form renders address fields dynamically based on the selected country. The `_view_get_address` method in the `format.address.mixin` replaces the default address `div` with the XML arch of the view linked in the current company's `address_view_id` field. Since this arch is wrapped within the `<form>` tags, the JS framework adds an extra div element and `o_form_nosheet` class, causing layout misalignment. After this commit ============== This commit only includes address `div` element inside the `<form>` tag. Task-4744412 Forward-Port-Of: odoo/odoo#208965
…count value Steps to reproduce: 1. Create an invoice with a product 2. Set quantity to 3, price to 11.34 3. Confirm & get the invoice PDF 4. Upload the PDF in accounting app 5. Check the "discount" value Issue: Visually the result is correct, but the stored value (in db) is not -2.220446049250313e-14 != 0.0 Cause: ``` >>> 3 * 11.34 34.019999999999996 ``` Creating a slight error of -0.0000000000002 opw-4675079 Forward-Port-Of: odoo/odoo#210672 Forward-Port-Of: odoo/odoo
Original PR description
…count value Steps to reproduce: 1. Create an invoice with a product 2. Set quantity to 3, price to 11.34 3. Confirm & get the invoice PDF 4. Upload the PDF in accounting app 5. Check the "discount" value Issue: Visually the result is correct, but the stored value (in db) is not -2.220446049250313e-14 != 0.0 Cause: ``` >>> 3 * 11.34 34.019999999999996 ``` Creating a slight error of -0.0000000000002 opw-4675079 Forward-Port-Of: odoo/odoo#210672 Forward-Port-Of: odoo/odoo#206107
Issue: In Odoo, it is impossible to generate an NLCIUS document for a partner with a valid Peppol endpoint using their Netherlands VAT (schemeID=9944) instead of a Dutch KVK/OIN identification number (schemeID=0106/0190). The latter is required for the PartyLegalEntity section of the document, but shares fields with the Peppol endpoint values, thus the two are incompatible. Solution: When the Peppol endpoint is not set to KVK/OIN, the number is instead taken from the generic res_partner.co
Original PR description
Issue: In Odoo, it is impossible to generate an NLCIUS document for a partner with a valid Peppol endpoint using their Netherlands VAT (schemeID=9944) instead of a Dutch KVK/OIN identification number (schemeID=0106/0190). The latter is required for the PartyLegalEntity section of the document, but shares fields with the Peppol endpoint values, thus the two are incompatible. Solution: When the Peppol endpoint is not set to KVK/OIN, the number is instead taken from the generic res_partner.company_registration field which is used for similar purposes for other locales, and the length of the number is used to determine the type. Addresses ticket-4624350 task-4624366 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#211620 Forward-Port-Of: odoo/odoo#209875
Currently the show quantity setting visible on /product page does not apply on the product and combo configurator. We want to uniformize the behavior and if the setting is enabled then view the quantity selector everywhere depending on whether its visible on /product opw-4716312 opw-4781159 Backport of https://github.com/odoo/odoo/pull/209116 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#211323 Forward-Por
Original PR description
Currently the show quantity setting visible on /product page does not apply on the product and combo configurator. We want to uniformize the behavior and if the setting is enabled then view the quantity selector everywhere depending on whether its visible on /product opw-4716312 opw-4781159 Backport of https://github.com/odoo/odoo/pull/209116 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#211323 Forward-Port-Of: odoo/odoo#209934
Problem: Bootstrap grid classes like `row` and `col` are not handled properly when placed inside an `o_text_columns` container. During processing (e.g., for email rendering), rows are expected to be converted to tables — but since `o_text_columns` is not included in the selector query, the transformation is skipped. As a result, when rendering the email, columns are not preserved and fall back to stacked layout. Solution: Update the container selection logic to include `o_text_columns` w
Original PR description
Problem: Bootstrap grid classes like `row` and `col` are not handled properly when placed inside an `o_text_columns` container. During processing (e.g., for email rendering), rows are expected to be…
Problem: Bootstrap grid classes like `row` and `col` are not handled properly when placed inside an `o_text_columns` container. During processing (e.g., for email rendering), rows are expected to be converted to tables — but since `o_text_columns` is not included in the selector query, the transformation is skipped. As a result, when rendering the email, columns are not preserved and fall back to stacked layout. Solution: Update the container selection logic to include `o_text_columns` when querying Bootstrap-based containers that need to be transformed into tables. Steps to reproduce: 1. Go to Email Marketing. 2. Create a new email. 3. Add a Text snippet. 4. Type `/col` and choose "2 Columns". 5. Add text to both columns. 6. Save and send the email. → In the received email, the two columns appear stacked vertically instead of side by side. opw-4675310 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#211109
### Steps to reproduce: - install fsm_industry - run any of these tests: - test_change_parent_plan - test_change_parent_plan_conflict - test_change_parent_plan_with_intermediate - test_change_plan - test_change_plan_conflict - test_change_plan_no_conflict #### > create access right error for the `account.analytic.line` model ### Cause of the issue: The following three record rules provide the creation of `account.analytic.line` for users related to projec
Original PR description
### Steps to reproduce: - install fsm_industry - run any of these tests: - test_change_parent_plan - test_change_parent_plan_conflict - test_change_parent_plan_with_intermediate - test_change_plan -…
### Steps to reproduce:
- install fsm_industry
- run any of these tests:
- test_change_parent_plan
- test_change_parent_plan_conflict
- test_change_parent_plan_with_intermediate
- test_change_plan
- test_change_plan_conflict
- test_change_plan_no_conflict
#### > create access right error for the `account.analytic.line` model
### Cause of the issue:
The following three record rules provide the creation of `account.analytic.line` for users related to project or timesheet access rights unless the analytic line it self is linked to a project: https://github.com/odoo/odoo/blob/e7bd20e64e023c279bf574630e2d8c8a45ba2fe2/addons/hr_timesheet/security/hr_timesheet_security.xml#L52-L64 https://github.com/odoo/odoo/blob/e7bd20e64e023c279bf574630e2d8c8a45ba2fe2/addons/hr_timesheet/security/hr_timesheet_security.xml#L66-L76 https://github.com/odoo/odoo/blob/e7bd20e64e023c279bf574630e2d8c8a45ba2fe2/addons/hr_timesheet/security/hr_timesheet_security.xml#L78-L83 Since the analytic module is unrelated to the project module, these tests will inevitably fail.
### Note:
These record rules do not stop the record creation once the account module is installed since the following record rules override the creation access rights for `account.group_account_invoice` users: https://github.com/odoo/odoo/blob/e7bd20e64e023c279bf574630e2d8c8a45ba2fe2/addons/account/security/account_security.xml#L102-L107
Similar issue treated in commit 9d164c1d2cd8e532109b9859ab776fcf2f71d115
### Note 2:
A priori, the same problem would occur if we were to write post install analytic tests for portal users:
https://github.com/odoo/odoo/blob/e7bd20e64e023c279bf574630e2d8c8a45ba2fe2/addons/hr_timesheet/security/hr_timesheet_security.xml#L33-L50
### Forward port additional fix (18.0):
Since Commit 0e997470b7174a187c876d734e38f633223f65ec the test of the `TestAnalyticAccount` class are launched in sudo mode since the environment is set using OdooBot and never associated with an other user:
https://github.com/odoo/odoo/blob/ed38752e55d6bafbc71fac3df249f226a4eba332/odoo/tests/common.py#L979
https://github.com/odoo/odoo/blob/4baf55a5d108063b0b60beddf332b6ae367f1871/odoo/api.py#L568-L571
In 17.0 the environment was reset to a non sudo mode by the user reassignement:
https://github.com/odoo/odoo/blob/d2ea23f252f0f8f329e2b0ff96de6ee2a14b922f/addons/analytic/tests/test_analytic_account.py#L28-L31
In order for the tests to also check access rights we have added our own `setup_independent_user` in the `AnalyticCommon` class.
Note 3:
Since saas-18.3, there are new problematic groups:
https://github.com/odoo/enterprise/blob/e54a44bf6c8e0f37ccc72006ab691be18d79859b/helpdesk_timesheet/security/helpdesk_timesheet_security.xml#L4-L24
In addition, since the accounting group `account.group_account_invoice` is not part of the default group when `account.accountant` is installed, we need to remove the problematic groups in all independantly of the install of `account.accountant`.
runbot-160013
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#210001
Forward-Port-Of: odoo/odoo#208978Before this commit, if the parent of the SelectionBox component had updated its 'root' from the model, the component was not rerendered, and it was misbehaving in those case (e.g. after an upload of a Document, the selection was not working with the right root, and the component failed to be updated accordingly. Now, the component can receive a root as a props. task-4664231 Forward-Port-Of: odoo/odoo#211842
Original PR description
Before this commit, if the parent of the SelectionBox component had updated its 'root' from the model, the component was not rerendered, and it was misbehaving in those case (e.g. after an upload of a Document, the selection was not working with the right root, and the component failed to be updated accordingly. Now, the component can receive a root as a props. task-4664231 Forward-Port-Of: odoo/odoo#211842
In this PR: - A `Print` button allows users to generate the E-Waybill or Challan PDF. - The PDF is attached to the chatter and gets downloaded. - Applies only when the document is marked as an E-Waybill or Challan. Task-4807694 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#211543 Forward-Port-Of: odoo/odoo#210998
Original PR description
In this PR: - A `Print` button allows users to generate the E-Waybill or Challan PDF. - The PDF is attached to the chatter and gets downloaded. - Applies only when the document is marked as an E-Waybill or Challan. Task-4807694 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#211543 Forward-Port-Of: odoo/odoo#210998
If a user tries to open a combo product on the website and the combo item has been deleted, a traceback will appear. Steps to reproduce the error: - Install ``website_sale_stock`` module - Create ``Product A`` > product type: ``Goods`` > Save - Go to Website > eCommerce > Combo choices > Create New(``Combo choice A``) > Add ``Product A`` in combo item - Create ``Product Combo A`` > product type: ``combo`` > Combo Choices: ``Combo choice A`` - Delete ``Product A`` - Go to Website > S
Original PR description
If a user tries to open a combo product on the website and the combo item has been deleted, a traceback will appear. Steps to reproduce the error: - Install ``website_sale_stock`` module - Create…
If a user tries to open a combo product on the website and the combo item
has been deleted, a traceback will appear.
Steps to reproduce the error:
- Install ``website_sale_stock`` module
- Create ``Product A`` > product type: ``Goods`` > Save
- Go to Website > eCommerce > Combo choices > Create New(``Combo choice A``) >
Add ``Product A`` in combo item
- Create ``Product Combo A`` > product type: ``combo`` > Combo Choices: ``Combo choice A``
- Delete ``Product A``
- Go to Website > Shop > Open ``Product Combo A``
Traceback:
```
File "/home/odoo/src/odoo/addons/website_sale_stock/models/product_combo.py", line 25, in _get_max_quantity
return max(max_quantities) if (None not in max_quantities) else None
ValueError: max() iterable argument is empty
```
https://github.com/odoo/odoo/blob/4d3b220b0ec6e718f962979b3f271ea161997322/addons/website_sale_stock/models/product_combo.py#L21-L24
Here, when the user deletes the product, ``self.combo_item_ids`` becomes empty,
resulting in ``max_quantities`` being an empty list ([]),
which causes the above traceback.
sentry-6589160704
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#208766Trigger an onchange requiring res_model_id to be returned. Before this commit, there was an error because the dependency field "res_model" was False and injected into a function that required it not to be. After this commit, there is no crash. runbot-error-223466 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 F
Original PR description
Trigger an onchange requiring res_model_id to be returned. Before this commit, there was an error because the dependency field "res_model" was False and injected into a function that required it not to be. After this commit, there is no crash. runbot-error-223466 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#211696
The failed WhatsApp message icon turns green after 15 days or once the message is deleted. PROBLEM: WhatsApp messages are deleted after 15 days, leading to data loss and causing the default green icon to be displayed. SOLUTION: Introduced `getWhatsappStatusClass` to display appropriate icons based on the message state: - Green icon for `sent`, `delivered`, `read`, and `received` states. - Orange icon for the `outgoing` state. - Red icon for the `error` and `cancel` states. - Grey ico
Original PR description
The failed WhatsApp message icon turns green after 15 days or once the message is deleted. PROBLEM: WhatsApp messages are deleted after 15 days, leading to data loss and causing the default green icon to be displayed. SOLUTION: Introduced `getWhatsappStatusClass` to display appropriate icons based on the message state: - Green icon for `sent`, `delivered`, `read`, and `received` states. - Orange icon for the `outgoing` state. - Red icon for the `error` and `cancel` states. - Grey icon for the `undefined` state (i.e., deleted WhatsApp message). Also introduced was `getWhatsappStatusTitle`, which returns the correct title based on the message state. Task-4481123 Forward-Port-Of: odoo/enterprise#86458 Forward-Port-Of: odoo/enterprise#77739
After a recent change in German EDI, the data exported in CSV from the EC Sales List can no longer be uploaded because the expected structure has changed Steps to reproduce (with a DE Company): - Make an invoice to an EU Partner - Open EC Sales List - Export CSV When uploading the file on the Elster portal it will be rejected with an explicit error message, saying that we're using an old CSV format now deprecated, and prompts the user to refer to the new specifications Original mes
Original PR description
After a recent change in German EDI, the data exported in CSV from the EC Sales List can no longer be uploaded because the expected structure has changed Steps to reproduce (with a DE Company): -…
After a recent change in German EDI, the data exported in CSV from the EC Sales List can no longer be uploaded because the expected structure has changed Steps to reproduce (with a DE Company): - Make an invoice to an EU Partner - Open EC Sales List - Export CSV When uploading the file on the Elster portal it will be rejected with an explicit error message, saying that we're using an old CSV format now deprecated, and prompts the user to refer to the new specifications Original message: Ihre CSV-Datei wurde für eine ältere Version der CSV-Schnittstelle erstellt. Bitte informieren Sie sich in der Versionstabelle der Importhilfe über die aktuellste Version der Schnittstelle sowie Änderungen. Sind die Versionsangaben korrekt, prüfen Sie bitte das Encoding Ihrer CSV-Datei. Das zulässige Encoding ist UTF-8. Sources: https://www.elster.de/eportal/helpGlobal?themaGlobal=zmdo_import_eop https://www.datev-community.de/t5/Betriebliches-Rechnungswesen/Import-CSV-Daten-nacvh-Elster-f%C3%BCr-ZM/td-p/480079 opw-4751667 opw-4674533 Forward-Port-Of: odoo/enterprise#85992
Before this PR: When generating the Libro Giornale Journal Audit report as PDF, journal items with long descriptions would cause rendering issues. The Name column would expand excessively to accommodate the long text, resulting in the Debit and Credit columns being cropped or completely missing from the printed report as seen in below image.  After this PR: The Libro Giornale Journal Audit report no
Original PR description
Before this PR: When generating the Libro Giornale Journal Audit report as PDF, journal items with long descriptions would cause rendering issues. The Name column would expand excessively to accommodate the long text, resulting in the Debit and Credit columns being cropped or completely missing from the printed report as seen in below image.  After this PR: The Libro Giornale Journal Audit report now correctly handles journal items with long descriptions. The report template has been modified to ensure proper column width distribution, preventing the Name column from expanding excessively. The Debit and Credit columns are now consistently displayed in the PDF report regardless of description length.  OPW-4788257 Forward-Port-Of: odoo/enterprise#86049
**Steps to reproduce:** - Install Planning app - Set the type of view to Gantt - (Create a shift if there is none) - Click on `Publish` button - The period end date doesn't take the last day into account (time is 00:00) **Issue:** Gantt model default `_buildMetaData` computation behavior was changed multiple times during previous refactoring: Previously used: ``` export function computeRange(scale, date) { let start = date; let end = date; if (scale === "week") {
Original PR description
**Steps to reproduce:** - Install Planning app - Set the type of view to Gantt - (Create a shift if there is none) - Click on `Publish` button - The period end date doesn't take the last day into…
**Steps to reproduce:**
- Install Planning app
- Set the type of view to Gantt
- (Create a shift if there is none)
- Click on `Publish` button
- The period end date doesn't take the last day into account (time is 00:00)
**Issue:**
Gantt model default `_buildMetaData` computation behavior was changed multiple times
during previous refactoring:
Previously used:
```
export function computeRange(scale, date) {
let start = date;
let end = date;
if (scale === "week") {
// startOf("week") does not depend on locale and will always give the
// "Monday" of the week... (ISO standard)
const { weekStart } = localization;
const weekday = start.weekday < weekStart ? weekStart - 7 : weekStart;
start = start.set({ weekday }).startOf("day");
end = start.plus({ weeks: 1, days: -1 }).endOf("day");
} else {
start = start.startOf(scale);
end = end.endOf(scale);
}
return { start, end };
}
```
Which became:
```
export function getRangeFromDate(rangeId, date) {
const startDate = localStartOf(date, rangeId);
const stopDate = startDate.plus({ [rangeId]: 1 }).minus({ day: 1 });
return { focusDate: date, startDate, stopDate, rangeId };
}
```
**Fix:**
This issue was partially fixed in 18.3, removed my changes and used the
given solution while ensuring the last day is fully taken into account by using:
`adjustedEndDate.endOf('day')`
related commits:
https://github.com/odoo/enterprise/commit/d18639785e622d97102227103d62ddb3a2716be6
https://github.com/odoo/enterprise/commit/c175a848369057cc69596737dcd9d21dd24c9d5c
issue partially fixed with:
https://github.com/odoo/enterprise/commit/d32646024fd2e9aadb0cf4022eeda94296922684
opw-4580458
Forward-Port-Of: odoo/enterprise#85920
Forward-Port-Of: odoo/enterprise#85608This PR updates the `l10n_pe_withhold_code` field in the `product.template` model for the Peruvian localization (`l10n_pe_edi`) to reflect the latest official SUNAT withholding catalog (as of April 2025). Changes were made directly in the `fields.Selection`, maintaining compatibility with existing data by preserving obsolete values used in previous versions. This update helps ensure consistency with current SUNAT requirements while avoiding potential issues in existing databases. Refere
Original PR description
This PR updates the `l10n_pe_withhold_code` field in the `product.template` model for the Peruvian localization (`l10n_pe_edi`) to reflect the latest official SUNAT withholding catalog (as of April 2025). Changes were made directly in the `fields.Selection`, maintaining compatibility with existing data by preserving obsolete values used in previous versions. This update helps ensure consistency with current SUNAT requirements while avoiding potential issues in existing databases. Reference: [Reglas de Validación actualizado al 21/04/2025 (Nuevo)](https://cpe.sunat.gob.pe/sites/default/files/inline-files/AjustesValidacionesCPEv20250421.xlsx) Forward-Port-Of: odoo/enterprise#85917
In this PR: - Added Bank of Slovenia to the list of currency providers. - Fetches exchange rates using the official API and updates the rates. Task-4794271 Forward-Port-Of: odoo/enterprise#85575
Original PR description
In this PR: - Added Bank of Slovenia to the list of currency providers. - Fetches exchange rates using the official API and updates the rates. Task-4794271 Forward-Port-Of: odoo/enterprise#85575