Daily updates from Odoo
Thursday, January 8, 2026
31 changes · saas-18.3
Resolved issues and error corrections
This update corrects a technical issue preventing credit notes with allowances issued more than 6 days after the original invoice from being processed by ECpay. The fix removes the incorrect date parameter and ensures consistent data transmission, eliminating errors and improving compliance. This change ensures seamless e-invoice generation and submission to ECpay.
Original PR description
**AllowanceDate**: l10n_tw_edi_ecpay has an issue on Credit Notes (Allowances). When we `_l10n_tw_edi_generate_issue_allowance_json()`, we send the `l10n_tw_edi_invoice_create_date` which is was set…
**AllowanceDate**:
l10n_tw_edi_ecpay has an issue on Credit Notes (Allowances).
When we `_l10n_tw_edi_generate_issue_allowance_json()`, we send the
`l10n_tw_edi_invoice_create_date` which is was set to the associated
invoices creation date, and not the Allowance's creation date.
This creates a potential issue where allowances issued more than 6 days
after the original invoice would bounce back from ECpay with errors.
To be consistent with invoices send to ECPay, we do not send the
`AllowanceDate` parameter at all
Manual Testing/Verification:
1. Create an invoice that has a `l10n_tw_edi_invoice_create_date`,
visible in the Invoice's ECPay tab more than 6 days ago. (Requires
sending to ECPay via the custom wizard via the "Send" button)
2. Create a credit note from the invoice and send to ECPay.
3a. Before this, see that an error would appear.
3b. Now, there would be no error
*InvoiceRemark*:
When Customer Reference `ref` is not set, the code sets the parameter
value as `False`, displaying it's string on the e-invoice and official
printout. We only set the parameter if there exists the `ref` now,
eliminating the issue.
Tests:
1. (both cases) undo the `account_move.py` changes and run the tests.
task-[5455847](https://www.odoo.com/odoo/project/967/tasks/5455847)
---
# New test failed output
<img width="1458" height="353" alt="image" src="https://github.com/user-attachments/assets/77df8e51-5005-4d99-985c-71757c0f62a6" />
```bash
07:47:53,055 ERROR l10n_tw_edi_ecpay-demo-vy2vd3s0 odoo.addons.l10n_tw_edi_ecpay.tests.test_edi: FAIL: L10nTWITestEdi.test_01_can_generate_file
Traceback (most recent call last):
File "/home/odoo/odev/worktrees/18.0-l10n_tw_edi_ecpay-fix-allowance-date-erle/odoo/addons/l10n_tw_edi_ecpay/tests/test_edi.py", line 61, in test_01_can_generate_file
self.assertIsInstance(json_data["InvoiceRemark"], str)
~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: False is not an instance of <class 'str'>
07:48:02,516 ERROR l10n_tw_edi_ecpay-demo-vy2vd3s0 odoo.addons.l10n_tw_edi_ecpay.tests.test_edi: FAIL: L10nTWITestEdi.test_13_b2b_refund_upload_deadline_restriction
Traceback (most recent call last):
File "/home/odoo/odev/virtualenvs/18.0/lib/python3.13/site-packages/freezegun/api.py", line 885, in wrapper
result = func(*args, **kwargs)
File "/home/odoo/odev/worktrees/18.0-l10n_tw_edi_ecpay-fix-allowance-date-erle/odoo/addons/l10n_tw_edi_ecpay/tests/test_edi.py", line 430, in test_13_b2b_refund_upload_deadline_restriction
self.assertNotIn("AllowanceDate", json_data,
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
"B2B Allowances should not include AllowanceDate to avoid >6 day limit errors."
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
AssertionError: 'AllowanceDate' unexpectedly found in {'MerchantID': '1234', 'Details': [{'OriginalInvoiceNumber': 'AB11100099', 'OriginalInvoiceDate': '2025-01-06', 'OriginalSequenceNumber': 0, 'ItemName':
'product_a', 'ItemCount': 1.0, 'ItemPrice': 1000.0, 'ItemAmount': 1000.0}], 'TotalAmount': 1000.0, 'TaxAmount': 50.0, 'CustomerEmail': 'partner_b@tsointsoin', 'AllowanceDate': '2025-01-06 15:00:00'} : B2B
Allowances should not include AllowanceDate to avoid >6 day limit errors.
```
---
Things to think about:
- FWP
- [ ] 19.0
- [ ] master
Forward-Port-Of: odoo/odoo#241973This update prevents the loss of Starshipit delivery orders when label creation fails. Previously, a failed label attempt would delete the order, requiring users to restart. Now, users can retry validation and fix issues in Starshipit without losing existing orders, streamlining the delivery process.
Original PR description
## Current behaviour: When validating a delivery, Odoo sends data to Starshipit. If label creation fails, the module deletes the created order. ## Expected behaviour: If label creation fails, the…
## Current behaviour: When validating a delivery, Odoo sends data to Starshipit. If label creation fails, the module deletes the created order. ## Expected behaviour: If label creation fails, the Starshipit order should remain. Users should be able to fix data in Starshipit and retry validation in Odoo without losing the existing order. ## Steps to reproduce: 1. Validate a delivery order integrated with Starshipit. 2. Trigger a label generation failure (e.g., bad address). 3. Observe that the created Starshipit order is deleted. ## Cause of the issue: The integration treats label creation failure as a fatal step and cleans up the previously created Starshipit order. ## Fix: Do not delete the Starshipit order on label failure. When the user retries validation, first check Starshipit for an order matching the unique reference. If found, reuse it and continue with label creation and manifest. If not found, create a new Starshipit order as usual. ## Additional note: The _() wrapper in the error line was removed because the Starshipit service has no env or language context. Since translations cannot be resolved there, Odoo raised a warning. Removing _() avoids this warning and keeps the error clean. opw-5306979 Forward-Port-Of: odoo/enterprise#103354 Forward-Port-Of: odoo/enterprise#101174
This update corrects an issue where invoice data sent to the SInvoice system was missing descriptions and unit information. The fix now uses the line name directly and defaults to 'Units', ensuring accurate and complete data transmission for invoices. This improves the integration with the SInvoice system and reduces potential data discrepancies.
Original PR description
Currently, the item name in the data sent to the SInvoice system is comprised only of the product name on the line. This brings a few issues that should be corrected: - Any description set on the line on top of the product won't be sent - If there is no product, the required item name will be set to False - If there is no product, the required unit name will be set to False too To fix these issues, we will: - Use the line name directly and not the product name and; - Default to 'Units' for the unit name in all cases where it wouldn't be set. task-5438691 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#241503
This update resolves an issue where setting an invalid video link in course slides would cause a system error. The fix ensures that the system gracefully handles incorrect links, preventing disruptions to the user experience when adding or editing course content. This improves the reliability of our online learning platform.
Original PR description
When a user sets an invalid video link for a slide, a traceback occurs. Steps to reproduce the error: - Install ``website_slides`` module with demo data - Go to Website > Courses > Open Taking care…
When a user sets an invalid video link for a slide, a traceback occurs. Steps to reproduce the error: - Install ``website_slides`` module with demo data - Go to Website > Courses > Open Taking care of Trees course - Add Content > Video > Add valid video link (ex. https://www.youtube.com/shorts/SXHMnicI6Pg) > Save and Publish > Delete - Repeat above step - Add content > Video > Add any text in video link > Save and Publish Traceback: ```py AssertionError: Could not find all values of slide.slide(12,) to flush them ``` https://github.com/odoo/odoo/blob/7bbfb207f8699973f8580ea18821f82b1a83e149/addons/website_slides/controllers/main.py#L1363-L1372 New record is created using ``new()`` to fetch external metadata for the slide. This record only exists in memory and is not stored in the database. When the video link is invalid, ``video_source_type`` is False, and the code attempts to ``unlink()`` the slide. Unlinking the record triggers field recomputations, and it will lead to the above error when flushing the new record. ref: https://github.com/odoo/odoo/commit/71233fa2cb8984b65f8e7ac55405fdbc054756a0 sentry-6964031088 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#235099
This update resolves an issue where users without administrator permissions encountered errors when opening duplicated reports within the Studio feature. The fix prevents a traceback by ensuring the system handles permission errors gracefully, improving the user experience for all users.
Original PR description
When a user opens a duplicated report in Studio after their administrator rights are removed, a traceback is raised. Steps to reproduce the error: - Install ``account`` and ``web_studio`` - Login as…
When a user opens a duplicated report in Studio after their administrator rights are removed, a traceback is raised. Steps to reproduce the error: - Install ``account`` and ``web_studio`` - Login as Mitchell Admin > grant Administrator and Invoicing Administrator rights to Mark Demo - Login as Mark Demo in incognito tab > Open invoices > Open studio > Reports > duplicate any report - Login as Mitchell Admin, remove administrator right of Marc Demo - In Mark Demo, Open the duplicated report Traceback: ```py UnboundLocalError: cannot access local variable 'studio_view' where it is not associated with a value ``` https://github.com/odoo/enterprise/blob/58dc97cb5a7185dc2acd801bb3af0e6c35add0b6/web_studio/controllers/report.py#L379 The bug occurs because ``_get_and_write_studio_view()`` method performs a search on ``ir.ui.view`` before returning ``studio_view``. For users without the required permissions, this ``search()`` raises an AccessError. https://github.com/odoo/enterprise/blob/58dc97cb5a7185dc2acd801bb3af0e6c35add0b6/web_studio/controllers/report.py#L393-L400 Since this exception is raised before the assignment completes, the local variable ``studio_view`` is never bound. However, the finally block of ``deactivate_studio_view`` is always executed and attempts to access ``studio_view.active``, resulting in an ``UnboundLocalError``. sentry-7149350379 Forward-Port-Of: odoo/enterprise#103017
This update ensures that report views in Odoo Enterprise consistently generate unique keys, regardless of template status (active or inactive). Previously, inactive templates could cause duplicate keys, leading to potential customization conflicts and data inconsistencies. This fix improves the reliability and accuracy of report generation.
Original PR description
Before this commit: ------------------------- The sequence used in the template key was computed based only on the last active template. If the next sequence number corresponded to an inactive…
Before this commit: ------------------------- The sequence used in the template key was computed based only on the last active template. If the next sequence number corresponded to an inactive template, the system could end up generating duplicate template keys — one for the inactive template and one for the newly created active template. After this commit: ----------------------- The sequence for the template key is now computed based on the last template, regardless of whether it is active or inactive. This ensures that template keys remain unique across all report templates. Why this commit: ----------------------- if a template is inactive, the report engine should raise an error. However, because duplicate template keys were being generated, the inactive template could silently fall back to the active template with the same key, preventing the expected exception and bringing customization of one report to another. Additionally, if the inactive template is later corrected and reactivated, both reports would still reference the same template (the one with the smaller ID) because they shared identical template keys. This fix prevents such conflicts by ensuring unique template key generation. Forward-Port-Of: odoo/enterprise#101894
This update fixes a potential confusion in the sales details report by ensuring payment orders are consistently displayed. The report now sorts by payment method and session, making it easier for users to understand sales transactions and improve reporting accuracy. This change enhances the overall usability of the sales reporting feature.
Original PR description
Before this commit, payment order was not guaranteed and could confuse users reviewing sales details report, especially as the cash register lines are ordered before. This commit orders the results by payment method and session to make the output more readable. opw-5240864 Forward-Port-Of: odoo/odoo#242387 Forward-Port-Of: odoo/odoo#237040
This update ensures that the correct warehouse location is linked to merged manufacturing orders. Previously, the location information wasn't properly carried over, causing issues with multi-location workflows. This fix resolves a potential disruption in order fulfillment processes, particularly for complex manufacturing scenarios.
Original PR description
Situation ----- When applying a push rule after manufacturing a merged MO, there is an odd case where the link between the merged MO's transfer and the demand move breaks in…
Situation ----- When applying a push rule after manufacturing a merged MO, there is an odd case where the link between the merged MO's transfer and the demand move breaks in https://github.com/odoo/odoo/blob/182a387d0ec6ad28d7d052d7100b2184372514be/addons/stock/models/stock_move.py#L1054 because of the `m.location_id == move.location_final_id` part being false in https://github.com/odoo/odoo/blob/182a387d0ec6ad28d7d052d7100b2184372514be/addons/stock/models/stock_move.py#L1090-L1097 This is because, during the merge, `location_final_id` is not propagated to the new MO https://github.com/odoo/odoo/blob/5f8336c7d8ab891103a3035a9ebb5242cfa46ce6/addons/mrp/models/mrp_production.py#L2416-L2424 so when the new MO's `move_finished_id` gets computed https://github.com/odoo/odoo/blob/5f8336c7d8ab891103a3035a9ebb5242cfa46ce6/addons/mrp/models/mrp_production.py#L822 it gets the MO's `location_final_id` https://github.com/odoo/odoo/blob/5f8336c7d8ab891103a3035a9ebb5242cfa46ce6/addons/mrp/models/mrp_production.py#L1202 which is false. This leads to to the move getting the warehouse's default stock location thanks to https://github.com/odoo/odoo/blob/182a387d0ec6ad28d7d052d7100b2184372514be/addons/mrp/models/stock_move.py#L456-L457 This is problematic for complex use cases with multi-locations and custom routes. It should be safe to propagate the `location_final_id` of the merged MOs if they all share the same one. Use case example ----- <details> <summary>Full use case</summary> - Enable multi-step routes - Create location "WH/Stock/L1" - Create location "WH/Stock/L2" - Create Operation Type "MO child" - Type of Operation: Manufacturing - Sequence Prefix: MOCHILD - Source Location: L1 - Destination Location: L2 - Create Operation Type "Push Transfer" - Type of Operation: Internal Transfer - Sequence Prefix: L2L1 - Source Location: L2 - Destination Location: L1 - Create Route "MO child" - Create Rule "Manufacture" - Action: Manufacture - Operation Type: MO child - Source Location: False - Destination Location: Stock - Create Route "2-step" - Warehouse: Main WH - Create Rule "L1 -> Virtual/Production" - Action: Pull from - Operation Type: MO child - Source Location: L1 - Destination Location: Virtual/Production - Create Rule "Push: L2 -> L1" - Action: Push To - Operation Type: Push Transfer - Source Location: L2 - Destination Location: L1 - Unarchive MTO - Edit MTO route - Create Rule "L1 -> Virtual/production (MTO)" - Action: Pull - Operation Type: "My Company: Manufacturing" - Source Location: L1 - Destination Location: Virtual/Production - Supply Method: Trigger another rule - Create product "Main product" - Create product "Child product" - Routes: "MO child" & MTO - Create product "Material" (consumable) - Create BOM - Product: "Main product" - Component: "Child product" - Create BOM - Product: "Child product" - Component: "Material" - Create MO for "Main product" - Misc/Component Location set to L1 - Duplicate the MO - Merge child MOs & produce - Validate merged MO transfer to L1 - Go back to one of the "Main product" MO > Component quantity is 0 </details> ----- Ticket: opw-5144196 Forward-Port-Of: odoo/odoo#240695
This update resolves an issue where string values entered in the web_studio field editor were incorrectly formatted with extra quotes and slashes. Now, string values are correctly displayed and saved, ensuring accurate field configuration within the studio interface. This improves data integrity and usability.
Original PR description
Have a field widget with an option of type "string" (supportedOption meta field of the widget) In studio, change the value for that option. Before this commit, the value appeared in the input as escaped: there were supplementary quotes and slashes After this commit, the string value is correctly displayed. Forward-Port-Of: odoo/enterprise#103476 Forward-Port-Of: odoo/enterprise#103364
This update ensures that inventory tracking changes are properly enforced when a product's type is altered, preventing incorrect stock calculations. Previously, a change in product type could be saved without triggering the necessary checks, leading to potential inventory discrepancies. This fix restores the expected behavior of raising an error when attempting to change a product's inventory tracking.
Original PR description
## Description of the issue/feature this PR addresses: `compute_is_storable` is called when the `type` value is modified but the `write` function is never called when the value is set using the…
## Description of the issue/feature this PR addresses: `compute_is_storable` is called when the `type` value is modified but the `write` function is never called when the value is set using the `is_storable` attribute. Updating `is_storable` using a `write` ensure that an exception is raised when move line exists. But this fix addresses the symptom, not the underlying issue. So why ? Is it related to the cache or unit test environment ? ## Current behavior before PR: In a Unit test, If you convert a consumable and storable product to a service, no exception is raised, even with existing stock moves. Unlike the previous version of Odoo (<15.0), where an exception was raised when the product type was changed and stock movements existed, detection now occurs if the ‘is_storable’ status is changed. However, this detection is not triggered if the value of ‘is_storable’ is defined by its attribute. ## Desired behavior after PR is merged: An exception must be raised (like Odoo 14.0) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#242514 Forward-Port-Of: odoo/odoo#239284
This update resolves an issue where placing items into a package via the SML view incorrectly locates the new package. The fix addresses a technical problem within the Odoo stock management system, ensuring packages are correctly identified and tracked after this action. This improves the reliability of the 'Put in Pack' functionality.
Original PR description
Putting in pack from the SML view leads to package incorrectly located To reproduce the issue: 1. In Settings, enable "Package" 2. Confirm a delivery with 2 available products 3. Open the SML thanks…
Putting in pack from the SML view leads to package incorrectly located To reproduce the issue: 1. In Settings, enable "Package" 2. Confirm a delivery with 2 available products 3. Open the SML thanks to the smart button 4. Tick a line > Put in pack 5. On the second line, in "Destination Package", look for the package Error: it is impossible to find it When opening the SML thanks to the smart button, we also load a lot of default values: https://github.com/odoo/odoo/blob/1492abd8c6bcfdbc48f730f6767b177aeff54bf7/addons/stock/models/stock_picking.py#L1203-L1221 Those are (obviously) SML specific. However, this context is used when putting in pack. This is a problem since `location_id` is also the field name of a package. As a result, the ORM defines the location of the new package with the default value, i.e. the source location of the SML. This is incorrect. One consequence of this bug is the step 5 of the above use case. When looking for a package, a domain checks its location: https://github.com/odoo/odoo/blob/35feed47622b279abf8e593d8190ea36b64d32fd/addons/stock/models/stock_move_line.py#L51-L55 It must be either `False` or equal to the dest loc, which is not the case with the created package. Now... About the solution. It's probably difficult to do something more hacky. However, it's not too invasive in the code and all user will take benefit from it once the commit is deployed. On master, we will discuss with both frameworks to negotiate/find something more elegant. OPW-5215243 Forward-Port-Of: odoo/odoo#242328
This update resolves an issue where duplicating an invoice from a sales order would incorrectly link both the original and duplicate invoices with the same source document. The fix prevents the automatic copying of the source document during the duplication process, ensuring each invoice has its own unique link.
Original PR description
### Issue: When opening an invoice from a Sale Order and duplicating it, the Source Document (invoice_origin) was also copied As a result, both the original and duplicated invoice showed the same…
### Issue: When opening an invoice from a Sale Order and duplicating it, the Source Document (invoice_origin) was also copied As a result, both the original and duplicated invoice showed the same Sale Order in the Source Document field ### Cause: The `action_view_invoice` method adds `default_invoice_origin` in the context, causing the `copy` function to set `invoice_origin` The field invoice_origin was already set with copy=False in this PR: https://github.com/odoo/odoo/pull/236656 The default context was introduced in PR: https://github.com/odoo/odoo/pull/34561 ### Steps to reproduce: - Create a sales order (SO) - Create and confirm an invoice from the SO - Click on the `Invoices` smart button to access the invoice (SO is visible at the top) - Duplicate and confirm the invoice (The SO is not linked) - Go to the invoices list view and make the `Source Document` visible - Observe that both invoices show the same SO as their `Source Document` opw-5360172 Forward-Port-Of: odoo/odoo#239676
This update fixes an issue where the wrong manager was sometimes assigned to approval requests. The change ensures the correct manager, based on the request, is always identified, preventing errors and ensuring approvals are processed accurately. This improves the reliability of the approval workflow.
Original PR description
The previous code added the manager by searching for the first employee that matches the request_owner_id. If there are multiple such employees, it's possible that an employee from a different company than the approval can be selected. Ticket: [5185449](https://www.odoo.com/odoo/project.task/5185449) Forward-Port-Of: odoo/enterprise#99978
This update corrects an issue where bank statements were incorrectly flagged as invalid, even when they were accurate. The fix adjusts how statement validity is calculated, ensuring that all statements are properly recognized as valid based on their balances. This improves the reliability of bank reconciliation within the accounting module.
Original PR description
Some bank account statements are computed as not valid, although they are valid. Statement 1 and 3 appear, and statement 3 is shown as invalid, while both statements should be shown as valid. Statement validity is computed depending on previous statement end balance and current statement start balance. The SQL query uses a window function to retrieve the previous statement. However, the function is applied after the WHERE clause. Therefore, it uses the end_balance of the previously selected statement instead of the previous statement. #### Step to reproduce: - In the bank dashboard of the accounting app - Create journal entry 1 - Create statement 1 - Create journal entry 2 - Create statement 2 - Validate the journal entry 2 - Create journal entry 3 - Create statement 3 - filter statement per "Not Matched" Ticket [link](https://www.odoo.com/odoo/project.task/5341433) opw-5341433 Forward-Port-Of: odoo/odoo#238381
A recent update to the 'account_no_followup' module caused a memory error during installation on existing Odoo databases. This commit resolves the issue by initializing the module's data directly in SQL, preventing the overfill of system memory and ensuring smooth installations.
Original PR description
The module `account_no_followup` is a new module added in odoo/enterprise#96627. Since it's marked as `auto-install=True` and since it's a dependency of the new `pos_no_followup` module, it may be installed on existing 18.0 databases with a lot of account.move.lines. In this case, the module installation will raise a MemoryError as there's a new stored computed field on journal items called `no_followup`. Computing this field and storing the value in cache will overfill `self.env._cache` and reach the 2GB threshold. This commit fixes that by adding an overwrite of the `_auto_init` method to initialize the field's value in raw SQL, circumventing the issue. Forward-Port-Of: odoo/enterprise#102330
This update corrects a prioritization issue in how Odoo identifies partner names when importing account data from XML files. Previously, the contact name was favored over the legal entity name. This change, requested by CHKL, ensures the legal entity name is used as the primary identifier, improving data accuracy for legal entity reporting.
Original PR description
When we create an account.move from an XML file, Odoo first searches for an existing partner via some values fetched with `_import_retrieve_partner_vals()`. Amongst those vals, the name can be fetched from either the `Contact:Name` or the `PartyLegalEntity:RegistrationName`. Currently, the contact name is prioritized over the legal entity name. After discussion with CHKL, this should be the opposite. Discord link: https://discord.com/channels/678381219515465750/694447009679147068/1457691361959608413 Related ticket: opw-5269360 Forward-Port-Of: odoo/odoo#242405 Forward-Port-Of: odoo/odoo#242037
This update resolves a technical issue where the 'Mark as Ready' order completion process in UrbanPiper POS was failing, resulting in an 'undefined street' error. The fix ensures the system correctly checks if a customer is assigned before completing the order, preventing this error and ensuring accurate order processing.
Original PR description
Steps to produce: ==== - Place an online delivery order through urbanpiper - Edit the order and remove customer - Complete the order as Marks as Ready - Print Reciept Issue: ==== - TB occurs stating undefined street Fix: ==== - Check whether partner is assigned or not task-5407001 Forward-Port-Of: odoo/enterprise#103475 Forward-Port-Of: odoo/enterprise#102100
This update fixes a problem where customers on one website could access payment providers enabled only for a different website. The change ensures that payment providers are correctly filtered based on the customer's website, preventing incorrect payment options from appearing in the sales portal. This improves the customer experience and ensures accurate payment processing.
Original PR description
[FIX] website_sale, adding website_id in portal controller Version: 17.0+e Steps to reproduce ------------------ The database has two different websites. A payment provider is enabled for just one of…
[FIX] website_sale, adding website_id in portal controller Version: 17.0+e Steps to reproduce ------------------ The database has two different websites. A payment provider is enabled for just one of them (website1). When a sale order is created on the sales app and the customer accesses it in its portal on the website2, he is able to pay with the payment provider which is only enabled on website1. The problem also occurs when previewing the customer’s portal view. Why it's happening ------------------ When accessing an order via “/my/orders/<int:order\_id>”, the portal_order_page method calls _get_compatible_providers without passing the website_id. The overriding logic in website_payment then defaults to considering all activated payment methods as compatible, regardless of website restrictions. As no website_id is provided, the overriding method from the payment_provider extension in website_payment module considers every activated payment methods as compatible. The Fix ------- We now add the current website's id to the method if none has been added before. opw-5172444, “Payment provider visible on sales order portal" --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#242380 Forward-Port-Of: odoo/odoo#235954
This update addresses a warning message that appeared when searching for payment tokens. The change adds a field to the payment token model, allowing searches to be performed using the record name instead of the display name, which was causing the warning. This ensures smoother and more reliable searching functionality.
Original PR description
address this warning: `2026-01-07 04:53:23,985 3407309 WARNING v18c_... odoo.models: Cannot search on display_name, no _rec_name or _rec_names_search defined on payment.token` Forward-Port-Of: odoo/odoo#242477
This update resolves an issue where loyalty rewards would throw errors when attempting to apply them if their associated product was archived or invalid. The system now intelligently skips loading these rewards, preventing disruptions to the POS experience and ensuring smooth operation. This improves reliability and prevents potential errors during transactions.
Original PR description
Steps: --------- - Install pos_loyalty. - Add a product to a loyalty reward’s reward product, or assign a product tag with no actual products as a reward product tag. - Archive/delete the reward product. - Open session. Issue: ---------- - A traceback appears when attempting to apply the affected reward, due to the archived/deleted or invalid reward product is being loaded in the POS. FIX: ----------- - Skip loading loyalty rewards whose reward product is archived/deleted or whose reward product tag contains no valid products. Task-5226654 Forward-Port-Of: odoo/odoo#242551 Forward-Port-Of: odoo/odoo#235081
This update fixes an issue where invoices could incorrectly retain accounts from the original company after changing the invoice's company and journal. Previously, this meant accounts weren't properly associated with the new company, preventing accurate financial reporting. This change ensures invoices correctly reflect the associated company and journal, improving data accuracy.
Original PR description
This issue was already fixed in this PR: https://github.com/odoo/odoo/pull/234357 But that was revert because there was a bug with company branches ### Steps to reproduce: - Create Company A and Company B - Create an invoice on Company A with one line having an account in Company A - On the same invoice, change the company to Company B and change the journal to a journal of Company B - Save, then confirm the invoice. ### Issue: The invoice, now belonging to Company B, still has the same account from company A, and we are able to post it on the journal from company B opw-5167958 Forward-Port-Of: odoo/odoo#242239
This update resolves a bug that prevented Facebook account statistics from refreshing correctly in older versions of Odoo. The issue stemmed from a difference in how the datetime library handled timezones, specifically the format of date strings. This change ensures consistent functionality across different Python versions.
Original PR description
Bug
===
When refreshing the statistics of a Facebook account, an error can happen, depending on the datetime library version.
The following work in python 3.11, but not on python 3.10 and earlier, due to `+0000` instead of `+00:00`.
```py
import datetime
datetime.datetime.fromisoformat('2025-11-16T08:00:00+0000')
```
Task-5473117
Forward-Port-Of: odoo/enterprise#103456This update fixes an issue where changing the rental period of an order didn't automatically update the associated rental transfers. The fix mimics the rescheduling behavior of purchase orders, ensuring that rental transfers are accurately updated when the rental period is adjusted. This improves the reliability of rental order management.
Original PR description
### Steps to reproduce: - In the settings enable "Rental Transfers" - Create a storable and rentable product P - Create and confirm a rental order for 1 unit of P - Change the rental period to 10 days in the future #### > The rental tranfers were not updated accordingly ### Cause of the issue: Nothing is currently implemented to reschedule the rental transfers. ### Fix: We somewhat mimic the reschedule purchase behavior: https://github.com/odoo/odoo/blob/6ca34a0f5347e0611cde95453119dda8b40fa589/addons/purchase_stock/models/purchase_order_line.py#L98-L101 But we rely on the order itself rather than its order lines since the `start_date` and the `return_date` are related fields so that no `write` is triggered when the order is rescheduled: https://github.com/odoo/enterprise/blob/96a80f583a0ca502ff06bc05d03775c76c6a7537/sale_renting/models/sale_order_line.py#L18-L19 opw-5158508 Forward-Port-Of: odoo/enterprise#102437 Forward-Port-Of: odoo/enterprise#101334
This update resolves a potential issue where precommit hooks in Odoo's database system could cause an infinite loop. By allowing the ORM to automatically handle flushing, the system is now more reliable and stable. This change was made in conjunction with a previous update to ensure consistent database operations.
Original PR description
In the existing implementation sometimes precommit hooks need to flush manually because they are ran after the flush is executed in the cursor. A precommit that triggers ORM changes may be not flushed unless it is done explicitly, however an explicit call may turn into an infinite loop. This removes the need to flush in precommit hooks and let the ORM handle it safely. Flushing of the environment was already done in #220379. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#242248
This update resolves a test issue that was consistently failing due to a hardcoded January date. The fix adjusts the test's date reference to a more standard mid-year date, ensuring consistent test results and preventing false failures. This improves the reliability of the testing process.
Original PR description
Some tests are making "self.frozen_today - timedelta(days=1)". It means some tests are failing only the first of January. To avoid that, let's make "frozen_today" to be in the middle of the year. Forward-Port-Of: odoo/enterprise#102827 Forward-Port-Of: odoo/enterprise#102772
This update resolves an issue where the automated PDF generation for multiple paychecks wasn't functioning correctly. The fix ensures that PDF documents are generated reliably, regardless of the number of paychecks being processed. This improves the accuracy and efficiency of payroll reporting.
Original PR description
### Issue: When running the scheduled action "Payroll: Generate pdfs" for several payslips, nothing is generated and a traceback can be seen in the logs. ### Steps to reproduce: - Disable scheduled…
### Issue: When running the scheduled action "Payroll: Generate pdfs" for several payslips, nothing is generated and a traceback can be seen in the logs. ### Steps to reproduce: - Disable scheduled action: "Payroll: Generate pdfs" (to avoid side effect in next step) - Refuse all time off for "Anita Oliver" (to avoid side effect in next step) - Create a user for the employee "Anita Oliver" - Link the employee and the user - Create 2 payslips - 1 for "Mitchell Admin" - 1 for "Anita Oliver" - Compute sheet and confirm both payslips - Run scheduled action: "Payroll: Generate pdfs" - Nothing happens ### Cause: The traceback is raised on the line `self._get_document_partner().id` because `_get_document_partner()` can return a recordset. ### Solution: Call `ids` instead of `id`. ### Note: Calling `_get_document_partner()` on a recordset [here](https://github.com/odoo/enterprise/blob/a0729c8d42ca93016b23e331d8f38c1f4fa88f12/hr_payroll/models/hr_payslip.py#L444) seems unexpected as, if only one payslip in the recordset has `self.employee_id.user_id.partner_id` evaluating to `True`, then it will return only this partner, completely ignoring the other part checking `self.employee_id.work_contact_id`. The final code works fine as `_check_create_documents()` is called again individually [here](https://github.com/odoo/enterprise/blob/a0729c8d42ca93016b23e331d8f38c1f4fa88f12/documents/models/ir_attachment.py#L86). opw-5213979 Forward-Port-Of: odoo/enterprise#101911
This update fixes an issue where the POS system incorrectly flagged refunds as exceeding order amounts due to rounding differences. The change now accounts for potential rounding discrepancies, ensuring accurate refund calculations and preventing unnecessary alerts. This improves the reliability of the POS refund process.
Original PR description
Before this commit, if the total amount of the order had rounding differences compared to the sum of its lines, the system could incorrectly trigger an alert stating that the refund amount exceeds the original order amount. This was due to a direct comparison between the two amounts without considering potential rounding issues. opw-5402240 Forward-Port-Of: odoo/enterprise#103094 Forward-Port-Of: odoo/enterprise#102224
This update resolves an issue where scanning cashier barcodes would cause an error if employee logging was turned off. Now, the barcode scanning functionality in the POS HR module works correctly regardless of whether employee logging is enabled, ensuring consistent operation for all users.
Original PR description
Before this commit, if logging with employee was disabled, scanning a cashier barcode would raise an error. opw-5437310 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#241318 Forward-Port-Of: odoo/odoo#241131
This update resolves a visual inconsistency in Odoo reports. Previously, long company taglines would push the address off-screen when generating PDFs, leading to a mismatch between the report preview and the final printed version. The fix ensures taglines wrap correctly, maintaining a consistent and professional report layout.
Original PR description
In the report when a company_tagline is long it offsets the address outside of the visible area but only in PDF. This creates a mismatch between the preview and the PDF rendering, creating unpredictable behavior. Adding a width ensures the tagline wraps instead of pushing the address out. task-5367661 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#238110
This update resolves two issues impacting the website editing experience. Firstly, it fixes blurry countdown canvases and text when zooming, ensuring sharp visuals at any scale. Secondly, it prevents text overlap with icons, particularly when using the search bar or selecting media options, improving usability and design clarity.
Original PR description
## [FIX] website: prevent blurry countdown canvas and text on zoom [Commit 1] Steps to reproduce: - Go to Website -> Edit Mode - Add a Countdown snippet (size: "Small") - Save and zoom in/out, the…
## [FIX] website: prevent blurry countdown canvas and text on zoom [Commit 1] Steps to reproduce: - Go to Website -> Edit Mode - Add a Countdown snippet (size: "Small") - Save and zoom in/out, the countdown canvas and text appears blurry The countdown was rendered at a low resolution, which caused it to blur when zooming. This fix updates the canvas to draw at the proper resolution so the countdown remains sharp at any zoom level. ## [FIX] web_editor: prevent text overlap with icon [Commit 2] Steps to reproduce: - Go to Website -> Edit Mode - Add a Image snippet - Enter a long text in search bar: Issue: 1. Text overlaps with search icon. 2. Selecting the "Photos (via Unsplash)" option causes the text to overlap the dropdown icon. The fix adjusts the end padding to provide sufficient spacing between the text and the icons. task-[4771268](https://www.odoo.com/odoo/project/974/tasks/4771268) Forward-Port-Of: odoo/odoo#242706 Forward-Port-Of: odoo/odoo#213373
This update fixes an issue with Brazil tax names that were causing errors when setting up a new company. The changes rename and translate tax names to ensure accurate accounting and prevent setup failures, improving the system's reliability for Brazilian businesses.
Original PR description
In 17.0, some taxes have had their incorrect name for the cashback taxes. This renames the invoice_label and name fields of such taxes to better represent what they are as well as add portuguese translations where necessary. task-5470453 Forward-Port-Of: odoo/odoo#242720 Forward-Port-Of: odoo/odoo#242446