Daily updates from Odoo
Navigate
Branch
Thursday, January 29, 2026
165 changes
35 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 simplifies the process for users to view project details linked to a manufacturing order. Previously, project information was hidden within a less prominent section of the MO form. Now, a dedicated 'Project' button provides instant access, streamlining workflows and improving efficiency.
Original PR description
When a MO is linked to a project and a user wants to check it, they have to find it in the miscellaneous section of the form, which is easy to miss and makes it harder for users to quickly navigate to the related project compared to other documents (for example, sales orders) where related records are directly accessible through a smart button. This change adds a `Project smart button` on the manufacturing order form when a project is set, allowing users with access to the Project app to open the related project directly from the MO. TaskID-5438411 Forward-Port-Of: odoo/odoo#241854
This update grants the Invoicing & Banks role read-only access to critical accounting reports like the General Ledger and Profit & Loss. Previously, this role was restricted, hindering their ability to fully utilize key financial data. This change improves reporting capabilities and operational efficiency for users in this role.
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
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
This update improves tax data and reporting within Odoo to align with Taiwanese business practices. Key changes include the addition of required tax reports (401, 403, 404) and refined tax groups, ensuring accurate compliance with Taiwanese tax regulations.
Original PR description
This is an improvement on tax data and reports, to more precisely match common business practices in Taiwan. It also introduces key tax reports to support standard compliance and reporting requirements. Updates: - Refine Taiwanese tax and tax groups - Add fiscal positions - Add tax reports: Business Tax Declaration Forms (401, 403, and 404) [Task-3371895](https://www.odoo.com/odoo/project.task/3371895) Forward-Port-Of: odoo/odoo#243980
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
This update resolves an error that occurred when users removed the start date on a leave request and then assigned a resource. The fix ensures the system correctly calculates the calendar ID for leave records, regardless of whether a contract start date is present, improving the reliability of leave scheduling.
Original PR description
Currently, an error occurs when user sets the resource on a resource leave. **Steps to Reproduce:** - Install `hr_contract` with demo data. - Go to `Resource Time Off`. - Create a new record and…
Currently, an error occurs when user sets the resource on a resource leave. **Steps to Reproduce:** - Install `hr_contract` with demo data. - Go to `Resource Time Off`. - Create a new record and remove the `start date` value. - Select the `Anita Oliver` resource `(employee record with running contract)`. **Error:** `TypeError: '<=' not supported between instances of 'datetime.datetime' and 'bool'` **Cause:** This error occurs when the user removes the start date and sets a resource that is linked to an employee with a contract. In this case, the system groups leave records based on the contract [1], and while computing calendar_id for the leave, it filters records by checking whether the leave start date falls between the contract start and end dates [2]. Since the leave start date is False, the comparison raises the error. Another issue is that when the user changes the start date, the calendar_id should be updated based on the employee’s current contract. **Fix:** This commit ensures that when setting or changing the resource_id, for contracts with and without a start date, the calendar_id is computed correctly. [1]: https://github.com/odoo/odoo/blob/5f8336c7d8ab891103a3035a9ebb5242cfa46ce6/addons/hr_contract/models/resource_calendar_leaves.py#L17 [2]- https://github.com/odoo/odoo/blob/5f8336c7d8ab891103a3035a9ebb5242cfa46ce6/addons/hr_contract/models/resource_calendar_leaves.py#L29 **No Task ID** --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244372 Forward-Port-Of: odoo/odoo#241638
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 corrects a bug where the Product List page incorrectly kept the last selected category active after a self-order kiosk purchase. The change ensures that the category selection resets upon order confirmation, providing a smoother and more accurate checkout experience for kiosk users. This resolves a potential issue with order accuracy.
Original PR description
The Product List page was keeping the previously selected category active after checkout in kiosk mode. This commit resets the category selection on order confirmation. Task-5877912 Forward-Port-Of: odoo/odoo#245830
This update fixes a visual issue where the virtual keyboard would cover the bottom sheet in point of sale, making it difficult for users to see what they were typing. The change ensures the bottom sheet always remains visible by properly resizing the viewport when the keyboard appears. This improves usability and the overall user experience.
Original PR description
Before this commit, when you clicked on an input that didn’t have focus inside a bottom sheet, the virtual keyboard popped up on top of the bottom sheet, hiding the input. As a result, you couldn’t…
Before this commit, when you clicked on an input that didn’t have focus inside a bottom sheet, the virtual keyboard popped up on top of the bottom sheet, hiding the input. As a result, you couldn’t see what you were typing. This happens because, in this case, the browser opens the virtual keyboard in overlay mode and does not resize the viewport. This seems to be a common behavior for inputs inside fixed or overlay-based layouts such as bottom sheets. Strangely, when you clicked on an input that was already the active element, the keyboard still popped up, but the viewport was resized and the bottom sheet remained visible. In this situation, the browser treats the keyboard appearance as a viewport change and recomputes the layout to keep the active element visible (safe mode?). To fix this inconsistency, we now explicitly control how the virtual keyboard affects the layout by forcing the bottom sheet to resize with the viewport. This is done by using `interactive-widget: resizes-content`, which ensures the viewport is resized when the keyboard appears and prevents the bottom sheet from being covered. Note that we should probably apply this change on the web as well, but it seems that we currently don’t have any inputs inside bottom sheets there. Since this is a fix, we prefer to apply it only where it is necessary for now. https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/meta/name/viewport#interactive-widget opw-5491343 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244538
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 fixes an issue where editing component quantities on the shop floor incorrectly displayed components from all internal locations instead of just the intended source location. The fix ensures that work orders accurately reflect the origin of components, improving inventory accuracy and reducing errors in production.
Original PR description
In the shop floor when you edit the quantity of components, all the components for the internal localization will appear instead of only the one from the source location Steps to reproduce:…
In the shop floor when you edit the quantity of components, all the components for the internal localization will appear instead of only the one from the source location
Steps to reproduce:
-------------------
- Active lot/serial number in settings
- Create component A tracked by lot, and add quantities in two location (WH/stock and WH/random)
- Create a product with a bom that use component A
- Create an operation for that bom
- Update the bom to consume the component during the operation
- Create a workorder for the product, confirm it and go to the shop floor
- Click on the operation
- Edit the quantity of components
-> all internal localisation appear (WH/{stock/random})
Observation:
-------------
The domain consider all localisation where the usage is internal: https://github.com/odoo/enterprise/blob/e99c20547528f6664d091cd230ce94cf76a08eb1/mrp_workorder/static/src/mrp_display/mrp_record_line/stock_move.js#L119
opw-5268989
Forward-Port-Of: odoo/enterprise#102902This update corrects a previous issue where the company flag on customer records was incorrectly determined based solely on the partner's country. Now, the system correctly identifies companies (VKN) based on Turkish tax ID rules (10 or fewer digits) regardless of the partner's location, ensuring compliance with UBL TR e-invoicing requirements. This ensures accurate invoicing and reporting for Turkish businesses.
Original PR description
Currently, the company flag on res.partner is determined based on whether the partner country is Türkiye or not. This causes incorrect behavior for partners using the UBL TR e-invoicing flows, where the company definition must follow Turkish identification rules regardless of the country of origin. This change updates the logic to rely on the invoice_edi_format. When the format is set to ubl_tr. Any partner valid numeric TAX ID with 10 digits or less is set as a company (VKN) and any partner Tax ID with 11 digits or more (TCKN) is set as individual task-5468521 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
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 signed documents sometimes showed incomplete fields before the PDF was fully loaded. By refreshing the sign items after the PDF iframe is ready, the system now consistently displays signed documents with all available fields, improving the user experience.
Original PR description
Ensure sign items are refreshed after the PDF iframe is fully loaded to avoid displaying partially signed documents without fields when not in sign mode. task-5877678 Forward-Port-Of: odoo/enterprise#105533
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 an issue where product attributes and values within the Purchase Product Matrix weren't being translated correctly for partners with different languages. The fix ensures that all product information, including names and values, is displayed in the appropriate language based on the selected vendor contact. This improves the accuracy and usability of the Purchase Order process for international customers.
Original PR description
When adding a product with never variant, their name and values are not translated in the language of the partner. ### Steps to reproduce: * Activate the setting Variants and Variant Grid Entry. *…
When adding a product with never variant, their name and values are not translated in the language of the partner. ### Steps to reproduce: * Activate the setting Variants and Variant Grid Entry. * Create a product , add a translation for its name. * Create a attribute and a translation for its name, with variant creation set to never. * Create values for the attribute and add translation for their name. * Add the attribute and it's values to the product . * Create a contact and change it's language to the language of the translation. * Create a purchase order set the contact as the vendor * Add the product, and set the grid number to 1 -> the attribute and attribute value is not translated. ### Observation: When adding a product via the variant grid, the attribute and value names are added. For other attribute creation types, this information is retrieved directly from the product: https://github.com/odoo/odoo/blob/f95bcc097fd7e70af8d28a66c010ae9b9490f439/addons/purchase/models/purchase_order_line.py#L283-L288 But in case of never attribute, the name it retrieved after and we don't set the context: https://github.com/odoo/odoo/blob/f95bcc097fd7e70af8d28a66c010ae9b9490f439/addons/purchase_product_matrix/models/purchase.py#L173-L174 -> we retrieve the information but in the wrong language opw-5396058 Forward-Port-Of: odoo/odoo#242692
This update fixes an issue where negative procurement quantities were not being processed correctly in the MRP system. The change impacts how MTO products are ordered, ensuring accurate quantity adjustments when users reduce product orders. This resolves a discrepancy where the PO quantity was incorrectly showing as 1.
Original PR description
Steps to reproduce ----- - Enable routes - Unarchive MTO - Create a MTO product with a vendor - Create a final product - Create a MO for final product - Confirm MO - Open catalog - Add 0.5 of the MTO…
Steps to reproduce ----- - Enable routes - Unarchive MTO - Create a MTO product with a vendor - Create a final product - Create a MO for final product - Confirm MO - Open catalog - Add 0.5 of the MTO product - Open the linked purchase > Quantity on the PO is 1 Cause ----- The catalog creates a move with a default quantity of 1 when the product is clicked. Then, when the user updates the quantity in the catalog, it triggers a `write` of the `product_uom_qty` (which triggers a procurement). Error comes from the code added in commit c0f00e4, which changed the `_run_procurement` of `stock.move` to avoid creating returns for done moves. https://github.com/odoo/odoo/blob/07198521ea1defb6abb9a6e619b8824bbb1d16a7/addons/mrp/models/stock_move.py#L493-L497 In our case, all of the conditions are met: - the quantity update is negative - the move is MTO - `move_orig_ids` is empty, so the `all()` is also true This means the move gets skipped for procurement, although that was not the goal of the commit. Even if we were to fix this last condition, there is also a problem with https://github.com/odoo/odoo/blob/07198521ea1defb6abb9a6e619b8824bbb1d16a7/addons/mrp/models/stock_move.py#L505-L507 that was also affected by the mentioned commit. Since `move_orig_ids` is empty, `possible_reduceable_qty` is 0. And because `procurement_qty` is negative, taking the max of the 2 will always mean `procurement_qty` is 0. This again does not match the goal of the original commit. ----- Ticket: opw-5440296 Forward-Port-Of: odoo/odoo#245865
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 the Gantt chart controls would overlap the user interface, particularly when using custom date ranges or the Dutch language. The change ensures the controls are displayed correctly, improving usability and preventing visual clutter, especially on smaller screens.
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
This update resolves a critical issue preventing Odoo payment batches for Swedbank Bankgiros from being accepted. Swedbank requires an 'RfdDocAmt' element in the payment XML, which was missing. This change adds this required field, ensuring successful bankgiro payments.
Original PR description
**PROBLEM** Swedbank requires the RfdDocAmt Element for Bankgiro account. [documentation](https://internetbank.swedbank.se/ConditionsEarchive/download?bankid=1111&id=WEBDOC-PRODE211415244). Payment batches generated by Odoo don't contains this fields, meaning they are refused by the bank. **REPRO STEPS** We can't reproduce the error the client have because it would require a valid bankgiro account. To generate the payment batch xml you have to: 1. Install l10n_se. 2. Create a vendor bank account of type bankgiro. 3. Create a vendor payment with this vendor bank account. 4. Create a batch payment and validate it. 5. There should be a xml in the chatter, you can look at it to see there is no RfdDocAmt element. opw-5427505 Forward-Port-Of: odoo/enterprise#104777
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 a bug where users could successfully pay invoices with expired Sales Orders. Now, the system automatically prevents payment attempts when the Sales Order's expiry date has passed, ensuring accurate payment processing and preventing revenue loss. This improves the reliability of our invoicing system.
Original PR description
## Issue: Payment link should expire if payment is expired. #### Steps to reproduce: 1- Create a new quotation. 2- Set the expiry date in the past. 3- Open the action menu and generate a payment link. 4- Open the payment link and pay. Expected result: The payment should fail if the so is expired. opw-5478691 Forward-Port-Of: odoo/odoo#245982 Forward-Port-Of: odoo/odoo#244061
This update resolves an issue where Stripe payments were failing for certain currencies like ISK and UGX. The problem stemmed from a mismatch in how the system converted amounts between the currency used for the payment and the currency expected by Stripe. This fix ensures accurate payment processing across all supported currencies.
Original PR description
### Issue: Stripe payment is failing in some special currencies (e.g. ISK, UGX). ### Steps to reproduce: 1- Configure Stripe 2- Enable ISK currency 3- Create a SO with ISK currency and generate a…
### Issue: Stripe payment is failing in some special currencies (e.g. ISK, UGX). ### Steps to reproduce: 1- Configure Stripe 2- Enable ISK currency 3- Create a SO with ISK currency and generate a payment. 4- Pay using Stripe. The payment will fail due to the amount mismatch. ### Cause: Commit https://github.com/odoo/odoo/commit/9493475273a40320228b92940be15ad8cb0643cb added support for special currency but did not adapt amount validation method in fw. In stripe payload, we are using `const.CURRENCY_DECIMALS` as `arbitrary_decimal_number` to convert the amount to minor currency unit: https://github.com/odoo/odoo/blob/6e2a29bbb23a8233132dc039d144d97be4feb3af/addons/payment_stripe/models/payment_transaction.py#L161-L166 However, we are not using the same constant in conversion back to major currency unit in `compare_notification_data`: https://github.com/odoo/odoo/blob/6e2a29bbb23a8233132dc039d144d97be4feb3af/addons/payment_stripe/models/payment_transaction.py#L393-L395 opw-5871420 Forward-Port-Of: odoo/odoo#245911 Forward-Port-Of: odoo/odoo#245689
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
5 changes
Resolved issues and error corrections
This update fixes a discrepancy in Odoo's Balance Sheet reports for specific localizations (CO, EC, KR, TW, and ZM). It ensures that the 'Other Expense' account type is correctly included in the 'Previous Years Unallocated Earnings' calculation, providing more accurate financial reporting. This aligns the localized reports with the standard Odoo Balance Sheet.
Original PR description
*= co, ec, kr, tw, 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, tw, 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#105262
This update grants the Invoicing & Banks role read-only access to critical accounting reports like General Ledger and Profit & Loss. Previously, this role lacked access, hindering their ability to perform essential financial analysis. This change improves reporting capabilities and supports better decision-making for users in this role.
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
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 (Dutch language and iPhone SE emulation). 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
This update resolves an issue where Odoo payments for Swedbank Bankgiro accounts were being rejected due to missing required data. The fix adds the 'RfdDocAmt' element to the payment XML, ensuring compliance with Swedbank's banking requirements and allowing successful payment processing. This prevents payment failures and improves integration with Swedbank.
Original PR description
**PROBLEM** Swedbank requires the RfdDocAmt Element for Bankgiro account. [documentation](https://internetbank.swedbank.se/ConditionsEarchive/download?bankid=1111&id=WEBDOC-PRODE211415244). Payment batches generated by Odoo don't contains this fields, meaning they are refused by the bank. **REPRO STEPS** We can't reproduce the error the client have because it would require a valid bankgiro account. To generate the payment batch xml you have to: 1. Install l10n_se. 2. Create a vendor bank account of type bankgiro. 3. Create a vendor payment with this vendor bank account. 4. Create a batch payment and validate it. 5. There should be a xml in the chatter, you can look at it to see there is no RfdDocAmt element. opw-5427505 Forward-Port-Of: odoo/enterprise#104777
This update fixes an issue where the system incorrectly predicted taxes during XML invoice imports. Previously, it relied on customer history, even if the imported invoice only contained one tax. Now, the system accurately uses the tax data directly from the imported XML file, ensuring correct tax calculations.
Original PR description
Context: When importing an XML invoice or vendor bill, the tax prediction was based on the customer’s invoice history. Example: if the imported invoice contains an item found in the history with two taxes (6% and 21%), the prediction would return both taxes (6% and 21%),even though only one tax is present in the XML file. The actual tax data present in the imported XML was not taken into account. This behaviour is fixed by this PR : #246159 And this commit is part of the fix. task-5503126 --- I confirm I have signed the CLA and read the PR guidelines at [www.odoo.com/submit-pr](http://www.odoo.com/submit-pr)
16 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 resolves an issue where the virtual keyboard would appear on top of the Point of Sale bottom sheet, obscuring the input field. The fix ensures the bottom sheet correctly adjusts to the keyboard's presence, improving the user experience and allowing users to easily input data.
Original PR description
Before this commit, when you clicked on an input that didn’t have focus inside a bottom sheet, the virtual keyboard popped up on top of the bottom sheet, hiding the input. As a result, you couldn’t…
Before this commit, when you clicked on an input that didn’t have focus inside a bottom sheet, the virtual keyboard popped up on top of the bottom sheet, hiding the input. As a result, you couldn’t see what you were typing. This happens because, in this case, the browser opens the virtual keyboard in overlay mode and does not resize the viewport. This seems to be a common behavior for inputs inside fixed or overlay-based layouts such as bottom sheets. Strangely, when you clicked on an input that was already the active element, the keyboard still popped up, but the viewport was resized and the bottom sheet remained visible. In this situation, the browser treats the keyboard appearance as a viewport change and recomputes the layout to keep the active element visible (safe mode?). To fix this inconsistency, we now explicitly control how the virtual keyboard affects the layout by forcing the bottom sheet to resize with the viewport. This is done by using `interactive-widget: resizes-content`, which ensures the viewport is resized when the keyboard appears and prevents the bottom sheet from being covered. Note that we should probably apply this change on the web as well, but it seems that we currently don’t have any inputs inside bottom sheets there. Since this is a fix, we prefer to apply it only where it is necessary for now. https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/meta/name/viewport#interactive-widget opw-5491343 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244538
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 fixes a bug that prevented automatic reconciliation when an invoice's reference matched its payment reference. The system now correctly identifies and matches these invoices, streamlining the accounting process. This change was driven by a user report and ensures accurate reconciliation without manual intervention.
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)
This update fixes an issue where product attributes and values weren't being translated correctly when using 'never' variants in purchase orders. The fix ensures that all product information, including names and values, is displayed in the customer's preferred language, improving the user experience and accuracy of purchase orders. This resolves a previous bug impacting international sales.
Original PR description
When adding a product with never variant, their name and values are not translated in the language of the partner. ### Steps to reproduce: * Activate the setting Variants and Variant Grid Entry. *…
When adding a product with never variant, their name and values are not translated in the language of the partner. ### Steps to reproduce: * Activate the setting Variants and Variant Grid Entry. * Create a product , add a translation for its name. * Create a attribute and a translation for its name, with variant creation set to never. * Create values for the attribute and add translation for their name. * Add the attribute and it's values to the product . * Create a contact and change it's language to the language of the translation. * Create a purchase order set the contact as the vendor * Add the product, and set the grid number to 1 -> the attribute and attribute value is not translated. ### Observation: When adding a product via the variant grid, the attribute and value names are added. For other attribute creation types, this information is retrieved directly from the product: https://github.com/odoo/odoo/blob/f95bcc097fd7e70af8d28a66c010ae9b9490f439/addons/purchase/models/purchase_order_line.py#L283-L288 But in case of never attribute, the name it retrieved after and we don't set the context: https://github.com/odoo/odoo/blob/f95bcc097fd7e70af8d28a66c010ae9b9490f439/addons/purchase_product_matrix/models/purchase.py#L173-L174 -> we retrieve the information but in the wrong language opw-5396058 Forward-Port-Of: odoo/odoo#242692
This update fixes an issue where negative procurement quantities weren't being processed correctly, specifically when creating MTO products. The change ensures that the system accurately handles requests to reduce stock levels, preventing incorrect purchase orders. This ensures accurate inventory management.
Original PR description
Steps to reproduce ----- - Enable routes - Unarchive MTO - Create a MTO product with a vendor - Create a final product - Create a MO for final product - Confirm MO - Open catalog - Add 0.5 of the MTO…
Steps to reproduce ----- - Enable routes - Unarchive MTO - Create a MTO product with a vendor - Create a final product - Create a MO for final product - Confirm MO - Open catalog - Add 0.5 of the MTO product - Open the linked purchase > Quantity on the PO is 1 Cause ----- The catalog creates a move with a default quantity of 1 when the product is clicked. Then, when the user updates the quantity in the catalog, it triggers a `write` of the `product_uom_qty` (which triggers a procurement). Error comes from the code added in commit c0f00e4, which changed the `_run_procurement` of `stock.move` to avoid creating returns for done moves. https://github.com/odoo/odoo/blob/07198521ea1defb6abb9a6e619b8824bbb1d16a7/addons/mrp/models/stock_move.py#L493-L497 In our case, all of the conditions are met: - the quantity update is negative - the move is MTO - `move_orig_ids` is empty, so the `all()` is also true This means the move gets skipped for procurement, although that was not the goal of the commit. Even if we were to fix this last condition, there is also a problem with https://github.com/odoo/odoo/blob/07198521ea1defb6abb9a6e619b8824bbb1d16a7/addons/mrp/models/stock_move.py#L505-L507 that was also affected by the mentioned commit. Since `move_orig_ids` is empty, `possible_reduceable_qty` is 0. And because `procurement_qty` is negative, taking the max of the 2 will always mean `procurement_qty` is 0. This again does not match the goal of the original commit. ----- Ticket: opw-5440296 Forward-Port-Of: odoo/odoo#245865
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 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 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
This update resolves an issue where Odoo payments for Bankgiro accounts were being rejected by Swedbank due to missing data. The fix adds the required 'RfdDocAmt' element to the payment XML, ensuring successful processing and avoiding payment failures. This improves compatibility with Swedbank's banking system.
Original PR description
**PROBLEM** Swedbank requires the RfdDocAmt Element for Bankgiro account. [documentation](https://internetbank.swedbank.se/ConditionsEarchive/download?bankid=1111&id=WEBDOC-PRODE211415244). Payment batches generated by Odoo don't contains this fields, meaning they are refused by the bank. **REPRO STEPS** We can't reproduce the error the client have because it would require a valid bankgiro account. To generate the payment batch xml you have to: 1. Install l10n_se. 2. Create a vendor bank account of type bankgiro. 3. Create a vendor payment with this vendor bank account. 4. Create a batch payment and validate it. 5. There should be a xml in the chatter, you can look at it to see there is no RfdDocAmt element. opw-5427505 Forward-Port-Of: odoo/enterprise#104777
This update fixes an issue where negative invoice amounts (like discounts) were causing incorrect tax calculations, specifically for VAT and withholding taxes. The previous change introduced an `abs` function that inadvertently impacted tax calculations. This fix ensures accurate tax reporting on invoices with negative amounts.
Original PR description
Issue: When using negative amounts, for example to explicitly show a discount, the tax calculation is incorrect due to the application of the `abs` function. Furthermore, the way to find out if a tax…
Issue:
When using negative amounts, for example to explicitly show a discount, the tax calculation is incorrect due to the application of the `abs` function. Furthermore, the way to find out if a tax is of the withholding type is based on the sign of the value, which can lead to error in these cases.
Cause:
A previous change (#237235) added the `abs` function so the `TotalTaxesWithheld` would be always with positive value. But this also affects the calculation of taxes `TotalTaxOutputs` in some cases, such as if the invoice line has negative values.
Steps to reproduce:
- Install `l10n_es_edi_facturae`
- With the ES company, create an invoice with some standard lines and one line with negative amounts, as an explicit discount
- Confirm the invoice and send (facturae)
- Open the XML attached in the chatter
- Observe that the taxes amounts (VAT and WITHHOLDING) are erroneous
A correct invoice should be for example:
```
Product Price Taxes Amount
---------------------------------------------
PRODUCT-A 1000 21%VAT 15%WHI 1000
Discount -100 21%VAT 15%WHI -100
---------------------------------------------
Untaxed amount 900
Withholding 15% -135
VAT 21% 189
-----------------------
TOTAL 954
```
This PR replaces #240808
---
I confirm I have signed the [CLA](https://github.com/odoo/odoo/pull/157955) and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#244428This update resolves a regression that prevented new PEPPOL participant registrations. The issue stemmed from a configuration change introduced during a previous port, leading to a requirement for existing EDI proxy users. This fix ensures proper registration functionality for PEPPOL participants.
Original PR description
Fix regression of participant fetch cron introduced in forward port odoo/odoo#245038 Indeed self might be a record set in lots of different cases, which leads to users at least 1 existing edi proxy user in their company, all future registrations will fail Forward-Port-Of: odoo/odoo#246054
3 changes
Resolved issues and error corrections
This update fixes errors in the SAF-T export process for Romanian companies when partner information (country or name) is missing. The fix ensures accurate registration number generation and prevents report errors, improving compliance for our Romanian clients. It addresses issues related to incomplete partner data.
Original PR description
Fix SAF-T export errors when partners have no country or name. For Romanian companies, the RegistrationNumber should be generated as “04 + partner ID” for customers not subject to VAT and with unknown CNP, without including the country code. Steps to reproduce country issue: - Configure a Romanian company with l10n_ro_saft installed - Create a contact without a country - Create and validate an invoice for this contact - Export the SAF-T file from the General Ledger report You you will get a TypeError because you cant concatenate Bool and String. Steps to reproduce name issue: - Create a main contact - Add a child contact without a name - Change the child type to “Company” - Create and validate an invoice - Export the SAF-T file from the General Ledger report This prevents KeyError when printing the first 70 characters of the partner name in the report. opw-5499918 Forward-Port-Of: odoo/enterprise#105406 Forward-Port-Of: odoo/enterprise#105020
This update fixes an issue where the barcode scanning process wasn't creating enough quality checks for products tracked by lot. The change ensures that quality checks are automatically generated when using the ‘Put-In-Pack’ feature, guaranteeing accurate quality control for lot-based inventory.
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#102714
This update resolves an issue where Odoo payments using Swedbank's Bankgiro accounts were being rejected. The fix adds a required field, 'RfdDocAmt,' to the payment XML, ensuring compliance with Swedbank's banking requirements and allowing successful payment processing.
Original PR description
**PROBLEM** Swedbank requires the RfdDocAmt Element for Bankgiro account. [documentation](https://internetbank.swedbank.se/ConditionsEarchive/download?bankid=1111&id=WEBDOC-PRODE211415244). Payment batches generated by Odoo don't contains this fields, meaning they are refused by the bank. **REPRO STEPS** We can't reproduce the error the client have because it would require a valid bankgiro account. To generate the payment batch xml you have to: 1. Install l10n_se. 2. Create a vendor bank account of type bankgiro. 3. Create a vendor payment with this vendor bank account. 4. Create a batch payment and validate it. 5. There should be a xml in the chatter, you can look at it to see there is no RfdDocAmt element. opw-5427505 Forward-Port-Of: odoo/enterprise#104777
18 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 simplifies the setup for Peppol integration within the Enterprise module. The previous wizard has been removed, and a more intuitive setting page with a radio button for registration type and a dedicated email field for Peppol contacts has been implemented. This change streamlines the process for users to connect to the Peppol network.
Original PR description
In this commit: - We remove the 'peppol config wizard'. - Add peppol contact e-mail field in setting instead of the wizard. - Add a radio button to choose peppol registration type instead of a button in that wizard. - Simplify and improve the user experience of peppol setting. task-5438539
This update introduces the ability to test payment terminal devices within the Odoo Enterprise system. Previously, this functionality was unavailable. A key improvement prevents excessive test requests that could cause system instability, particularly with Worldline payment terminals.
Original PR description
We now use the view widget for the device test button and allow testing payment terminal devices. see odoo/odoo#244530 Task: 5491079
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 resolves performance issues that were causing slow calculations for holiday leave requests. The change involved optimizing how the system queries for holiday information, resulting in faster processing times. This ensures smoother and more efficient leave management for users.
Original PR description
In this commit, we fixed the failed performance tests due to changes related to the new public holiday leave model since we are doing an additional query. Community PR: https://github.com/odoo/odoo/pull/229288 task-4791808
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 an issue where invoices couldn't be processed correctly when multiple payment methods shared the same code, a requirement by Mexican regulations. The system now prevents users from modifying payment method codes, ensuring compliance and stability. This change enhances the reliability of the l10n_mx_edi module for Mexican businesses.
Original PR description
Currently, an error occurs when a user tries to post an invoice using a payment method that shares the same code as another payment method. Steps to replicate: - Install `l10n_mx_edi` and…
Currently, an error occurs when a user tries to post an invoice using a payment method that shares the same code as another payment method.
Steps to replicate:
- Install `l10n_mx_edi` and `accountant` with demo and switch to `ZAPATERIA URTADO ÑERI` (Mexican company).
- Go to `Accounting > Configuration > Payment Way Codes (MX)`.
- Open `Efectivo` and change its code to `02`.
- Create a new Invoice, select `Efectivo` in the Payment Way.
- Add a customer and a move line, then confirm the invoice and send it (make sure CFDI is checked).
Error:
```
File '/home/odoo/src/enterprise/19.0/l10n_mx_edi/models/account_move.py', line 424, in _l10n_mx_edi_get_extra_invoice_report_values
cfdi_infos['payment_way'] = f'{payment_way} - {payment_method.name}'
File '/home/odoo/src/odoo/19.0/odoo/orm/fields.py', line 1659, in __get__
record.ensure_one()
File '/home/odoo/src/odoo/19.0/odoo/orm/models.py', line 5934, in ensure_one
raise ValueError('Expected singleton: %s' % self)
ValueError: Expected singleton: l10n_mx_edi.payment.method(1, 22)
```
Cause:
- Issue originated through this [PR] that gave access to write on the model.
- As the user made the codes of two payment methods same, the [search] returned two records and while accessing `payment_method.name` on two records it results into this error.
Solution:
- Made the fields read-only to prevent users from changing the payment method codes established by the Mexican government.
- Added limit to the search query to prevent multiple records (Just for safety).
- Removed unlink rights on the `l10n_mx_edi.payment.method` model.
- Added a SQL constraint to allow only unique values for the code.
- Removed the form view.
- Added the field `active` to the list view and made it editable.
PR for stable(18.0): https://github.com/odoo/enterprise/pull/103944
[PR]: https://github.com/odoo/enterprise/pull/38046
[search]: https://github.com/odoo/enterprise/blob/18117c6a9fbf270ace1c551616828a85713d5225/l10n_mx_edi/models/account_move.py#L423
sentry-7171030995This 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 fixes an issue where editing component quantities on the shop floor incorrectly displayed all internal locations instead of just the source location. The fix ensures that only the intended source location is considered when updating component quantities, improving accuracy in work order management. This prevents over-allocation of stock and ensures correct material usage.
Original PR description
In the shop floor when you edit the quantity of components, all the components for the internal localization will appear instead of only the one from the source location Steps to reproduce:…
In the shop floor when you edit the quantity of components, all the components for the internal localization will appear instead of only the one from the source location
Steps to reproduce:
-------------------
- Active lot/serial number in settings
- Create component A tracked by lot, and add quantities in two location (WH/stock and WH/random)
- Create a product with a bom that use component A
- Create an operation for that bom
- Update the bom to consume the component during the operation
- Create a workorder for the product, confirm it and go to the shop floor
- Click on the operation
- Edit the quantity of components
-> all internal localisation appear (WH/{stock/random})
Observation:
-------------
The domain consider all localisation where the usage is internal: https://github.com/odoo/enterprise/blob/e99c20547528f6664d091cd230ce94cf76a08eb1/mrp_workorder/static/src/mrp_display/mrp_record_line/stock_move.js#L119
opw-5268989
Forward-Port-Of: odoo/enterprise#102902This update resolves an issue where signed documents sometimes displayed incorrectly, showing fields as incomplete. The change ensures the PDF iframe fully loads before displaying the document, guaranteeing accurate field visibility for users. This improves the user experience when working with signed documents.
Original PR description
Ensure sign items are refreshed after the PDF iframe is fully loaded to avoid displaying partially signed documents without fields when not in sign mode. task-5877678 Forward-Port-Of: odoo/enterprise#105533
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
8 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
This update grants the Invoicing & Banks role read-only access to critical accounting reports like General Ledger and Profit & Loss. Previously, this role lacked access, hindering their ability to perform essential financial analysis. This change improves reporting capabilities and supports better decision-making for users in this role.
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
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 fixes a discrepancy in Odoo's Balance Sheet reports for several localized versions (CO, EC, KR, US, TW, and ZM). It ensures that 'Other Expenses' (expense_other) are now correctly included in the unallocated earnings calculations, aligning them with standard reports. This improves financial reporting accuracy for these localized businesses.
Original PR description
*= co, ec, kr, us, tw, 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, tw, 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#105262
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 resolves an issue preventing Odoo payments using Swedbank's Bankgiro accounts. Swedbank requires a specific 'RfdDocAmt' field in payment XMLs, which Odoo was previously missing. This fix adds this field, ensuring successful payment processing and avoiding bank rejections.
Original PR description
**PROBLEM** Swedbank requires the RfdDocAmt Element for Bankgiro account. [documentation](https://internetbank.swedbank.se/ConditionsEarchive/download?bankid=1111&id=WEBDOC-PRODE211415244). Payment batches generated by Odoo don't contains this fields, meaning they are refused by the bank. **REPRO STEPS** We can't reproduce the error the client have because it would require a valid bankgiro account. To generate the payment batch xml you have to: 1. Install l10n_se. 2. Create a vendor bank account of type bankgiro. 3. Create a vendor payment with this vendor bank account. 4. Create a batch payment and validate it. 5. There should be a xml in the chatter, you can look at it to see there is no RfdDocAmt element. opw-5427505 Forward-Port-Of: odoo/enterprise#104777
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 (Dutch language and iPhone SE emulation). The change ensures that 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
8 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" />
This update resolves an intermittent issue where event registrations would fail with a 500 error when the 'Mail Scheduler' cron job was running. The fix prevents a database conflict by skipping the automatic commit during registration, ensuring registrations are reliably processed.
Original PR description
Registering for an event while the mail scheduler cron was running could lead to a PostgreSQL serialization failure, leading to a 500 error and the failure of the registration. ### Reproduction Steps…
Registering for an event while the mail scheduler cron was running could lead to a PostgreSQL serialization failure, leading to a 500 error and the failure of the registration. ### Reproduction Steps 1. Configure an Event with a "Mail Scheduler" set to trigger "After each registration" with an interval of "Immediately". 2. Ensure the "Event: Mail Scheduler" cron job is active and running. 3. As a public user or portal user, attempting to register for this event will intermittently fail with an HTTP 500 error. 4. The server logs will show `psycopg2.errors.SerializationFailure: could not serialize access due to concurrent update`, followed by `psycopg2.errors.InFailedSqlTransaction`. 5. The registration is not created. ### Cause When a user registers for an event, the system immediately attempts to process any "on-registration" emails. The method used (`_execute_attendee_based`) forces a database `commit()`. When this `commit()` is executed, the Postgres database attempts to finalize the user's transaction. However, if the concurrent background cron job has modified the same event/mail records while the user's request was processing, Postgres detects a serialization conflict. Consequently, the commit itself fails and raises `SerializationFailure`. Because the commit failed, the user's transaction is rolled back, and the registration record is never persisted to the database (explaining the missing attendees). Critically, the exception handling logic in `_update_mail_schedulers` catches this `SerializationFailure` (preventing odoo from retrying the transaction) but then attempts to perform further database operations (to log the error). Since the transaction is already in an aborted state due to the failed commit, this triggers a secondary `InFailedSqlTransaction` error. This secondary error is not recognized as a concurrency error by Odoo's automatic retry mechanism (`odoo.service.model.retrying`), resulting in a hard crash instead of a retry. ### Fix The logic now checks the execution context using `event_mail_registration_ids`. If triggered by a user registration (indicated by the presence of specific registration IDs in the context), the explicit `commit()` is skipped. opw-5355116
This update fixes a potential issue where users re-registering through PEPPOL wouldn't be properly reset. The change ensures that proxy user accounts are archived when a participant's status changes, allowing for a smoother and more reliable 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
7 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 strengthens the website's stock notification system by adding validation to prevent unauthorized subscriptions and misuse of user accounts. Now, users attempting to subscribe for unavailable products or using existing user emails will be blocked, enhancing security and preventing potential issues.
Original PR description
Description of the issue/feature this PR addresses: Currently, in the website_sale_stock module, there is no backend validation when subscribing to notifications for products without stock. This…
Description of the issue/feature this PR addresses: Currently, in the website_sale_stock module, there is no backend validation when subscribing to notifications for products without stock. This allows public users to potentially use emails that belong to registered accounts. Current behavior before PR: - Users could subscribe to stock notifications for products that don’t exist or cannot be added (no stock). - Public users could use emails already associated with registered accounts, allowing them to subscribe on behalf of another user. - No validation is enforced, leading to potential security issues. Desired behavior after PR is merged: - Adding a subscription for a non-existent or unavailable product raises a ValidationError. - Public users trying to subscribe with an email that belongs to a registered user receive an AccessError prompting them to sign in first. - Backend validation prevents misuse of registered user emails and improves security. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
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 fixes an issue where the work order planning views would lose their dependency links after a page refresh. The change ensures that the correct view, including dependency links, is always displayed, regardless of page reload. This improves the accuracy of production planning.
Original PR description
**Behaviour:** When accessing the Planning by Production/Workcenter views from the menu, a server action checks if the work order dependencies setting is enabled, and if yes, it will change the ref…
**Behaviour:** When accessing the Planning by Production/Workcenter views from the menu, a server action checks if the work order dependencies setting is enabled, and if yes, it will change the ref of the default gantt view to another view which handles dependencies. However, when reloading the page, the server action is not accessed anymore which will result in the default view being loaded and the dependencies not being represented. This behaviour is fixed starting from 18.2 with this commit ( https://github.com/odoo/odoo/commit/b663a6e3dbda6eda84e4a6b051acfc8511476cd3 ) that ensures that if a page is reloaded the current action's state is restored as it was. Applying this commit to previous versions would not comply with stable policy, the current solution is to override the get_views method to make sure the presence of the setting is checked and the correct view is applied whenever that page is loaded. **Steps to reproduce:** - Check Work Orders->Work Order Dependencies in the Manufacturing settings - Create a Product - Create a Bill of materials with two components - Check Operation Dependencies in the Miscellaneous tab - Create two operations, and make one of them blocked by the other - Create a Manufacturing order for the product then click confirm then Plan - In the Planning dropdown menu, select Planning by Production (workcenter works aswell) - You will see the two operations with an arrow linking them. - Refresh the page - The arrow will have disapeared opw-5477803
This update corrects inaccuracies in the Spanish tax reporting formulas (Mod390) for 2025. The changes align with the latest regulations from the Agencia Tributaria, ensuring accurate reporting and compliance. This fix addresses a critical error impacting tax calculations.
Original PR description
Currently report line formulas for box 33 and 34 are wrong, as they are not according to the regulation. https://sede.agenciatributaria.gob.es/static_files/Sede/Procedimiento_ayuda/G412/Instrucciones_modelo_390-2025.pdf Box 33 is missing the sum of 27, 29, 649 and 31 Box 34 is missing the sum of 28, 30, 650 and 32 Updating mod390 report for 2025 opw-5498345
This update fixes a misclassification of account 649 in the French Profit and Loss report. The change aligns the report with French accounting standards (PCG 2025 & 2026), ensuring accurate financial reporting for French businesses using Odoo. This improves the report's compliance and reliability.
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-5724559This 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