Daily updates from Odoo
Thursday, January 29, 2026
87 changes
29 changes
New functionality added to Odoo
This update adds the necessary data to support Taiwan's VAT tax reporting requirements within Odoo. Specifically, it incorporates data records for the `account.return.type` model, ensuring compliance with local regulations. This enhancement improves the functionality of the Taiwan localization module.
Original PR description
This commit adds the necessary data records for the `account.return.type` model to support Taiwan VAT tax return. [Task-3371895](https://www.odoo.com/odoo/project.task/3371895) Forward-Port-Of: odoo/enterprise#104698
Enhancements to existing features
This update expands Odoo's language support to include Spanish, recognizing the significant number of Spanish speakers. By adding Spanish translations, we improve the usability of Odoo for a wider range of customers and users. This enhancement aligns with our commitment to global accessibility.
Original PR description
The official language is English, but Spanish is spoken by ~41 million. task-5247124 Forward-Port-Of: odoo/odoo#245702 Forward-Port-Of: odoo/odoo#245358
This update expands Odoo's language capabilities to include Spanish, recognizing the significant Spanish-speaking population. This enhancement improves usability for a wider range of customers and aligns with global market needs. It's an important step in supporting diverse user bases.
Original PR description
The official language is English, but Spanish is spoken by ~41 million. task-5247124 Forward-Port-Of: odoo/enterprise#105494 Forward-Port-Of: odoo/enterprise#105246
This update aligns the appointment quick create form with recent design changes for calendar dialogs, ensuring a consistent user experience. The changes restore proper icon and field alignment, improving the visual appearance and usability of the appointment scheduling feature. This addresses a design oversight identified in odoo/odoo#238855.
Original PR description
Following odoo/odoo#238855 the dialogs design have been improved. While improving the calendar dialog, the appointment one has been overlooked. Adapting the appointment quick create form following the changes in its parent calendar form view. Restoring icons and fields alignment. Task-5887839
Resolved issues and error corrections
This update removes the 'New' button from the DIMONA Declaration List view in the l10n_be_hr_payroll module. This change simplifies the user interface and corrects a minor usability issue, ensuring a cleaner and more straightforward process for generating DIMONA declarations.
Original PR description
. Remove the New button on DIMONA Declaration List view task-5471873
This update increases the width of barcodes on customer receipts generated by the Point of Sale (POS) loyalty program. Previously, the barcodes were too narrow, making them difficult for staff and customers to scan accurately. This change ensures seamless order processing and improved customer experience.
Original PR description
Step to reproduce; - install pos_loyalty - create a loyalty program of type "next order coupon" with minimum spend of 1$. - open pos and settle a order, see receipt. Issue: - currently bar-code is too narrow, making it difficult for to be scanned Fix: - increase the width of barcode, so it can be easily scanned. <table> <tr> <td> <b>Before</b> </td> <td> <b>After</b> </td> </tr> <tr> <td> <img width="451" height="508" alt="image" src="https://github.com/user-attachments/assets/a0d1e95e-0a9d-4552-977a-0ad9686867b8" /> </td> <td> <img width="456" height="517" alt="image" src="https://github.com/user-attachments/assets/40d04ac4-9ffc-4f81-a063-31b3ea26b4e1" /> </td> </tr> </table> opw-5363916 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244353 Forward-Port-Of: odoo/odoo#242469
A bug preventing users from duplicating skills in the HR module has been fixed. This update ensures that users can now successfully create copies of existing skill entries without encountering validation errors. This improves the usability of the skills management feature.
Original PR description
Version: - saas-18.2 Steps to reproduce: - Install the hr_skills module - Go to the Skills menu - Select a skill and click Duplicate Issue: - A validation error appears when duplicating a skill Solution: - Updated the copy_data method so skills can be duplicated without causing a validation error Task - 5481185 Forward-Port-Of: odoo/odoo#243227
A test within the sale_pdf_quote_builder module was failing due to how it handled PDF files. This update replaces the test's invalid PDF data with a real, encrypted PDF, resolving the warning messages and ensuring the test now passes. This improves the stability of the Nightly builds.
Original PR description
The `test_wrong_pdf` test fails on runbot in the `Nightly build` when executed under `Distro Builds > Testing distro PureTrixie without requirements for config Parallel testing`. **Steps to…
The `test_wrong_pdf` test fails on runbot in the `Nightly build` when executed under `Distro Builds > Testing distro PureTrixie without requirements for config Parallel testing`. **Steps to reproduce:** - Install `sale_pdf_quote_builder` module. - Run `test_wrong_pdf` (Make sure `PyPDF==5.4.0` is installed). - Observe `PyPDF` warnings in the logs. **Warnings:** ``` WARNING server pypdf._reader:435 invalid pdf header: b'test' WARNING server pypdf._reader:435 EOF marker not found WARNING server pypdf._reader:435 EOF marker not found ``` **Root cause:** Odoo officially supports the PyPDF version defined in requirements.txt [1]. The test passes with `PyPDF2`, but `PyPDF` is stricter and emits warnings when parsing arbitrary byte content. Because the test uses raw bytes instead of a structurally valid (but unsupported or encrypted) PDF, PyPDF logs warnings. **Fix:** This commit updates the test to use a real encrypted PDF instead of raw bytes, similar to [2]. This commit fixes test failures caused by [3]. **Note:** Refer to [4] for generating the encrypted file. [1]: https://github.com/odoo/odoo/blob/a6af7df429f9cd3bfb60347e9b30cc48fb5bfaff/requirements.txt#L63-L65 [2]: https://github.com/odoo/odoo/blob/0499dbd8944b4002883afab5d3ed76d8e55dab9c/addons/mail/tests/discuss/test_discuss_attachment_controller.py#L63-L75 [3]: https://github.com/odoo/odoo/pull/230712 [4]: https://colab.research.google.com/drive/1UfWSKDluObEkKxCg6eX-nHoe04_FGrEq#scrollTo=A5hO11Eh1qvV runbot-238399 Forward-Port-Of: odoo/odoo#246034
This update fixes a technical error that occurred when a user discarded a configurable product while setting up a Point of Sale order. The issue caused a system error, preventing users from completing transactions. The fix ensures the system handles product discard scenarios correctly, improving PoS functionality.
Original PR description
Steps to reproduce: = - Open a PoS with pos_loyalty - Set a customer - Open a configurable product - Click `Discard` button or press `ESC` key Issue: = - A traceback occurs with the error: `TypeError: Cannot read properties of undefined (reading 'product_id')` Reason: = - When a configurable product is discarded during variant selection, the flow continues and attempts to process an undefined product. Fix: = - Ensure if adding a configurable product is discarded while selecting variant it should not p[roccess futher. task-5481204 Forward-Port-Of: odoo/odoo#243996
This update completes a necessary data upgrade for the Odoo Spreadsheet module. Previously, a client-side data upgrade was missing, which has now been implemented. This ensures data consistency and accuracy within the spreadsheet functionality.
Original PR description
Follow up of 682d6ec1ddb825674999e0db1fc0cc48c3be67c5 where I forgot to add the client-side data upgrade Task-5477426 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244935
This update resolves an issue where the 'Accept & Sign' button remained active even when the customer's name field was empty. The fix ensures the button is disabled when no name is entered, preventing users from accidentally proceeding without a valid signature. This improves the user experience and data integrity.
Original PR description
**Steps to produce:** - Install `sale_management` module. - `Create a SO > Click on Preview > Sign and Pay`. - Remove all text from the Full Name`. **Issue:** - The `Accept & Sign` button remains…
**Steps to produce:** - Install `sale_management` module. - `Create a SO > Click on Preview > Sign and Pay`. - Remove all text from the Full Name`. **Issue:** - The `Accept & Sign` button remains enabled even when the Full Name field is empty. **Root cause:** - At [1], When the `drawCurrentName` method is called, it retrieves text using `getCleanedName`. This method returns an empty string when no name is provided - Despite this, the code still generates an image and passes it to `printImage`, which keeps the button enabled. **Solution:** - If the cleaned name is empty or contains only spaces, do not generate image. - Instead, immediately clear the signature pad so the button remains disabled. [1]https://github.com/odoo/odoo/blob/9dedf75810bd6b7a92fe5bd279bf6bae98834750/addons/web/static/src/core/signature/name_and_signature.js#L103-L109 **Before:** <img width="400" height="400" alt="before" src="https://github.com/user-attachments/assets/5ebdf852-4cba-4e1d-9ae4-7373e4b8b91d" /> **After:** <img width="400" height="400" alt="after" src="https://github.com/user-attachments/assets/9280aa66-4f22-40d6-8a22-326cec24378d" /> **opw-5361890** --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#238638
This update allows users to directly edit the background color of snippets within the s_tabs website builder. Previously, users had to work around this limitation by setting background images/videos. This change also resolves an issue where default background colors couldn't be removed, creating a more intuitive editing experience.
Original PR description
Before this commit, it was not possible to edit the background color of a snippet dropped within the s_tabs snippet. The user could set the background image / video, but not the color. The user could work around the limitation by setting the background color of a snippet, saving it, then dropping it within the s_tabs snippet. Therefore, it made no sense to disable the background color option. Moreover, adding the background color option fixes the reverse issue: if the user dropped a snippet with a background color set by default, they cannot remove it since the colorpicker was not available. Forward-Port-Of: odoo/odoo#245021
The breadcrumb displayed in the Documents section was incorrectly showing 'Unnamed' when accessed through the systray. This update resolves a technical issue where the system couldn't properly identify the active folder, leading to the incorrect display. Now, the breadcrumb accurately reflects the folder name.
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 resolves a visual issue where the help section within the employee action view was displaying incorrectly (content overlapping). The fix ensures the help content appears correctly in both the main menu and the action itself. This improves the user experience for employees.
Original PR description
While performing a task I observed an improper view in employees action. Steps to Reproduce : 1. Activate debug mode and go to Employees/Employees/Employees menu 2. Go to its action 3. You will see improper view(content overlapping) in help section. These changes were added [here](https://github.com/odoo/odoo/pull/214810/changes#diff-99eff1b023601f0f844a2fa7efc6c4e62e13a8592d5b799113f848ac4c7565f8L549-R658 ). I have made the changes accordingly so that the Help content looks fine in both Employees menu and action. before : <img width="1695" height="752" alt="image" src="https://github.com/user-attachments/assets/6a847373-5ac2-4877-a07f-ad58338429c5" /> after : <img width="1272" height="823" alt="image" src="https://github.com/user-attachments/assets/16b50843-e736-490a-8a00-44848c6011fa" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244651
This update ensures that refusal emails sent to applicants now use the designated 'Send From' email address specified in the recruitment template. Previously, the emails always used the sender's personal email, leading to inconsistent branding. This change improves the applicant experience and ensures a professional communication.
Original PR description
### Issue: When refusing an application, the system will always use the user's email to send the refusal, even if the template specifies an email to send from. ### Steps to reproduce: - Recruitment > Configuration > Refuse Reasons - Go to one of their template (i.e. "Recruitment: Refuse") - in Settings add a "Send From" email - Recruitment > Applications, click on an application - Click "Refuse" - Select the refuse reason with the template - Refuse - The mail is sent with the user email ### Cause: `_prepare_mail_values()` only returns `self.env.user.email_formatted`. ### Solution: If there is a template with `email_from`, we use this, otherwise `self.env.user.email_formatted` opw-5356662 Forward-Port-Of: odoo/odoo#245937
This update resolves a visual bug where columns in mass emails weren't rendering correctly when sent. The issue stemmed from a conflict between the email's styling and Odoo's CSS, specifically related to color definitions. The fix ensures consistent column alignment in received emails.
Original PR description
**Steps to reproduce:** - Install Mass Mailing and Website apps - Create a new mailing - Add Columns block with different content size - In "Vert. Alignment" field > Select the "Stretch to Equal Height" option - Columns are properly aligned in Odoo - Save the record and send test mail - The columns are not aligned anymore in the received mail **Issue:** Inline styling breaks in mail engines due to `website.scss` file. The `color-mix` css function is used and cast as a `color()` functional notation in the columns `border-color`. The inline styling is then removed by the mail engine (with all siblings attributes) as it is not compatible with this notation. (e.g. `border-color: color(srgb 0.129412 0.145098 0.160784 / 0.15);`) The color normalization step doesn't take this into account as it only checks for rgb patterns. **Fix:** Overwrite the css with the color notation by a default value for mailing. opw-5225248 Forward-Port-Of: odoo/odoo#242649
This update fixes an issue where event registration emails were incorrectly canceling invitations for contacts on a blacklist. The change bypasses the exclusion list process during email sending, ensuring that all registered contacts receive the intended event information. This improves the reliability of event communication.
Original PR description
**Steps to reproduce:** - Install Events & Contacts apps - Open Contacts - Create a contact "BLACKLIST", email: `blacklist@example.com` - Create a contact "GOOD", email: `good@example.com` - Open Settings > Technical > Discuss > Email Blacklist - Create a record with email: `blacklist@example.com` - Open Events - Create an event - Go to the event attendees - Create attendees for both contacts - Open Settings > Technical > Email > Emails - Both email are listed but the blacklisted one is cancelled **Issue:** The composer created in `EventMailScheduler._send_mail` is using `_process_mail_values_state` to find the list of blacklisted records and applies it to filter the mail recipients, which prevents the event mailing from being processed correctly. **Fix:** `use_exclusion_list` is set to `false` on the composer to bypass its exclusion process. opw-5046491 Forward-Port-Of: odoo/odoo#228445
This update fixes an issue where editing a previously edited message could cause incorrect updates due to a mismatch in the message body. The change ensures a reliable comparison of message bodies during editing, preventing data inconsistencies. This improves the overall stability and accuracy of message functionality.
Original PR description
Since #224800, we've been removing the `edited` element from the current message body in order to compare it with the updated body. However, the `edited` element may also be present in the updated body. This change removes the `edited` element from the updated body as well, ensuring a reliable comparison when editing an edited message. Steps to reproduce: - Send a message. - Click `edit`, change the message body and click `save`. - Click `edit` again, don't change the message body this time, then click `save` . - An RPC is made to update the message. Forward-Port-Of: odoo/odoo#245893
This update fixes an issue with the IoT Box's driver download process. Previously, enabling a setting allowed it to download standard drivers, which caused conflicts and duplicated files. Now, the system avoids downloading standard drivers from standard modules to prevent these issues and maintain stability.
Original PR description
The stable IoT Box uses drivers from git repository: it doesn't download them from the database as it used to do. However, sh/on premise clients might want to develop custom drivers that the IoT Box would download. For that, they have to enable a checkbox on the IoT homepage, making the IoT Box download handlers as before. The issue is it will also download standard drivers that are already present on the IoT Box: on newer databases it would simply overwrite them, but on older ones, it would duplicate as names might have changed. Also, it would introduce issues back that were already fixed. To avoid this, we avoid adding drivers from standard modules to the downloaded archive, to prevent issues with the main ones. Forward-Port-Of: odoo/enterprise#105770 Forward-Port-Of: odoo/enterprise#105531
A bug was preventing users with standard access rights from generating serial numbers for tracked products. This was due to a specific write operation within the system's serial number process. This fix ensures that all users can correctly generate serial numbers, improving inventory management functionality.
Original PR description
**Behavior:** Behavior: When logged in as a user with group_user access (member), trying to generate the next few serial numbers for a tracked product from receipts will cause an access error. This…
**Behavior:** Behavior: When logged in as a user with group_user access (member), trying to generate the next few serial numbers for a tracked product from receipts will cause an access error. This happens because there is a write operation on the ir.sequence linked to the serial number at the end of the process that happens only when the 'New' button was previously pressed. And since access rights to ir.sequence are dependant on the base group of the user, changing the user Inventory rights to admin will not resolve the issue. A test has been created to ensure no access error is created when generating sequence numbers as a lower access user, this test would pass without the fix since it is focused on the python function. **Steps to reproduce:** - Create a product that is tracked by serial number - Log in as a user with group_user access (member role) - Go to Inventory -> Operations -> Receipts - Create a new picking and add the product - After clicking on Mark as Todo you'll see Details pop up in the product line - After clicking Details, select Generate Serial/Lots - Click New, then Generate, and you'll get an access error for ir.Sequence opw-5368553 Forward-Port-Of: odoo/odoo#240368
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 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 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 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
3 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 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
15 changes
Resolved issues and error corrections
A bug preventing users from duplicating skills in the HR module has been fixed. This update ensures that users can now successfully create copies of existing skills, streamlining the process of adding new skill types. This resolves a validation error that was preventing duplication.
Original PR description
Version: - saas-18.2 Steps to reproduce: - Install the hr_skills module - Go to the Skills menu - Select a skill and click Duplicate Issue: - A validation error appears when duplicating a skill Solution: - Updated the copy_data method so skills can be duplicated without causing a validation error Task - 5481185 Forward-Port-Of: odoo/odoo#243227
This update resolves a test failure in the sale_pdf_quote_builder module. The test previously flagged warnings due to using invalid PDF data. The fix replaces the test data with a real, encrypted PDF, aligning with Odoo's supported PyPDF version and ensuring consistent test results.
Original PR description
The `test_wrong_pdf` test fails on runbot in the `Nightly build` when executed under `Distro Builds > Testing distro PureTrixie without requirements for config Parallel testing`. **Steps to…
The `test_wrong_pdf` test fails on runbot in the `Nightly build` when executed under `Distro Builds > Testing distro PureTrixie without requirements for config Parallel testing`. **Steps to reproduce:** - Install `sale_pdf_quote_builder` module. - Run `test_wrong_pdf` (Make sure `PyPDF==5.4.0` is installed). - Observe `PyPDF` warnings in the logs. **Warnings:** ``` WARNING server pypdf._reader:435 invalid pdf header: b'test' WARNING server pypdf._reader:435 EOF marker not found WARNING server pypdf._reader:435 EOF marker not found ``` **Root cause:** Odoo officially supports the PyPDF version defined in requirements.txt [1]. The test passes with `PyPDF2`, but `PyPDF` is stricter and emits warnings when parsing arbitrary byte content. Because the test uses raw bytes instead of a structurally valid (but unsupported or encrypted) PDF, PyPDF logs warnings. **Fix:** This commit updates the test to use a real encrypted PDF instead of raw bytes, similar to [2]. This commit fixes test failures caused by [3]. **Note:** Refer to [4] for generating the encrypted file. [1]: https://github.com/odoo/odoo/blob/a6af7df429f9cd3bfb60347e9b30cc48fb5bfaff/requirements.txt#L63-L65 [2]: https://github.com/odoo/odoo/blob/0499dbd8944b4002883afab5d3ed76d8e55dab9c/addons/mail/tests/discuss/test_discuss_attachment_controller.py#L63-L75 [3]: https://github.com/odoo/odoo/pull/230712 [4]: https://colab.research.google.com/drive/1UfWSKDluObEkKxCg6eX-nHoe04_FGrEq#scrollTo=A5hO11Eh1qvV runbot-238399 Forward-Port-Of: odoo/odoo#246034
This update fixes a technical error that occurred when a user discarded a configurable product during the Point of Sale (PoS) process. The issue caused a system error, preventing users from completing transactions. The fix ensures the system handles product discards gracefully, improving PoS reliability.
Original PR description
Steps to reproduce: = - Open a PoS with pos_loyalty - Set a customer - Open a configurable product - Click `Discard` button or press `ESC` key Issue: = - A traceback occurs with the error: `TypeError: Cannot read properties of undefined (reading 'product_id')` Reason: = - When a configurable product is discarded during variant selection, the flow continues and attempts to process an undefined product. Fix: = - Ensure if adding a configurable product is discarded while selecting variant it should not p[roccess futher. task-5481204 Forward-Port-Of: odoo/odoo#243996
This update corrects a minor issue in how product prices are calculated on the website. A parameter called 'target_currency' was being passed unnecessarily, causing confusion. The change simplifies the process by removing this unused parameter, ensuring accurate price displays without impacting functionality.
Original PR description
In website_sale product price computation in [_to_markup_data](https://github.com/odoo/odoo/blob/saas-18.2/addons/website_sale/models/product_product.py#L163) and…
In website_sale product price computation in [_to_markup_data](https://github.com/odoo/odoo/blob/saas-18.2/addons/website_sale/models/product_product.py#L163) and [_get_additionnal_combination_info](https://github.com/odoo/odoo/blob/saas-18.2/addons/website_sale/models/product_template.py#L490), the target_currency is passed but it is unused parameter.
The product_pricelist price computation logic relies on the [currency](https://github.com/odoo/odoo/blob/saas-18.2/addons/product/models/product_pricelist.py#L162) and target_currency is not used anywhere in the pricing flow. As a result, passing target_currency adds confusion without affecting the outcome.
The target_currency parameter was unused in the method call flow and, due to this, it was always being passed as NULL. This made the parameter ineffective and confusing, while the actual logic expects a valid currency value.
This commit replaces target_currency with currency to avoid unused / misleading parameter.
Traceback
```py
2026-01-22 12:50:48,564 48232 ERROR currency_19 odoo.addons.website_sale.tests.test_website_sale_product_template: ERROR: TestWebsiteSaleProductTemplate.test_markup_data_uses_taxes_included_price_when_configured_on_website
Traceback (most recent call last):
File "/home/odoo/odoo/odoo/addons/website_sale/tests/test_website_sale_product_template.py", line 81, in test_markup_data_uses_taxes_included_price_when_configured_on_website
markup_data = self.product._to_markup_data(self.website)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/odoo/odoo/addons/website_sale/models/product_product.py", line 162, in _to_markup_data
product_price = request.pricelist._get_product_price(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/odoo/odoo/addons/product/models/product_pricelist.py", line 121, in _get_product_price
return self._compute_price_rule(product, *args, **kwargs)[product.id][0]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/odoo/odoo/addons/product/models/product_pricelist.py", line 220, in _compute_price_rule
price = suitable_rule._compute_price(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: ProductPricelistItem._compute_price() got an unexpected keyword argument 'target_currency'
```
Before fix,
```py
(Pdb) > /home/odoo/odoo/saas~18.2/odoo/addons/product/models/product_pricelist.py(166)_compute_price_rule()
(Pdb) args
self = product.pricelist(2,)
products = product.product(4,)
quantity = 1
currency = None
uom = None
date = False
compute_price = True
kwargs = {'target_currency': res.currency(20,)}
> /home/odoo/odoo/saas~18.2/odoo/addons/product/models/product_pricelist.py(186)_compute_price_rule()
(Pdb) currency
(Pdb) self.currency_id
res.currency(20,)
(Pdb) self.env.company.currency_id
res.currency(1,)
(Pdb)
```
After fix,
```py
(Pdb) > /home/odoo/odoo/saas~18.2/odoo/addons/product/models/product_pricelist.py(166)_compute_price_rule()
(Pdb) args
self = product.pricelist(2,)
products = product.product(4,)
quantity = 1
currency = res.currency(20,)
uom = None
date = False
compute_price = True
kwargs = {}
> /home/odoo/odoo/saas~18.2/odoo/addons/product/models/product_pricelist.py(186)_compute_price_rule()
(Pdb) currency
res.currency(20,)
(Pdb) self.currency_id
res.currency(20,)
(Pdb) self.env.company.currency_id
res.currency(1,)
```
- opw - [5447980](https://www.odoo.com/odoo/project/70/tasks/5447980)
- upg - [3782135](https://upgrade.odoo.com/odoo/upgrade.request/3782135)
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#242998This update corrects a visual issue where the 'Sign and Pay' button remained active even when the customer's name field was blank. The fix ensures the button is disabled when no name is entered, preventing users from accidentally proceeding without a valid signature. This improves the user experience and data integrity.
Original PR description
**Steps to produce:** - Install `sale_management` module. - `Create a SO > Click on Preview > Sign and Pay`. - Remove all text from the Full Name`. **Issue:** - The `Accept & Sign` button remains…
**Steps to produce:** - Install `sale_management` module. - `Create a SO > Click on Preview > Sign and Pay`. - Remove all text from the Full Name`. **Issue:** - The `Accept & Sign` button remains enabled even when the Full Name field is empty. **Root cause:** - At [1], When the `drawCurrentName` method is called, it retrieves text using `getCleanedName`. This method returns an empty string when no name is provided - Despite this, the code still generates an image and passes it to `printImage`, which keeps the button enabled. **Solution:** - If the cleaned name is empty or contains only spaces, do not generate image. - Instead, immediately clear the signature pad so the button remains disabled. [1]https://github.com/odoo/odoo/blob/9dedf75810bd6b7a92fe5bd279bf6bae98834750/addons/web/static/src/core/signature/name_and_signature.js#L103-L109 **Before:** <img width="400" height="400" alt="before" src="https://github.com/user-attachments/assets/5ebdf852-4cba-4e1d-9ae4-7373e4b8b91d" /> **After:** <img width="400" height="400" alt="after" src="https://github.com/user-attachments/assets/9280aa66-4f22-40d6-8a22-326cec24378d" /> **opw-5361890** --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#238638
This update fixes a visual issue in the Time Off Kanban view, ensuring users can easily see and manage their time off requests. The scrollbar was previously missing, hindering usability. This change improves the user experience and allows for efficient time off tracking.
Original PR description
Before: the scrollbar of the kanban view in timeoff was not showing coz of which users were not able to see their timeoffs easily After: Fixed the scrollbar of the kanban view so that the user can be able to see their timeoffs which they were not able to do that easily Fix: Added the `overflow-x` as auto so that the scrollbar is visible. Task:5502863 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a visual bug where columns in marketing emails weren't rendering correctly after being sent. The issue stemmed from a conflict between the email's styling and how Odoo handled color codes. The fix ensures consistent column alignment in received emails by standardizing color formatting.
Original PR description
**Steps to reproduce:** - Install Mass Mailing and Website apps - Create a new mailing - Add Columns block with different content size - In "Vert. Alignment" field > Select the "Stretch to Equal Height" option - Columns are properly aligned in Odoo - Save the record and send test mail - The columns are not aligned anymore in the received mail **Issue:** Inline styling breaks in mail engines due to `website.scss` file. The `color-mix` css function is used and cast as a `color()` functional notation in the columns `border-color`. The inline styling is then removed by the mail engine (with all siblings attributes) as it is not compatible with this notation. (e.g. `border-color: color(srgb 0.129412 0.145098 0.160784 / 0.15);`) The color normalization step doesn't take this into account as it only checks for rgb patterns. **Fix:** Overwrite the css with the color notation by a default value for mailing. opw-5225248 Forward-Port-Of: odoo/odoo#242649
This update fixes an issue where event registration emails were incorrectly canceling invitations for contacts on a blacklist. The change bypasses the exclusion list process during email sending, ensuring that all registered contacts receive the intended event information. This improves the reliability of event registration communications.
Original PR description
**Steps to reproduce:** - Install Events & Contacts apps - Open Contacts - Create a contact "BLACKLIST", email: `blacklist@example.com` - Create a contact "GOOD", email: `good@example.com` - Open Settings > Technical > Discuss > Email Blacklist - Create a record with email: `blacklist@example.com` - Open Events - Create an event - Go to the event attendees - Create attendees for both contacts - Open Settings > Technical > Email > Emails - Both email are listed but the blacklisted one is cancelled **Issue:** The composer created in `EventMailScheduler._send_mail` is using `_process_mail_values_state` to find the list of blacklisted records and applies it to filter the mail recipients, which prevents the event mailing from being processed correctly. **Fix:** `use_exclusion_list` is set to `false` on the composer to bypass its exclusion process. opw-5046491 Forward-Port-Of: odoo/odoo#228445
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 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
2 changes
Resolved issues and error corrections
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
14 changes
Enhancements to existing features
This update expands Odoo's language support to include Spanish, recognizing the significant number of Spanish speakers. This enhancement improves usability for a wider customer base and aligns with global market needs. It's an important step in broadening Odoo's reach and appeal.
Original PR description
The official language is English, but Spanish is spoken by ~41 million. task-5247124 Forward-Port-Of: odoo/enterprise#105494 Forward-Port-Of: odoo/enterprise#105246
This update simplifies how the portal displays author avatars. The team has replaced a specific route used for fetching avatars with the standard route used in the main Odoo email system. This ensures consistent avatar display across the portal and improves the overall user experience.
Original PR description
This is a preparation PR to replace the portal message fetch route with the mail one. This commit replaces the `/mail/avatar/mail.message/` route with the route currently used in the mail base code, which is `/web/image`. odoo/odoo#183911
This update enhances the clarity of DIMONA categories used in the odoo Enterprise payroll module. The changes include adding code labels and enforcing a specific ordering, ensuring accurate payroll calculations and reporting. This improves data consistency and reduces potential errors related to DIMONA category assignments.
Original PR description
clarify DIMONA categories with code and label Task Id:5478540
This update replaces the previous method of managing holidays with a new, dedicated 'public holiday' model within Odoo. This change improves the accuracy and flexibility of holiday tracking, ensuring proper payroll and scheduling calculations. It simplifies holiday management and aligns with best practices.
Original PR description
In this commit, we introduced the new public holiday model instead of using resource calendar leaves. task-4791808
This update improves how Odoo clients with on-premise IoT Box installations manage their device drivers. It now allows clients to download custom drivers directly from the Odoo database, based on modules they've installed. This enhances flexibility and allows for tailored IoT device integration.
Original PR description
We updated the outdated "automatic handlers update" to "use custom handlers" to adapt to the stable IoT Box. This allows sh/on premise clients to download their custom drivers from the database (from custom modules). see odoo/odoo#245771 see odoo/upgrade#9352
Resolved issues and error corrections
This update addresses inaccuracies in performance tracking for Odoo's email, SMS, and WhatsApp functionalities. The changes ensure that internal counters are correctly updated, leading to more reliable performance data and improved reporting. This enhances the overall stability and accuracy of Odoo's communication tools.
Original PR description
Some of them are not up to date.
This update fixes an error that prevented users without WhatsApp access from viewing WhatsApp conversations within Discuss. The issue stemmed from a configuration change that caused access problems when fetching messages. This ensures all users can access and participate in WhatsApp conversations.
Original PR description
Steps to reproduce: - Open any WhatsApp conversation in Discuss. - post a message. - Invite an internal user who does not have WhatsApp access (e.g., Marc Demo). - Log in as the invited user. - Open the invited WhatsApp conversation. => it shows `An error occured while fetching messages` Since [1], this happens because `sudo()` was accidentally removed while storing `whatsappStatus` on messages, leading to an access error. This commit fixes the issue. [1]: https://github.com/odoo/enterprise/pull/100237 Task-5794783 Forward-Port-Of: odoo/enterprise#104953
This update resolves an issue where the Gantt chart incorrectly displayed unavailability for employees who didn't have a defined holiday schedule. The fix standardizes the data format to ensure accurate representation of all employee time off, improving the chart's reliability and usability.
Original PR description
In this PR, _get_unavailable_intervals() returns Intervals objects while _gantt_unavailability assumes mutable lists. This mismatch causes a runtime error when appending new intervals. Normalize all unavailability data to lists of (start, stop) tuples to ensure consistent behavior and fix gantt rendering without schedules. Build-238381
This update enhances the performance testing of our holiday leave functionality. Following the addition of the Public Holiday Leave model, we've adjusted query counts in performance tests to ensure optimal system performance. This ensures a smoother user experience and efficient processing of leave requests.
Original PR description
In this commit, we updated query count in some perf tests after adding th public holiday leave model. task-4791808
This update resolves a problem where 360 feedback emails sent to external clients displayed incorrectly due to formatting errors in the email template. The fix addresses issues with HTML nesting and Bootstrap styling, ensuring consistent and professional email presentation for all recipients. This improves the user experience for feedback requests.
Original PR description
The mail template layout breaks in external clients due to HTML tag nesting and reliance on Bootstrap classes. To reproduce: 1. Install 'hr_appraisal_survey'. 2. In an Appraisal, click "Ask Feedback" using the 360 template. 3. View the sent mail in an external client (e.g., Mailhog). 4. Observe broken alignment and missing styles. task-5462702
This update resolves an issue where the VoipImStatus component's validation process would fail when receiving incorrect 'persona' values. By relaxing the validation rules, the system now handles falsy values gracefully, ensuring consistent functionality and preventing potential errors. This improves the stability of the VoIP feature.
Original PR description
The component VoipImStatus introduced in https://github.com/odoo/enterprise/pull/102936 declares an optional prop "persona" whose type should be Object (in case it is defined) but some components that use VoipImStatus sometimes pass it false or null. In those cases, the props validation fails if the debug mode is activated. Since the underlying component ImStatus of VoipImStatus can work with any falsy values assigned to persona, we can accept more types for persona in VoipImStatus too.
This update resolves a technical error that prevented users from successfully connecting the demo account for the HR Expense Stripe module. The previous implementation had a flaw in how system parameters were updated, causing a traceback during the account creation process. This fix ensures a smooth and reliable experience for users wanting to test the demo.
Original PR description
Forward port wasn't done right, and the way to get the system parameter changed. To reproduce: - Install hr_expense_stripe_demo - confirm agreeing to the terms - Save - click on "Connect (Demo)" Forward-Port-Of: odoo/enterprise#105790
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
7 changes
Enhancements to existing features
This update expands Odoo's language support to include Spanish, recognizing the significant Spanish-speaking population. It adds Spanish translations to the system, improving usability for a wider range of customers and users. This enhancement aligns with Odoo's commitment to global accessibility.
Original PR description
The official language is English, but Spanish is spoken by ~41 million. task-5247124 Forward-Port-Of: odoo/enterprise#105494 Forward-Port-Of: odoo/enterprise#105246
Resolved issues and error corrections
A recent issue in the Point of Sale system's appointment tour was triggered when tests were run close to midnight. The system incorrectly filtered out appointments scheduled for the next day, causing the tour to fail. This fix ensures the tour functions correctly regardless of the time of day the test is executed.
Original PR description
The `test_pos_restaurant_appointment_tour_basic` test was failing when run late in the day. The test creates an appointment 30 minutes in the future and expects a corresponding label to appear underneath the table in the POS floor plan. However, if the test is executed near midnight (e.g. 23:45 UTC), the appointment is scheduled for the following day. Since the Point of Sale frontend only displays appointments for the current day, it filters the booking out, causing the tour to timeout while waiting for the label. runbot-232601 Forward-Port-Of: odoo/enterprise#105738
This update changes how errors during Shopee order synchronization are handled. Instead of causing an exception and a log error, the system now logs a warning. This prevents unnecessary disruptions for users who have already received email notifications about these issues, streamlining the logging process.
Original PR description
Currently a logger exception is printed in the log when an error is generated during the synchronization of Shopee shop orders. Since this is not a blocking error and the user has already been notified about this error via email, it is idle for the user to log a warning instead of logging an exception here. sentry-7122935675
This update resolves an issue where the IoT Box was incorrectly downloading standard drivers, leading to potential conflicts and duplicated files. To allow custom driver development, a checkbox was added, but this caused problems with existing drivers. The fix now avoids downloading standard drivers from modules to ensure stability.
Original PR description
The stable IoT Box uses drivers from git repository: it doesn't download them from the database as it used to do. However, sh/on premise clients might want to develop custom drivers that the IoT Box would download. For that, they have to enable a checkbox on the IoT homepage, making the IoT Box download handlers as before. The issue is it will also download standard drivers that are already present on the IoT Box: on newer databases it would simply overwrite them, but on older ones, it would duplicate as names might have changed. Also, it would introduce issues back that were already fixed. To avoid this, we avoid adding drivers from standard modules to the downloaded archive, to prevent issues with the main ones. Forward-Port-Of: odoo/enterprise#105770 Forward-Port-Of: odoo/enterprise#105531
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 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
12 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 in invoices to match DIAN's requirements, ensuring accurate and compliant invoice submissions. This resolves a validation error and avoids potential delays in tax reporting.
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
This update fixes a minor issue in the subscription payment process. Previously, a payment link was always displayed, even when the subscription was expired and certain products had been archived, leading to a confusing user experience. Now, the 'Pay Now' link only appears when the advance payment section is visible, streamlining the payment flow for users.
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#105480
This update ensures that text continues to appear correctly in Odoo views after a field is removed due to security restrictions. Previously, removing a field caused inconsistencies in the view's layout. This change maintains a consistent and professional appearance for all users.
Original PR description
In a view, if a field is removed due to security access restrictions, the text that follows it is not preserved. This leads to inconsistencies in the view. opw-5798852 Forward-Port-Of: odoo/odoo#245855
This update fixes a potential issue where users could inadvertently set non-stored models as default values for model pages, leading to errors. The change now prevents this by raising a validation error if a non-stored model is selected, ensuring data integrity and preventing unexpected behavior.
Original PR description
Steps to Reproduce: 1) Install the following modules: website, stock_account, web_studio. 2) On the homepage, create a new custom app using Studio. 3) Fill in these details: - App Name: Test App - In the `Create your First Menu section`, select 'Existing Model', choose 'Stock Quantity Report' to link this app, and click Create your App. 4) Navigate to 'Model Pages' and create a new model page and click on 'go to website' magic button. Before this commit: By following the above steps, User can set non-stored models as default model. Due to which on creating a Model Page the dafault value for 'Exposed Model' will be set as default model(e.g. Stock Quantity Report) and user can save it later on which leads to an issue. After this commit: If 'Exposed Model' is set to a non-stored model ValidationError will be raised. Related Enterprise PR: https://github.com/odoo/enterprise/pull/94286 sentry-6842596566
This update resolves an error that occurred when creating website pages linked to certain non-stored Odoo models (like reports). The fix prevents Odoo from attempting to access fields that don't exist in these models, ensuring website page functionality works correctly. This improves stability and usability for users creating custom website content.
Original PR description
Currently, an error occurs when a user creates a 'Model Page', which is referring to a non-stored model and trying to access it through website view. Steps to Reproduce: - Install stock, website and…
Currently, an error occurs when a user creates a 'Model Page', which is referring to a non-stored model and trying to access it through website view. Steps to Reproduce: - Install stock, website and web_studio modules. - Open Inventory and turn on studio mode. - Navigate to model pages. - Create a new model page with the exposed model as 'Stock Quantity Report'. - Save and click on the Website smart button and you will get the error. Error: `ValueError: Invalid field 'create_date' on model 'report.stock.quantity'` Root Cause: Odoo Studio allows creating website pages for any model, including non-stored models (`_auto = False`) such as `report.stock.quantity`. When a user creates a `Model Page` with such a model, Odoo attempts to fetch records from the database and sort them by `create_date` as shown at [1]. Since these models do not have a database table, the `create_date` field does not exist, causing the error. Fix: Exclude non-stored models from the model selection for Model Pages. [1]: https://github.com/odoo/odoo/blob/ce2d134d3e8e5c0d96529c1d0490f1e0c5e28294/addons/website/controllers/model_page.py#L77 Related Community PR: https://github.com/odoo/odoo/pull/226774 sentry-6842596566
This update resolves an issue where dynamic product snippets would display a horizontal scroll when the content width was set to 'max'. The fix repositions the navigation buttons to prevent this scrolling behavior, ensuring a consistent and user-friendly experience on larger devices.
Original PR description
Steps to reproduce: 1. Drag and drop the dynamic products snippet. 2. Select it and change the content width to **max**. Issue: When the content width is set to **max**, an unnecessary horizontal scroll appears. Reason: The issue occurs because the `previous` and `next` navigation buttons were not properly positioned. Fix: For devices larger than "mobile", the `previous` and `next` buttons are re-positioned, horizontally inward by "**50%**" of their own width with the help of `transform` property. This keeps the controls within the visible area and prevents horizontal scrolling. task-5090468 Before: <img width="1915" height="966" alt="image" src="https://github.com/user-attachments/assets/0c20d0b6-32cc-477b-8403-55bb0d372d8d" /> After: <img width="1920" height="963" alt="image" src="https://github.com/user-attachments/assets/4194b0f1-f3ad-4818-aa6f-2fda4561d2c7" />
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 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
5 changes
Enhancements to existing features
This update addresses issues with the Belarusian accounting chart of accounts (COA) by removing duplicate account types and streamlining data management. The changes ensure more accurate and efficient accounting processes within the Odoo system.
Original PR description
- Currently, l10n_id COA has unacceptable account types for some accounts - There are also duplicate accounts since data for such accounts exists in chart template, but Odoo also creates for them Task-[5360134](https://www.odoo.com/odoo/project.task/5360134?debug=assets) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
This update fixes an error that occurred when users attempted to view the BoM Overview after archiving warehouses. The fix ensures the system correctly handles scenarios where all warehouses are archived, preventing a technical error and ensuring the BoM Overview functionality remains available.
Original PR description
Currently, an error is encountered when a user tries to open the BoM Overview when all warehouses are archived. **steps to Reproduce:** - Install MRP without demo - Archive the warehouses from the inventory configuration - Now create a BOM from MRP/products and try to open the overview **Error:** `IndexError: list index out of range` **Root Cause:** When the user clicks on BoM Overview, the system tries to fetch all warehouses at [1]. At [2], the system tries to fetch all active warehouses, and since they are archived, we get a traceback here. [1]- https://github.com/odoo/odoo/blob/a8fdf26ee138b1f71e0534cbef73efd95bb2445d/addons/mrp/report/mrp_report_bom_structure.py#L114 [2]- https://github.com/odoo/odoo/blob/a8fdf26ee138b1f71e0534cbef73efd95bb2445d/addons/mrp/report/mrp_report_bom_structure.py#L21-L22 **Solution:** This commit prevent error by ensuring that all the warehouses are available for computation at [2]. sentry-**6379275060**
This update resolves a confusion for users of the account_peppol module. Previously, a user setting ('proxy_client_user') was configured as 'demo' while another ('edi_mode') was set to 'test'. This change ensures both settings are consistently configured, improving clarity and usability for users.
Original PR description
Currently, the proxy_client_user is neutralized as demo. But the edi_mode is set to test. It's confusing for the users, and we should be consistent. --- 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 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