Daily updates from Odoo
Thursday, January 29, 2026
165 changes
18 changes
Enhancements to existing features
This update ensures document discoverability settings (like public or private access) are consistently maintained when moving documents within the system. Previously, moving a document could unintentionally change its visibility based on the destination folder. The change includes updated confirmation dialogs to clearly communicate that the original settings will be preserved.
Original PR description
This commit improves the handling of a document's discoverability setting (`is_access_via_link_hidden`) when it is moved between folders. Previously, when a document was moved, it would inherit the…
This commit improves the handling of a document's discoverability setting (`is_access_via_link_hidden`) when it is moved between folders. Previously, when a document was moved, it would inherit the discoverability setting from the destination folder. This could lead to unintended changes in a document's visibility. For example, a publicly discoverable document could become private (requiring a direct link) simply by being reorganized into a different folder. This behavior was inconsistent with a previous improvement that prevented discoverability from propagating downwards from a parent folder to its children. See PR-93697. With this change, a document's discoverability is now treated as an intrinsic property that is fully preserved when the document is moved. It is no longer affected by the settings of its destination folder. To ensure clarity for the user, the move confirmation dialog has been updated to reflect this new logic. It now correctly informs the user that the document's original discoverability setting will be maintained. Task-5159832 Forward-Port-Of: odoo/enterprise#97045
Resolved issues and error corrections
This update fixes a discrepancy in Odoo's Balance Sheet reports for several localized versions (CO, EC, KR, US, and Zambia). It ensures that 'Other Expenses' (expense_other) are now correctly included in the unallocated earnings calculations, aligning with standard reporting practices. This improves the accuracy of financial reporting for these localized businesses.
Original PR description
*= co, ec, kr, us, zm Currently, the `Other Expense(expense_other)` account type, introduced in saas-18.3, is missing from the Balance Sheet reports of certain `localizations`, even though it's…
*= co, ec, kr, us, zm Currently, the `Other Expense(expense_other)` account type, introduced in saas-18.3, is missing from the Balance Sheet reports of certain `localizations`, even though it's correctly implemented in the standard reports. **Steps to reproduce:** - Install the `l10n_co_reports` and `accountant` modules. - Switch to `CO company `and navigate to Accounting > Reporting > Balance Sheet. - Ensure the `report` smart button is set to `Balance Sheet (CO)`. - Equity > Previous Years Unallocated Earnings and click the `info icon`. - Observe the formula of `balance_domain`. **Observation:** The formula does not include the `expense_other` account type. **Root Cause:** After PR [1], at [2] `expense_other` was added to the Previous Years Unallocated Earnings balance domain only in the main `account_reports` module. The corresponding localization reports mentioned above were not updated accordingly, resulting in incomplete Balance Sheet formulas. **Fix:** This commit updates the Balance Sheet report and includes the `expense_other` account type in the Previous Years Unallocated Earnings balance domain, aligning them with the standard reports. [1]: https://github.com/odoo/enterprise/pull/101591 [2]: https://github.com/odoo/enterprise/blob/316a5965e5fae83bd7d901929160c87eb28d13cf/account_reports/data/balance_sheet.xml#L205 opw-5491639 Forward-Port-Of: odoo/enterprise#105838 Forward-Port-Of: odoo/enterprise#105262
This update corrects a technical issue where order documents weren't being properly updated, leading to potential data inconsistencies. The change forces the update of the document's write date, ensuring accurate tracking and reporting within the l10n_mx_edi module. This resolves a previous limitation in the update process.
Original PR description
Before the commit 8b118a7, the search of the documents to update has been limited and ordered. With the actual domain the records to update will be most of the time the same because is not being updated. To fix this issue we force to update it. OPW-5368047 Forward-Port-Of: odoo/enterprise#104859 Forward-Port-Of: odoo/enterprise#103272
This update corrects a technical issue in the Odoo stock module that prevented accurate filtering of stock orderpoints. Previously, the system wasn't correctly restricting records to the current orderpoint, leading to potential inaccuracies. This fix ensures that stock orderpoints are filtered correctly, improving data reliability.
Original PR description
Description of the issue/feature this PR addresses:
This PR fixes an incorrect domain construction when restricting records to the current recordset.
The existing code attempted to combine domains using expression.AND() but did not apply the result, and referenced an invalid domain field.
Current behavior before PR:
- expression.AND() was called without assigning its return value, so the combined domain was never applied.
- The domain condition used ('ids', 'in', self.ids), which is not a valid searchable field.
- As a result, the intended filtering by the current recordset was silently ignored.
Desired behavior after PR is merged:
- The domain is correctly rebuilt and assigned using expression.AND().
- The filter uses the valid field instead of ids
- Records are properly restricted to the current recordset
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#246156
Forward-Port-Of: odoo/odoo#242799This update resolves an issue where administrators couldn't view sales order information linked to serial numbers, even when those orders belonged to other users. The fix removes a restriction on access to this data, ensuring all users can see the total number of sales orders associated with a specific serial number. This improves reporting and inventory management.
Original PR description
Steps to reproduce the bug - Create a storable product P1: - Tracking: Serial Number - Log in as Marc Demo - Create a sales order with 1 unit of P1 - Validate the delivery using serial number SN1 -…
Steps to reproduce the bug
- Create a storable product P1:
- Tracking: Serial Number
- Log in as Marc Demo
- Create a sales order with 1 unit of P1
- Validate the delivery using serial number SN1
- Log in as Mitchell Admin
- Go to Settings:
- Manage Users
- Mitchell Admin
- Sales: User: own documents only
- Go to the Serial Numbers list view:
- Try to open SN1
**Problem:**
An access error is triggered:
```
Uh-oh! Looks like you have stumbled upon some top-secret records.
Sorry, Mitchell Admin (id=2) doesn't have 'read' access to:
- Sales Order Line, S00025 - P1 (Deco Addict) (sale.order.line: 51)
Blame the following rules:
- Personal Order Lines
```
When clicking on SN1, the `stock.lot` form view.
it's contains the field "sale_order_count", which is a computed field that needs to access all `sale.order` records using the serial number in order to compute the count.
Since Mitchell Admin is restricted to his own sales orders only, an access error is raised during the computation.
There is also a many2many view widget that triggers an access errors. This widget can be removed since the smart button is now available. The widget has already been removed in v19.
**Solution:**
In this view, any stock user, admin or not, must be able to see how many sales orders use a given serial number, regardless of whether those sales orders belong to them or not.
opw-5400731
Forward-Port-Of: odoo/odoo#246009
Forward-Port-Of: odoo/odoo#244570This update fixes a previous issue where the weigh scale displayed incorrect prices due to a lack of consideration for pricelists and fiscal positions. Now, the weigh scale accurately reflects the price, including any adjustments defined in a customer's pricelist or fiscal position, ensuring accurate sales transactions.
Original PR description
Before this commit, the pricelist and fiscal position where not taken into account when displaying the price on the weigh scale. This caused confusion when selling products with pricelists or fiscal positions that modified the price. opw-5456144 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#243260
This update fixes an issue where the weigh scale displayed incorrect prices due to a lack of consideration for pricelists and fiscal positions. Now, the weigh scale accurately reflects the price based on the customer's selected pricelist or fiscal position, improving sales accuracy and customer satisfaction.
Original PR description
Before this commit, the pricelist and fiscal position where not taken into account when displaying the price on the weigh scale. This caused confusion when selling products with pricelists or fiscal positions that modified the price. opw-5456144
This update fixes an issue where the product quantity and unit of measure fields on the MRP production kanban cards would become unreadable when product names were long. The change ensures these fields remain consistently visible regardless of product name length, improving usability and clarity.
Original PR description
Description of the issue/feature this PR addresses: On MRP production kanban, if the name of the product is too long, `product_qty` and `product_uom_id` fields on the card shrink and become unreadable. This adds proper classes to keep those fields from shrinking no matter how long product's name is. Current behavior before PR: <img width="1561" height="303" alt="image" src="https://github.com/user-attachments/assets/08e299be-c6e2-4241-b289-aaa2fab9a94f" /> Desired behavior after PR is merged: - The size of the product's name should be fine no matter how long the name of the product is. - The `product_qty` and `product_uom_id` should not shrink if the name of the product is long. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245861
This update resolves a minor technical issue within the l10n_jo_hr_payroll module. A typographical error in the module's manifest file has been corrected. This ensures the module functions correctly and integrates smoothly with the Odoo system.
Original PR description
Fix some typos in the manifest of the module. Task: 5462506
This update resolves an issue where Odoo couldn't connect to printers with overly long device names. The fix automatically shortens these names to comply with CUPS's 127-character limit, ensuring reliable printer connectivity. This prevents connection failures and improves the overall printing experience.
Original PR description
CUPS has a limit on printer names of 127 characters, which means that if a device has a very long device URI, it can exceed this limit and cause an error when we try to add it to CUPS:
```
Failed to add printer 'dnssdPhotosmart%207520%20series%20%40%20Guillaume%E2%80%99s%20MacBook%20Air%20(2)_ipp_tcplocalcups?96d0de60-096c-3d08-5e2d-893393e10c2b'
Traceback (most recent call last):
File "/home/pi/odoo/addons/iot_drivers/iot_handlers/interfaces/printer_interface_L.py", line 242, in set_up_printer_in_cups
self.conn.addPrinter(name=device['identifier'], device=device['url'], **ppdname_argument)
~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
cups.IPPError: (1024, 'client-error-bad-request')
```
We fix this error by truncating the identifier to 127 characters maximum.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#246151
Forward-Port-Of: odoo/odoo#245910This update resolves an issue where Mexican CFDI invoices generated with Solution Factible were being rejected due to incorrect exchange rate precision. The fix applies a rounding adjustment previously implemented for other PACs, ensuring invoices with larger payment values are now processed correctly. This prevents invoice rejection and ensures compliance with Mexican tax regulations.
Original PR description
The PACs Quadrum and SwSapien both require the exchange rate to have 6 decimal places. This can cause some valid invoices to be rejected for large enough payment values. Pull request…
The PACs Quadrum and SwSapien both require the exchange rate to have 6 decimal places. This can cause some valid invoices to be rejected for large enough payment values. Pull request [83499](https://github.com/odoo/enterprise/pull/83499) added rounding precision for these PACs. Now, the remaining PAC (Solution Factible) appears to the same requirement. This commit ensures that the previous bug fix is applied to all PACs. [opw-5165200](https://www.odoo.com/odoo/project.task/5165200) ## Steps to reproduce: [Setup](https://drive.google.com/file/d/1BUkNG-Ezk-I47yvbNolOmlj0ne1iqDto/view?usp=sharing) 1. Navigate to Apps and install l10n_mx_edi. 2. Switch to any of the Mexican companies that appear. 3. Navigate to Accounting > Configuration > Currencies. 4. Click into the USD currency. 5. Change the current rate to be 20.101796407186 MXN per USD. (inverse_company_rate field). 6. Navigate to Accounting > Configuration > Settings, and set the PAC to Solution Factible. [Workflow](https://drive.google.com/file/d/11TFZ78QGDYdnD9R3CoJDAuFI-1_0dNyG/view?usp=sharing) 1. Navigate to Accounting > Customers > Invoices. 2. Select New to create a new invoice. 3. Add a mexican customer (such as XENON INDUSTRIAL ARTICLES). 4. Add the 45 day Payment terms. This should change the payment policy to PPD. 5. Change the currency to USD. 6. Add the product FURN_8220 (or any with the unspsc_code_id set). 7. Set the unit price of the product to 58968.29. 8. Confirm the invoice. 9. Select Send & Print, then ensure that the CFDI option is selected before clicking Send & Print again. 10. Select Register Payment, then Confirm Payment. 11. Select the Update Payments smart button. 12. Navigate to the CFDI tab; there will be a "Payment Send in Error" line. Forward-Port-Of: odoo/enterprise#105102 Forward-Port-Of: odoo/enterprise#102557
This update optimizes how Odoo builds SQL queries when joining related models with delegated access. Previously, joining on fields with delegated access required extra permissions, which is now bypassed. This change improves query performance and ensures consistent access control, particularly when using search functionality.
Original PR description
When building the SQL for a related field, we join the table for the comodel and may apply user access to that comodel. Using *inherits* already adds record rules for that field, so joining on the field on which "delegates" access to fields, can be done without additional permissions.
```py
class M1(Model): ...
class M2(Model):
_inherits = {'m1': 'm1_id'}
m1_id = fields.Many2one(...)
```
Consider the following, `Query(m2_record).m1_id` should join without additional access rules. This is fine because the query usually comes from a `_search` (which has added the necessary permissions).
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update fixes an issue where dialog windows were hidden behind the AI chat window, making them difficult to use. Now, the AI chat window remains consistently above all other dialogs, ensuring a clearer and more intuitive user experience for interacting with the system.
Original PR description
**Description of the issue this PR addresses:** ------------------------------------------------ Dialogs were rendered behind chat windows, making them difficult to see and interact with. **Current behavior before PR:** --------------------------------- - The dialog appears behind the chat window **Desired behavior after PR is merged:** ----------------------------------------- - Dialogs are displayed above all chat windows except AI - The AI chat window remains intentionally above dialogs **Task:** 5367135 Forward-Port-Of: odoo/enterprise#105710 Forward-Port-Of: odoo/enterprise#103076
This update fixes a previous issue where the VoIP ringtone would play incorrectly due to multiple tabs receiving notifications. Now, a central SharedWorker determines the best tab to play the ringtone, ensuring only one ringtone plays at a time and addressing potential reliability problems like connection loss or throttling.
Original PR description
Each Odoo tab establishes a WebSocket connection with the VoIP provider. This causes problems with incoming calls: each tab receives the notification, which leads to the associated callbacks being…
Each Odoo tab establishes a WebSocket connection with the VoIP provider. This causes problems with incoming calls: each tab receives the notification, which leads to the associated callbacks being called as many times as there are open tabs. This used to be particularly annoying with the ringtone, which would play in unison. To solve this problem, we decided that only the "main tab" should be responsible for playing the ringtone. Since there can only be one main tab at a time, there can only be one ringtone at a time. Problem solved. This seemed to be an easy and effective solution. However, we were informed that sometimes the call wouldn't ring at all 🤬 This called the reliability of the system into question. What would happen if: - The main tab loses the WebSocket connection? - The main tab is throttled? - The main tab was never interacted with, preventing us from playing audio? - The notification arrives after the main tab is killed and before a new main tab is elected? This commit attempts a new approach ⋆✴︎˚。⋆ All tabs receiving incoming call notifications will now send a message to a central authority—The _SharedWorker_ 🙀—along with information about whether or not they can play audio. The SharedWorker then selects the first tab that can play audio and assigns it the task of playing the incoming ringtone. This is expected to solve the problems mentioned above, as it guarantees that the "player tab" is a tab that: - effectively received the incoming call notification - is allowed to play audio [Task-5411760](https://www.odoo.com/odoo/project.task/5411760) Backport of https://github.com/odoo/enterprise/pull/104885 Forward-Port-Of: odoo/enterprise#105022
This update fixes an issue where changes to form fields weren't immediately reflected in the builder interface. By moving key properties to the component and using a state management system, the builder now correctly updates when field types or settings are modified, ensuring a more responsive and accurate editing experience.
Original PR description
*: website After the [refactoring of html_builder], containers weren't updated all the time properly. They were updated only when the options' length or ids, respectively, have been changed, which is not the desired behavior. For example, if `isCloneDisabledReason` changes, we won't be able to see the changes right away. That's why we moved some options containers' props to the component to use `useDomState`. Steps to see the issue: - Open website and start editing - Drop a form - Add a field and click on it - Change its type to one of the existing fields, e.g. 'Alias Domain' => The duplicate button of the builder is not deactivated, while it should be. The issue exists vice versa too (when we change the type from an existing field to a custom one). [refactoring of html_builder]: https://github.com/odoo/odoo/commit/9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 task-5391316 Forward-Port-Of: odoo/odoo#246150 Forward-Port-Of: odoo/odoo#239235
This update fixes an issue where optional products for a sale order were always added at the end of the order, regardless of where the main product was placed. The change ensures that optional products are now correctly inserted immediately after their corresponding main product line, creating a cleaner and more organized sale order view. This improves the user experience and data clarity.
Original PR description
# Steps to reproduce: * Create a sale order with two sections * In the first section, use the ellipsis to add a product that has optional products configured and add its optional products * The optional product lines are added under the next section instead of the current one # Issue: * Optional products are always appended at the end of the order, even when the main product is inserted in the middle # Cause: * While creating new lines in `sale_product_field.js`, the intended insertion position is ignored # Solution: * Update the configurator save logic to insert optional product lines immediately after their corresponding main product line Affected Version-19.0 opw-5445800 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#243069
Code cleanup and technical improvements
This update enhances the testing process for Odoo's Arabic accounting modules (l10n_ar). Specifically, a new testing method and refactoring of the test suite ensures more reliable and accurate verification of these modules, improving overall system stability and accuracy for Arabic-speaking users.
Original PR description
- Implemented a working `assert_json` method on `AccountTestInvoicingCommon`, that also supports the ignore_schema system and quick save using the `SAVE_JSON` test tag. - Refactors the whole test suite of `l10n_ar*` modules to use the new accounting test helpers properly. task-4891206 Forward-Port-Of: odoo/odoo#245457 Forward-Port-Of: odoo/odoo#242309
This update streamlines the testing process for the Ar-EDI module by automatically verifying data against JSON files. This change allows tests to run without external dependencies and simplifies updates to test data through a simple tag.
Original PR description
This commit refactors the whole `l10n_ar_edi` test suite to use the new helpers, and made it possible for the test to (finally) be run without external mode. Now, when running these new tests, the test framework will by default assert the request data with their associated JSON file. When a change is made, new overwrites for the test files can be easily changed by just adding the `SAVE_JSON` test tag on the command to run the tests. task-4891206 Forward-Port-Of: odoo/enterprise#105299 Forward-Port-Of: odoo/enterprise#103370
5 changes
Resolved issues and error corrections
This update corrects a bug where embedded actions within documents were disappearing from the user interface, preventing their removal. The fix ensures that embedded actions remain visible and manageable, resolving a previous issue caused by overly broad filtering of server actions. This improves the user experience and simplifies document management.
Original PR description
Server actions that were standalone (not a child) and embedded on a documents folder cannot be executed anymore when they are linked to a parent action. Before saas-18.3, the embedded child action…
Server actions that were standalone (not a child) and embedded on a documents folder cannot be executed anymore when they are linked to a parent action. Before saas-18.3, the embedded child action would still be in the documents' available_embedded_actions, and couldn't be removed, such that a fix was necessary. From saas-18.3 onwards, children embedded actions are no longer visible. As this precise case wasn't explicitly tested, we continue the FW-port with the (adapted) test. Furthermore, we add a garbage collection of the embedded actions for children actions, as they cannot be executed anymore. Initial FIX: ### ISSUE It is possible that certain embedded actions visible in a folder cannot be found or deleted through the interface, as they are not displayed under the folder's server actions list when clicking on the gear icon. This is caused by overly broad filtering in documents.document.get_documents_actions, which removes all child server actions regardless of whether they were embedded in the folder. So if a user creates two embedded actions inside a folder, then modifies the underlying server actions so that one is the child of the other, the embedded action associated with the child server action would disappear from the folder's actions list but would still be embedded in the folder making it impossible to remove it through the UI This patch updates the logic so that only non-embedded child actions are excluded. Embedded actions remain visible and manageable as expected. opw-5213881 Forward-Port-Of: odoo/enterprise#105235 Forward-Port-Of: odoo/enterprise#100395
This update corrects a technical issue preventing invoices from successfully validating with DIAN, Colombia's tax authority. The fix involves updating a specific tag format within the invoice XML files to match DIAN's requirements. This ensures invoices are properly processed and avoids validation errors.
Original PR description
Problem: When validating invoices with DIAN, an error is received. Cause: Incorrect tags are being used in the invoices. These tags are checked when invoices are validated with DIAN. Solution: Use the correct tags in the invoices. schemeName should be used instead of scheme_name. Steps to reproduce: - Install l10n_co_dian module - Choose a Colombian company - Activate DIAN service in Settings - Create an invoice and send it while making sure the DIAN checkbox is ticked - Download the generated zip file and uncompress - Open the XML file and check for scheme_name. It should be replaced by schemeName. opw-5829958 Forward-Port-Of: odoo/enterprise#105659
This update fixes a bug that prevented automatic reconciliation when an invoice's reference matched its payment reference. Previously, the system blocked the match, requiring manual intervention. Now, the system correctly identifies and automatically reconciles invoices with matching payment references, improving accounting efficiency.
Original PR description
The aim of this commit is to make the automatic reconciliation works in case of an obvious matching that was prevented because the reference of the invoice was also it's payment reference. It also…
The aim of this commit is to make the automatic reconciliation works in case of an obvious matching that was prevented because the reference of the invoice was also it's payment reference. It also modify a docstring of a test because it was lying about what it was really testing. The usecase it says it forbid is actually enforced by `test_matching_algorithm_for_multiple_invoices`. Before this commit: - functionally: The obvious matching was denied and the accountant had to manually make the match. - technically: The `aml.ref` and the `move.payment_reference` were the exact same and thus postgres regrouped the invoice (through aml) with itself as if there were 2 invoices matching the same word. After this commit: - functionally: The obvious match is made. - technically: The initial intend was to avoid having several invoices (proxy by amls) reported for a specific matching word preventing the system to take a difficult and arbitrary functional decision which might be wrong. In order to comply with that and to not block the match of an invoice that would be matched through several matching words, we don't gather twice the same aml for the same word. task-id: None (The issue arose on odoo.com and was brought by APFA) Forward-Port-Of: odoo/enterprise#105648
This update fixes a minor issue where payment links were sometimes displayed even when the subscription was expired and certain products were archived. Now, the 'Pay Now' link only appears if the advance payment section is visible, ensuring a cleaner and more accurate user experience for subscription renewals.
Original PR description
When the subscription is expired and has to be paid, only use an anchor for `Pay Now` if the advance payment section is displayed (it could be hidden for ex. if any of the product has been archived) Forward-Port-Of: odoo/enterprise#105802 Forward-Port-Of: odoo/enterprise#105480
This update fixes an issue where the barcode scanning process didn't create enough quality checks for products tracked by lot. The change ensures that each unique lot within a receipt triggers a separate quality check, improving inventory accuracy and quality control. This impacts users managing lot-based stock tracking.
Original PR description
**Steps to reproduce:** * Install the `stock_barcode`, `quality_control` modules. * Go to *Inventory > Configuration > Settings* and enable **Packages**. * Create a product with **By Lot** tracking…
**Steps to reproduce:** * Install the `stock_barcode`, `quality_control` modules. * Go to *Inventory > Configuration > Settings* and enable **Packages**. * Create a product with **By Lot** tracking enabled and set a barcode reference. * Create a quality control point for this product with following configuration: * Operation: *Receipts* * Control per: *Quantity* * Control Frequency: *All* * Product: the previously created lot-tracked product. * Create a receipt for this product with a quantity of 6 and `mark as todo`. * Open the *Barcode* app and process the receipt. * Scan the product barcode. * Scan some quantity of the product with lot *LOT01* and put those units into a package(Put-In-Pack). * Scan the remaining quantity with lot *LOT02* and put those units into a different package(Put-In-Pack). * Click on **Quality Checks**. **Observed behavior:** * Only one quality check is created, even though the receipt contains two different lots that should each generate a quality check. **Cause:** * In `_inverse_qty_done`, move lines are marked as *picked* when `qty_done` is equal to quantity(Demand). * During the `write` operation, quality checks are created only for move lines that are not picked, which prevents creating a quality check for each lot. * Relevant code: https://github.com/odoo/enterprise/blob/464dc0c65548f3f440b293b534616743ddd5e130/quality_control/models/stock_move_line.py#L39 https://github.com/odoo/enterprise/blob/464dc0c65548f3f440b293b534616743ddd5e130/stock_barcode/models/stock_move_line.py#L67-L71 **Fix:** * Ensure that quality check points are generated correctly when validating products through the Barcode app using the Put in Pack option. --- opw-5405221 Forward-Port-Of: odoo/enterprise#105535 Forward-Port-Of: odoo/enterprise#102714
10 changes
Resolved issues and error corrections
This update corrects a technical issue preventing invoices from successfully validating with DIAN, Colombia's tax authority. The fix involved updating a specific tag format within the invoice XML to match DIAN's requirements, ensuring accurate and compliant invoice submissions. This resolves a validation error impacting Colombian businesses using the l10n_co_dian module.
Original PR description
Problem: When validating invoices with DIAN, an error is received. Cause: Incorrect tags are being used in the invoices. These tags are checked when invoices are validated with DIAN. Solution: Use the correct tags in the invoices. schemeName should be used instead of scheme_name. Steps to reproduce: - Install l10n_co_dian module - Choose a Colombian company - Activate DIAN service in Settings - Create an invoice and send it while making sure the DIAN checkbox is ticked - Download the generated zip file and uncompress - Open the XML file and check for scheme_name. It should be replaced by schemeName. opw-5829958 Forward-Port-Of: odoo/enterprise#105659
This update corrects a bug in version 17 where paid event registrations automatically confirmed after a sale, leading to incorrect notifications and a less effective attendee editor. Now, registrations remain in 'draft' mode until attendee information is entered, ensuring notifications go to the correct recipient and maintaining administrative control.
Original PR description
Problem: - In version 17, event records linked to a sales order can be automatically set to ‘open’ immediately after the sale. This makes the wizard editor less useful (the data provided is not used…
Problem: - In version 17, event records linked to a sales order can be automatically set to ‘open’ immediately after the sale. This makes the wizard editor less useful (the data provided is not used for the record that is already confirmed) and notifications go to the sales partner instead of the actual assistant. Current behaviour: - Confirmed orders automatically confirm attendees, reducing the value of the wizard step and sending emails to the wrong recipient. Expected behaviour: - Paid attendee registrations created from Sales should remain in “draft” until attendee details are provided. Solution: - Do not set ‘state=“open”’ for payment records created from a sale involving the data wizard for records. Ensure they remain in “draft”. - Confirm registrations once attendee details are present. Advantages: - Restores the usefulness of the attendee editor: confirmation occurs after data entry, so notifications are directed to the attendee, not just the sales partner. - Meets functional expectations for administrative control and proper recipient targeting. Tests to reproduce the error: - Create quote with payment entry - Confirm SO - Enter attendee details and confirm - Registrations change to ‘open’ and a confirmation email is sent to the order partner and not to the registered attendee. @Tecnativa TT58160 @pedrobaeza please review --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#230500
This update fixes an issue where the product quantity and unit of measure fields on the MRP production kanban cards would shrink and become unreadable when product names were long. The change ensures these fields remain consistently visible, regardless of the product name's length, improving usability.
Original PR description
Description of the issue/feature this PR addresses: On MRP production kanban, if the name of the product is too long, `product_qty` and `product_uom_id` fields on the card shrink and become unreadable. This adds proper classes to keep those fields from shrinking no matter how long product's name is. Current behavior before PR: <img width="1561" height="303" alt="image" src="https://github.com/user-attachments/assets/08e299be-c6e2-4241-b289-aaa2fab9a94f" /> Desired behavior after PR is merged: - The size of the product's name should be fine no matter how long the name of the product is. - The `product_qty` and `product_uom_id` should not shrink if the name of the product is long. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245861
A bug preventing statement printing from the list view has been resolved. The issue stemmed from incorrect data being passed to a print function within the Odoo accounting module, specifically related to bank statement imports. This update ensures statements can now be printed successfully.
Original PR description
When trying to print a statement via the list view, we get a traceback. This is because the module `account_bank_statement_import` inherits the `view_bank_statement_tree` and use `accountMoveUploadListView` which use `AccountMoveListController`. Therefore, when calling `get_extra_print_items` from the controller, we call it with model `account.move` but with a statement id, which leads to either wrong behavior or access error. Steps: - Make sure account_bank_statement_import is installed - Have 2 companies - Create a bank statement for company B, make sure it has the same id as any account move from company A - From the bank statement list view, select the statement - Click on the print button -> Traceback opw-5427019
This update fixes a potential issue where users re-registering their PEPPOL accounts wouldn't be properly updated. The change ensures that when a participant's status changes to 'client_gone', the associated proxy user is archived, allowing for a smoother re-registration process. This improves the overall user experience for PEPPOL integration.
Original PR description
Currently, if the participant_status gets a client_gone, we call the _reset_peppol_configuration method. But while we reset, we don't archive the proxy_user. We should do so, so the user can re-register --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246261
This update fixes a minor issue where payment links were incorrectly displayed for expired subscriptions. Specifically, the 'Pay Now' anchor was only added when the advance payment section was visible, preventing confusion when products associated with the subscription had been archived. This ensures a cleaner and more accurate user experience.
Original PR description
When the subscription is expired and has to be paid, only use an anchor for `Pay Now` if the advance payment section is displayed (it could be hidden for ex. if any of the product has been archived) Forward-Port-Of: odoo/enterprise#105802 Forward-Port-Of: odoo/enterprise#105480
This update corrects a visual bug where carousel snippets were incorrectly truncated in the snippet editor. Now, the preview height automatically adjusts to fit the content of the carousel, ensuring accurate representation and a better user experience. This resolves a display issue impacting how users create and manage carousel snippets.
Original PR description
Steps to reproduce: - Drag and drop a Carousel. - Add content to the first slide of the carousel to make the snippet taller. - Save the snippet as a custom snippet. - Open the snippet dialog. - Issue: The height of the preview for the saved snippet is forced to 550px, causing the snippet to be truncated. After this commit, the height is no longer forced; it now adapts to the snippet content. task-5156137 Forward-Port-Of: odoo/odoo#244251
This update resolves a memory issue that occurred when loading website pages, specifically within the page manager. The fix prevents excessive data loading by optimizing how the system retrieves page information, resulting in faster and more stable website performance. This change improves the overall user experience and reduces the risk of performance slowdowns.
Original PR description
Before this commit, loading the list view of the website pages invoked a method called `_get_most_specific_pages`. This method caused a memory error due to loading the field called `key` for the pages being fetched. This field was related to a field called `key` in the model `ir.ui.view`, so a cache miss in the recordset causes a `SELECT *` query for the ir.ui.view potentially causing a memory error if the size of these views are big. A solution for this is to force the ORM to load only the `key` field by invoking **search_fetch** on the `ir.ui.view` model instead. In order to improve the retrieval of a given page key count, we now use a Counter map (=> constant time instead of linear search). --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#240924
This pull request addresses several minor bugs and improves the stability of the Hoot system, which handles web interactions within Odoo. The changes include correcting error messages, enhancing XHR mocking for testing, and adding a new option for value assertions. These improvements ensure a more reliable and predictable user experience.
Original PR description
### [FIX] Hoot fixes This PR contains several fixes for the Hoot system. See each commit description for more details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244726
This update resolves a testing issue in the account module's audit trail tests. Specifically, a change was made to ensure data flushing occurs within key test cases, improving the reliability of the tests. This ensures the accuracy of audit trail reporting.
Original PR description
Since this commit https://github.com/odoo/odoo/pull/242248/changes flushing inside `test_cant_unlink_message1`, `test_cant_unown_message` is now required. https://runbot.odoo.com/odoo/runbot.build.error/237803 runbot/error-237803
5 changes
Resolved issues and error corrections
This update corrects a technical issue preventing invoices from successfully validating with DIAN, Colombia’s tax authority. The fix involves updating a specific tag format within invoices to match DIAN’s requirements, ensuring accurate and compliant invoice submissions. This resolves a validation error that was impacting Colombian businesses using the l10n_co_dian module.
Original PR description
Problem: When validating invoices with DIAN, an error is received. Cause: Incorrect tags are being used in the invoices. These tags are checked when invoices are validated with DIAN. Solution: Use the correct tags in the invoices. schemeName should be used instead of scheme_name. Steps to reproduce: - Install l10n_co_dian module - Choose a Colombian company - Activate DIAN service in Settings - Create an invoice and send it while making sure the DIAN checkbox is ticked - Download the generated zip file and uncompress - Open the XML file and check for scheme_name. It should be replaced by schemeName. opw-5829958 Forward-Port-Of: odoo/enterprise#105659
This update fixes an issue where move quantities were incorrectly displayed after exiting the barcode MRP operation. The change ensures that quantities are accurately reflected when re-entering the operation, preventing discrepancies in production tracking. This improves the reliability of the manufacturing process.
Original PR description
**Issue** When leaving the barcode MRP operation, `post_barcode_process()` may incorrectly update the move quantities. **Steps to reproduce** - Create a product with a BOM using a component with qty…
**Issue** When leaving the barcode MRP operation, `post_barcode_process()` may incorrectly update the move quantities. **Steps to reproduce** - Create a product with a BOM using a component with qty 6. - Create an MO producing qty 1. - Open the Barcode app > Manufacturing > open the MO (remove “MO Ready” filter if needed). - Click “+1”. - Edit the component qty from 6 to 3. - Exit the operation. - Re-enter the operation. -> The component shows 3/3 instead of 3/3 and 0/3. **Cause** On exit, `_onExit`: https://github.com/odoo/enterprise/blob/776848dc4e29d07a027847fde46a59f84dd35f56/stock_barcode/static/src/models/barcode_picking_model.js#L1489 calls `post_barcode_process()`, which triggers `split_uncompleted_moves`: https://github.com/odoo/enterprise/blob/776848dc4e29d07a027847fde46a59f84dd35f56/stock_barcode/models/stock_move.py#L16 correctly creating a `stock.move.line` with qty 3. However, `_truncate_overreserved_moves`: https://github.com/odoo/enterprise/blob/776848dc4e29d07a027847fde46a59f84dd35f56/stock_barcode/models/stock_move.py#L40 then reduces the move quantity to `max_reserved_qty = 3` and unreserves the remaining 3 units: https://github.com/odoo/enterprise/blob/776848dc4e29d07a027847fde46a59f84dd35f56/stock_barcode/models/stock_move.py#L49 This happens because the newly created move line is initialized with `reserved_uom_qty = 0`: https://github.com/odoo/enterprise/blob/776848dc4e29d07a027847fde46a59f84dd35f56/stock_barcode/static/src/models/barcode_picking_model.js#L1256 leading to `max_reserved_qty = quantity_done = 3 < move.quantity = 6`, while `move.product_uom_qty` is still 6. opw-5166763 Forward-Port-Of: odoo/enterprise#100314
This update fixes a minor issue on the subscription payment page by ensuring the 'Pay Now' anchor link is only displayed when the advanced payment section is visible. This prevents unnecessary links from appearing when products have been archived, creating a cleaner and more user-friendly experience for customers.
Original PR description
When the subscription is expired and has to be paid, only use an anchor for `Pay Now` if the advance payment section is displayed (it could be hidden for ex. if any of the product has been archived) Forward-Port-Of: odoo/enterprise#105802 Forward-Port-Of: odoo/enterprise#105480
This update prevents documents from automatically opening in their form view when accessed through various channels like direct URLs or systray notifications. This change addresses a user experience issue, ensuring users can access documents without unwanted automatic opening, improving usability and workflow efficiency. The fix covers several access points including direct URLs, systray notifications, and the Discuss app.
Original PR description
Users do not want to access the form view of the document by default. This PR solves three cases for accessing documents.document records that were not covered before: * From the basic path pattern `odoo/x/documents.document/<id>` * From a systray notification "Open Form View" * when we are not yet in Documents * when we already are in Documents * From the Discuss app, on the record's thread Tests for most of these are included. Additionally, make sure the document is selected on accessing from `_get_access_action`. Task-5386466 Forward-Port-Of: odoo/enterprise#104622
This update resolves an issue where customer claims weren't being processed correctly when a customer shared a VAT number with a related invoice contact (like a child invoice). The fix ensures the system accurately identifies the correct partner based on VAT number, preventing missed account move updates and ensuring claim processing accuracy.
Original PR description
When we process new customer claims, we need to search for the corresponding account moves in order to update their `l10n_cl_dte_acceptation_status`. Currently, we only expect 1 partner per VAT number when searching for a partner to match with the account move. However, this is not always true. For instance, a child invoice contact will share the same VAT number than the parent partner. This can lead to the selection of the wrong partner in the search domain and consequently, the account move not being found. Related ticket: opw-5257481 Forward-Port-Of: odoo/enterprise#103366
6 changes
Enhancements to existing features
This update simplifies the map view by changing how task numbers are displayed, making it easier to identify related records. It also adds visual cues – like marker highlighting and size changes – when you interact with the map or the list, improving usability. This enhances the overall efficiency of using the map to manage tasks.
Original PR description
First PR of multiple to rework the map UI / UX. In this first PR we focus on the change from numbering the map marker according to the list item number to numbering the map marker by the number of…
First PR of multiple to rework the map UI / UX. In this first PR we focus on the change from numbering the map marker according to the list item number to numbering the map marker by the number of records with the same address (previously done with badges) Furthermore, now that the list between the task and the pin on the map is less evident (no more numbering to link the two), we add some hover effects: on the map marker hover we highlight the list item, and on the list item hover, we make the map marker bigger in the map. List of all changes: - Side panel - Removed List title - Side panel - Replaced the drag handle from the far right to far left of the task. - Side panel - Removed numbering of tasks. - Side panel - Move and restyled "View in Google Maps" button to control panel. - Side panel - On hover of the list item make the related map marker bigger. - Side panel - Add some coloring change to the handle on the handle hover. (This was done in an accounting module, and I find it a good addition to the mouse pointer changing on handle hover) - Map - On hover of the marker, make the marker bigger and highlight the related list item. - Map - Remove badges from map marker with multiple records address. - Map - Change numbering from representing the list item number to the number of records with the same marker. - Map - On the mobile view, no more toggling of tasks. --> We do not yet address any grouping logic. task#5259181 documentation PR: odoo/documentation#16092 Following PR: odoo/enterprise#104812
This update enhances the Invoicing & Banks role's access to critical accounting reports like General Ledger and Profit & Loss. Previously restricted, the role now has read-only access, ensuring users have the necessary data for accurate financial reporting. This change improves operational efficiency and reporting capabilities.
Original PR description
Before: The Invoicing & Banks role did not have access to important accounting reports such as General Ledger, Trial Balance, and Profit & Loss. After: The role now inherits read-only privileges, allowing access to all essential accounting reports. Task-5418541 Forward-Port-Of: odoo/enterprise#105322 Forward-Port-Of: odoo/enterprise#104868
Resolved issues and error corrections
This update corrects a bug in how websites are displayed on the Helpdesk page. Now, the website with the lowest sequence number is automatically designated as the default, ensuring consistent and predictable website selection. This resolves an issue where a website with a high sequence number could incorrectly appear as the default.
Original PR description
This PR changed the default website behaviour. Now, the website appearing at the top of the list in the '/websites' page is considered to be the default one. In other words, the default website is the one with the lowest `sequence` value. This commit fixes a test where a website is created with sequence equal to 5 and interferes with the above-described mechanism. Community PR: https://github.com/odoo/odoo/pull/225335 Upgrade PR: https://github.com/odoo/upgrade/pull/9434 task-5028180
The Documents activity menu now correctly displays folder names instead of "Unnamed" when navigating from the systray. This issue stemmed from an undefined value in the folder selection process, which was resolved by providing a default folder value to ensure accurate breadcrumb navigation.
Original PR description
When navigating to Documents through the activity menu (systray), the breadcrumb displays "Unnamed" instead of showing the proper folder name. Steps to reproduce: 1. Click the activity menu icon (clock) in the systray 2. Click on "Documents" in the activity dropdown 3. Observe the breadcrumb shows "Unnamed" The issue occurs because when navigating from the systray, the folder section's activeValueId is undefined. This causes getSelectedFolderAndParents() to call folderSection.values.get(undefined), which returns undefined instead of the default folder. Without a valid folder object, the breadcrumb computation has no context and falls back to displaying "Unnamed". The fix ensures that when activeValueId is undefined, we explicitly pass false to values.get(), which correctly retrieves the root/default folder. opw-5473442 Forward-Port-Of: odoo/enterprise#104297
This update fixes an issue where the Gantt chart controls would overlap the user interface, particularly when using custom date ranges and a smaller screen size (simulating an iPhone). The change ensures that the Gantt controls are displayed correctly, improving usability and preventing visual clutter.
Original PR description
Steps to reproduce ================== - Switch to dutch - Emulate an iPhone SE viewport in the browser settings - Open a project - Switch to the gantt view - Use a custom date range -> The gantt controls are displayed on top due to the daterange format being to long | Before | After | |--------|--------| | <img width="736" height="1542" alt="image" src="https://github.com/user-attachments/assets/7c573ab1-fbf8-4f31-83ba-21d66ebc504d" /> | <img width="736" height="1542" alt="image" src="https://github.com/user-attachments/assets/62ab3d47-701e-4e2d-aaef-5c92675236cb" /> | opw-5340869 Forward-Port-Of: odoo/enterprise#105229 Forward-Port-Of: odoo/enterprise#104821
Code cleanup and technical improvements
This update simplifies adding new AI providers to Odoo by introducing a standardized API service structure. It improves the LLM's ability to handle conversations and interactions, enabling new features like user-interactive tools and batch record updates. The refactoring also addresses previous issues with statelessness and inefficient reasoning.
Original PR description
This PR introduces a refactoring of the LLMApiService which aims to make use of inheritance in order to simplify the addition of new providers to odoo. It creates a new `AIApiService` base class that exposes 4 public methods: - `get_completions`: the main method to retrieve completions from the LLMs. - `get_embeddings`: method to retrieve the embeddings for a given input. - `get_transcription`: method to create a transcription for an audio file. - `get_realtime_session`: method to create a realtime transcription session. These methods (particularly the `get_completions` rely on overrides of private methods in the specific services to specialise the request/response cycle to a specific provider. This commit also introduce a new `AIApiServiceFactory` class which is used to initialise an `AIApiService` of proper type based on the model that is requested (i.e. OpenAIApiService for `gpt-5`, and `GoogleAIApiServie` for gemini-2.5-flash)
6 changes
Enhancements to existing features
This update ensures document discoverability (public or private) remains consistent when moving files within Odoo. Previously, moving a document could unintentionally change its visibility based on the destination folder's settings. The move confirmation dialog now clearly indicates that the document's original discoverability setting will be preserved.
Original PR description
This commit improves the handling of a document's discoverability setting (`is_access_via_link_hidden`) when it is moved between folders. Previously, when a document was moved, it would inherit the…
This commit improves the handling of a document's discoverability setting (`is_access_via_link_hidden`) when it is moved between folders. Previously, when a document was moved, it would inherit the discoverability setting from the destination folder. This could lead to unintended changes in a document's visibility. For example, a publicly discoverable document could become private (requiring a direct link) simply by being reorganized into a different folder. This behavior was inconsistent with a previous improvement that prevented discoverability from propagating downwards from a parent folder to its children. See PR-93697. With this change, a document's discoverability is now treated as an intrinsic property that is fully preserved when the document is moved. It is no longer affected by the settings of its destination folder. To ensure clarity for the user, the move confirmation dialog has been updated to reflect this new logic. It now correctly informs the user that the document's original discoverability setting will be maintained. Task-5159832
This update enhances the mobile signing experience by addressing layout issues and improving navigation. The changes include cleaner designs, clearer empty state indicators, and smoother transitions during the signing process, resulting in a more user-friendly experience.
Original PR description
Before: - Several mobile screens had layout issues such as extra white space, misaligned elements, and uneven spacing. - During signing, the "Next" navigation appeared abruptly without a smooth transition. After: - Improved mobile layouts to remove unnecessary white space and keep grid alignment consistent. - Added placeholders on relevant screens (e.g. Documents folder, Authorized Users, redirect link) to clarify empty states. - Fixed transition issues when navigating between fields during the signing flow. Impact: - Provides a cleaner and more polished mobile signing experience. - Improves usability by making empty states clearer and navigation smoother. Task: 5493477
Resolved issues and error corrections
This update fixes an issue with how employer social insurance contributions are recorded in Odoo Enterprise for Saudi Arabia. The change ensures that these payments are accurately assigned to the correct accounting accounts, improving financial reporting and compliance. This resolves a previous error impacting payroll processing.
Original PR description
Fix the account configuration used by Saudi social insurance contribution salary rules for the company. This ensures employer contributions are posted to the correct accounting accounts. Task-5468575
This update clarifies the recruitment process by renaming a stage label in the 'Initial Qualification' stage to 'Qualification' within the Enterprise module. This change improves the clarity and consistency of the recruitment dashboard, making it easier for users to understand the stages of the hiring process. It's a minor adjustment to enhance the user experience.
Original PR description
This is a small follow-up PR to the original PR to simply rename a stage label. See https://github.com/odoo/enterprise/pull/105278 Task-ID: 5454691
This update streamlines the user experience by embedding key actions like 'Create Vendor Bill' directly into the appropriate journal folders (e.g., Purchase, Sales). This ensures users have the necessary tools readily available within the areas where they're working, improving efficiency.
Original PR description
What: Previously, actions like "Create Vendor Bill" were only embedded in the main "Finance" folder. Now, these actions are also embedded directly into the specific subfolders for each journal type…
What: Previously, actions like "Create Vendor Bill" were only embedded in the main "Finance" folder. Now, these actions are also embedded directly into the specific subfolders for each journal type (e.g., "Purchase", "Sales"). All relevant actions are also kept in the parent "Finance" for general accessibility. The purchase actions are also added to the "Inbox" folder. Why: The previous behavior was inefficient. A user uploading a vendor bill to the "Purchase" folder would not see the "Create Vendor Bill" action. He would only see it when he is in the parent "Finance" folder. By embedding it by default this streamlines the process by ensuring the necessary tools are available exactly where the user is working. How: The logic is implemented within the _documents_configure_sync method of the account.journal model. This is the ideal location because it handles the complete setup of a journal for the Documents app. This ensures that actions are embedded correctly both during module installation and dynamically whenever a new journal is created by a user. Notes: - Tests were rewritten to check these embeddings on install. And were refactored to be more maintainable and cover bank statements better. - The test for importing bank statements had to be moved to a separate testing module, as it needs the `account_bank_statement_extract` module, which is not in the dependencies of `account_move`. - The tests for bank statement processing errors was improved to match the tests in later versions Task-5410752 Related Task-5075610
This update resolves an issue where embedded actions within documents were disappearing from the folder's action list, preventing users from managing or deleting them. The fix ensures that embedded child actions remain visible and accessible, streamlining the document management process.
Original PR description
Server actions that were standalone (not a child) and embedded onto a documents folder cannot be executed anymore when they are linked to a parent action. Before saas-18.3, the embedded child action…
Server actions that were standalone (not a child) and embedded onto a documents folder cannot be executed anymore when they are linked to a parent action. Before saas-18.3, the embedded child action would still be in the documents' available_embedded_actions, and couldn't be removed, such that a fix was necessary. From saas-18.3 onwards, children embedded actions are no longer visible. As this precise case wasn't explicitly tested, we continue the FW-port with the (adapted) test. Furthermore, we add a garbage collection of the embedded actions for children actions, as they cannot be executed anymore. Initial FIX: ### ISSUE Certain embedded actions inside a folder may not appear in the folder’s server actions list (accessible via the gear icon), making them impossible to find or delete through the interface. This occurs because documents.document.get_documents_actions applies overly broad filtering that removes all child server actions, regardless of whether they are embedded in the folder. As a result, if two embedded actions are created in a folder and one is later set as a child of the other, the embedded child action disappears from the visible list but remains embedded in the folder, leaving no way to remove it from the UI. ### SOLUTION The method has been updated to exclude only non-embedded child actions. Embedded child actions are now preserved and correctly displayed in the folder’s actions list, allowing them to be managed and deleted as expected. opw-5213881 Forward-Port-Of: odoo/enterprise#105235 Forward-Port-Of: odoo/enterprise#100395
10 changes
Resolved issues and error corrections
This pull request addresses several stability issues within the Hoot system, primarily focused on improving test coverage and error handling. Specifically, it expands the mocked API to better simulate real-world XHR requests and fixes a misleading error message during testing, ensuring more reliable test results.
Original PR description
### [FIX] Hoot fixes This PR contains several fixes for the Hoot system. See each commit description for more details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
A bug was causing the input field for campaign tests to disappear when cleared, requiring users to close and reopen the dialog. This fix resolves the issue by ensuring the input field remains visible, improving the user experience for campaign testing. The scope was limited to marketing automation due to prioritization.
Original PR description
Steps to reproduce: 1. Install `marketing_automation` 2. Create a campaign with activity and click on `Launch a test` button 3. Clear the input field and then click outside the input area Issue: -…
Steps to reproduce: 1. Install `marketing_automation` 2. Create a campaign with activity and click on `Launch a test` button 3. Clear the input field and then click outside the input area Issue: - The input area has disappeared. Now, the only way to get it back is by closing the dialog and reopening it Cause: - Field `resource_ref` uses `hide_model: True`, and when cleared, the widget has no value and no model selector to determine the target model because of the function `getRelation` that now returns `undefined`, by this XML fails to render the `<Many2OneField/>` https://github.com/odoo/odoo/blob/7680b83501cef18362be38f90715d824f2bf9cd6/addons/web/static/src/views/fields/reference/reference_field.js#L107-L119 Solution: - Add `model_field: model_id` option to the view so the widget can resolve the model from the `model_id` field even when input is empty Note: - This behavior also occurs in other places. After discussion with the framework team, we agreed to keep the scope of this PR limited to marketing_automation, as this is not a priority issue. A broader fix can be addressed in the master if needed. opw-5473320
This update addresses a small technical issue where a missing space in a route caused a problem with the account online synchronization process. This fix ensures the synchronization feature functions correctly, preventing potential disruptions to data synchronization.
Original PR description
During this forward port: https://github.com/odoo/enterprise/commit/a5b9372ca0b23151046c14c9a8ead0ed9cd46b80 there was a missing space in the route. no task id
This update resolves a visual issue where carousel previews appeared too tall in Firefox. The fix adjusts the preview height, ensuring consistent and accurate display of carousel snippets for users. This improves the user experience and prevents potential confusion.
Original PR description
Steps to reproduce (only with Firefox): - Open the snippet dialog. - Issue: The carousel snippets are too tall. Bug introduced by this commit [1] [1]: https://github.com/odoo/odoo/commit/78d33cf8b475f891dd95bec1b0c058446538824a task-5156137
This update resolves an issue where the FAIA report incorrectly classified partners as suppliers. The change allows partners to be recognized as both customers and suppliers, addressing a discrepancy caused by credit notes. This ensures accurate reporting of financial balances within the SAFT report.
Original PR description
1. Create a contact (with minimal details). 2. Create a customer invoice for that contact **last month** with `quantity = 300`. 3. Create a credit note for that invoice **this month**. 4. Create…
1. Create a contact (with minimal details). 2. Create a customer invoice for that contact **last month** with `quantity = 300`. 3. Create a credit note for that invoice **this month**. 4. Create another customer invoice for the same contact **this month** with `quantity = 100`. In the FAIA report (XML), within the General Ledger section, the partner is incorrectly classified as a supplier instead of a customer. In the method _saft_fill_report_partner_ledger_values from account_saft, he partner type is determined based on whether the balance is negative. However, a negative balance can result from a credit note, where the partner is still a customer and not a supplier. Furthermore, a partner can be both a supplier and a customer. This commit allows a partner to be both a customer and a supplier. If both receivable and payable are 0 we set the partner type to customer to keep the behavior from e9640caf29e967fe7d8c6fe303b5a8d7a866437e opw-5360924 Forward-Port-Of: odoo/enterprise#100749
This update enhances Odoo's compliance with Saudi Arabian tax regulations (ZATCA) by making the 'Additional Buyer ID' visible for non-Saudi partners when operating in Saudi Arabia. It ensures that VAT is used as the primary buyer ID when available, and falls back to the Additional Buyer ID if VAT is missing, streamlining ZATCA XML generation. This change supports accurate tax reporting for our non-Saudi customers.
Original PR description
This commit makes l10n_sa_additional_identification_number visible for non-Saudi individuals and company partners when the active company is in Saudi Arabia and keeps the identification scheme fixed to OTH, keeping it invisible. When generating ZATCA XML for non-Saudi partners, VAT is used as the primary buyer ID if present, and fall back to the additional identification number when VAT is missing. task-4525956
This update fixes a misclassification of account 649 in the French Profit and Loss report. The change aligns with French accounting standards (PCG 2025 & 2026) ensuring accurate reporting of wages and social security charges. This improves the report's compliance and reliability for French businesses.
Original PR description
## Issue In the *Profit and Loss* report for the French localization (`l10n_fr_reports`), the account 649 was mentioned in the *"Reversals of provisions (and depreciation), expense transfers"*…
## Issue
In the *Profit and Loss* report for the French localization (`l10n_fr_reports`), the account 649 was mentioned in the *"Reversals of provisions (and depreciation), expense transfers"* section, instead of *"Wages and salaries"* and *"Social security charges"*. This classification is described in the *"Recueil des normes comptables françaises"* (Versions [2025](https://www.anc.gouv.fr/files/anc/files/1_Normes_fran%C3%A7aises/Reglements/Recueils/PCG_Janvier2025/Recueil-NF-Janvier-2025.pdf) and [2026](https://www.anc.gouv.fr/files/anc/files/1_Normes_fran%C3%A7aises/recueil/RECEUIL-PCG-2026-AVEC-COUVERTURE.pdf)).
## Steps to reproduce
1. Install *France - Accounting Reports* (`l10n_fr_reports`)
2. Go to the *Profit and Loss* report
3. In debug mode, click the information buttons on the following rows:
- *Reversals of provisions (and depreciation), expense tranfers*: **649 is mentioned**
- *Wages and salaries*: **649 is not mentioned**
- *Social security charges*: **649 is not mentioned**
## Note
The account 649 was added at the beginning of the formula for the *"Wages and salaries"* section in order to respect a logical order. In the *"Social security charges"* formula, since no logical order appears to be used, the account was added at the end.
opw-5724559
Forward-Port-Of: odoo/enterprise#105474This update fixes a validation error preventing employees from requesting paid time off when using a 2-week calendar schedule. The issue stemmed from a formatting element within the calendar that was incorrectly calculating start and end dates. This change ensures accurate PTO requests are processed for all calendar types.
Original PR description
Steps to reproduce: - Choose France as the company location, and download "France - Work Entries Time Off" module. - From Employees > Configuration > Settings > French Time Off Localization, select…
Steps to reproduce: - Choose France as the company location, and download "France - Work Entries Time Off" module. - From Employees > Configuration > Settings > French Time Off Localization, select Paid time Off. - Create a new employee and a new contract (in running state) for that employee that starts on 01/01/2025. - While in the contract screen, create a new schedule that has 2 weeks calendar and Europe/Paris timezone. - From Time Off > Management > Allocations, allocate 1+ paid time off days for the newly created employee that's valid from 01/01/2025. - From the employee's profile > Time Off, try to take a Monday off. Issue: - The user gets a Validation error stating that the "start date" is later than the "end date". Fix: - In a 2 weeks calendar, there are 2 lines that are there to separate the first week from the second week (for aesthetic purposes). These lines have "hour_from" and "hour_to" = 0, which are taken into account when calulating the minimum hour to start the day off. - Add a check to remove lines from calendar that are just there for display purposes. opw-5387347
This update fixes an issue where product names weren't consistently displayed in the correct language based on the user's current language setting. Previously, repeated access to the product name within a method would default to the initial language, even with a different language context. Now, the system always uses the specified language context when calculating the product name, ensuring accurate display for all users.
Original PR description
Description of the issue/feature this PR addresses: Compute of display_name in different languages that can be returned incorrect Current behavior before PR: When accessing two times in the same method the display_name of a configured product but the second time having a .with_context(lang=lang) other than the previous language, the returned display name will not be in the specified language as the cached value will be returned. Desired behavior after PR is merged: _compute_display_name should always take into account a change of language in context when the value is accessed. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update ensures that users mentioned in sub-channels, even if they aren't direct members, receive ping notifications and the sub-channel appears in their sidebar. Previously, this caused missed notifications, which has now been resolved to improve communication and collaboration within the system.
Original PR description
Before this commit, when a user was mentioned in a sub-channel they were not member of, the sub-channel would not appear in their sidebar. This could lead to some missed pings. This commit fixes the issue by automatically adding mentioned users to the sub-channel, ensuring it is pinned to their sidebar. task-5233958
5 changes
Resolved issues and error corrections
This update resolves an issue where modifying the quantity of a subcontracting receipt could lead to incorrect quantities displayed on the move line. The fix addresses a problem triggered by a BOM modification after a purchase order is created, ensuring accurate stock tracking within the subcontracting process.
Original PR description
**Issue** In subcontracting, if a BOM is modified after the creation of a PO, then modifying the move quantity of the associated receipt can lead to inconsistency between move and move line…
**Issue** In subcontracting, if a BOM is modified after the creation of a PO, then modifying the move quantity of the associated receipt can lead to inconsistency between move and move line quantities. **Steps to reproduce** - Create a subcontracting BOM of a final product using 1 component product - Create a PO of the final product for a quantity of 10 and confirm it - Modify the BOM to use 2 component products instead - Go to the receipt of the PO and modify the quantity to 2 and validate it - Click on the move line of the receipt -> The displayed quantity is 10 instead of 2 **Cause** Setting the quantity triggers this line: https://github.com/odoo/odoo/blob/c496235b9520b2a33040174974de7d37e74b0580/addons/mrp_subcontracting/models/stock_move.py#L78-L78 which calls: https://github.com/odoo/odoo/blob/c496235b9520b2a33040174974de7d37e74b0580/addons/mrp_subcontracting/models/stock_move.py#L107 Since the BOM has been modified, a `consumption_issues` is detected and `_update_finished_move()` won't be called: https://github.com/odoo/odoo/blob/c496235b9520b2a33040174974de7d37e74b0580/addons/mrp_subcontracting/models/mrp_production.py#L86-L89 And since the returned action is not used when calling `subcontracting_record_component`, `_update_finished_move()` won't be called later neither, which is the method responsible for updating the move line quantities: https://github.com/odoo/odoo/blob/c496235b9520b2a33040174974de7d37e74b0580/addons/mrp_subcontracting/models/mrp_production.py#L142-L146 **Solution** Since the consumption issue actions are ignored in this case, just skipped it and avoid inconsistencies. opw-5493577
This update fixes an issue where invalid responses from the Zatca system were causing user tracebacks. The change now includes better error handling and checks the length of CSR fields before sending data, addressing a new requirement from Zatca regarding CSR field lengths. This ensures smoother onboarding for users in Saudi Arabia.
Original PR description
Previously, it was assumed that if no 'error' or 'errors' key was present that means we've received a valid response for obtaining CCSID or PCSID. But sometimes the error is not sent with those keys, and the binarySecurityToken is missing, therefore a traceback is shown to the user because the invalid requests passes through the validation unnoticed. This kind of response is the result of a new change introduced by zatca requiring csr fields to be at most 64 characters long. This commit improves the error handling mechanism of CSID responses, to show the user an informative message, and handles the length check for csr fields on the client side before sending to zatca. task-5347269 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update ensures that WebGL testing continues to function correctly in Chrome's headless mode (version 144+). Chrome's default settings now disable WebGL, so this change re-enables it for testing purposes, specifically to maintain functionality for website builder features. While SwiftShader is less secure, it's deemed acceptable for controlled test environments.
Original PR description
Since Chrome 144 disabled [^1] by default the WebGL fallback to the software renderer SwiftShader, this commit reenables [^2][^3] it when running in headless mode to allow to keep testing WebGL features (i.e. image filters in website builder). Note: the SwiftShader implementation is considered deprecated and less safe than proper hardware based ones, hence not recommended for a regular usage with untrusted content. However, as tests are run in a more controlled environment, it looks reasonnable to opt-in to keep actually testing WebGL features. [^1]: https://chromium-review.googlesource.com/c/chromium/src/+/7128438 [^2]: https://issues.chromium.org/issues/476172421 [^3]: https://chromestatus.com/feature/5166674414927872
This update resolves an issue where attendance overlaps weren't being correctly counted towards hourly accrual plans. The change adjusts how attendances are processed to accurately reflect worked time, ensuring employees receive the correct accrual amounts. This improves the reliability of time-off calculations.
Original PR description
### Issue: Attendances overlapping on two days are ignored for hourly accrual plans based on attendances. ### Steps to reproduce: - Install 'hr_holidays_attendance' - In Time Off > Configuration >…
### Issue: Attendances overlapping on two days are ignored for hourly accrual plans based on attendances. ### Steps to reproduce: - Install 'hr_holidays_attendance' - In Time Off > Configuration > Accrual Plan, create a new plan - Based on worked time - Hourly rule - Attendances as Source - In Management > Allocations, create an allocation for an employee using the new accrual plan - Create an Attendance for this employee in the period of the Accrual Plan - Check-in at 22pm for example - Check-out at 7am - Run the cron "Accrual Time Off: Updates the number of time off" - The Allocation ignores the worked time from the attendance ### Cause: `_get_accrual_plan_level_work_entry_prorata()` is called on each day of the accrual period. So `start_dt` is `datetime.datetime(2026, 1, 2, 0, 0)` and `end_dt` is `datetime.datetime(2026, 1, 3, 0, 0)` for example. This means that the search will always excludes attendances overlapping on two days. https://github.com/odoo/odoo/blob/26f3026ed45cc409cd7f67fa219d44f1adbac9b7/addons/hr_holidays_attendance/models/hr_leave_allocation.py#L79-L83 ### Solution: To count the attendances on several days, we need to split these attendances by day because `_get_accrual_plan_level_work_entry_prorata()` is only called with an interval of one day from midnight to midnight. First we get all attendances overlapping with the day by changing the domain in the search. Then we could simply take the difference between `max(attendance.check_in, start_dt)` and `min(attendance.check_out, end_dt)` but we also need to remove the lunch breaks (they were not counted in `attendance.worked_hours`). This would mean duplicating the code present in `_compute_worked_hours()`. To avoid this we create a new method for `hr.attendance` named `_get_worked_hours_in_range()`. That returns the number of hours worked due to this attendance in a given time frame. This new method can be used in both cases to get the needed value. opw-5172669
This update corrects a technical issue where expired sales leads were triggering warning messages. The change ensures that a single record ID is used, resolving a previous error in how the system processed payment link data. This prevents the warning and ensures proper functionality.
Original PR description
### Issue: In #244061 changes, the expired so leads to warning message. However, the batch `res_id` is used instead of single record which is an error. opw-5478691