Daily updates from Odoo
Monday, November 24, 2025
186 changes
12 changes
Resolved issues and error corrections
This fix ensures subscription deliveries are properly counted even when a product is returned. As a result, the delivered quantity on the sales order stays accurate, which improves billing and subscription tracking.
Original PR description
**Steps to reproduce** - Create a new subscription using a subscription product. Confirm it. - Run the "Sale Subscription: generate recurring invoices and payments" scheduled action to generate the delivery. Validate the delivery. - Return the delivery and validate the return. - Issue: the delivered quantity of the sale order line is not updated. **Cause** Currently, we consider a move as related to a subscription period based on the `date_deadline` field (see _get_outgoing_incoming_moves). Since `_prepare_procurement_values` is not called when creating a return, the `date_deadline` is not set on the return moves. **Change** The returns linked to a move in a subcription period will be conisdered for the computation of the delivered quantities. opw-5136406 Forward-Port-Of: odoo/enterprise#99734 Forward-Port-Of: odoo/enterprise#98690
This update stops Gantt rows grouped by read-only fields from being moved in a way that would change those protected values. It reduces the risk of users accidentally modifying important data while dragging items in planning views.
Original PR description
Issue ----- Gantt view's drag & drop allows the user to change the value of readonly fields if they are stored. E.G. in the Planning view of MRP, grouped by Work Center > Product, dragging & dropping…
Issue ----- Gantt view's drag & drop allows the user to change the value of readonly fields if they are stored. E.G. in the Planning view of MRP, grouped by Work Center > Product, dragging & dropping can change the product of the WO if the user is not careful and drops the WO on top of another product's WO. Steps to reproduce ----- - Have 2 products - Create a MO for product 1 with a WO at work center 1, plan it - Create a MO for product 2 with a WO at work center 2, plan it - Got to Manufacturing, Planning, Planning by Work Center - Add a custom group (by product) - Drag the WO of WC2 and drop it on top of the other WO > Both the WC and the product of the second WO change Cause ----- The example problem is only for versions 17.0 & 18.0 where the `product_id` field of `mrp.workorder` is both readonly and stored. https://github.com/odoo/odoo/blob/31e46a841b38de0f99beb1844f985bc670621486/addons/mrp/models/mrp_workorder.py#L34 While the user cannot change the field value manually, automatic actions such as a gantt view drag & drop can change its' value by passing it to `write` since the field is stored. This does not pose any problem for related fields that are not stored. More broadly, gantt views should not ignore the `readonly` attribute of fields. Solution ----- Add a new `o_gantt_readonly` class to all cells of rows grouped by a readonly field - and their "child" rows. For example, if the grouping is done by "Work Center > Product > Quality Check" and "Product" is readonly, rows grouped by either "Product" or "Quality Check" will be marked as readonly. When the user drags a pill, dynamically remove the class from cells of the same "child group". The class will then be added back upon pill drop. ----- Ticket: opw-4875366 Forward-Port-Of: odoo/enterprise#100088 Forward-Port-Of: odoo/enterprise#94166
This update fixes how Swiss Federal Tax Administration exchange rates are dated when imported. Rates will now be stored with the correct publication date, which prevents them from appearing a day off and keeps exchange rate records more accurate for users.
Original PR description
Steps to reproduce: - Select exchange service: [CH] Federal Tax Administration (FTA). - Add USD (or other currencies). - Fetch the new rates (click on the reload icon). Issue: Rates are returned for yesterday but stored with today’s date. Cause: The request fetches yesterday’s rates and we store the date using `gueltigkeit` (valid-until). FTA rates are typically valid until the next morning (around 7 AM) or until the next business day on weekends. Example (fetch on Fri 14.11.2025): <gueltigkeit>15.11.2025,16.11.2025,17.11.2025</gueltigkeit> For example, if we fetch on the 14th (Friday), we get this value: <gueltigkeit>15.11.2025,16.11.2025,17.11.2025</gueltigkeit> Solution: Query the FTA endpoint using today’s date and store the rate date from `datum` (publication date) instead of `gueltigkeit`. opw-5189127 Forward-Port-Of: odoo/enterprise#100046
This fix restores the expected payment instruction used for standard ISO 20022 payments. As a result, non-SEPA transfers will again be processed with the correct service level by default, reducing the risk of rejected or mishandled payments.
Original PR description
Since commit [[1]], the Service Level is set to NURG only when using the specific `iso20022_se` payment method. However, the previous expected behavior was to set the Service Level to NURG automatically whenever a payment was in a non-EUR currency or targeted a non-EU IBAN, regardless of the specific ISO20022 variant. This commit restores the logic to set the Service Level to NURG for all standard ISO20022 payments. This fix doesn't check anymore if a payment is in non-EUR currency or target a non-EU IBAN. Using iso_20022 activate it by default. opw-5095483 [1]: https://github.com/odoo/enterprise/commit/67593e5ff9b3a5187a1535bc8fc89590b4c9401e Forward-Port-Of: odoo/enterprise#100061
This update prevents an error that could appear when opening a partner record after uninstalling certain e-invoicing modules. It now safely clears the related e-invoice format so users can continue working without encountering a traceback.
Original PR description
Before this fix, if you uninstalled this module and navigated to any partner that had a e-invoice format defined by this module, you'd have a traceback. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr @moduon MT-12168 OPW-5172861 Forward-Port-Of: odoo/odoo#235301 Forward-Port-Of: odoo/odoo#232297
This fixes an error that could appear when opening the Accounts Coverage Report for Spain balance sheet reports. The report data is now loaded correctly, preventing the traceback and allowing users to view the report without interruption.
Original PR description
Step to reproduce: - for Spain localization, in developer mode: - Go to Balance sheet - Select either report 'Balance sheet - SMEs (ES) or Complete Balance Sheet (ES) - Click on the parameters button…
Step to reproduce:
- for Spain localization, in developer mode:
- Go to Balance sheet
- Select either report 'Balance sheet - SMEs (ES) or Complete Balance Sheet (ES)
- Click on the parameters button
- Click on the "Accounts Coverage Report"
Observation:
- we receive a traceback
```
psycopg2.errors.InvalidTextRepresentation: invalid input syntax for type integer: "%(balance_sheet_11700_account)d"
LINE 1: ...ccount_tag" WHERE ("account_account_tag"."id" IN ('%(balance...
```
Cause:
- few records used a wrong format style for values of `domain_formula`
- These faulty domains were not [evaluated](https://github.com/odoo/odoo/blob/2070e30c540a066fb80851527e5e54e97fb23c4b/addons/account/models/account_report.py#L450-L453), but inserted into database as is.
- when browsing account.tag record using these domain, record ids were expected,
instead we got its string representation , causing traceback
https://github.com/odoo/enterprise/blob/8fa6fb27d2a79ee299361b281dc82182feee5860/account_reports/models/account_report.py#L5679-L5680
Fix:
- we fix the data file, which is properly evaluated and stored in database.
- Manifest's data file order is changed, so that account tags is loaded first.
opw-5224114
Forward-Port-Of: odoo/enterprise#99865
Forward-Port-Of: odoo/enterprise#98745The web test runner now logs a warning instead of raising an error when no tests are found, which avoids unnecessary failures. It also records the results of all top-level test suites at the end of each run in headless mode, making automated test runs easier to review.
Original PR description
[FIX] web: Hoot - remove error if no tests This commit replaces the error thrown if there is no test found by a log. --- [IMP] web: Hoot - log root suites at end of run This commit makes the unit test runner log all root suites results after each test run, only in headless mode. Forward-Port-Of: odoo/odoo#236647
This update brings the spreadsheet component to a newer version and includes several fixes that improve everyday use. It addresses issues like scrolling on iOS, editing behavior, button sizing, and better handling of read-only views and sheet names with spaces.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/4f8366721 [REL] 18.4.18 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/4f8366721 [REL] 18.4.18 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/83c393f62 [FIX] Spreadsheet: fix scroll on ios [Task: 5270869](https://www.odoo.com/odoo/2328/tasks/5270869) https://github.com/odoo/o-spreadsheet/commit/948c51e86 [FIX] headers_overlay: disable interaction in read-only mode [Task: 5182854](https://www.odoo.com/odoo/2328/tasks/5182854) https://github.com/odoo/o-spreadsheet/commit/3ce3152f7 [FIX] spreadsheet: fix button height [Task: 5253888](https://www.odoo.com/odoo/2328/tasks/5253888) https://github.com/odoo/o-spreadsheet/commit/16b2e4115 [FIX] composer: change mode to editing when composer cursor selection changes [Task: 5226615](https://www.odoo.com/odoo/2328/tasks/5226615) https://github.com/odoo/o-spreadsheet/commit/e4b3ebef8 [FIX] SidePanel: reset initial props on Model change [Task: 5059484](https://www.odoo.com/odoo/2328/tasks/5059484) https://github.com/odoo/o-spreadsheet/commit/62dfe8a88 [FIX] composer: Enter/Tab confirm when assistant is force-closed [Task: 5153666](https://www.odoo.com/odoo/2328/tasks/5153666) https://github.com/odoo/o-spreadsheet/commit/2a23dddf4 [FIX] reference_type: add single quotes for sheet names with spaces [Task: 5244798](https://www.odoo.com/odoo/2328/tasks/5244798) Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya (rmbh) <rmbh@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com> Co-authored-by: Marceline Thomas (matho) <matho@odoo.com>
The image editor now handles image load events more reliably by using the correct built-in event handling in the template. This prevents leftover listeners from building up and helps avoid small performance or behavior issues when working with images.
Original PR description
In `AutoResizeImage`, a listener for the load of an image was made with a `useEffect`, but it was not correctly cleaning. It should return a function that remove the listener not directly call `removeListener`, and it should remove the same listener that was added. This commit uses the `t-on-load` in the template instead. task-5190618
This update prevents the Italian "Libro Giornale" template from affecting all journal reports. As a result, regular journal exports keep their journal names and other companies’ reports are no longer altered by this local customization.
Original PR description
The custom template for the report "Libro Giornale" was neither inheriting with primary neither using conditions on the country code. Therefore, the xpaths applied were for all the journal reports, whatever the company. For example, when exporting the regular journal report, the names of the journals no longer appeared once the module l10n_it_reports was installed on a database. opw-5217520 Forward-Port-Of: odoo/enterprise#100045
This update fixes an error that could appear when users changed the website header to the Search Bar template and then selected Center or Right alignment. It removes incorrect view references so the alignment options work normally again in the Website Editor.
Original PR description
Problem: When setting Center or Right alignment while using the Search Bar Header Template, an error message will occur due to an invalid xpath in the respective views. Purpose: Remove the invalid xpaths. Steps to Reproduce on Runbot: 1. Enter the Website Editor. 2. Select the Header and change the Template to Search Bar. 3. Attempt to change the Alignment to Center or Right. opw-5150348
This fix prevents date placeholders from appearing to the wrong signer in multi-signer documents. It helps each person see only the fields that are meant for them, reducing confusion during the signing process.
Original PR description
Version: - saas-18.3 Steps to reproduce: - Add date fields for multiple signers. - When the first signer signs, the date placeholder for the next signer becomes visible to the first signer. Issue: - Date fields for next signers were showing placeholders to the current signer. Fix: - Added a condition to only set the placeholder when it has a valid value. Impact: - Ensures date placeholders are visible only to the correct signer. task-5218970 Forward-Port-Of: odoo/enterprise#98256
17 changes
Resolved issues and error corrections
This fix ensures that when a delivered subscription product is returned, the system updates the subscription’s delivered quantity correctly. This matters because billing and service tracking stay accurate after product returns.
Original PR description
**Steps to reproduce** - Create a new subscription using a subscription product. Confirm it. - Run the "Sale Subscription: generate recurring invoices and payments" scheduled action to generate the delivery. Validate the delivery. - Return the delivery and validate the return. - Issue: the delivered quantity of the sale order line is not updated. **Cause** Currently, we consider a move as related to a subscription period based on the `date_deadline` field (see _get_outgoing_incoming_moves). Since `_prepare_procurement_values` is not called when creating a return, the `date_deadline` is not set on the return moves. **Change** The returns linked to a move in a subcription period will be conisdered for the computation of the delivered quantities. opw-5136406 Forward-Port-Of: odoo/enterprise#99734 Forward-Port-Of: odoo/enterprise#98690
This update fixes an error that could appear when opening the Accounts Coverage Report for Spanish balance sheet reports. It ensures the report data is stored correctly and loaded in the right order, so users can view the report without encountering a traceback.
Original PR description
Step to reproduce: - for Spain localization, in developer mode: - Go to Balance sheet - Select either report 'Balance sheet - SMEs (ES) or Complete Balance Sheet (ES) - Click on the parameters button…
Step to reproduce:
- for Spain localization, in developer mode:
- Go to Balance sheet
- Select either report 'Balance sheet - SMEs (ES) or Complete Balance Sheet (ES)
- Click on the parameters button
- Click on the "Accounts Coverage Report"
Observation:
- we receive a traceback
```
psycopg2.errors.InvalidTextRepresentation: invalid input syntax for type integer: "%(balance_sheet_11700_account)d"
LINE 1: ...ccount_tag" WHERE ("account_account_tag"."id" IN ('%(balance...
```
Cause:
- few records used a wrong format style for values of `domain_formula`
- These faulty domains were not [evaluated](https://github.com/odoo/odoo/blob/2070e30c540a066fb80851527e5e54e97fb23c4b/addons/account/models/account_report.py#L450-L453), but inserted into database as is.
- when browsing account.tag record using these domain, record ids were expected,
instead we got its string representation , causing traceback
https://github.com/odoo/enterprise/blob/8fa6fb27d2a79ee299361b281dc82182feee5860/account_reports/models/account_report.py#L5679-L5680
Fix:
- we fix the data file, which is properly evaluated and stored in database.
- Manifest's data file order is changed, so that account tags is loaded first.
opw-5224114
Forward-Port-Of: odoo/enterprise#98745This update lets Canadian users choose a different start date for annual reporting when their fiscal year does not end on December 31. It helps ensure year-end filings and closings are calculated on the correct dates, aligning with allowed government rules.
Original PR description
If a user from CA has a fiscal year on something other than the 31/12 and needs to return annually, he can't do his closing on the right bounds. We now allow CA to show the field to be able to shift it, as government allow it. Later, we will change the heuristic to be smarter to show it as soon as it may cause issue. opw-5193999 Forward-Port-Of: odoo/enterprise#100006
This update restores the correct payment message setting for standard ISO 20022 payments, so non-SEPA transfers are handled as expected again. It ensures payments that need the NURG service level are marked correctly by default, helping avoid processing issues with international payments.
Original PR description
Since commit [[1]], the Service Level is set to NURG only when using the specific `iso20022_se` payment method. However, the previous expected behavior was to set the Service Level to NURG automatically whenever a payment was in a non-EUR currency or targeted a non-EU IBAN, regardless of the specific ISO20022 variant. This commit restores the logic to set the Service Level to NURG for all standard ISO20022 payments. This fix doesn't check anymore if a payment is in non-EUR currency or target a non-EU IBAN. Using iso_20022 activate it by default. opw-5095483 [1]: https://github.com/odoo/enterprise/commit/67593e5ff9b3a5187a1535bc8fc89590b4c9401e Forward-Port-Of: odoo/enterprise#100061
This update stops users from accidentally changing locked information when they drag and drop items in Gantt views. It is especially important in planning screens, where moving a task could previously alter a read-only field such as the product on a work order.
Original PR description
Issue ----- Gantt view's drag & drop allows the user to change the value of readonly fields if they are stored. E.G. in the Planning view of MRP, grouped by Work Center > Product, dragging & dropping…
Issue ----- Gantt view's drag & drop allows the user to change the value of readonly fields if they are stored. E.G. in the Planning view of MRP, grouped by Work Center > Product, dragging & dropping can change the product of the WO if the user is not careful and drops the WO on top of another product's WO. Steps to reproduce ----- - Have 2 products - Create a MO for product 1 with a WO at work center 1, plan it - Create a MO for product 2 with a WO at work center 2, plan it - Got to Manufacturing, Planning, Planning by Work Center - Add a custom group (by product) - Drag the WO of WC2 and drop it on top of the other WO > Both the WC and the product of the second WO change Cause ----- The example problem is only for versions 17.0 & 18.0 where the `product_id` field of `mrp.workorder` is both readonly and stored. https://github.com/odoo/odoo/blob/31e46a841b38de0f99beb1844f985bc670621486/addons/mrp/models/mrp_workorder.py#L34 While the user cannot change the field value manually, automatic actions such as a gantt view drag & drop can change its' value by passing it to `write` since the field is stored. This does not pose any problem for related fields that are not stored. More broadly, gantt views should not ignore the `readonly` attribute of fields. Solution ----- Add a new `o_gantt_readonly` class to all cells of rows grouped by a readonly field - and their "child" rows. For example, if the grouping is done by "Work Center > Product > Quality Check" and "Product" is readonly, rows grouped by either "Product" or "Quality Check" will be marked as readonly. When the user drags a pill, dynamically remove the class from cells of the same "child group". The class will then be added back upon pill drop. ----- Ticket: opw-4875366 Forward-Port-Of: odoo/enterprise#100088 Forward-Port-Of: odoo/enterprise#94166
This update makes the testing tool less disruptive when no tests are found by logging a message instead of raising an error. It also improves test run reporting in headless mode by logging root suite results at the end of each run, making automated test output easier to review.
Original PR description
[FIX] web: Hoot - remove error if no tests This commit replaces the error thrown if there is no test found by a log. --- [IMP] web: Hoot - log root suites at end of run This commit makes the unit test runner log all root suites results after each test run, only in headless mode. Forward-Port-Of: odoo/odoo#236647
This update fixes several issues in Uruguay’s vendor bill synchronization, including correctly handling multiple documents in one XML file and improving how imported bills are identified. It also keeps a copy of the uploaded XML with the bill and makes automatic processing more stable by running in smaller batches.
Original PR description
1) Update l10n_uy_edi translations. 2) When an uruguayan xml file is uploaded on a purchase journal it could contain the information of more than one CFE but before this commit only the first CFE was…
1) Update l10n_uy_edi translations. 2) When an uruguayan xml file is uploaded on a purchase journal it could contain the information of more than one CFE but before this commit only the first CFE was processed. Now all the CFEs are processed. 3) Add suffix '-manual' for new vendor edi documents uuid that are created by drag and drop xml file. 4) Create xml attachment in the edi document if it is created by drag and drop xml file. 5) Add suffix '-notification' for new vendor edi documents uuid that are created by 'UY: Create vendor bills (sync from Uruware)'. 6) Cron is run by batches (size=10). 7) Add tests. The suffixes -manual and -notification are used to differentiate between EDI documents generated manually and those generated automatically. This is useful to determine whether the document was created by a user or by an automated process, also helps users identify its origin more easily and also it is useful for debugging and tracking purposes. Task Adhoc side: 43467 Task latam side: 1355 Forward-Port-Of: odoo/enterprise#99308 Forward-Port-Of: odoo/enterprise#86829
Exchange rates imported from the Swiss Federal Tax Administration now use the correct publication date. This prevents rates from appearing to belong to the wrong day, improving the accuracy and reliability of currency conversions.
Original PR description
Steps to reproduce: - Select exchange service: [CH] Federal Tax Administration (FTA). - Add USD (or other currencies). - Fetch the new rates (click on the reload icon). Issue: Rates are returned for yesterday but stored with today’s date. Cause: The request fetches yesterday’s rates and we store the date using `gueltigkeit` (valid-until). FTA rates are typically valid until the next morning (around 7 AM) or until the next business day on weekends. Example (fetch on Fri 14.11.2025): <gueltigkeit>15.11.2025,16.11.2025,17.11.2025</gueltigkeit> For example, if we fetch on the 14th (Friday), we get this value: <gueltigkeit>15.11.2025,16.11.2025,17.11.2025</gueltigkeit> Solution: Query the FTA endpoint using today’s date and store the rate date from `datum` (publication date) instead of `gueltigkeit`. opw-5189127 Forward-Port-Of: odoo/enterprise#100046
This change updates the recorded state code for Odisha in India from "OR" to "OD". It helps ensure customer addresses and related documents, such as sales orders, use the correct official code.
Original PR description
**Steps to reproduce:** 1. Install the `Contacts` module. 2. Go to Contacts > Create a new contact. 3. Select country India, and state Odisha. 4. Create a sales order using the newly created contact. **Issue:** As per [Government of India](https://www.iso.org/obp/ui/#iso:code:3166:IN), the state code was officially changed from "OR" to "OD" in 2023. However, Odoo still uses the outdated code. <img width="407" height="163" alt="image" src="https://github.com/user-attachments/assets/1631a831-f455-4a51-886f-7e4ed691add0" /> **Solution:** Update the name of the state from "OR" to "OD" in state records. **opw-4935633** Forward-Port-Of: odoo/odoo#234697
This update brings the spreadsheet component to a newer version with several fixes to improve day-to-day use. It addresses issues like button sizing, accidental interaction in read-only spreadsheets, editing mode behavior, and side panel refresh behavior.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/57b11b85d [REL] 18.3.27 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/57b11b85d [REL] 18.3.27 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/6487f6d0e [FIX] spreadsheet: fix button height [Task: 5253888](https://www.odoo.com/odoo/2328/tasks/5253888) https://github.com/odoo/o-spreadsheet/commit/8ec4b1cd1 [FIX] headers_overlay: disable interaction in read-only mode [Task: 5182854](https://www.odoo.com/odoo/2328/tasks/5182854) https://github.com/odoo/o-spreadsheet/commit/e076525ba [FIX] composer: change mode to editing when composer cursor selection changes [Task: 5226615](https://www.odoo.com/odoo/2328/tasks/5226615) https://github.com/odoo/o-spreadsheet/commit/e8d8bcd9b [FIX] SidePanel: reset initial props on Model change [Task: 5059484](https://www.odoo.com/odoo/2328/tasks/5059484) Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya (rmbh) <rmbh@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com> Co-authored-by: Marceline Thomas (matho) <matho@odoo.com>
The mobile Documents board now displays folders and documents more cleanly, removing awkward empty space when both appear together. It also improves the Recent folder so items use the available width properly and can be scrolled to view all documents. This makes browsing documents on phones smoother and easier to use.
Original PR description
This commit fix several issue in kanban mobile view: - When a folder has folders AND documents, there is a huge gap between the two because of the kanban ghost records. - In the 'Recent' folder, folders and documents doesn't take all width. - In the 'Recent' folder, we can't scroll to see all the documents. Task-4963198 Forward-Port-Of: odoo/enterprise#99810 Forward-Port-Of: odoo/enterprise#90647
This change fixes an issue where certain POS items, including gift cards and e-wallet products, could fail to appear on the product screen. By aligning the product category setup, the POS now loads the expected items correctly and avoids test failures in the runbot environment.
Original PR description
Before this commit: ======================= The `whiteboard_pen` product had no assigned category, while the main POS configuration was limited to specific categories. As a result, `whiteboard_pen` was not displayed on the product screen. When no products were loaded, special products like gift cards and e-wallets also not shown,showing the `Load Sample` button instead of products. This caused tour tests expecting gift cards on the screen to fail. After this commit: ====================== Assigned the same product category to whiteboard_pen as used in the POS configuration. This ensures that the product appears on the product screen and special products like gift cards also load properly, preventing the tour test from failing. Runbot Error: 233434, 233435
This change ensures the Italian "Libro Giornale" report only applies its custom layout to the correct country. As a result, the standard journal report keeps showing journal names properly for other companies and reports are no longer affected by the Italian customization.
Original PR description
The custom template for the report "Libro Giornale" was neither inheriting with primary neither using conditions on the country code. Therefore, the xpaths applied were for all the journal reports, whatever the company. For example, when exporting the regular journal report, the names of the journals no longer appeared once the module l10n_it_reports was installed on a database. opw-5217520 Forward-Port-Of: odoo/enterprise#100045
This fix prevents an error that could appear when a duplicated delivery is changed to a different product and then returned. It ensures stock cost calculations only use records for the same product, so users can validate deliveries and returns without unexpected failures.
Original PR description
When duplicating a delivery linked to a sale order and changing the product on the duplicated picking, validating the return could lead to an error when validating the original picking of the initial…
When duplicating a delivery linked to a sale order and changing the product on the duplicated picking, validating the return could lead to an error when validating the original picking of the initial product. The issue occurred because the average price computation was mixing stock moves of different products when consuming valuation layers, leading to a UoM singleton error. Steps to reproduce: - Create storable products P1 and P2: - Category: AVCO - P1 UoM: Unit - P2 UoM: Dozen - Create a sale order with 1 unit of P1 - Confirm the SO - Open the generated picking - Duplicate it → a new picking is created and still linked to the same SO - Change the product on the duplicated picking to P2 - Confirm and validate it - Create a return on this picking and validate it - Go back to the original picking of P1 and try to validate it Problem: A UserError is raised due to mixed products in the average price computation, resulting in a “Expected singleton: uom.uom(...)” This fix ensures that average price is computed only using stock moves belonging to the same product. opw-5027089 Forward-Port-Of: odoo/odoo#236706
This fix updates several Philippine custom tax tags so they are properly treated as negative amounts in tax reporting. It prevents tax reports from showing incorrect totals for affected transactions.
Original PR description
This commit sets tax_negate to true to (-QAPA, -QAPB, -SAWTA, -SAWTB). They were missing and impacted a tax report falsely. opw-5157090 Forward-Port-Of: odoo/odoo#236725
This change fixes an issue that could cause the system to run out of memory when registering payments for many invoices at once. It makes the payment validation step more efficient so large batches can be processed more reliably.
Original PR description
### Description: When trying to register a payment for multiple invoices, it is possible to trigger an Out Of Memory error. This is caused by the constraint `_validate_taxes_country`, calling the compute `_compute_tax_country_id` on all of the moves. To avoid that, we just retrieve the field we need rather than fetching everything. ### Reference: opw-5152687 Forward-Port-Of: odoo/odoo#235749
This change prevents Point of Sale from getting stuck in a repeated update when both the default preset and the available presets are empty. It makes the system handle this empty-state case safely, avoiding a freeze during configuration updates.
Original PR description
The condition `config.default_preset_id.id not in config.available_preset_ids.ids` is equivalent to True when both default_preset_id and available_preset_ids are empty. This triggers an infinite loop as assigning with `|=` triggers a nested write. 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#231378
4 changes
Resolved issues and error corrections
This fix ensures that when a delivered subscription item is returned, the subscription’s delivered quantity is updated correctly. It prevents billing and delivery figures from staying out of sync after a return, which helps keep subscription records accurate.
Original PR description
**Steps to reproduce** - Create a new subscription using a subscription product. Confirm it. - Run the "Sale Subscription: generate recurring invoices and payments" scheduled action to generate the delivery. Validate the delivery. - Return the delivery and validate the return. - Issue: the delivered quantity of the sale order line is not updated. **Cause** Currently, we consider a move as related to a subscription period based on the `date_deadline` field (see _get_outgoing_incoming_moves). Since `_prepare_procurement_values` is not called when creating a return, the `date_deadline` is not set on the return moves. **Change** The returns linked to a move in a subcription period will be conisdered for the computation of the delivered quantities. opw-5136406 Forward-Port-Of: odoo/enterprise#99734 Forward-Port-Of: odoo/enterprise#98690
This update fixes how ISO 20022 payments are labeled so they follow the expected non-SEPA handling again. As a result, international or non-standard payments are prepared correctly without requiring a specific payment variant.
Original PR description
Since commit [[1]], the Service Level is set to NURG only when using the specific `iso20022_se` payment method. However, the previous expected behavior was to set the Service Level to NURG automatically whenever a payment was in a non-EUR currency or targeted a non-EU IBAN, regardless of the specific ISO20022 variant. This commit restores the logic to set the Service Level to NURG for all standard ISO20022 payments. This fix doesn't check anymore if a payment is in non-EUR currency or target a non-EU IBAN. Using iso_20022 activate it by default. opw-5095483 [1]: https://github.com/odoo/enterprise/commit/67593e5ff9b3a5187a1535bc8fc89590b4c9401e Forward-Port-Of: odoo/enterprise#100061
This fix ensures exchange rates imported from the Swiss Federal Tax Administration are saved with the correct publication date. It prevents rates from appearing one day off, which helps keep accounting and currency conversions accurate.
Original PR description
Steps to reproduce: - Select exchange service: [CH] Federal Tax Administration (FTA). - Add USD (or other currencies). - Fetch the new rates (click on the reload icon). Issue: Rates are returned for yesterday but stored with today’s date. Cause: The request fetches yesterday’s rates and we store the date using `gueltigkeit` (valid-until). FTA rates are typically valid until the next morning (around 7 AM) or until the next business day on weekends. Example (fetch on Fri 14.11.2025): <gueltigkeit>15.11.2025,16.11.2025,17.11.2025</gueltigkeit> For example, if we fetch on the 14th (Friday), we get this value: <gueltigkeit>15.11.2025,16.11.2025,17.11.2025</gueltigkeit> Solution: Query the FTA endpoint using today’s date and store the rate date from `datum` (publication date) instead of `gueltigkeit`. opw-5189127 Forward-Port-Of: odoo/enterprise#100046
The Canadian reporting settings now let users choose a start date other than December 31 when their fiscal year does not match the calendar year. This helps businesses file annual reports using the correct date range and avoid closing-period errors.
Original PR description
If a user from CA has a fiscal year on something other than the 31/12 and needs to return annually, he can't do his closing on the right bounds. We now allow CA to show the field to be able to shift it, as government allow it. Later, we will change the heuristic to be smarter to show it as soon as it may cause issue. opw-5193999 Forward-Port-Of: odoo/enterprise#100006
27 changes
Resolved issues and error corrections
Returned deliveries for subscription products are now correctly counted when calculating delivered quantities. This prevents subscription sale orders from showing inaccurate delivery status after a customer return is processed.
Original PR description
**Steps to reproduce** - Create a new subscription using a subscription product. Confirm it. - Run the "Sale Subscription: generate recurring invoices and payments" scheduled action to generate the delivery. Validate the delivery. - Return the delivery and validate the return. - Issue: the delivered quantity of the sale order line is not updated. **Cause** Currently, we consider a move as related to a subscription period based on the `date_deadline` field (see _get_outgoing_incoming_moves). Since `_prepare_procurement_values` is not called when creating a return, the `date_deadline` is not set on the return moves. **Change** The returns linked to a move in a subcription period will be conisdered for the computation of the delivered quantities. opw-5136406 Forward-Port-Of: odoo/enterprise#99734 Forward-Port-Of: odoo/enterprise#98690
Uninstalling the Databases module no longer leaves behind a project access rule that refers to removed database fields. This prevents an error during uninstall and helps keep the system stable when customers remove the module.
Original PR description
Currently an error occurs when user uninstalls the `databases` module. **Steps to replicate:** * Install and uninstall databases **Error:** `ValueError: Invalid field project.project.database_hosting…
Currently an error occurs when user uninstalls the `databases` module.
**Steps to replicate:**
* Install and uninstall databases
**Error:**
`ValueError: Invalid field project.project.database_hosting in condition ('database_hosting', '=', False)`
**Root cause:**
* This error happens because when the user installs `databases`, record rule [1] is created by the module and it overrides rule [2]. Later, when databases is uninstalled, rule [1] is still there, but it tries to access the field 'database_hosting' [3], which was removed during the uninstall. Since that field no longer exists, it causes an error.
**Solution:**
* Revert the domain back to the one defined in project module.
[1]:
https://github.com/odoo/enterprise/blob/437f724c182ddf22bd3df9a7e1582ffa4b29e33b/databases/security/databases_security.xml#L43-L46
[2]:
https://github.com/odoo/odoo/blob/9333df06e15134df92efed765cf95db38c0dfede/addons/project/security/project_security.xml#L57-L62
[3]:
https://github.com/odoo/enterprise/blob/437f724c182ddf22bd3df9a7e1582ffa4b29e33b/databases/models/project_project.py#L17-L26
sentry-7035410943
Forward-Port-Of: odoo/enterprise#99987The subscription customer portal now uses the billing periods configured in the system instead of relying on a fixed list. This prevents errors when businesses add custom billing options, such as daily subscriptions, and makes future changes easier to support.
Original PR description
Problem -------- In v18.0, the day billing period was removed from the sale.subscription.plan model. For our use case, we require daily subscriptions, so we added this value back to the…
Problem -------- In v18.0, the day billing period was removed from the sale.subscription.plan model. For our use case, we require daily subscriptions, so we added this value back to the billing_period_unit selection field via inheritance. However, this customization causes an error (a KeyError) when accessing the customer portal at /my/subscriptions/<int:order_id>. This is because the controller logic relies on a hardcoded list of periods and does not account for the new custom "day" value. - Screenshot Order with plan Daily: <img width="1246" height="483" alt="image" src="https://github.com/user-attachments/assets/5dc5ca0d-a2f2-434d-8183-15a0424d9f34" /> - Screenshot when trying to get in order on the website: <img width="1250" height="776" alt="image" src="https://github.com/user-attachments/assets/5b10504e-71e2-4c13-8611-39e8a41e05d1" /> Proposed Solution -------- This PR improves the subscription portal by dynamically retrieving billing periods instead of using a hardcoded list. The portal now reads the available options directly from the billing_period_unit field's selection (i.e., self.env['sale.subscription.plan']._fields['billing_period_unit'].selection). This improves maintainability, as future changes to the field's selection will be automatically reflected without requiring code modifications. This makes the portal robust and automatically compatible with any custom periods added via inheritance. - <img width="1331" height="752" alt="image" src="https://github.com/user-attachments/assets/4f7be6c3-d96b-4525-8e23-6e1323adabde" /> Forward-Port-Of: odoo/enterprise#100084 Forward-Port-Of: odoo/enterprise#99207
Budget values in accounting reports now show the same rounded amount when viewed and edited. This prevents confusing extra decimal digits from appearing in budget input fields, making report updates clearer for users.
Original PR description
**Issue:** When editing budget values in the Profit & Loss report, users see floating-point precision errors (e.g., 0.999999 instead of 1.00) in the input field, even though the display shows the…
**Issue:** When editing budget values in the Profit & Loss report, users see floating-point precision errors (e.g., 0.999999 instead of 1.00) in the input field, even though the display shows the correct rounded value. **Steps to Reproduce:** 1. Go to Accounting → Reporting → Profit and Loss Report 2. Enable Column Budget 3. Enter budget value: 5.00 4. Save → Value displays correctly as: 5.00 ✓ 5. Click to edit the same cell 6. Input field shows: 5.000000000174602 ✗ (instead of 5.00) 7. Save without changes → Display shows: 5.00 ✓ 8. Edit again → Still shows: 5.000000000174602 ✗ **Root Cause:** The frontend reads from cell['no_format'] when populating the edit input field. This field receives the raw column_value which contains floating-point precision errors accumulated during aggregation operations. While the display formatting applies rounding, the edit mode receives the unrounded value. **Solution:** Round column_value using float_round() immediately after detecting an editable budget column, before the value is used anywhere. This ensures both the display path and edit path receive the same properly rounded value based on the company's currency decimal places. opw-5158862 Forward-Port-Of: odoo/enterprise#98478
DHL shipments and return labels now use the field names and date-time format expected by DHL. This prevents failed label creation when customer references or return shipments are involved, improving reliability for DHL deliveries.
Original PR description
Currently, when creating a DHL shipment with an export declaration that includes a customer reference, there is a misspelling of the field 'recipientReference' as 'recepientReference'. This causes…
Currently, when creating a DHL shipment with an export declaration that includes a customer reference, there is a misspelling of the field 'recipientReference' as 'recepientReference'. This causes validation errors when communicating with the DHL API. In addition, the datetime format used for the planned shipping date and time does not conform to the expected format specified by DHL. Steps to reproduce spelling issue: 1. Create a Sales Order with a customer reference and a deliverable product. 2. Validate the SO. 3. Go to the delivery, select DHL as carrier, and confirm. → Error: Validation error #/content/exportDeclaration: extraneous key [recepientReference] is not permitted. Steps to reproduce datetime issue: 1. Create a delivery using the DHL carrier. 2. Confirm the delivery. 3. Return the delivery. 4. Click "Print Return Label". → Error: Bad request #/plannedShippingDateAndTime is not well formatted (expected format: '2010-02-11T17:10:09 GMT+01:00'). Official DHL documentation: https://developer.dhl.com/sites/default/files/2025-11/dpdhl-express-api-3.1.1_swagger.yaml opw-5024363 Forward-Port-Of: odoo/enterprise#98981
Invoice reports now keep section amounts aligned correctly when the Country of Origin column is displayed. This prevents confusing invoice layouts and helps users read totals accurately.
Original PR description
Before this commit when having section and the country of origin column, the amount was is the wrong place. The solution is to add 1 to the line colspan when display origin is set. opw-5333624 Forward-Port-Of: odoo/enterprise#100012
This update removes duplicate internal methods identified by automated code checks. It helps keep the affected HR payroll, salary contract, and expense processing areas easier to maintain, with no expected change for day-to-day users.
Original PR description
found by pylint 4 Forward-Port-Of: odoo/enterprise#100078 Forward-Port-Of: odoo/enterprise#99809
The fix ensures the Italian “Libro Giornale” PDF layout only applies to the intended Italian journal report. This prevents regular journal report exports from losing journal names when the Italian reporting module is installed, improving report reliability for affected companies.
Original PR description
The custom template for the report "Libro Giornale" was neither inheriting with primary neither using conditions on the country code. Therefore, the xpaths applied were for all the journal reports, whatever the company. For example, when exporting the regular journal report, the names of the journals no longer appeared once the module l10n_it_reports was installed on a database. opw-5217520 Forward-Port-Of: odoo/enterprise#100045
Swiss Federal Tax Administration exchange rates are now saved with the correct publication date instead of a later validity date. This prevents rates from appearing under the wrong day, improving accuracy for companies using Swiss currency rate updates.
Original PR description
Steps to reproduce: - Select exchange service: [CH] Federal Tax Administration (FTA). - Add USD (or other currencies). - Fetch the new rates (click on the reload icon). Issue: Rates are returned for yesterday but stored with today’s date. Cause: The request fetches yesterday’s rates and we store the date using `gueltigkeit` (valid-until). FTA rates are typically valid until the next morning (around 7 AM) or until the next business day on weekends. Example (fetch on Fri 14.11.2025): <gueltigkeit>15.11.2025,16.11.2025,17.11.2025</gueltigkeit> For example, if we fetch on the 14th (Friday), we get this value: <gueltigkeit>15.11.2025,16.11.2025,17.11.2025</gueltigkeit> Solution: Query the FTA endpoint using today’s date and store the rate date from `datum` (publication date) instead of `gueltigkeit`. opw-5189127 Forward-Port-Of: odoo/enterprise#100046
Quality checks in the barcode app now only appear for items that were actually picked or scanned, including the correct serial or lot-tracked unit. This prevents staff from being asked to complete checks for products that are not being received yet, reducing confusion and avoiding blocked validations.
Original PR description
*: {stock_barcode_,}quality_control #### There are two issues addressed in this PR: 1) In the barcode app, quality checks triggered at validation includes quality checks related to unpicked products.…
*: {stock_barcode_,}quality_control
#### There are two issues addressed in this PR:
1) In the barcode app, quality checks triggered at validation includes quality checks related to unpicked products.
2) Quality check related to product without set lots are triggered.
### Steps to reproduce:
- Create a storable products product A tracked by SN
- Create a control points of type pass/fail on receipts control by
quantity on product A
- Create and confirm a receipt with a move 2 x product A
- Open the receipt in the barcode app
- Scan product A > Scan SN001
- Click on Quality Check
#### > Both QC's are displayed to be processed
### Expected behavior:
Only the QC related to the scanned SN should be processed as it is the only unit that will be moved at validation.
### Cause of the issue:
Only picked move lines are considered to be processed in the barcode app. However, the `check_quality` triggered by clicking on the quality check button only check if the move related to the move line is picked:
https://github.com/odoo/enterprise/blob/9fe45b673c02a98e6dd6b3997f19a2018a76df09/quality_control/models/stock_picking.py#L64-L72
### Fix:
Relying the `barcode_trigger` context key will ensure a uniform behavior between the QC's displayed to be processed directly from the QC button and from these displayed at validation since this context key is already used at validation:
https://github.com/odoo/enterprise/blob/9fe45b673c02a98e6dd6b3997f19a2018a76df09/stock_barcode/static/src/models/barcode_model.js#L581-L590
Note we all changed the default return value of the `check_quality` from `False` to `True` here:
https://github.com/odoo/enterprise/blob/9fe45b673c02a98e6dd6b3997f19a2018a76df09/quality_control/models/stock_picking.py#L71-L73
because this method is called in the `pre_action_done_hook` during the `button_validate` of the picking:
https://github.com/odoo/odoo/blob/a97d3c772001f4f0b9df66d28c1c8f19358898e0/addons/stock/models/stock_picking.py#L1415-L1421
https://github.com/odoo/enterprise/blob/9fe45b673c02a98e6dd6b3997f19a2018a76df09/quality_control/models/stock_picking.py#L91-L96
and since a result that is not `True` is expected to be an action that should be processed prior to validation, returning `False` would make it impossible to proceed with a validation in case the `check_quality` is called and there is no check to process.
Task: 4716252
opw-5010764
Forward-Port-Of: odoo/enterprise#99799
Forward-Port-Of: odoo/enterprise#99565Hong Kong payroll now respects manually entered Average Daily Wage amounts instead of replacing them with an automatic calculation. This prevents incorrect payslip results when payroll teams need to use a specific manually provided value.
Original PR description
The current logic is incorrect and while it does pick the ADW from the input line, it then proceeds to override that amount with the calculated one. In cases where the manual input is needed, this is a big issue. Forward-Port-Of: odoo/enterprise#100262
German Datev exports now use the manually adjusted tax totals from vendor bills instead of the original calculated amount. This helps ensure exported accounting files match what users see in the ledger and reduces reconciliation errors.
Original PR description
- Install Accounting and `l10n_de_reports` - Switch to a German company - Create a bill: * Price: `100.00` * Taxes: `19%` - Edit the tax total with the pencil button - Go to "Accounting / Reporting /…
- Install Accounting and `l10n_de_reports` - Switch to a German company - Create a bill: * Price: `100.00` * Taxes: `19%` - Edit the tax total with the pencil button - Go to "Accounting / Reporting / Audit Reports / General Ledger" => The tax amount is the one that has been edited manually - Download `Datev DATA (zip)` - Open `EXTF_accounting_entries.csv` file The total amount in the file is the one before the edition of the tax amount. The Datev data depends on `price_total` field of the invoice lines, but this field is not updated when the tax amount is edited manually. We now check the total by adding `price_total` of each invoice line and the total amount defined in `tax_totals` field. If there is a difference, compute the delta for each tax group and split it between all the lines where a tax of that group is used. Ticket [link](https://www.odoo.com/odoo/project.task/4951488) opw-4951488 Forward-Port-Of: odoo/enterprise#100244 Forward-Port-Of: odoo/enterprise#98684
Spanish balance sheet users can now open the Accounts Coverage Report without encountering an error. The underlying report data is loaded in the correct order and stored properly, improving reliability for Spain localization reporting.
Original PR description
Step to reproduce: - for Spain localization, in developer mode: - Go to Balance sheet - Select either report 'Balance sheet - SMEs (ES) or Complete Balance Sheet (ES) - Click on the parameters button…
Step to reproduce:
- for Spain localization, in developer mode:
- Go to Balance sheet
- Select either report 'Balance sheet - SMEs (ES) or Complete Balance Sheet (ES)
- Click on the parameters button
- Click on the "Accounts Coverage Report"
Observation:
- we receive a traceback
```
psycopg2.errors.InvalidTextRepresentation: invalid input syntax for type integer: "%(balance_sheet_11700_account)d"
LINE 1: ...ccount_tag" WHERE ("account_account_tag"."id" IN ('%(balance...
```
Cause:
- few records used a wrong format style for values of `domain_formula`
- These faulty domains were not [evaluated](https://github.com/odoo/odoo/blob/2070e30c540a066fb80851527e5e54e97fb23c4b/addons/account/models/account_report.py#L450-L453), but inserted into database as is.
- when browsing account.tag record using these domain, record ids were expected,
instead we got its string representation , causing traceback
https://github.com/odoo/enterprise/blob/8fa6fb27d2a79ee299361b281dc82182feee5860/account_reports/models/account_report.py#L5679-L5680
Fix:
- we fix the data file, which is properly evaluated and stored in database.
- Manifest's data file order is changed, so that account tags is loaded first.
opw-5224114
Forward-Port-Of: odoo/enterprise#99865
Forward-Port-Of: odoo/enterprise#98745Swiss payroll test coverage was adjusted so it no longer depends on accounting configuration being present. This helps ensure payroll validation and related declarations can be tested more reliably without unnecessary accounting setup requirements.
Original PR description
Forward-Port-Of: odoo/enterprise#99853 Forward-Port-Of: odoo/enterprise#98672
This update fixes how default filing deadlines are configured for multiple country-specific Intrastat and tax return reports. It helps ensure each company uses the correct return deadline settings, reducing configuration errors in localized reporting.
Original PR description
The fields default_deadline_periodicity and default_deadline_days_delay have been added on the return type model because they handle the company dependant property of their associated field, and they are the ones that should be used in the xml. Forward-Port-Of: odoo/enterprise#99793
This fix restores the expected handling of ISO20022 bank payments by applying the normal service level to standard non-SEPA payment flows. It helps ensure international or non-standard currency payments are generated in the format banks expect, reducing the risk of payment processing issues.
Original PR description
Since commit [[1]], the Service Level is set to NURG only when using the specific `iso20022_se` payment method. However, the previous expected behavior was to set the Service Level to NURG automatically whenever a payment was in a non-EUR currency or targeted a non-EU IBAN, regardless of the specific ISO20022 variant. This commit restores the logic to set the Service Level to NURG for all standard ISO20022 payments. This fix doesn't check anymore if a payment is in non-EUR currency or target a non-EU IBAN. Using iso_20022 activate it by default. opw-5095483 [1]: https://github.com/odoo/enterprise/commit/67593e5ff9b3a5187a1535bc8fc89590b4c9401e Forward-Port-Of: odoo/enterprise#100061
Fixes an issue where edited or deleted partners on multi-line bank statements could be recalculated unexpectedly during reconciliation. This helps accounting users keep their intended partner assignments and reduces incorrect reconciliation changes.
Original PR description
Before this commit, when having multiple lines in a statement line. By default, all the lines have a partner since we compute the partner depending of other lines. But in the case of an edit or a delete we don't want to recompute. What was happening is that the partner keep getting recomputed on the other lines even the one that was previously edited. This commit will add a context key when using the reconcile button to recompute the partners. opw-5179670 Forward-Port-Of: odoo/enterprise#99999
Fixed an issue that caused point-of-sale scales using fallback connectivity to send rapidly multiplying requests after each weight change. This prevents request failures and keeps scale weighing reliable during checkout.
Original PR description
Steps to reproduce: 1. Setup a scale in a POS. 2. Disable the WebRTC connection so that longpolling is used. 3. Try to weigh with the scale in the POS. Expected behaviour: - There is one HTTP call per weight event, and the scale continues to work no matter how many times the weight changes. Actual behaviour: - The amount of HTTP calls doubles every time the weight changes. Before long, a limit is reached and the requests start to fail. This behaviour was due to the `addListener` method being called again inside the listener callback, calling the poll method. The original poll call would also start to poll again, leading to two polling requests. The fix is to check in the poll method that listening has not restarted during the handling of the callback. If so, we don't try to poll again.
Spreadsheet version history tiles now use colors with better contrast in dark mode, making past versions easier to read. Related spreadsheet document tests were also updated to match the latest resizing behavior, helping keep the feature reliable after the spreadsheet engine update.
The update corrects an internal test for Belgian SODA accounting imports by ensuring the needed analytic setup is created during the test. This helps keep automated quality checks reliable and prevents false failures in development pipelines.
Original PR description
This https://github.com/odoo/enterprise/commit/e01d865d922d47d8ba1638a48e6d481363fc1f04 introduced an error while running the test without enough analytic accounts. We instead manually create the analytic plan and accounts required for the test. runbot-234353
The VoIP keypad input now uses a better font size when it is empty, so its placeholder text displays correctly. This makes the calling interface clearer and avoids confusing clipped guidance for users entering a number.
Original PR description
In https://github.com/odoo/enterprise/pull/99877, the font size for the Keypad input was fixed to a value suitable for most cases. Still it is problematic when the input is empty: the placeholder is not fully displayed. Here we set an appropriate value for the font size in that later case.
This fixes an issue in the Sign app where a signer could see date placeholders meant for later signers. The change helps keep the signing experience clearer and avoids confusion during multi-signer document workflows.
Original PR description
Version: - saas-18.3 Steps to reproduce: - Add date fields for multiple signers. - When the first signer signs, the date placeholder for the next signer becomes visible to the first signer. Issue: - Date fields for next signers were showing placeholders to the current signer. Fix: - Added a condition to only set the placeholder when it has a valid value. Impact: - Ensures date placeholders are visible only to the correct signer. task-5218970 Forward-Port-Of: odoo/enterprise#100252 Forward-Port-Of: odoo/enterprise#98256
French financial reports now include balances from deprecated income and expense accounts when calculating retained earnings. This prevents balance sheets from becoming unbalanced for companies moving from the 2024 French chart of accounts to the legally required 2025 version.
Original PR description
[FIX] l10n_fr_reports: unbalanced Balance Sheet when coming from the 2024 CoA https://github.com/odoo/odoo/commit/8f3a86925e0301c15ca93b64d6237b69a534d71a introduced a new version of the French CoA,…
[FIX] l10n_fr_reports: unbalanced Balance Sheet when coming from the 2024 CoA https://github.com/odoo/odoo/commit/8f3a86925e0301c15ca93b64d6237b69a534d71a introduced a new version of the French CoA, legally mandatory starting in 2025. Doing so, it also adapted the P&L and BS reports accordingly. However, it did not take into account the fact that some deprecated account codes would disappear from the P&L, causing the BS to be unbalanced when computing the retained earnings (by calling the P&L with a forced date_scope to run it on the full history). We fix that by reinjecting the balance of the missing Income and Expense accounts in the computation of the BS's Retained Earnings line. opw-5212801 =============================================================== [FIX] l10n_fr_reports : add new accounts in P&L Backport from https://github.com/odoo/enterprise/commit/eb35916f4f5a45e0c11919e0ee1a16e0caee010f , which was done in master for 18.2, but should have targetted older versions as well. Forward-Port-Of: odoo/enterprise#100116 Forward-Port-Of: odoo/enterprise#100077
Opening the translation widget for invoice terms and conditions no longer triggers an error when those terms are made translatable by GCC invoice localization. This helps users edit translated invoice text without interruption.
Original PR description
With l10n_gcc_invoice, the narration field on invoice (the Terms & Condition part) becomes translatable. However, when opening the translation widget, a traceback happens as the "fields" (the text-to-fill part) to load don't have a specified name. opw-5269869 Forward-Port-Of: odoo/enterprise#100003
Composite financial reports now apply the analytic grouping filter consistently to their underlying sections. This ensures the filter appears in the interface when enabled, giving users the expected reporting options without extra setup.
Original PR description
When using a composite report whose sections aren't used independently, enabling that filter on the composite report needs to enable it on their sections as well, else it won't show in the UI. This is the standard behavior for all report filters. Forward-Port-Of: odoo/enterprise#100135
This fixes an internal payroll accounting test so it uses the right company when checking account-related partner settings. It helps ensure Belgian payroll accounting remains reliable in multi-company situations, reducing the risk of incorrect accounting configuration going unnoticed.
Original PR description
We are now testing for consistency between the company properties set on partners related to accounting values. opw-5127901 Forward-Port-Of: odoo/enterprise#100192
This update prevents an error when Stripe webhook events include virtual cards with no shipping details. It helps expense card events process reliably instead of failing on missing shipping information.
Original PR description
Add a fix to a pattern of error found in webhook events where virtual cards whose shipping value is "None" would be accessed as dict Forward-Port-Of: odoo/enterprise#100291
31 changes
Resolved issues and error corrections
When a subscription delivery is returned, the delivered quantity on the related sales line is now updated correctly. This keeps subscription invoicing and delivery tracking accurate after returns, avoiding overcounting shipped items.
Original PR description
**Steps to reproduce** - Create a new subscription using a subscription product. Confirm it. - Run the "Sale Subscription: generate recurring invoices and payments" scheduled action to generate the delivery. Validate the delivery. - Return the delivery and validate the return. - Issue: the delivered quantity of the sale order line is not updated. **Cause** Currently, we consider a move as related to a subscription period based on the `date_deadline` field (see _get_outgoing_incoming_moves). Since `_prepare_procurement_values` is not called when creating a return, the `date_deadline` is not set on the return moves. **Change** The returns linked to a move in a subcription period will be conisdered for the computation of the delivered quantities. opw-5136406 Forward-Port-Of: odoo/enterprise#99734 Forward-Port-Of: odoo/enterprise#98690
This change makes sure split payments in Point of Sale are recorded against the same customer record as the related order, even when the sale is made under a child contact. It prevents mismatches in accounting and helps keep customer statements balanced and accurate.
Original PR description
### Description Before this commit, when split payment was enabled for a payment method and a PoS order was assigned to a child contact, the accounting move for the payment was linked to the child contact, while the order move lines were linked to the parent contact. This inconsistency resulted in unbalanced customer statements. This commit ensures that the payment move is assigned to the same accounting partner as the order lines. ### How to reproduce: * Create a child contact (res.partner). * Activate "Identify Customer" (split payment) for a payment method. * Open the session. * Create an order assigning the child contact and pay using this method * Close the session. * Accounting payment for this session will be assigned to child partner opw-5121710 Forward-Port-Of: odoo/odoo#237028 Forward-Port-Of: odoo/odoo#235951
This change corrects how manually entered average daily wage values are handled in Hong Kong payroll. When a user provides a manual amount, the system now keeps that value instead of overwriting it with a calculated one, avoiding incorrect payslip results.
Original PR description
The current logic is incorrect and while it does pick the ADW from the input line, it then proceeds to override that amount with the calculated one. In cases where the manual input is needed, this is a big issue.
This fix ensures delivery slips show the right ordered quantity when an order is partially delivered and a backorder is created, especially for make-to-order items. Previously, the slip could incorrectly show the remaining quantity as if it were the original order quantity, which was confusing for operations and customers.
Original PR description
Steps: - Create an MTO product. - Create an SO for 10 units and confirm. - Deliver 5 on the first picking, validate, and create the backorder. - Print the delivery slip of the first (done) picking.…
Steps:
- Create an MTO product.
- Create an SO for 10 units and confirm.
- Deliver 5 on the first picking, validate, and create the backorder.
- Print the delivery slip of the first (done) picking.
Before:
- MTO: Ordered = 5, Delivered = 5, Remaining = 5.
- Normal product: Ordered = 10, Delivered = 5, Remaining = 5.
Cause:
- _get_aggregated_properties builds a display key including the description:
line_key = f"{product.id}_{product.display_name}_{description}_{uom.id}_{move.product_packaging_id}".
- In MTO, backorder delivery moves are regenerated and sale_stock recomputes description_picking from the SO line, so backorders no longer share the same line_key and previous quantities are not merged.
Fix:
- Introduce _get_group_key_from_move to group sale moves by sale_line_id (fallback: product + UoM).
- For each picking, compute Ordered as the SO line quantity (in report UoM) minus quantities delivered on preceding pickings for that group.
- Keep the original line_key-based behavior for non sale-related moves and for empty moves.
opw-5112467This change makes spreadsheet features use the translation context meant for spreadsheets, instead of falling back to generic terms. As a result, labels and messages in spreadsheets should appear more accurately and consistently for users in translated languages.
Original PR description
When we give the translation function to the o-spreadsheet library, we give `_t` which doesn't have the translation context which means all translations fallback on the general translated terms instead of using the spreadsheet specific terms. 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
The Swiss Federal Tax Administration exchange rates are now saved with the correct date. This prevents rates from appearing one day off when users refresh currency rates.
Original PR description
Steps to reproduce: - Select exchange service: [CH] Federal Tax Administration (FTA). - Add USD (or other currencies). - Fetch the new rates (click on the reload icon). Issue: Rates are returned for yesterday but stored with today’s date. Cause: The request fetches yesterday’s rates and we store the date using `gueltigkeit` (valid-until). FTA rates are typically valid until the next morning (around 7 AM) or until the next business day on weekends. Example (fetch on Fri 14.11.2025): <gueltigkeit>15.11.2025,16.11.2025,17.11.2025</gueltigkeit> For example, if we fetch on the 14th (Friday), we get this value: <gueltigkeit>15.11.2025,16.11.2025,17.11.2025</gueltigkeit> Solution: Query the FTA endpoint using today’s date and store the rate date from `datum` (publication date) instead of `gueltigkeit`. opw-5189127 Forward-Port-Of: odoo/enterprise#100046
The Belgian VAT return now includes the client nihil option again, which had been lost after a system change. This makes the export more accurate by only enabling the option when it is truly applicable, based on whether any customer exceeded the yearly invoicing threshold of 250€.
Original PR description
Since the new return system, the client nihil option that was inside the vat export xml was removed. We used a too simple mechanism which only checks if the tax report was empty or not. This was completely wrong, now we added the checkbox back for finer tuning and we precomputed it. The precompute is checking if any partner is exceeding 250€ invoiced for the current year. This commit adds a new module l10n_be_report_client_nihil which will be removed in master. It will be integrated with l10n_be_reports directly. task-5217079
This update prevents the website theme editor from crashing when a Google font is available only in one weight, such as 700. It ensures the editor requests the correct font variant so users can reopen and adjust their theme normally after saving.
Original PR description
Steps to reproduce: =================== 1. Edit the website theme and set an external font, e.g., UnifrakturCook. 2. Save, exit, then reopen the editor and go to the Theme tab. → Traceback occurs. Cause: ====== Some Google Fonts (e.g., UnifrakturCook) only provide a single weight (700). When fetching the font, html_builder does not request a specific weight, so Google Fonts attempts to return the default set, including 300. Since that weight does not exist for these fonts, Google Fonts responds with an error, leading to the traceback. This issue is same to the one fixed here: https://github.com/odoo/odoo/commit/f843c591c0377e0dab1a1f0cfaca36c1981c8880 but the fix was not ported during refactoring. opw-5259891 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#236556
This update corrects the company used in a payroll accounting test so it matches the expected accounting setup. It helps ensure company-linked accounting data is validated consistently, reducing the risk of hidden configuration issues.
Original PR description
We are now testing for consistency between the company properties set on partners related to accounting values. opw-5127901
This fix ensures that when a route is chosen directly on a sales order line, Odoo keeps that choice instead of falling back to the product’s default route. This prevents the wrong supply process from being triggered, so orders now follow the intended buying or manufacturing flow.
Original PR description
**Issue** A route explicitly set on a sale order line is ignored: the system falls back to product-level routes. **Steps to reproduce** 1. Activate multi-route. 2. Unarchive the MTO route. 3. Create…
**Issue** A route explicitly set on a sale order line is ignored: the system falls back to product-level routes. **Steps to reproduce** 1. Activate multi-route. 2. Unarchive the MTO route. 3. Create a product. 4. Enable MTO + Manufacture on the product. 5. Create a sale order using this product. 6. Set the Buy route on the SO line. 7. Confirm the order. → A Manufacturing Order is created instead of a PO. **Cause** This regression originates from the changes introduced in https://github.com/odoo-dev/odoo/commit/2713876dbc70d3984e584a9037a2206dcda4e84a, where `propagate_warehouse_id` was removed and associated info began to be propagated through stock moves instead. In 19.0, the route of the rule started being injected into the move: https://github.com/odoo/odoo/blob/af4365421bc7ba990420789c12c98270d723fa1a/addons/stock/models/stock_rule.py#L367 To avoid infinite loops (e.g., WH1 resupplying WH2 and vice-versa), `_prepare_procurement_values` then filters out these injected routes: https://github.com/odoo/odoo/blob/af4365421bc7ba990420789c12c98270d723fa1a/addons/stock/models/stock_move.py#L1674-L1683 Unfortunately, whenever the `location_id` has a warehouse, the filtering applies to all `route_ids`, including those explicitly set by the user (e.g., on a sale order line) As soon as `route_ids` is cleared, `_get_rule` stops considering SO-line routes (first priority): https://github.com/odoo/odoo/blob/dab7c5821e627bc7120660778a288cb521a223d3/addons/stock/models/stock_rule.py#L599C13-L600C89 and falls back to product routes: https://github.com/odoo/odoo/blob/dab7c5821e627bc7120660778a288cb521a223d3/addons/stock/models/stock_rule.py#L604 **Solution** Revert the workaround that injected the rule's `route_id` into the move (added because `propagate_warehouse_id` no longer existed), and instead propagate the warehouse information directly in the inter-company case. Concretely: - Stop injecting the rule's `route_id` into the move: https://github.com/odoo/odoo/blob/af4365421bc7ba990420789c12c98270d723fa1a/addons/stock/models/stock_rule.py#L367 - Always keep the user's `route_ids` intact, no more filtering. - Explicitly propagate the warehouse coming from the rule in the inter-company case, restoring the intent of `propagate_warehouse_id`: https://github.com/odoo/odoo/blob/a7b504a3f5845feff8b676cc02ecf2d7b3489b7f/addons/stock/models/stock_move.py#L1655-L1656 This preserves manually-set routes (such as on SO lines) while still ensuring inter-company transfers work reliably. opw-5170290
The Spain localization balance sheet reports now open the Accounts Coverage Report without errors. The underlying report data was corrected and loaded in the right order so the report can display properly for users.
Original PR description
Step to reproduce: - for Spain localization, in developer mode: - Go to Balance sheet - Select either report 'Balance sheet - SMEs (ES) or Complete Balance Sheet (ES) - Click on the parameters button…
Step to reproduce:
- for Spain localization, in developer mode:
- Go to Balance sheet
- Select either report 'Balance sheet - SMEs (ES) or Complete Balance Sheet (ES)
- Click on the parameters button
- Click on the "Accounts Coverage Report"
Observation:
- we receive a traceback
```
psycopg2.errors.InvalidTextRepresentation: invalid input syntax for type integer: "%(balance_sheet_11700_account)d"
LINE 1: ...ccount_tag" WHERE ("account_account_tag"."id" IN ('%(balance...
```
Cause:
- few records used a wrong format style for values of `domain_formula`
- These faulty domains were not [evaluated](https://github.com/odoo/odoo/blob/2070e30c540a066fb80851527e5e54e97fb23c4b/addons/account/models/account_report.py#L450-L453), but inserted into database as is.
- when browsing account.tag record using these domain, record ids were expected,
instead we got its string representation , causing traceback
https://github.com/odoo/enterprise/blob/8fa6fb27d2a79ee299361b281dc82182feee5860/account_reports/models/account_report.py#L5679-L5680
Fix:
- we fix the data file, which is properly evaluated and stored in database.
- Manifest's data file order is changed, so that account tags is loaded first.
opw-5224114
Forward-Port-Of: odoo/enterprise#99865
Forward-Port-Of: odoo/enterprise#98745This update stops users from accidentally changing protected values when dragging items in Gantt views. It makes rows grouped by read-only fields behave as non-editable, so planning data stays consistent and unintended changes are avoided.
Original PR description
Issue ----- Gantt view's drag & drop allows the user to change the value of readonly fields if they are stored. E.G. in the Planning view of MRP, grouped by Work Center > Product, dragging & dropping…
Issue ----- Gantt view's drag & drop allows the user to change the value of readonly fields if they are stored. E.G. in the Planning view of MRP, grouped by Work Center > Product, dragging & dropping can change the product of the WO if the user is not careful and drops the WO on top of another product's WO. Steps to reproduce ----- - Have 2 products - Create a MO for product 1 with a WO at work center 1, plan it - Create a MO for product 2 with a WO at work center 2, plan it - Got to Manufacturing, Planning, Planning by Work Center - Add a custom group (by product) - Drag the WO of WC2 and drop it on top of the other WO > Both the WC and the product of the second WO change Cause ----- The example problem is only for versions 17.0 & 18.0 where the `product_id` field of `mrp.workorder` is both readonly and stored. https://github.com/odoo/odoo/blob/31e46a841b38de0f99beb1844f985bc670621486/addons/mrp/models/mrp_workorder.py#L34 While the user cannot change the field value manually, automatic actions such as a gantt view drag & drop can change its' value by passing it to `write` since the field is stored. This does not pose any problem for related fields that are not stored. More broadly, gantt views should not ignore the `readonly` attribute of fields. Solution ----- Add a new `o_gantt_readonly` class to all cells of rows grouped by a readonly field - and their "child" rows. For example, if the grouping is done by "Work Center > Product > Quality Check" and "Product" is readonly, rows grouped by either "Product" or "Quality Check" will be marked as readonly. When the user drags a pill, dynamically remove the class from cells of the same "child group". The class will then be added back upon pill drop. ----- Ticket: opw-4875366 Forward-Port-Of: odoo/enterprise#100088 Forward-Port-Of: odoo/enterprise#94166
This fix ensures that date placeholders in signed documents only appear for the intended signer. It prevents one signer from seeing placeholder information meant for another, which helps avoid confusion during the signing process.
Original PR description
Version: - saas-18.3 Steps to reproduce: - Add date fields for multiple signers. - When the first signer signs, the date placeholder for the next signer becomes visible to the first signer. Issue: - Date fields for next signers were showing placeholders to the current signer. Fix: - Added a condition to only set the placeholder when it has a valid value. Impact: - Ensures date placeholders are visible only to the correct signer. task-5218970 Forward-Port-Of: odoo/enterprise#98256
This fix blocks saving a partner with a fiscal position that belongs to a different company. It helps avoid creating inconsistent customer/vendor records that would later fail when used on invoices.
Original PR description
It was possible to create a partner with a fiscal position from another company. Using this partner in an invoice would then raise the error like expected, but there is no reason to allow that configuration in the first place. opw-5127901
This change prevents editor placeholders from being inserted inside buttons and links. As a result, editable buttons like the product “Add to Cart” button keep their correct alignment and appearance when edited.
Original PR description
The "add to cart" button in the showcase view of products in website_sale is a block with `contenteditable=true` and a selection placeholder was inserted in it, messing up its layout (alignment). It shouldn't be there in the first place, as buttons and links are not meant to contain paragraphs. This commit prevents the insertion of selection placeholders in buttons and links. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change prevents a crash that could happen when users press backspace while editing the people assigned to a task in kanban views. It improves reliability during a common editing action and avoids an unexpected error screen.
Original PR description
How to reproduce: - Go to project tasks - Edit the list of people assigned to a task - Press backspace Current behavior: Traceback Expected behavior: No traceback task-5189783 Forward-Port-Of: odoo/odoo#235997 Forward-Port-Of: odoo/odoo#235489
This fix corrects planned hours in Timesheets / Planning analysis reports so shifts are only counted when they overlap with an employee’s working hours. This prevents hours from being incorrectly attributed to the wrong month when a shift ends outside business hours.
Original PR description
### Steps to reproduce: - Create an employee with fixed working schedule from 8 to 5 - Create a Planning shift for this employee that starts in a month and ends in the first day of the next month outside of working hours (e.g. Sept30th 8AM -> Oct1st 2AM) - Navigate to Timesheets / Planning analysis reports - Notice October has been taken into consideration in the report's planned hours ### Cause: The query we are using for the timesheets/planning report doesn't take working hours into consideration it only cares about the date. So if the shift ends in October 1st we are taking it into account whether it is inside working hours or not. ### Fix: Add a condition to the where clause to check the working hours and if the record lays in this period or not. opw-5089052 Forward-Port-Of: odoo/enterprise#96846
The website now hides mega menu links when the linked content is not available to the current visitor, both on desktop and mobile. This avoids empty dropdowns and keeps the navigation cleaner and less confusing for users.
Original PR description
Before this commit, when setting the mega menu content visibility, the navbar link would still appear even if the user does not have access to the mega menu content. This commit hides the navbar link for the mega menu in the mobile and desktop view when the user does not have access to the mega menu content, in order to prevent unnecessary elements in the navbar. Steps to reproduce the bug: - Add a mega menu element in the navbar - Open the mega menu - Set the mega menu content visibility to conditional (logged in) - Open the website while logged out (The mega menu link is here but the content is not displayed. However, the dropdown is still opened but it is empty.) task-3992066 Forward-Port-Of: odoo/odoo#235714 Forward-Port-Of: odoo/odoo#179454
This update prevents long product attribute text from spilling outside the product card in the catalog view. It keeps the product image and details neatly contained, improving the layout and making the interface more reliable for users.
Original PR description
Steps to reproduce: 1. Go to Products > Create a new product. 2. Add or create a new attribute with a long text value. 3. Go to Sales > Open any quotation. 4. In the sale order line, click on…
Steps to reproduce: 1. Go to Products > Create a new product. 2. Add or create a new attribute with a long text value. 3. Go to Sales > Open any quotation. 4. In the sale order line, click on "Catalog" and search for the created product. Issue: - The product image and attribute value text overflow outside the product card in the kanban view, causing layout misalignment and breaking the UI design. <img width="647" height="225" alt="image" src="https://github.com/user-attachments/assets/afc592bb-e25a-4d81-882b-0e7cc7ad1064" /> Cause: - The inner div containing the attribute text lacked overflow control, allowing long text to exceed the container width and pushing other elements. Solution: - Added the Bootstrap class `overflow-hidden` to the div element to ensure the image and text remain properly contained within the card layout. <img width="587" height="171" alt="image" src="https://github.com/user-attachments/assets/580ce1e5-42bd-4c2d-b6bf-14315759626d" /> opw-5222002 Forward-Port-Of: odoo/odoo#235680 Forward-Port-Of: odoo/odoo#235214
This update brings the spreadsheet component to a newer version with several bug fixes and small usability improvements. It addresses issues like scrolling on iOS, read-only behavior, formula handling, border display, and pivot/table limits, helping users work more reliably across devices and spreadsheet scenarios.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/f5bdbccc9 [REL] 19.0.11 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/f5bdbccc9 [REL] 19.0.11 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/6b7c8085a [FIX] Spreadsheet: fix scroll on ios [Task: 5270869](https://www.odoo.com/odoo/2328/tasks/5270869) https://github.com/odoo/o-spreadsheet/commit/1a9de79be [FIX] borders: preserve side borders when combining External and All [Task: 5270171](https://www.odoo.com/odoo/2328/tasks/5270171) https://github.com/odoo/o-spreadsheet/commit/42fa2e10a [FIX] headers_overlay: disable interaction in read-only mode [Task: 5182854](https://www.odoo.com/odoo/2328/tasks/5182854) https://github.com/odoo/o-spreadsheet/commit/dd6124730 [FIX] spreadsheet: fix button height [Task: 5253888](https://www.odoo.com/odoo/2328/tasks/5253888) https://github.com/odoo/o-spreadsheet/commit/c23e4925d [FIX] functions: ignore vectorized SUBTOTAL [Task: 5261987](https://www.odoo.com/odoo/2328/tasks/5261987) https://github.com/odoo/o-spreadsheet/commit/7edc3b50b [FIX] release: make lastest [](https://www.odoo.com/odoo/2328/tasks/) https://github.com/odoo/o-spreadsheet/commit/d59fcbf0d [FIX] composer: change mode to editing when composer cursor selection changes [Task: 5226615](https://www.odoo.com/odoo/2328/tasks/5226615) https://github.com/odoo/o-spreadsheet/commit/2b5cd53d1 [FIX] SidePanel: reset initial props on Model change [Task: 5059484](https://www.odoo.com/odoo/2328/tasks/5059484) https://github.com/odoo/o-spreadsheet/commit/7ae8c7666 [FIX] composer: Enter/Tab confirm when assistant is force-closed [Task: 5153666](https://www.odoo.com/odoo/2328/tasks/5153666) https://github.com/odoo/o-spreadsheet/commit/eccc2e02f [FIX] reference_type: add single quotes for sheet names with spaces [Task: 5244798](https://www.odoo.com/odoo/2328/tasks/5244798) https://github.com/odoo/o-spreadsheet/commit/b95dcae83 [FIX] pivot: raise pivot size limit [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya (rmbh) <rmbh@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com> Co-authored-by: Marceline Thomas (matho) <matho@odoo.com>
This update corrects how the Italian "Libro Giornale" report custom template is applied so it only affects the intended report and company context. As a result, regular journal reports keep showing journal names correctly even when the Italian localization is installed.
Original PR description
The custom template for the report "Libro Giornale" was neither inheriting with primary neither using conditions on the country code. Therefore, the xpaths applied were for all the journal reports, whatever the company. For example, when exporting the regular journal report, the names of the journals no longer appeared once the module l10n_it_reports was installed on a database. opw-5217520 Forward-Port-Of: odoo/enterprise#100045
This update prevents an error when opening the translation tool on invoice terms and conditions. It ensures translatable text fields load correctly, so users can translate invoice content without seeing a traceback.
Original PR description
With l10n_gcc_invoice, the narration field on invoice (the Terms & Condition part) becomes translatable. However, when opening the translation widget, a traceback happens as the "fields" (the text-to-fill part) to load don't have a specified name. opw-5269869
The link popup no longer shows an unwanted horizontal scrollbar. This makes the editor look cleaner and keeps the action buttons neatly within the popup area.
Original PR description
### Description of the issue/feature this PR addresses: - The link popover started showing a horizontal scrollbar after the addition of the wand (magic) icon. The combined horizontal margins (`mx-1`) on all action buttons caused the total width to slightly exceed the popover’s fixed size. ### Desired behavior after PR is merged: - To fix this, removed the `mx-1` margins and used `gap-2` with `justify-content-end`, ensuring all buttons fit within the defined width without triggering overflow. task-5261323 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
GCC invoices now display product line names in both English and Arabic again when both translations are available. This restores the expected bilingual presentation on printed invoices, helping customers read documents in the language they prefer.
Original PR description
### Issue: In GCC invoices the product names are not in both languages. ### Steps to reproduce: - Install "l10n_sa" and switch to a Saudi company - Have a product with its name translated in both…
### Issue: In GCC invoices the product names are not in both languages. ### Steps to reproduce: - Install "l10n_sa" and switch to a Saudi company - Have a product with its name translated in both English and Arabic - Create an invoice with this product, print it - The product name is only displayed in the language of the partner ### Cause: [This refactor](https://github.com/odoo/odoo/commit/1cddcab8b8626b34c437a51d320b0a3e4698dae7) removed the [part of the code responsible for displaying the product in both languages](https://github.com/odoo/odoo/blob/f9090fff6b3564c0d7ce2363a283b81ea10b3906/addons/l10n_gcc_invoice/views/report_invoice.xml#L286-L293). Now only `line.name` is displayed. ### Solution: We use the same XML architecture as in 18.0. As `line.name` is composed of several fields combined we need to check if the English and/or Arabic name is in `line.name` to display it or not. We use a replace in the xpath to add `dir="rtl"` on `line.name`. This ensure that when the partner lang is Arabic then `line.name` is displayed right to left. ### Note: `line.name` can contain other field like `description_sale` or `description_purchase` that will still be displayed in only one language. opw-5219783
This fix ensures table numbers appear correctly on receipts generated from self-orders in restaurant POS. It matters because staff and customers can now quickly identify the correct table on printed receipts, reducing confusion and mistakes.
Original PR description
**Steps to reproduce:** * Set up a `POS` with the restaurant module. * Go to `Configuration → Settings → Self Ordering` and set `QR Menu + Ordering`. * Set `Service At` to `Table` and `Pay After` to `Meal`. * Download QR codes from the `Get QR Codes` button in the POS restaurant interface. * Create a self-order by scanning the QR code. * Print the receipt. **Observed behavior:** When a self-order is created, the table number does not appear on the receipt, while orders created from the POS interface correctly display the table number. **Cause:** The receipt template only checks `table_id` to display the table number, but self-orders only have `self_ordering_table_id` set. **Fix:** Update the receipt header template and logic to also use `self_ordering_table_id` as a fallback when `table_id` is not set, ensuring the table number is correctly displayed on self-order receipts. opw-5250724
This update restores the expected payment rule for standard ISO 20022 payments, ensuring the correct service level is used by default. It helps avoid payment rejection or processing issues when sending payments outside the SEPA zone or in non-EUR currencies.
Original PR description
Since commit [[1]], the Service Level is set to NURG only when using the specific `iso20022_se` payment method. However, the previous expected behavior was to set the Service Level to NURG automatically whenever a payment was in a non-EUR currency or targeted a non-EU IBAN, regardless of the specific ISO20022 variant. This commit restores the logic to set the Service Level to NURG for all standard ISO20022 payments. This fix doesn't check anymore if a payment is in non-EUR currency or target a non-EU IBAN. Using iso_20022 activate it by default. opw-5095483 [1]: https://github.com/odoo/enterprise/commit/67593e5ff9b3a5187a1535bc8fc89590b4c9401e Forward-Port-Of: odoo/enterprise#100061
This fixes an issue where editing or deleting one line in a bank statement could unintentionally change the partner on other lines. The update keeps previously edited lines stable while still recalculating partner information when using the reconcile action, improving consistency for accounting users.
Original PR description
Before this commit, when having multiple lines in a statement line. By default, all the lines have a partner since we compute the partner depending of other lines. But in the case of an edit or a delete we don't want to recompute. What was happening is that the partner keep getting recomputed on the other lines even the one that was previously edited. This commit will add a context key when using the reconcile button to recompute the partners. opw-5179670 Forward-Port-Of: odoo/enterprise#99999
This update fixes a styling issue that could break page assets when the text editor app was not installed. It ensures the color picker keeps working and the interface remains usable in databases without that optional component.
Original PR description
Some scss variables used in color_picker.scss were defined in html_editor, thus breaking assets if html_editor was not installed. Steps to reproduce: - Create a new database - Uninstall html_editor - Scss assets are broken task-5230908 Issue: https://github.com/odoo/odoo/issues/234507
This update corrects how planning weeks are compared when schedules span multiple years. It prevents incorrect calculations in forecasted planning and helps ensure allocated hours are computed accurately.
Original PR description
Steps to reproduce: 1- install project_forecast 2- run test_creating_a_planning_shift_with_flexible_hours_allocated_hours_are_correct => test fail Source: When slots span across multiple years (e.g., 2019 → 2026), https://github.com/odoo/odoo/blob/f8f72b15598576f5870e49879e96fc5c127a6100/addons/resource/models/resource_resource.py#L338 this comparison becomes invalid, it compares week numbers only, ignoring the year. For instance, week 23 of 2019 is considered after week 18 of 2026. Fix: compare year and week
This change prevents the system from sending duplicate and growing numbers of network requests when a POS scale updates its weight over longpolling. It keeps the scale working reliably by ensuring only one request is active per event, which avoids request failures after repeated use.
Original PR description
Steps to reproduce: 1. Setup a scale in a POS. 2. Disable the WebRTC connection so that longpolling is used. 3. Try to weigh with the scale in the POS. Expected behaviour: - There is one HTTP call per weight event, and the scale continues to work no matter how many times the weight changes. Actual behaviour: - The amount of HTTP calls doubles every time the weight changes. Before long, a limit is reached and the requests start to fail. This behaviour was due to the `addListener` method being called again inside the listener callback, calling the poll method. The original poll call would also start to poll again, leading to two polling requests. The fix is to check in the poll method that listening has not restarted during the handling of the callback. If so, we don't try to poll again. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue that could cause the system to run out of memory when registering payments for multiple invoices at once. It improves reliability for large payment batches and helps avoid interruptions during accounting operations.
Original PR description
### Description: When trying to register a payment for multiple invoices, it is possible to trigger an Out Of Memory error. This is caused by the constraint `_validate_taxes_country`, calling the compute `_compute_tax_country_id` on all of the moves. To avoid that, we just retrieve the field we need rather than fetching everything. ### Reference: opw-5152687 Forward-Port-Of: odoo/odoo#235749
6 changes
Resolved issues and error corrections
This change ensures invoice lines created from quotation templates display product details in the same consistent way as regular sales orders. As a result, the product name and description now appear correctly separated in the invoice PDF, improving readability and avoiding confusion.
Original PR description
### Issue: In this issue, when a quotation template is used in sale order, the end line is missing between name and description in the invoice pdf. #### Steps to reproduce: 1- Install a db with sale…
### Issue: In this issue, when a quotation template is used in sale order, the end line is missing between name and description in the invoice pdf. #### Steps to reproduce: 1- Install a db with sale and invoicing installed 2- Create a quotation template, and add a description in the line. 3- Create a quotation with the created template. 4- Confirm the order and create an invoice for the sale order. 5- Print the pdf, as seen the name and description are shown in the same line, while if the sale order was created without a template, we would have seen the description from product in the next line. ### Cause: There is a mismatch between `line.name` when it's from template and when it's from product itself, causing this issue. In the case, the line is not coming from template we have: https://github.com/odoo/odoo/blob/aaad780e897e941a3d5cf9b3a881252907ba266a/addons/sale/models/sale_order_line.py#L405-L416 in which: https://github.com/odoo/odoo/blob/aaad780e897e941a3d5cf9b3a881252907ba266a/addons/sale/models/sale_order_line.py#L432-L435 https://github.com/odoo/odoo/blob/aaad780e897e941a3d5cf9b3a881252907ba266a/addons/product/models/product_product.py#L852-L861 Which means the name will be ```python product_id.display_name + product_id.description_sale + line._get_sale_order_line_multiline_description_variants() ``` While when the quotation is coming from template the name is: ```python template_line.name + line._get_sale_order_line_multiline_description_variants() ``` As `template_line.name` is the template line description, we can add the `product_id.display_name` in `_compute_name` so both logic match. opw-5130171
This change ensures related number fields use the same database type as their source field when they have decimal precision settings. It prevents unnecessary recalculations during upgrades and avoids mismatches that could affect data storage and performance.
Original PR description
**Steps to Reproduce:** 1. create test ``Float`` field in model ``A`` with ``digits`` args 2. create ``Many2One`` field with comodel ``A`` and then create Float Field in ``B Model`` with related…
**Steps to Reproduce:** 1. create test ``Float`` field in model ``A`` with ``digits`` args 2. create ``Many2One`` field with comodel ``A`` and then create Float Field in ``B Model`` with related ``A`` model test and store True **Issue:** 1. ``column_type`` for both model table will be different. For ``test field in model A`` the ``column_type`` will be ``numeric``. But for the related field ``column_type`` ``float`` it should be ``numeric``. This happen because the @lazy_propery it hold the ``column_type`` which is ``float8`` and other related attributes from ``setup_related`` before that ``_digits`` have the null value. So, from [here](https://github.com/odoo-dev/odoo/blob/a9398502260fa57573b88fd62ca3f554e0685c7b/odoo/fields.py#L772) it remains ``float8`` it should update with ``numeric`` **Second issue comes From odoo 18.3**:= during upgrade if any new ``module`` is intalled due to dependency change and inherits the same model that is ``A``. Due to ``_auto_init`` it will recompute this related field because due to this newly [commit](https://github.com/odoo/odoo/commit/f5ce6784fce1ae27c3e92090b3723e9d4ce45808) clear the columns column becomes [``False``] and [``not column``] becomes true from ``update_db`` and same reason as above it didn't return from [here](https://github.com/odoo/odoo/commit/f5ce6784fce1ae27c3e92090b3723e9d4ce45808#diff-956d895aa67961bac940841f7c3d1e10eb8ecabec82ef017803c4a6a3bb7cd22R1074) because column type is ``float8`` which leads to memory of unecessary compute which shouldn't do in first place. **FIX:** Remove the ``column_type`` and let it get again as soon ``_digits`` attribute add. before fix:- ``` SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'account_move_line' AND column_name = 'test_line_id'; column_name | data_type --------------+------------------ test_line_id | double precision (1 row) ``` After fix:- ``` SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'account_move_line' AND column_name = 'test_line_id'; column_name | data_type --------------+----------- test_line_id | numeric (1 row) ``` opw-5222760 upg-3253635 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update prevents a traceback when updating the analytic distribution of a locked manufacturing order that uses multiple analytic plans. It helps users avoid unexpected errors during accounting updates and keeps the workflow stable.
Original PR description
This commit only forward-ports the test ## Original issue: Updating the analytic distribution of a locked MO with multiple analytic plans raised an error, because `_create_analytic_entry()` only supports a single ID per key The issue was originally fixed in commit: https://github.com/odoo/enterprise/commit/c2648d6ff4a2f3e5234ff80a7f0ff77b2dbf4812 opw-4835165 Forward-Port-Of: odoo/enterprise#94101
When a manufacturing order quantity is increased in 3-step production, component replenishment now updates correctly for the pre-production to production flow. This ensures the system requests the right amount of stock, avoiding shortages or stale transfer quantities.
Original PR description
Issue ----- In 3step manufacturing, changing the pre-prod -> prod rule to MTSO doesn't have the expected behaviour. That is, if there is an insufficient quantity of component present in pre-prod,…
Issue ----- In 3step manufacturing, changing the pre-prod -> prod rule to MTSO doesn't have the expected behaviour. That is, if there is an insufficient quantity of component present in pre-prod, updating the producing qty doesn't update the replenishment quantity. Steps to reproduce ----- - Enable warehouses and multi-step routes - Set warehouse manufacturing to 3 step - Edit the 3 step production route - Change the pre-prod -> prod rule to mts else mto - Create a product "Comp" - Set a quantity of 5 in location pre-prod - Create a product "Prod" - Add a BoM with "Comp" as component - Create a MO for 10 of Prod - Confirm MO > There is a transfer stock -> pre-prod for 5 of Comp - Open the production quantity wizard, update value to 12 and confirm > The transfer still shows 5 of Comp instead of the needed 7 Cause ----- Changing the production quantity updates the raw moves of the MO. This triggers a write on the move with the new `product_uom_qty` so we do a `run_procurement` https://github.com/odoo/odoo/blob/322c6d0468bf79e9d29e1375c49aa13d4a7b7a67/addons/mrp/models/stock_move.py#L481-L485 Before actually running any procurement we do https://github.com/odoo/odoo/blob/322c6d0468bf79e9d29e1375c49aa13d4a7b7a67/addons/mrp/models/stock_move.py#L492 Since the procurement group's method is `mts_else_mto`, when we go through https://github.com/odoo/odoo/blob/322c6d0468bf79e9d29e1375c49aa13d4a7b7a67/addons/stock/models/stock_move.py#L2329-L2332 we go into the `else` part and set the move's `procure_method` to mts. This means that, in the `run_procurement` method https://github.com/odoo/odoo/blob/322c6d0468bf79e9d29e1375c49aa13d4a7b7a67/addons/mrp/models/stock_move.py#L504 is not true, so we don't add any procurement to run. Solution ----- In `_adjust_procure_method` we update the move's rule to the MTSO one we found https://github.com/odoo/odoo/blob/322c6d0468bf79e9d29e1375c49aa13d4a7b7a67/addons/stock/models/stock_move.py#L2328 This means that we can update the check in `run_procurement` to also add a procurement to run if the move's rule is MTSO. ----- Ticket: opw-5008871
This fix ensures that when a delivery is made from a lot with a zero cost, the system keeps that lot’s zero value instead of incorrectly falling back to an average product cost. This prevents stock valuation from showing the wrong amount and keeps inventory accounting accurate.
Original PR description
**Problem:** when selling a product valued by lot and chosing a lot with a value of 0 the average value of the product is used instead of 0. **Steps to reproduce:** - make sure your warehouse is in…
**Problem:**
when selling a product valued by lot
and chosing a lot with a value of 0
the average value of the product
is used instead of 0.
**Steps to reproduce:**
- make sure your warehouse is in single step receipt and delivery
- create a product tracked by lot and valued by lot
- set the category as avco
- create a PO for a quantity of 10 and a unit price of 10
- confirm and open the receipt
- open the stock move widget on the stock move
- write "lot A" in the lot column and save
- validate
- create a PO for a quantity of 10 and a unit price of 0
- confirm and open the receipt
- open the stock move widget on the stock move
- write "lot B" in the lot column and save
- validate
- create a quotation for 1 quantity of your product
- confirm
- open the delivery
- open the stock move widget on the stock move
- in the 'pick from' column enter lot B and save
- validate
- open the valuation smart button
**Current behavior:**
the value of the stock valuation layer is -5
**Expected behavior:**
it should be 0
**Cause of the issue:**
Inside _prepare_out_svl_vals
lot.standard_price is 0 so the if condition
is false and we don't use the price of the lot
https://github.com/odoo/odoo/blob/cd2a241182cf56fc36d03df9f0afdcea30f682d2/addons/stock_account/models/product.py#L277
**fix:**
deleting the lot.standard_price condition
is not possible because when the lot is created
at delivery it has no standard_price and in this
case we want to use the standard_price of the
product.
(see test https://github.com/odoo/odoo/blob/d3835668349d466ed4ba27c9eacdbd3339f2ac37/addons/stock_account/tests/test_lot_valuation.py#L58)
opw-5077671This change fixes an issue where clicking the Pack button in purchase catalogs could sometimes appear to do nothing. The quantity is now calculated more reliably so packaging can be added correctly even when decimal values are involved.
Original PR description
Issue ----- Clicking the "pack" button in the catalog sometimes seems not to work and the product quantity remains unchanged. Steps to reproduce ----- - Enable packagings in settings - Create a…
Issue ----- Clicking the "pack" button in the catalog sometimes seems not to work and the product quantity remains unchanged. Steps to reproduce ----- - Enable packagings in settings - Create a product - Set a vendor "Mom" - Add a packaging of some decimal number, eg 22.68 - Create a new purchase from "Mom" - Open the catalog - Click the product once - Click the "pack" button 4 times (# of clicks required depends on the pack amount) > The last click did not increase the product quantity Cause ----- Javascript floats are sometimes an approximation of the value rather than the value itself. This means that when we do https://github.com/odoo/odoo/blob/0611a74cb52ca639b683ef158f8b4f2f347d08ad/addons/purchase/static/src/product_catalog/kanban_record.js#L33-L34 the flooring might sometimes get a close approximation and end up flooring down the packaging quantity. In our example, `this.productCatalogData.quantity` should be `68.04` but is actually `68.03999999999999`. This leads to `this.productCatalogData.quantity / packaging.qty` == `2.9999999999999996` `Math.floor` then rounds it down to 2 so we end up with 2 + 1 = 3, which is the current packaging quantity so nothing changes. ----- Ticket: opw-5130865 Forward-Port-Of: odoo/odoo#235706
3 changes
Resolved issues and error corrections
When a delivery line is split during barcode packing, the remaining line now keeps the original package information. This ensures products that started in a specific package continue to be tracked correctly, avoiding confusion and mismatches in stock handling.
Original PR description
Steps to reproduce ----- - Enable packages - Create a stored Product "Prod" - Add a quantity of 5 "Prod" in stock, in package "PACK1" - Create a delivery for 3 units of "Prod" (so as to not move the…
Steps to reproduce ----- - Enable packages - Create a stored Product "Prod" - Add a quantity of 5 "Prod" in stock, in package "PACK1" - Create a delivery for 3 units of "Prod" (so as to not move the whole package) - Open the delivery in Barcode - Scan "Prod" - Put in pack > The new line created for the remainder of the delivery is not taken from PACK1 Cause ----- Put in pack causes the line to be split since there is some remaining quantity https://github.com/odoo/enterprise/blob/139a123637369737ae7a58eebdbc2743ce134a64/stock_barcode/static/src/models/barcode_picking_model.js#L1586-L1593 Through which we create a new line https://github.com/odoo/enterprise/blob/139a123637369737ae7a58eebdbc2743ce134a64/stock_barcode/static/src/models/barcode_model.js#L555-L559 With the origin package set as false by default https://github.com/odoo/enterprise/blob/139a123637369737ae7a58eebdbc2743ce134a64/stock_barcode/static/src/models/barcode_model.js#L617-L624 ----- Ticket: opw-5081496
This fix ensures customers cannot return more rented items than were originally picked up. It keeps rental quantities accurate and prevents inconsistent order records that could affect billing and inventory tracking.
Original PR description
## Versions 17.0+ ## Issue It is possible to return more products than what has been picked in Rental. ## Steps to reproduce - Create a service product available for rent; - Create a rental SO for any partner: - Add 5 units of the created service; - Confirm the SO; - Pickup 5; - Return 4; - Return 4; - Check the SOL containing 5 delivered products and 8 returned products. opw-5259727
This update refreshes the spreadsheet component to its latest version and includes a couple of usability fixes. It prevents interactions in read-only spreadsheets and improves how the editor switches modes when the cursor or selection changes, reducing confusing behavior for users.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/498c3fcb1 [REL] 17.0.78 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/498c3fcb1 [REL] 17.0.78 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/1e758de59 [FIX] headers_overlay: disable interaction in read-only mode [Task: 5182854](https://www.odoo.com/odoo/2328/tasks/5182854) https://github.com/odoo/o-spreadsheet/commit/60a66b680 [FIX] composer: change mode to editing when composer cursor selection changes [Task: 5226615](https://www.odoo.com/odoo/2328/tasks/5226615) Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya (rmbh) <rmbh@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com> Co-authored-by: Marceline Thomas (matho) <matho@odoo.com>