Daily updates from Odoo
Tuesday, February 3, 2026
237 changes
37 changes
New functionality added to Odoo
This update introduces a new field for 'CPV code' on products, addressing a requirement for B2C invoices in Romania. When enabled, the module automatically adds the CPV code to the RO-CIUS XML generated for invoices, ensuring compliance with local regulations. This improves data accuracy for Romanian customers.
Original PR description
In This PR: - We add a new module to add a new field 'CPV code' in the product. - Till now, in Odoo, customers can't input that CPV identification number on products, and the field is always left empty. That's an issue with B2C invoices, where the field is mandatory. - If the module is installed and a product with a CPV category is set on an invoice, we add the value of the CPV code in the RO-CIUS XML generated on an invoice. Task [link](https://www.odoo.com/odoo/project.task/5416833) task-5416833 Forward-Port-Of: odoo/odoo#240219
This update introduces a new test suite specifically designed to verify the integration with the Nilvera Turkish e-invoice API. Previously, there were no automated tests for this critical component, and this addition ensures proper functionality and reliability of the Turkish e-invoice module. This improves the overall stability and accuracy of the system.
Original PR description
There are no tests for the Turkish e-invoice module. This commit adds that. Task ID: 4655864 Forward-Port-Of: odoo/odoo#239359 Forward-Port-Of: odoo/odoo#216179
This update extends the tax reporting capabilities within Odoo Enterprise to include EC Sales Lists and Intrastat returns for key European markets. Specifically, it supports Austria, Germany, Italy, Poland, Portugal, and The Netherlands, ensuring compliance with local regulations and improving reporting accuracy for businesses operating in these regions.
Original PR description
Following the implementation of the Tax returns feature in 18.3 which was focused on the general implementation and Belgium, we want to add the specification for other country and in this case Austria, Germany, The Netherlands, Italy, Poland, and Portugal. Adding EC sales list, Intrastat specific deadlines and periodicities. task-4776236 Forward-Port-Of: odoo/enterprise#97615
Resolved issues and error corrections
This update fixes an issue where certain Odoo records wouldn't open correctly in their default form view. The change ensures that records can be opened with other views enabled, providing a smoother and more flexible user experience. This resolves a technical glitch that was impacting how records are accessed.
Original PR description
Records of some models may not want to be shown in their form view by default. See related ENT PR for documents. We re-export to avoid patching order issues. In particular, this makes sure that if we are in the webclient, the chat window is opened before executing the "real" open. Task-5386466 Forward-Port-Of: odoo/odoo#246525 Forward-Port-Of: odoo/odoo#244289
This update refines how the HTML editor handles selections, particularly within nested editing contexts. The change resolves issues where nested edits could corrupt cursor states, ensuring consistent and reliable selection management across the editor. This improves the overall stability and usability of the HTML editor.
Original PR description
Summary: Refactor `preserveSelection()` to use a stack-based approach (`preservedCursors` array) instead of a single cursor reference. This allows nested calls to `preserveSelection()` to operate…
Summary:
Refactor `preserveSelection()` to use a stack-based approach (`preservedCursors` array) instead of a single cursor reference. This allows nested calls to `preserveSelection()` to operate independently while keeping cursor updates synchronized across active contexts.
Problem:
Using a single stored cursor caused issues in nested calls to `preserveSelection()`:
1. **State overwrite:** Inner calls could overwrite or clear the outer cursor.
2. **Stale references:** If an inner function replaced a DOM node, the outer cursor could still point to a removed node and fail on restore.
Solution:
Use an array of cursor subscribers
- **Shared updates:** When calling `remapNode` on a cursor, it iterates over all active subscribers in the stack. This ensures node replacements performed in inner contexts also update outer cursor references.
- **Scoped cleanup:** `restore()` now removes only the corresponding cursor instance from the stack, ensuring proper lifecycle management.
Example:
The key improvement is that outer scopes receive updates performed by inner scopes.
```javascript
// Function A (outer)
function wrapperFunction() {
const cursor = this.preserveSelection();
replaceTextWithSpan();
cursor.restore();
}
// Function B (inner)
function replaceTextWithSpan() {
const innerCursor = this.preserveSelection();
const oldNode = document.querySelector('text');
const newNode = document.createElement('span');
oldNode.replaceWith(newNode);
innerCursor.remapNode(oldNode, newNode);
innerCursor.restore();
}
```
opw-5386862
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#244758
Forward-Port-Of: odoo/odoo#238989This update resolves an issue where the background color of nested columns within tabs was being incorrectly overridden. The fix ensures that tab styling applies correctly, regardless of the column structure used within the tab panes. This improves the visual consistency of the Odoo interface.
Original PR description
Steps to reproduce: =================== 1- Drop the block tab snippet 2- Inside one of the tab panes, drop a Columns snippet. 3- Select background_color for one of the columns 4- Change tab style to…
Steps to reproduce: =================== 1- Drop the block tab snippet 2- Inside one of the tab panes, drop a Columns snippet. 3- Select background_color for one of the columns 4- Change tab style to tab -> The background color of the inner column is overridden. Cause: ====== When the "Tabs" snippet style is set, a `.card` class is added to its container (See [1]) A generic CSS rule, intended to style these tabs, was targeting any `.card` element with a `.card-body` child. (See [2]) However, the Columns snippet also uses a `.card > .card-body` structure (distinguished by a `data-vxml` attribute). This caused the overly broad tab-styling rule to incorrectly cascade and override the background color of the nested column. Solution ======== The SCSS selector has been made more specific so that works if `card-body` class doesn't have any parent class with class `card` and has attribute `data-vxml` [1]: https://github.com/odoo/odoo/blob/4cb3ffc09507fdfdb1aeabb70b2c93105f992700/addons/website/static/src/snippets/s_tabs/options.js#L149 [2]: https://github.com/odoo/odoo/blob/4cb3ffc09507fdfdb1aeabb70b2c93105f992700/addons/web/static/src/scss/bootstrap_review_frontend.scss#L55 opw-5394480 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#241118
This update fixes an issue where new CRM contacts created using the quick create feature weren't automatically linked to the company's address. The fix ensures that when a company is selected, the new contact's address is correctly populated, improving data accuracy and streamlining CRM workflows. This enhancement impacts the Sales and CRM applications.
Original PR description
**Steps to reproduce:** - Install Sales/CRM apps - Go to CRM app - Create new opportunity card - Set a company (`commercial_partner_id`) - Create a new contact using `quick_create` - The new contact is linked to the company but it doesn't inherit the company address **Issue:** Kanban quick create of crm app was modified to allow a company field, which is used as `default_parent_id` when creating a new partner from the card. This properly set the partner `parent_id` and `commercial_partner_id` but without applying the logic of `_fields_sync()` which also added the address (only for quick_create). **Fix:** Check if a default value was given for `parent_id` in `_fields_sync()`. related: https://github.com/odoo/odoo/commit/a6c3ebc21c066ab4d5711f535ca5fc858e6485b0 opw-4932114 Forward-Port-Of: odoo/odoo#229234
This update fixes an issue where multiple product filters were not consistently saved during pagination, leading to incorrect product listings. The change ensures that all selected filters are correctly passed to the URL, maintaining accurate filtering across different pages. This improves the user experience and ensures products are displayed as intended.
Original PR description
Current behavior: When a user selects multiple filters (attributes) that result in multiple pages of products, navigating to the second page causes some filters to be lost. Specifically, only the…
Current behavior:
When a user selects multiple filters (attributes) that result in multiple pages of products, navigating to the second page causes some filters to be lost. Specifically, only the last selected attribute value is kept in the URL of the pager.
This happens because the `/shop` controller processes query parameters using a standard Python dictionary (**post). Since a dictionary cannot hold duplicate keys, an URL like `?attrib=1&attrib=2` is reduced to `{'attrib': '2'}`, losing all previous values.
Steps to reproduce:
1. Install `website_sale`.
2. Reduce "Products per Page" (e.g., to 4) to easily trigger pagination.
3. Go to the /shop page.
4. Select a first attribute (e.g., Color: White).
5. Select a second attribute (e.g., Size: M).
6. Ensure the result spans at least two pages.
7. Click on page "2".
8. Observation: The second attribute filter is lost, and the product list changes incorrectly.
Fix:
Ensure that `attribute_values` are stored as a list within the `url_args` passed to the pager. Since Odoo's `website.pager` uses `url_encode` internally, passing a list of values for a single key correctly generates repeated parameters in the resulting URL (e.g., `attrib=1&attrib=2`).
opw-4152637
Forward-Port-Of: odoo/odoo#245784
Forward-Port-Of: odoo/odoo#244941This update addresses a visual issue in the Point of Sale action dialog where disabled buttons had insufficient contrast. We've enhanced button visibility by using a consistent lighter background color for disabled states and added a border, ensuring better clarity for users, especially in bright environments. This improves the overall user experience and accessibility.
Original PR description
Before this PR there was a contrast issue between disabled and active secondary buttons in the action dialog. This was due to a customization where the `btn-secondary`'s default background color was…
Before this PR there was a contrast issue between disabled and active secondary buttons in the action dialog. This was due to a customization where the `btn-secondary`'s default background color was lightened. To fix this, we used the same lighter background color for disabled `.btn-secondary`, reduced the opacity of its text and desaturated tho whole button for whenever there is color such as the "reward" button. This way we can distinguish between the two states. A border was added to `.btn-secondary` in order to make the button more visible in light-challenging situations (in broad daylight for example). task-5186928 | Before | After | | ------------- | ------------- | | <img width="1002" height="647" alt="Screenshot 2025-11-06 at 13 17 27" src="https://github.com/user-attachments/assets/cc63d6e1-8587-427e-b5cd-de99e96df8c0" />|<img width="1004" height="645" alt="Screenshot 2025-11-06 at 12 58 07" src="https://github.com/user-attachments/assets/f199fd94-1223-4c6b-869b-e8d66d99bc82" /> | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232969
This update makes it easier to manage channel members by displaying the '...' action (for options) directly on member items within the 'Members' panel. This enhancement, similar to the 'Discuss' sidebar, ensures actions are readily discoverable, especially on mobile devices. Additionally, the ability to remove guests from the member list has been added, addressing a previous limitation.
Original PR description
Before this commit, the channel member actions were hard to find: - Click on Members panel. - Click on Member to open popover card. - Click on "..." in top-right corner of card. This is hard because…
Before this commit, the channel member actions were hard to find: - Click on Members panel. - Click on Member to open popover card. - Click on "..." in top-right corner of card. This is hard because only this avatar card from this menu has the "..." button, and the actions are hidden in this menu. This is easy to miss since avatar cards in message list or other places don't have this "...", and since the actions are hidden there many people could easily miss these actions. This commit improves the visibility of action by their showing as a "..." on the member item on hover in the "Members" panel. This works like the "..." button in the discuss left sidebar, where the button is shown on mouse-hover. Mobile view (small or mobile device) shows the button all the time next to member, making the discoverability of the action very clear. Task-5871730 Before / After <img width="589" height="385" alt="Screenshot 2026-01-23 at 14 45 17" src="https://github.com/user-attachments/assets/bca66975-13cd-423a-a43d-9eb2be03741a" /> <img width="249" height="270" alt="Screenshot 2026-01-26 at 11 56 09" src="https://github.com/user-attachments/assets/edfe34c9-6b4c-4394-b532-7f79f9653b4a" /> ---- This PR also makes channel member actions available in guest items, so we can now "Remove Member" on guests too. <img width="252" height="296" alt="Screenshot 2026-01-27 at 18 25 54" src="https://github.com/user-attachments/assets/ee4b1271-0529-4e96-bda1-e621d7592555" />
This update enhances the Point of Sale mobile experience by ensuring that product categories are displayed efficiently on smaller screens. The UI now automatically scrolls to show all categories when more than three are present, and a small visual improvement (padding) has been added to the product list for a cleaner look. This improves usability for mobile sales staff.
Original PR description
Only three rows needs be displayed on small devices and if there are more, it must be scrollable. Adding of padding for the product in the product list to render a bit prettier. task : 5490918 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where product descriptions couldn't be edited on completed or cancelled stock picks. Now, users can correct descriptions for finished orders, improving data accuracy and reducing manual rework. This change ensures that product information is always up-to-date.
Original PR description
Once a picking is no longer in draft, it's not possible to edit a product description anymore and there's no easy way to correct a mistake. Solution: only make it readonly in done or cancel state. task 5083104 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246611 Forward-Port-Of: odoo/odoo#243109
This update fixes a bug related to how Odoo handles responses from the Zatca system when obtaining CCSID or PCSID information. Previously, missing error messages caused confusing tracebacks for users. Now, the system checks CSR field lengths and displays a helpful message to the user, ensuring smoother Zatca onboarding.
Original PR description
Previously, it was assumed that if no 'error' or 'errors' key was present that means we've received a valid response for obtaining CCSID or PCSID. But sometimes the error is not sent with those keys, and the binarySecurityToken is missing, therefore a traceback is shown to the user because the invalid requests passes through the validation unnoticed. This kind of response is the result of a new change introduced by zatca requiring csr fields to be at most 64 characters long. This commit improves the error handling mechanism of CSID responses, to show the user an informative message, and handles the length check for csr fields on the client side before sending to zatca. task-5347269 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246714 Forward-Port-Of: odoo/odoo#244507
This update allows users to star persistent messages like sign requests, even if they aren't part of a conversation thread. Previously, these messages couldn't be starred. This change simplifies the starring process and improves user functionality.
Original PR description
**Description of the issue this PR addresses:** Starring a message should depend on whether the message is persistent and whether the current user is allowed to star it, not on whether the message is attached to a thread. **Current behavior before PR:** Some persistent messages (such as user notifications) can be displayed in Inbox without an associated thread. In such cases, the star action was unavailable even though the message itself was valid and persistent. **Desired behavior after PR is merged:** This change removes the dependency on thread presence when determining whether a message can be starred. As a result, users can now star persistent messages without a thread, including Inbox notifications such as sign requests. task-[5473438](https://www.odoo.com/odoo/project/1519/tasks/5473438) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246787 Forward-Port-Of: odoo/odoo#244204
This update resolves an issue where canceling multiple Point of Sale orders would cause a system crash. The fix ensures correct argument formatting for order cancellation, allowing users to reliably cancel multiple orders at once. This improves the stability and usability of the Point of Sale module.
Original PR description
In 3f95dd4, we can call `action_pos_order_cancel` with either one or more orders; In the case of calling it with multiple orders, we were passing as argument an array of order ids as params for the python method, but since the method only expects a single argumetn, `self`, it will crash if we passed an array. The fix is to pass `[[1, 2, 3]]` instead of `[1, 2, 3]` for multiple orders. This still works for a single order too as both `[1]` and `[[1]]` works. Forward-Port-Of: odoo/odoo#246803
This update resolves a bug where the timer stopped appearing for survey participants after submitting their answers in live sessions. The fix ensures the timer correctly displays for the intended duration, regardless of whether the participant is in a live session, improving the survey experience. This change was made to ensure consistent functionality across all survey types.
Original PR description
Description of the issue/feature this PR addresses: Fixes timer not showing to participants of a live session after submitting an answer. Current behavior before PR: Steps to reproduce: Create a…
Description of the issue/feature this PR addresses: Fixes timer not showing to participants of a live session after submitting an answer. Current behavior before PR: Steps to reproduce: Create a Survey with two questions of any type. Set some Question Time Limit on both. Create Live Session for that Survey. Access Live Session as a participant. Start Survey as the host. The first question appears to the participant, with the timer on the top right. Answer the question as the participant and click Submit or press Enter. On the host side move to the next question. Bug: timer for the second question does not appear to the participant. Desired behavior after PR is merged: Fix: The logic to hide the timer is on `survey_form.js`. In the `_nextScreen` function. Specifically, when `options.isFinish` is set to `true`. It is set to `true` in the `_onSubmit` function. This function triggers when the participant submits an answer. The fix: only set that flag to `true` if there isn't a session in progress. This aligns with the other calls to `_nextScreen` for live sessions. That is, when a timer expires and the form is submitted: `'isFinish': !this.options.sessionInProgress` and when a notification is received for the session: `isFinish: nextPageEvent.type === 'end_session'` Meaning that for live sessions the only time `isFinish` should be set to `true`, is when the `end_session` notification is received. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246789 Forward-Port-Of: odoo/odoo#241086
This update resolves an issue preventing website designers with 'Editor and Designer' access from optimizing the SEO settings for product categories. The fix grants necessary write permissions to category records, allowing designers to implement SEO best practices directly within the website. This improves the functionality for our website design team.
Original PR description
### Issue: Due to this issue, website designer cannot optimize seo on category. #### Steps to reproduce: 1- Create a `eCommerce Category`. 2- In demo user, set Sale access to `All Documents` and Website access to `Editor and Designer`. 3- Login with demo user and navigate to website. 4- In shop page, open category. 5- From site tab, click on `Optimize SEO`. You get access error. Expected: You should be able to optimize seo with `Editor and Designer` access. ### Cause: The user needs write access on record in order to optimize seo: https://github.com/odoo/odoo/blob/ec5da99ca3f52420e7d973c3cf07167bd4104ffa/addons/website/controllers/main.py#L831-L834 opw-5443854 Forward-Port-Of: odoo/odoo#246900 Forward-Port-Of: odoo/odoo#244724
This update resolves a UI error that prevented link previews from working correctly when creating buttons within Odoo's email templates. The fix ensures that link previews function consistently across both the standard website view and template editor, improving the user experience for creating marketing content.
Original PR description
**Steps to reproduce:** - Install `mass_mailing` and `website_sale`. - Go to Email Marketing > Create new record. - In the template editor, insert a /button. - Set the URL to `/shop` and select it…
**Steps to reproduce:** - Install `mass_mailing` and `website_sale`. - Go to Email Marketing > Create new record. - In the template editor, insert a /button. - Set the URL to `/shop` and select it from the app URLs. - Click on Apply, then click on the newly created button. **Issue:** - Clicking on the button raises a UI error: `This URL is invalid. Preview couldn't be updated.` **Root cause:** - In [1], `this.props.document.url` is used. - This works in the website editor, but in template view `this.props.document` points to the iframe document, not the document. **Solution:** - Replace `this.props.document.url` with `document.URL`. - This ensures the preview works correctly in both website and template views. [1]https://github.com/odoo/odoo/blob/12d63b536dddc40428fb5edb6f6b3302605dc72d/addons/html_editor/static/src/main/link/link_popover.js#L506-L507 **Before:** <img width="381" height="123" alt="image" src="https://github.com/user-attachments/assets/1370b04d-8bc6-40b9-b7b0-77413a36bd51" /> **After:** <img width="419" height="119" alt="image" src="https://github.com/user-attachments/assets/d5d47a47-1805-4b1f-b852-88ea725beaba" /> opw-5428680 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#240836
This update resolves an issue where website previews with hover-triggered animations experienced a noticeable delay. The fix eliminates this delay and ensures previews revert instantly as the user types, preventing data loss. This improves the overall user experience and responsiveness of the website builder.
Original PR description
With commit aa3a2a694930d077aab5ff55e72655cc453a64ff, the delay of one animation frame in the preview of `templatePreviewableWebsiteConfig` is not necessary anymore. This was the only preview with a delay that can be triggered by hovering a button (the others needs to open a dropdown or input in text field). With commit be032732d1f5d1f7b28da3fa7bf19bffbef4a46d, previews are reverted as soon as the user starts typing, to avoid loosing the typed text when the preview is reverted. But this does not handle completely previews that are async: they may revert just after the first character is typed, and thus loose that character. This commit eliminates async preview that can be triggered while keeping focus in the editor. task-5493193 Forward-Port-Of: odoo/odoo#243727
This update resolves an issue where public users couldn't access their carts after a sale order's expiration date. The fix corrects a location within the code where the expiration status was incorrectly checked, preventing users from viewing or modifying their carts when the order was no longer valid. This ensures a smoother customer experience for sales transactions.
Original PR description
### Issue: Due to this issue public and portal users cannot access their carts once the so is expired. #### Steps to reproduce: 1- Using a public user, add a product to cart. 2- Using the admin user, go to the sale order created for the cart. 3- Change the date to an earlier date. 4- Back to public user, try to access the cart. You will see the error message: `The sale order has expired.` ### Cause: This regression is due to #245772. `_get_payment_values` is not the right place to check if the so is expired, as it is also used inside `_get_express_shop_payment_values`. opw-5903033 Forward-Port-Of: odoo/odoo#246962
This update resolves an issue where customers using self-service invoicing with Peppol received duplicate invoices repeatedly. The root cause was a technical glitch in how Odoo handles invoice creation with EDI API calls, leading to rollback and subsequent redundant sending. This fix ensures invoices are sent only once, improving efficiency and accuracy for Peppol customers.
Original PR description
Steps to reproduce: - Set up a test company with Peppol enabled - Create a Peppol customer and ensure they can receive invoices - In the POS settings, enable the “Self-service invoicing” option - Create a POS order linked to the Peppol customer - Log in as this customer - Enter the POS order information to access the invoice download view (from /pos/ticket) - Repeatedly click the “Request invoice” button - On the Peppol side, you will notice that the same invoice is sent as many times as the button is clicked Why ? This error is not really Peppol related, it can actually happen with all EDI making API call: the transaction is rolled-back when Odoo tries to create multiple invoices with a serialization error but the API call happened so, in this cas, the invoice is sent over Peppol. opw-5469467 Forward-Port-Of: odoo/odoo#246731
This update ensures that documents are correctly accessed when users click links to them, regardless of the initial view (like a systray notification or a discussion thread). Previously, the system wasn't consistently opening the document's form view, leading to a frustrating user experience. This fix resolves these inconsistencies and provides a smoother access flow.
Original PR description
Users do not want to access the form view of the document by default. This PR solves three cases for accessing documents.document records that were not covered before: * From the basic path pattern `odoo/x/documents.document/<id>` * From a systray notification "Open Form View" * when we are not yet in Documents * when we already are in Documents * From the Discuss app, on the record's thread Tests for most of these are included. Additionally, make sure the document is selected on accessing from `_get_access_action`. Task-5386466 Forward-Port-Of: odoo/enterprise#106009 Forward-Port-Of: odoo/enterprise#104622
This update resolves a test failure related to a date selection field in the EC accounting module. The test was failing because the date range was restricted, and 2021 was no longer a valid option. A simple change to the wizard's selection process ensures the test uses the correct 'frozen selection' data, addressing a potential future issue with long-running servers.
Original PR description
The selection field of the dividend_fiscal_year has a restricted range based on dates, which has implication for the frozen dates in the test. That is why the test will fail today: 2021 is not anymore in the selection. But, suppose however that you have a server running for 3 years, it could be problematic as well. (quite theoretical however) So we can simply make the selection field selection in the wizard a lambda method and that way also in the test, it will take the 'frozen selection'. build error 237681 https://runbot.odoo.com/odoo/runbot.build.error/237681 Forward-Port-Of: odoo/enterprise#106132
This update resolves a technical error that prevented printing from IoT printers within the Point of Sale system. The fix addresses an 'undefined' error, ensuring reliable printing functionality for users. This improvement enhances the overall reliability of the Odoo Enterprise system.
Original PR description
This PR fixed "error: undefined" when printing via websocket with iot printers in point of sale task-5496890
This update removes outdated comments and notes from the sale_renting module, stemming from a previous exploration of a feature change. This improves the clarity and organization of the codebase, ensuring it remains focused on its core functionality. The change is a routine maintenance task.
Original PR description
During the development of #102625, the idea of splitting the conversion date from the order date was explored. However, it was quickly dismissed, and some outdated comments slipped through.
This update fixes a bug that occurred when users copied and then undid copying planning slots. The issue was triggered when a previously deleted slot was involved in the undo process, resulting in an error message. The fix ensures the system verifies a record exists before attempting to delete it, preventing the error.
Original PR description
### Steps to reproduce: - Install Planning - Navigate to the gantt view for planning slots - Copy previous week's slots - Delete one of the newly copied records - Undo the copying action - Notice an Error is raised that a record doesn't exist ### Cause: When undoing the copy process we unlink all the newly created records but if the user has already deleted one of them it will trigger an error that this record doesn't exist and it has already been deleted ### Fix: We check the existence of the records before deleting them. opw-5490327 Forward-Port-Of: odoo/enterprise#105530
This update fixes an issue where the 'Next Booking Start' field for rooms was displaying incorrectly when a room had future bookings. The change removes a filtering rule that prevented the system from calculating the next available start time for occupied rooms, ensuring accurate booking information is displayed.
Original PR description
Steps to reproduce:
1. Install `room`
2. Create a room.
3. Create a booking for the current time (so the room becomes occupied).
4. Create another booking for tomorrow.
5. Open the list view of rooms.
Current Behavior:
- The `Next Booking Start` field is empty for the created room, despite Having future bookings.
Cause:
- The method `_compute_next_booking_start` filters the rooms using `self.filtered('is_available')`. Since the room is currently occupied (due to the active booking), the room is excluded from the query entirely.
Solution:
- Remove the `is_available` filter from the search domain. The next booking start time is now calculated for all rooms, regardless of whether they are currently available or occupied.
opw-5360101
Forward-Port-Of: odoo/enterprise#102129This update resolves a problem preventing the l10n_be_hr_payroll_fleet module from installing correctly when automatic dependencies aren't enabled. The fix ensures the necessary 'hr_fleet' module is installed, preventing a data error during demo data creation. This ensures the module functions as intended.
Original PR description
Steps to reproduce: 1. Install l10n_be_hr_payroll_fleet with --skip-auto-install and demo data. 2. Traceback when creating demo data because driver_employee_id is missing on the model fleet.vehicle Cause: The module depends on fleet instead of hr_fleet so hr_fleet is only auto installed. Thus, when skipping auto install, the field driver_employee_id doesn't exist. Fix: Change the dependency from fleet to hr_fleet to force the module to be installed. Runbot error: https://runbot.odoo.com/odoo/runbot.build.error/237909 Task: 5875410 Forward-Port-Of: odoo/enterprise#106199
This update resolves an issue where sending a voice message without text would cause the WhatsApp integration to fail. The fix ensures that the system correctly handles empty voice messages, preventing errors and allowing users to send voice messages without additional steps. This improves the reliability of the WhatsApp channel within the Odoo platform.
Original PR description
Sending a voice message without any text can trigger a WhatsApp API error because the empty HTML body is incorrectly treated as a valid text message. ### Reproduction Steps 1. Open the Discuss app.…
Sending a voice message without any text can trigger a WhatsApp API error because the empty HTML body is incorrectly treated as a valid text message. ### Reproduction Steps 1. Open the Discuss app. 2. Select a WhatsApp channel. 3. Record and send a voice message without typing any text in the composer. 4. Observe the message status. Result: The status changes from "Sent" to "Failed" with the error `(#100) The parameter text['body'] is required`. ### Cause The WhatsApp API does not support captions for audio files. Messages containing both audio and text are split into two separate WhatsApp messages: one for the audio file and one for the text body. Whether the text message is created depends on whether the message body is considered non-empty. Since commit odoo/odoo@f4dcc83adf552466ba7b05f09a4c651fe69f18ff , the composer’s default content is an empty HTML element. Although visually empty, this HTML is still a non-empty string at the data level. As a result, the system incorrectly determines that a text message is required and creates a secondary `whatsapp.message` record. When processed, the empty HTML is converted to a plain text string (`""`). Sending this as a text message fails validation because WhatsApp requires a non-empty body for text messages. ### Fix 1. Update `DiscussChannel.message_post()` to use `tools.is_html_empty(body)` to detect semantically empty HTML. This prevents creating a separate text message for audio attachments when the composer content is effectively empty. 2. Update `WhatsappMessage._send_message()` to check the truthiness of the converted plaintext `body` rather than the raw HTML field before adding a caption. This prevents sending an empty `caption` parameter for attachments when the body is empty. opw-5266805 Forward-Port-Of: odoo/enterprise#103213
This update simplifies the subscription plan view by removing irrelevant order line details like sections and discounts. The change focuses only on subscription products, making it easier for users to configure and understand their subscription plans. This improves usability and reduces visual clutter.
Original PR description
The subscription plan view was displaying all order line types, including sections, notes, and discount lines, which added unnecessary clutter. This update filters the order lines to display only actual subscription products, improving clarity and usability in the plan configuration. task-5404614 Forward-Port-Of: odoo/enterprise#106076 Forward-Port-Of: odoo/enterprise#101796
This update fixes a translation issue where warnings on Swiss payroll slips didn't correctly display translated field names. The fix ensures that all missing information fields are translated into French (CH) for improved clarity and compliance. This improves the user experience for French-speaking Swiss users.
Original PR description
The warnings that appear on a payslip when the employee's form misses information are not fully translated Steps to reproduce: 1. Install module l10n_ch_hr_payroll 2. Switch to "My Swiss Company" and change language to French (CH) 3. Open app "Paie" and create a new employee (only add a name) 4. Click on "Contrats" in the stat button and create a new contract for the employee (only add a name), save it and set it as "En cours" in the status bar 5. Go to "Fiches de paie" > "Toutes les fiches de paie" and create a new payslip 6. Add the newly created employee to the payslip 7. The warnings in the form displaying the missing fields from the employee form do not translate the name of the missing fields Solution: Use `get_description` to get the translated name of the missing fields opw-5403634 Forward-Port-Of: odoo/enterprise#106188 Forward-Port-Of: odoo/enterprise#104499
A recent issue preventing the sign tour from working correctly has been resolved. The fix ensures the tour opens the document in the correct signing view, restoring successful test results and improving the document signing experience. This resolves a bug that was impacting UI tests.
Original PR description
The sign_tour was failing because the `.o_sign_sign_directly` button was not found in the document view, causing the tour step to timeout and breaking both sign UI tests. This was due to the tour not properly opening the document in the signing view. The tour now relies on a stable selector, restoring successful execution of `test_sign_tour` and `test_sign_tour_without_sign`. Runbot issue: https://runbot.odoo.com/odoo/runbot.build.error/234923 Forward-Port-Of: odoo/enterprise#105844
This update corrects a temporary issue with the automatic download of Swiss tax rates. Recent changes by the Federal Tax Administration required adjustments to the URLs used for importing these rates, ensuring the payroll system continues to function correctly. This ensures accurate payroll calculations for our Swiss clients.
Original PR description
Due to recent updates on the Federal Tax Administration website, the single-canton import feature was made temporarly unavailable, this PR adjusts the new URLs for downloading the tax rates Forward-Port-Of: odoo/enterprise#106288
This update corrects a bug where canceled refunds were incorrectly included in global invoices generated from Point of Sale (PoS) orders. The fix filters out canceled refund lines during invoice generation, ensuring accurate reporting. This improves invoice accuracy and data integrity for Mexican VAT reporting.
Original PR description
When generating global invoices for orders in the PoS, refund of those orders are also included in the global invoice. However, if the refund has been canceled, it should not be included in the global invoice. Steps to reproduce: ------------------- * Create a PoS order and validate it. * Go to the backend and create a refund for that order. * Cancel the refund. * Go to the PoS order list and select the original order * Click on "Generate Global Invoice" > Observation: The canceled refund is included in the global invoice. Why the fix: ------------ We simply filter out the canceled orders when searching for refunded order lines. opw-5492576 Forward-Port-Of: odoo/enterprise#105959 Forward-Port-Of: odoo/enterprise#105868
This update corrects a technical issue with the XML code used for invoices and withhold documents in the Odoo Enterprise accounting module. The fix removes an extra closing tag, ensuring the system generates properly formatted invoices and avoids potential errors. This ensures accurate financial reporting.
Original PR description
Currently, the `account_move_form_invoice_and_withhold_view` contains an invalid closing group tag (`</group>>`) introduced by PR [1], at [2]. The extra `>` results in malformed XML. This commit removes the stray character and restores a properly closed `</group>` tag. [1]: https://github.com/odoo/enterprise/pull/77592 [2]: https://github.com/odoo/enterprise/blob/7c574d758ff5b1404b808cc647d4a2ae40f5f0c0/l10n_ec_edi/views/account_move_views.xml#L79 **No task Id** Forward-Port-Of: odoo/enterprise#106104
This update fixes a potential issue where old, unused account synchronization links could cause problems, preventing new connections. By focusing on fresh, uninitialized links, the system now reliably establishes and maintains account synchronization. This ensures smoother data flow and avoids disruptions for users.
Original PR description
Prevent reusing stale account.online.link records that have a provider_type set, which can leave an unusable row and block new connections. By adjusting the search domain in action_new_synchronization, we only reuse clean, uninitialized links. opw-5868438 opw-5867799 Forward-Port-Of: odoo/enterprise#106259 Forward-Port-Of: odoo/enterprise#105187
This update resolves a test failure within the Enterprise module's web_studio functionality. The change prevents unintended modifications to a key configuration setting, ensuring consistent test results and preventing disruptions during the full system deployment process. This improves the reliability of our automated testing.
Original PR description
Updating the fieldsets of `DEFAULT_FIELDS_TO_EXECUTE` in place changes the behaviour of `test_23_export_hardcoded_models_and_fields` if that test runs after `_compute_excluded_fields` has been executed for one reason or an other, which apparently does not occur during post_install but *does* occur during at_install, and so fails in the "full" enterprise test running everything in a single job. https://runbot.odoo.com/odoo/error/238451 https://runbot.odoo.com/odoo/error/238449 https://runbot.odoo.com/odoo/error/238497 Forward-Port-Of: odoo/enterprise#106110
10 changes
Resolved issues and error corrections
This update resolves a test failure related to a date selection field in the EC accounting module. The test was failing because the date range was restricted, and 2021 was no longer a valid option. A simple change to the selection method ensures the test uses the correct 'frozen selection', addressing a potential future issue with long-running servers.
Original PR description
The selection field of the dividend_fiscal_year has a restricted range based on dates, which has implication for the frozen dates in the test. That is why the test will fail today: 2021 is not anymore in the selection. But, suppose however that you have a server running for 3 years, it could be problematic as well. (quite theoretical however) So we can simply make the selection field selection in the wizard a lambda method and that way also in the test, it will take the 'frozen selection'. build error 237681 https://runbot.odoo.com/odoo/runbot.build.error/237681 Forward-Port-Of: odoo/enterprise#106132
This update corrects a bug where canceled refunds were incorrectly included in global invoices generated from Point of Sale (PoS) orders. The fix filters out canceled refund lines during invoice generation, ensuring accurate invoice totals. This improves the reliability of financial reporting for Mexican businesses using the PoS system.
Original PR description
When generating global invoices for orders in the PoS, refund of those orders are also included in the global invoice. However, if the refund has been canceled, it should not be included in the global invoice. Steps to reproduce: ------------------- * Create a PoS order and validate it. * Go to the backend and create a refund for that order. * Cancel the refund. * Go to the PoS order list and select the original order * Click on "Generate Global Invoice" > Observation: The canceled refund is included in the global invoice. Why the fix: ------------ We simply filter out the canceled orders when searching for refunded order lines. opw-5492576 Forward-Port-Of: odoo/enterprise#105959 Forward-Port-Of: odoo/enterprise#105868
This update fixes a bug that occurred when users copied and then undid slot duplication in the Planning module. The issue was triggered when a previously deleted record was involved in the undo process, resulting in an error message. Now, the system verifies record existence before deletion, ensuring a smoother user experience.
Original PR description
### Steps to reproduce: - Install Planning - Navigate to the gantt view for planning slots - Copy previous week's slots - Delete one of the newly copied records - Undo the copying action - Notice an Error is raised that a record doesn't exist ### Cause: When undoing the copy process we unlink all the newly created records but if the user has already deleted one of them it will trigger an error that this record doesn't exist and it has already been deleted ### Fix: We check the existence of the records before deleting them. opw-5490327 Forward-Port-Of: odoo/enterprise#105530
This update fixes a display issue where the 'Next Booking Start' time was not showing for rooms with upcoming bookings. The change removes a filter that prevented the system from correctly calculating the next available time, ensuring users always see accurate booking information. This improves the usability of the room scheduling feature.
Original PR description
Steps to reproduce:
1. Install `room`
2. Create a room.
3. Create a booking for the current time (so the room becomes occupied).
4. Create another booking for tomorrow.
5. Open the list view of rooms.
Current Behavior:
- The `Next Booking Start` field is empty for the created room, despite Having future bookings.
Cause:
- The method `_compute_next_booking_start` filters the rooms using `self.filtered('is_available')`. Since the room is currently occupied (due to the active booking), the room is excluded from the query entirely.
Solution:
- Remove the `is_available` filter from the search domain. The next booking start time is now calculated for all rooms, regardless of whether they are currently available or occupied.
opw-5360101
Forward-Port-Of: odoo/enterprise#102129This update resolves a problem that prevented the l10n_be_hr_payroll_fleet module from installing correctly when automatic module installation was skipped. The fix ensures the necessary dependencies are met, preventing errors during demo data creation and improving the module's stability.
Original PR description
Steps to reproduce: 1. Install l10n_be_hr_payroll_fleet with --skip-auto-install and demo data. 2. Traceback when creating demo data because driver_employee_id is missing on the model fleet.vehicle Cause: The module depends on fleet instead of hr_fleet so hr_fleet is only auto installed. Thus, when skipping auto install, the field driver_employee_id doesn't exist. Fix: Change the dependency from fleet to hr_fleet to force the module to be installed. Runbot error: https://runbot.odoo.com/odoo/runbot.build.error/237909 Task: 5875410 Forward-Port-Of: odoo/enterprise#106199
This update ensures that product prices within Odoo Enterprise are stored with a minimum level of precision. This change addresses a technical issue identified in previous testing and improves data accuracy for product costing and reporting. It primarily impacts the core accounting functionality.
Original PR description
Fix tests, related to https://github.com/odoo/odoo/pull/243987 task-4895014 Forward-Port-Of: odoo/enterprise#106073 Forward-Port-Of: odoo/enterprise#104728
This update corrects the Odoo Enterprise system to reflect recent changes on the Swiss Federal Tax Administration website. The import of tax rates for payroll has been adjusted to use the new URLs provided by the FTA, ensuring accurate tax calculations for Swiss businesses.
Original PR description
Due to recent updates on the Federal Tax Administration website, the single-canton import feature was made temporarly unavailable, this PR adjusts the new URLs for downloading the tax rates Forward-Port-Of: odoo/enterprise#106288
This update corrects a minor error in the XML code for the invoice and withhold views, specifically an extra closing tag. This ensures the system generates properly formatted invoices, preventing potential issues with reporting and accounting. The fix improves the stability and accuracy of the EC tax reporting functionality.
Original PR description
Currently, the `account_move_form_invoice_and_withhold_view` contains an invalid closing group tag (`</group>>`) introduced by PR [1], at [2]. The extra `>` results in malformed XML. This commit removes the stray character and restores a properly closed `</group>` tag. [1]: https://github.com/odoo/enterprise/pull/77592 [2]: https://github.com/odoo/enterprise/blob/7c574d758ff5b1404b808cc647d4a2ae40f5f0c0/l10n_ec_edi/views/account_move_views.xml#L79 **No task Id** Forward-Port-Of: odoo/enterprise#106104
This update resolves a test failure within the Enterprise module's web_studio functionality. The change prevents unintended behavior when updating configuration settings, ensuring consistent test results and stability during installation.
Original PR description
Updating the fieldsets of `DEFAULT_FIELDS_TO_EXECUTE` in place changes the behaviour of `test_23_export_hardcoded_models_and_fields` if that test runs after `_compute_excluded_fields` has been executed for one reason or an other, which apparently does not occur during post_install but *does* occur during at_install, and so fails in the "full" enterprise test running everything in a single job. https://runbot.odoo.com/odoo/error/238451 https://runbot.odoo.com/odoo/error/238449 https://runbot.odoo.com/odoo/error/238497 Forward-Port-Of: odoo/enterprise#106110
This update fixes an error in how secondary contract payrolls are calculated for Kenyan companies. The issue stemmed from an undefined variable, which has now been corrected to use the total taxable gross amount. This ensures accurate payroll processing for employees on secondary contracts.
Original PR description
Steps to reproduce: With a Kenyan company, create an employee. Check the "Secondary Contract" on the employee form view. Create a payslip and compute. There is an error in the payslip computation. Cause: There is an undefined variable "remaining_gross". Fix: Replace it by the total taxable gross. Task: 5462310 Forward-Port-Of: odoo/enterprise#103229
5 changes
Resolved issues and error corrections
This update fixes an issue where the Point of Sale tour experience wouldn't reliably work with infinite scrolling. By searching for the customer before a click, the system now handles this feature correctly, ensuring a smoother and more consistent user experience. This change also includes updates to related tests.
Original PR description
Make clickPartner search for the partner first to handle infinite scroll. Fixes: - test_preset_customer_selection - test_not_create_loyalty_card_expired_program - test_not_create_loyalty_card_max_usage_programm task-id: 5897380 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where the background color of nested columns within tabs was being incorrectly overridden. The fix ensures that tab styling applies correctly to all columns, regardless of their structure, improving the visual consistency of the user interface. This change enhances the overall user experience.
Original PR description
Steps to reproduce: =================== 1- Drop the block tab snippet 2- Inside one of the tab panes, drop a Columns snippet. 3- Select background_color for one of the columns 4- Change tab style to…
Steps to reproduce: =================== 1- Drop the block tab snippet 2- Inside one of the tab panes, drop a Columns snippet. 3- Select background_color for one of the columns 4- Change tab style to tab -> The background color of the inner column is overridden. Cause: ====== When the "Tabs" snippet style is set, a `.card` class is added to its container (See [1]) A generic CSS rule, intended to style these tabs, was targeting any `.card` element with a `.card-body` child. (See [2]) However, the Columns snippet also uses a `.card > .card-body` structure (distinguished by a `data-vxml` attribute). This caused the overly broad tab-styling rule to incorrectly cascade and override the background color of the nested column. Solution ======== The SCSS selector has been made more specific so that works if `card-body` class doesn't have any parent class with class `card` and has attribute `data-vxml` [1]: https://github.com/odoo/odoo/blob/4cb3ffc09507fdfdb1aeabb70b2c93105f992700/addons/website/static/src/snippets/s_tabs/options.js#L149 [2]: https://github.com/odoo/odoo/blob/4cb3ffc09507fdfdb1aeabb70b2c93105f992700/addons/web/static/src/scss/bootstrap_review_frontend.scss#L55 opw-5394480 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#241118
This update fixes a visual inconsistency in video link previews. Previously, thumbnails for YouTube videos left blank spaces, leading to a broken layout. Now, thumbnails consistently fill the container, ensuring a uniform and professional appearance for all video previews.
Original PR description
**Purpose of this PR:** Before this commit, video thumbnails from youtube left blank spaces in the container, creating inconsistent layouts across different video links. After this commit, thumbnails consistently fill the entire container, ensuring uniform appearance for all video link previews. **Before/After:** <img width="533" height="407" alt="image" src="https://github.com/user-attachments/assets/ce2ba872-27b7-4be5-9d85-fbbe6f272e14" /> <img width="481" height="386" alt="image" src="https://github.com/user-attachments/assets/523f5d16-2983-49c1-9dcc-01adb4284e56" /> task-5424534 Forward-Port-Of: odoo/odoo#244176
This update resolves a bug where discarding a combo product in the Point of Sale (POS) system incorrectly created empty order lines with a zero price. The fix ensures that the system accurately handles product discards, preventing this issue and improving the POS user experience. This ensures accurate order processing.
Original PR description
When discarding a combo product in the POS, it was creating an empty orderline with the product with a price of 0.0$. How to reproduce ? 1. Open a POS 2. Click on a combo product 3. Press ESC or press the cross icon 4. It creates an order line with the parent combo with a quantity of 0 and a price of 0.0 Fix : It’s because the popup payload returns undefined when the user discards it, but the condition was checking for false instead of undefined. task: 5868094 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where customers receiving invoices through Peppol were receiving multiple copies of the same invoice. The root cause was a technical glitch in how Odoo handles invoice creation with EDI API calls, leading to repeated sending. This fix ensures invoices are sent only once, improving efficiency and accuracy for Peppol customers.
Original PR description
Steps to reproduce: - Set up a test company with Peppol enabled - Create a Peppol customer and ensure they can receive invoices - In the POS settings, enable the “Self-service invoicing” option - Create a POS order linked to the Peppol customer - Log in as this customer - Enter the POS order information to access the invoice download view (from /pos/ticket) - Repeatedly click the “Request invoice” button - On the Peppol side, you will notice that the same invoice is sent as many times as the button is clicked Why ? This error is not really Peppol related, it can actually happen with all EDI making API call: the transaction is rolled-back when Odoo tries to create multiple invoices with a serialization error but the API call happened so, in this cas, the invoice is sent over Peppol. opw-5469467 Forward-Port-Of: odoo/odoo#246731
5 changes
Resolved issues and error corrections
This update fixes a bug that occurred when users copied and then undid copying planning slots. The issue arose because the system incorrectly reported a record as missing after a deletion. The fix ensures the system verifies record existence before attempting to delete, preventing the error and improving stability.
Original PR description
### Steps to reproduce: - Install Planning - Navigate to the gantt view for planning slots - Copy previous week's slots - Delete one of the newly copied records - Undo the copying action - Notice an Error is raised that a record doesn't exist ### Cause: When undoing the copy process we unlink all the newly created records but if the user has already deleted one of them it will trigger an error that this record doesn't exist and it has already been deleted ### Fix: We check the existence of the records before deleting them. opw-5490327 Forward-Port-Of: odoo/enterprise#105530
This update resolves an issue where subscriptions with zero-quantity lines resulted in invoices being incorrectly set to the subscription's start date. The fix ensures that invoice dates are accurately calculated, even when subscriptions include both positive and negative quantities, preventing delayed invoicing.
Original PR description
### Issue: When creating a subscription with several lines whose quantities add up to zero, the next invoice date is not updated and set to the start date. ### Steps to reproduce: - Install…
### Issue: When creating a subscription with several lines whose quantities add up to zero, the next invoice date is not updated and set to the start date. ### Steps to reproduce: - Install 'sale_subscription' - Create a new Subscription with two lines and a tart data several months in the past - One with a quantity of 1 and a higher price - The other with a quantity of -1 - It can be the same service product with invoicing based on ordered quantity - Confirm the Subscription - Click "Create Invoice" and confirm the invoice - Back to the Subscription, the next invoice date was not updated. ### Cause: In `_get_max_invoiced_date()` to compute the invoiced periods we check the quantity corresponding to this period. But if an invoice has two lines with opposite quantities, they will cancel each other out at this line: https://github.com/odoo/enterprise/blob/c2ac44f492ec53083864f07ff5bfbff9458ddf2a/sale_subscription/models/account_move_line.py#L131 So the method will return not return the date in `invoice_dates`. Later, if `_get_max_invoiced_date()` returns nothing for `last_invoice_end_date` then `next_invoice_date` is set to `start_date`: https://github.com/odoo/enterprise/blob/c2ac44f492ec53083864f07ff5bfbff9458ddf2a/sale_subscription/models/account_move.py#L66-L67 ### Solution: The goal was to not include invoices that were fully refunded for the `last_invoice_end_date`. This is why `_get_max_invoiced_date()` substract the quantities from refunds. To make this work we can take the absolute value of the quantity returned by the compute method before giving it the wanted sign based on if it's an invoice or a refund. opw-5360930 Forward-Port-Of: odoo/enterprise#103705
This update fixes an issue where the 'Next Booking Start' field for rooms was incorrectly empty when bookings existed. The change removes a filter that excluded occupied rooms from availability calculations, ensuring the field accurately reflects upcoming booking times. This improves the user experience when viewing room availability.
Original PR description
Steps to reproduce:
1. Install `room`
2. Create a room.
3. Create a booking for the current time (so the room becomes occupied).
4. Create another booking for tomorrow.
5. Open the list view of rooms.
Current Behavior:
- The `Next Booking Start` field is empty for the created room, despite Having future bookings.
Cause:
- The method `_compute_next_booking_start` filters the rooms using `self.filtered('is_available')`. Since the room is currently occupied (due to the active booking), the room is excluded from the query entirely.
Solution:
- Remove the `is_available` filter from the search domain. The next booking start time is now calculated for all rooms, regardless of whether they are currently available or occupied.
opw-5360101
Forward-Port-Of: odoo/enterprise#102129This update resolves rounding errors that were causing invoices to be rejected by the Mexican Electronic Domicile Identification (EDI) system. The fix involves changes to how discounts, taxes, and line items are calculated, particularly for combined invoices, ensuring accurate EDI compliance. Multiple related fixes were backported from version 18.3.
Original PR description
l10n_mx_edi* = l10n_mx_edi, l10n_mx_edi_pos, l10n_mx_edi_extended **STEP TO REPRODUCE** 1. Create a invoice with: - product price = 72.89 - discount = 10% - tax = 16% 2. Duplicate the invoice until…
l10n_mx_edi* = l10n_mx_edi, l10n_mx_edi_pos, l10n_mx_edi_extended
**STEP TO REPRODUCE**
1. Create a invoice with:
- product price = 72.89
- discount = 10%
- tax = 16%
2. Duplicate the invoice until you have 5 of them.
3. Create a global invoice with the 5 invoices, and send it.
4. The invoice will be refused by the EDI due to rounding issue.
This PR is a backport of multiples fixes done in 18.3 in which all rounding errors are fixed.
Each of them iterate upon the previous one, so they are all needed. The most important changes in thoses fixes are:
- for global invoices, deduce the discount on the base line instead of creating a 'descuento' (to avoid any problem with rounding when combining multiples invoices).
- changes in how the negative lines are dispatched.
- using raw values for 'conceptos' and 'impuestos' (5 digit precision) and changing how we compute things to solve rounding issue.
Tests files are modified accordingly, you can launch the tests with the external flag (need to be set in tests/common.py).
Backported PR (non-exhaustive):
https://github.com/odoo/enterprise/pull/92727
https://github.com/odoo/enterprise/pull/99395
https://github.com/odoo/enterprise/pull/90434
opw-5382423
Forward-Port-Of: odoo/enterprise#105615This update resolves an error in the calculation of secondary contract payslips for Kenyan companies. The fix replaces a missing variable with the total taxable gross, ensuring accurate payroll processing for employees on secondary contracts. This improves the reliability of payroll reporting for our Kenyan clients.
Original PR description
Steps to reproduce: With a Kenyan company, create an employee. Check the "Secondary Contract" on the employee form view. Create a payslip and compute. There is an error in the payslip computation. Cause: There is an undefined variable "remaining_gross". Fix: Replace it by the total taxable gross. Task: 5462310 Forward-Port-Of: odoo/enterprise#103229
16 changes
New functionality added to Odoo
This update adds support for Australian BAS (Business Activity Statement) tax returns within Odoo Enterprise. It includes new report templates and sets the most commonly used tax type as active by default, streamlining the process for Australian businesses to file their BAS returns. This ensures compliance with Australian tax regulations.
Original PR description
Add new BAS tax return types for Australia Task-5416381 CE master PR: https://github.com/odoo/odoo/pull/242733 Documentation PR: https://github.com/odoo/documentation/pull/15933
This update extends the EC Sales List and Intrastat reporting capabilities to support key European markets, including Austria, Germany, Italy, Poland, Portugal, and The Netherlands. It adds specific deadlines and reporting periods for these countries, aligning with local regulations and improving compliance for businesses operating within the EU.
Original PR description
Following the implementation of the Tax returns feature in 18.3 which was focused on the general implementation and Belgium, we want to add the specification for other country and in this case Austria, Germany, The Netherlands, Italy, Poland, and Portugal. Adding EC sales list, Intrastat specific deadlines and periodicities. task-4776236 Forward-Port-Of: odoo/enterprise#97615
Enhancements to existing features
This update optimizes how report data is stored, reducing memory usage and improving performance, particularly in the web client. By changing the format of column group options from a large string to a list of integers, the system now uses significantly less memory. This results in faster report generation and a smoother user experience.
Original PR description
Each cell of a report references its column group options. Before this commit, it was using `column_group_key`, which was a serialization of the column group options. You could get the column group options, using the `options['column_groups']` dict with this key. In the web client, this takes up a lot of memory. As it is a relatively big string, created for each cell. In the backend, there's no issue as they all are just references to the same objects as in the options. With this commit, in order to save memory, `options['column_groups']` is a list instead of a dict. `column_group_index` replaces `column_group_key`. Using this index on `options['column_groups']` gives the corresponding column group options. As it is a small int, it takes far less place in memory. task-5164369
This update standardizes the wording used for the Live Chat app across Odoo. This change improves the user experience by ensuring a consistent and professional brand image. It's part of a larger effort to streamline and refine key Odoo features.
Original PR description
This commit harmonizes the copywriting of the Live Chat app name. part of task-4461200 part of task-5867464
This update separates the mocked SIP.js library for demo mode, enabling better testing and future improvements. It allows for more robust unit tests and unlocks potential enhancements to the demo experience, paving the way for simulating various call scenarios.
Original PR description
This commit moves the mocked SIP.js library used in VoIP demo mode into a separate asset bundle. Benefits: - it makes the mocked SIP.js library usable in unit tests as well, and to even test the prod…
This commit moves the mocked SIP.js library used in VoIP demo mode into
a separate asset bundle.
Benefits:
- it makes the mocked SIP.js library usable in unit tests as well, and
to even test the prod mode by further extending the mocked features.
- it paves the way for future improvements in VoIP unit tests, by
allowing to have different mocked behaviors depending on the test
needs (e.g. simulating call drops, network issues, etc).
- it even allows the user agent to initialize even in demo mode,
unlocking potential future improvements of this mode.
Notable Changes:
- the bundle loading is now made inside the start of the voip service
instead of the user agent class, which makes more sense as it is the
voip service that knows in which mode it is running.
- the bundle "voip.assets_sip" is now split into three bundles:
- "voip.assets_sip_prod": contains the real SIP.js library
- "voip.assets_sip_demo": contains the mocked SIP.js library
- "voip.assets_sip_tests": contains the mocked SIP.js library plus
additional mocking for unit tests
Future improvements:
- the mocked SIP.js for unit tests is for now a bit naïve and should be
improved along with future VoIP unit tests developments.This update enhances the Odoo Enterprise softphone by adding tooltips to country flags displayed alongside phone numbers. This improves user recognition of the flagged countries, making the call process more intuitive and user-friendly. A new component was created to avoid code repetition and simplify future updates.
Original PR description
In voip.call form/list view, country flags are shown with phone numbers. In this commit, we add alt/tooltip to country flags for users to recognise them. Task-[5404442](https://www.odoo.com/odoo/5778/tasks/5404442)
This update simplifies the setup for desk phone calls by ensuring consistent labels, helpful instructions, and a unified user interface across different settings locations. The changes clarify how to configure calls from another device, improving usability and reducing potential confusion for users.
Original PR description
The `should_call_from_another_device` field is defined both on the user model and the discuss "user settings" model (accessible via Settings > Technical > Discuss > User Settings). This commit makes sure that: - Both fields have the same clear label (also keeping the fact it fits on one line in English). - Both fields have the same clear help text (before this commit, the help text did not appear where it was the most useful: in the user preference dialog). - The UI is the same for all 3 places (user form view, preference form view and discuss user settings form view): the label, the checkbox and then the input field for the phone number; all on the same line. Notice that the `external_device_number` related field was also simplified and the placeholder "No redirect" is replaced with "Phone number" which makes it clearer that once the checkbox is checked, a phone number has to be put over there. task-4947771
Resolved issues and error corrections
This update resolves a minor issue with the barcode app's tours related to scrap adjustments. The problem stemmed from a Chrome browser incompatibility with number input fields, leading to incorrect quantity updates. This fix ensures accurate scrap quantity entries, improving data consistency.
Original PR description
This commit fixes tours related to scrap refactor (odoo/odoo#210299) that included setting the quantity field in the scrap form in the barcode app. The issue was caused by <input type="number"> not supporting text selection in Chrome, which made the tour's edit() helper append instead of replace the value (e.g., "0.00" + "15" = "0.0015"). Fixed by using direct DOM value assignment, matching the existing workaround pattern for number inputs. Build Errors: https://runbot.odoo.com/odoo/runbot.build.error/238376 https://runbot.odoo.com/odoo/runbot.build.error/238374 https://runbot.odoo.com/odoo/runbot.build.error/238375
This update removes a redundant 'Follow-Up Report' line from PDF reports sent to customers. This line previously displayed the partner's total balance, which was confusing. Removing it simplifies the report and improves clarity for customers without impacting the report's core information.
Original PR description
When generating the followup report, compute and display the total in a single foreign currency if all invoices shown in the report share that same foreign currency. The total is suppressed (not displayed) if there is at least one invoice in a different currency (mixed currency scenario). task-4554514 --- When sending follow-up reports via the "Send" feature or payment reminders, the printed PDF includes a "Follow-Up Report" line. In this specific context, this line always equals the partner's total balance. This line is redundant and can be confusing for customers. Removing it clarifies the report without losing any necessary information.
This update resolves a test failure related to date restrictions in the dividend fiscal year selection field. The fix ensures the test environment uses the correct 'frozen' dates, preventing errors. While a long-running server scenario is theoretical, this change improves test reliability.
Original PR description
The selection field of the dividend_fiscal_year has a restricted range based on dates, which has implication for the frozen dates in the test. That is why the test will fail today: 2021 is not anymore in the selection. But, suppose however that you have a server running for 3 years, it could be problematic as well. (quite theoretical however) So we can simply make the selection field selection in the wizard a lambda method and that way also in the test, it will take the 'frozen selection'. build error 237681 https://runbot.odoo.com/odoo/runbot.build.error/237681 Forward-Port-Of: odoo/enterprise#106132
This update corrects a bug that prevented the system from correctly creating vendor partners when processing vendor bills in Uruguay. The issue stemmed from an incorrect state search when the 'Departamento' tag was missing from the XML data. This ensures accurate vendor partner creation and avoids disruptions in financial processes.
Original PR description
If the xml file has a tag "Departamento" without a value, the vendor partner creation fails because the state is searched with an empty string and detects a state that is not correct because the xml has no state value. Task Adhoc side: 109004 Forward-Port-Of: odoo/enterprise#105801
This update optimizes the project timesheet report to address performance issues caused by a previous change. By using a more efficient query structure with a CROSS LATERAL JOIN, the report now loads much faster, especially with large datasets. This improves the user experience and ensures the report remains responsive.
Original PR description
After this commit https://github.com/odoo-dev/enterprise/commit/6c33bde74342b634d9f6fbda4ef407ffe9bac54f we introduced a new left join which seems that it slowed down the query a lot. So the report…
After this commit https://github.com/odoo-dev/enterprise/commit/6c33bde74342b634d9f6fbda4ef407ffe9bac54f we introduced a new left join which seems that it slowed down the query a lot. So the report doesn't load at all if we have a lot of records. In this PR we are introducing CROSS LATERAL JOIN as we want to generate only the the relevant dates not all dates between the min starting date and max ending date of all slots. Query plan after modification https://explain.dalibo.com/plan/eh5293ba2354f43c The testing cardinality of the tables: `planning.slot` 7178 rows `hr.employee` 332 rows `resource.resource` 332 rows `resource_calendar_leaves` 4061 rows `account_analytic_line` 267376 rows `generate_series()` will produce 206417 rows | Before | After | |-----------------------------------------|-------| | Query keep being active with no results | ~2s | opw-5089052 Forward-Port-Of: odoo/enterprise#105696 Forward-Port-Of: odoo/enterprise#102283
This update fixes an issue where the 'Next Booking Start' field for rooms was incorrectly empty when bookings existed. The change removes a filter that excluded occupied rooms from availability calculations, ensuring the field accurately reflects upcoming booking times. This improves the user experience when viewing room availability.
Original PR description
Steps to reproduce:
1. Install `room`
2. Create a room.
3. Create a booking for the current time (so the room becomes occupied).
4. Create another booking for tomorrow.
5. Open the list view of rooms.
Current Behavior:
- The `Next Booking Start` field is empty for the created room, despite Having future bookings.
Cause:
- The method `_compute_next_booking_start` filters the rooms using `self.filtered('is_available')`. Since the room is currently occupied (due to the active booking), the room is excluded from the query entirely.
Solution:
- Remove the `is_available` filter from the search domain. The next booking start time is now calculated for all rooms, regardless of whether they are currently available or occupied.
opw-5360101
Forward-Port-Of: odoo/enterprise#102129This update resolves a technical issue preventing the demo data for the Switzerland - HR Payroll module from functioning correctly. A recent change removed a related database model, causing errors. The fix removes outdated references to this model within the demo data, ensuring the demo environment operates as intended.
Original PR description
**Steps to reproduce:** - Install the "Switzerland - HR Payroll" module with demo data. - You get a traceback **Issue:** A recently [merged PR](https://github.com/odoo/enterprise/pull/99418) removed `res.bank` model leaving demo data with references to this model invalid. **Solution:** Remove references to `res.bank` in demo data. Task: 5905983
This update fixes a bug that occurred when users copied and then undid copying planning slots. The issue was triggered when a previously deleted slot was involved in the undo process, resulting in an error. Now, the system verifies that records exist before attempting to delete them, ensuring a smoother user experience.
Original PR description
### Steps to reproduce: - Install Planning - Navigate to the gantt view for planning slots - Copy previous week's slots - Delete one of the newly copied records - Undo the copying action - Notice an Error is raised that a record doesn't exist ### Cause: When undoing the copy process we unlink all the newly created records but if the user has already deleted one of them it will trigger an error that this record doesn't exist and it has already been deleted ### Fix: We check the existence of the records before deleting them. opw-5490327 Forward-Port-Of: odoo/enterprise#105530
Features or functions removed from Odoo
This update removes the `device_controller` class, which was no longer needed. The team now directly utilizes the `iot_http` service, streamlining the integration. This change improves code efficiency and simplifies maintenance.
Original PR description
We remove the the `device_controller` class, now unused as we use the `iot_http` service directly. This commit removes the last usage of it in `iot_device_hook` and the last usage of `iot_device_hook` in `delivery_iot`. see odoo/upgrade#9383 task: 5885929
9 changes
Security fixes and vulnerability patches
This update resolves security issues related to copying spreadsheets and dashboards. It simplifies the process by removing unnecessary security checks, allowing users to copy documents without requiring excessive permissions. This enhances usability and reduces potential security risks.
Original PR description
In order to be able to copy a spreadsheet or a dashboard on which the user has access to, without requiring a bunch of extra security rights, this fix removes the need to - when copying a dashboard, the copy of the field 'main_data_model_ids' that is only used on standard dashboards, would require the read right on ir_model for no good reasons - when copying any spreadsheety document (spreadsheet, dashboard, etc.) the remove the field spreadsheet_revision_ids from the data sent by the client, so the field security won't be triggered on an empty field
New functionality added to Odoo
This update expands our tax reporting capabilities to include EC Sales Lists and Intrastat returns for key European markets – Austria, Germany, Italy, Poland, Portugal, and The Netherlands. This aligns with previous tax return implementations and ensures compliance with local regulations, simplifying reporting processes for our international customers.
Original PR description
Following the implementation of the Tax returns feature in 18.3 which was focused on the general implementation and Belgium, we want to add the specification for other country and in this case Austria, Germany, The Netherlands, Italy, Poland, and Portugal. Adding EC sales list, Intrastat specific deadlines and periodicities. task-4776236
This update adds missing templates for Equity and Government checks within the Odoo Enterprise accounting reports. This ensures accurate and comprehensive reporting, fulfilling a key requirement for financial compliance and providing complete data for analysis. It builds upon previous work to ensure data integrity.
Original PR description
Completes the work started in odoo/enterprise#88360. The Equity and Government check templates were missing and are added here to fully complete the data. task-5365677
Resolved issues and error corrections
This update ensures the accounting dashboard's data is compatible with the latest Odoo 18.5 version. The change addresses a technical issue where data formats were being incorrectly upgraded, and while partially implemented, requires further refinement for full functionality.
Original PR description
This commit upgrades the data for the accounting dashboard from the 18.4.x file format to 18.5.x The goal is to avoid having `ODOO.FILTER.VALUE` being upgraded to `ODOO.FILTER.VALUE.V18` because the dashboard was already adapted to work[*] with the new formula see 682d6ec1ddb825674999e0db1fc0cc48c3be67c5 *: it only half-works. It only works for simple values of filters (years, quarter, months), but it doesn't work properly with others (Last 7 days, etc.)
This update resolves a test failure related to a date restriction in the dividend fiscal year selection field. The fix ensures the test environment uses the correct, 'frozen' date range, preventing errors. While a long-running server scenario is considered theoretical, this change improves test reliability.
Original PR description
The selection field of the dividend_fiscal_year has a restricted range based on dates, which has implication for the frozen dates in the test. That is why the test will fail today: 2021 is not anymore in the selection. But, suppose however that you have a server running for 3 years, it could be problematic as well. (quite theoretical however) So we can simply make the selection field selection in the wizard a lambda method and that way also in the test, it will take the 'frozen selection'. build error 237681 https://runbot.odoo.com/odoo/runbot.build.error/237681 Forward-Port-Of: odoo/enterprise#106132
This update corrects a bug where canceled refunds were incorrectly included in global invoices generated from Point of Sale (PoS) orders. The fix filters out canceled refund lines during invoice generation, ensuring accurate invoice totals. This improves the reliability of financial reporting for Mexican VAT (EDI) transactions.
Original PR description
When generating global invoices for orders in the PoS, refund of those orders are also included in the global invoice. However, if the refund has been canceled, it should not be included in the global invoice. Steps to reproduce: ------------------- * Create a PoS order and validate it. * Go to the backend and create a refund for that order. * Cancel the refund. * Go to the PoS order list and select the original order * Click on "Generate Global Invoice" > Observation: The canceled refund is included in the global invoice. Why the fix: ------------ We simply filter out the canceled orders when searching for refunded order lines. opw-5492576 Forward-Port-Of: odoo/enterprise#105959 Forward-Port-Of: odoo/enterprise#105868
This update fixes a bug that occurred when users undid copying planning slots. Specifically, it prevented an error from appearing when a record had already been deleted. The fix ensures the system checks for record existence before attempting to delete, improving stability and usability of the Planning module.
Original PR description
### Steps to reproduce: - Install Planning - Navigate to the gantt view for planning slots - Copy previous week's slots - Delete one of the newly copied records - Undo the copying action - Notice an Error is raised that a record doesn't exist ### Cause: When undoing the copy process we unlink all the newly created records but if the user has already deleted one of them it will trigger an error that this record doesn't exist and it has already been deleted ### Fix: We check the existence of the records before deleting them. opw-5490327 Forward-Port-Of: odoo/enterprise#105530
This update simplifies the subscription plan view by removing irrelevant order line details like sections and discounts. The change focuses only on displaying the actual subscription products, making it easier for users to configure and understand their plans. This improves usability and reduces visual clutter.
Original PR description
The subscription plan view was displaying all order line types, including sections, notes, and discount lines, which added unnecessary clutter. This update filters the order lines to display only actual subscription products, improving clarity and usability in the plan configuration. task-5404614 Forward-Port-Of: odoo/enterprise#106076 Forward-Port-Of: odoo/enterprise#101796
This update fixes an issue where the 'Next Booking Start' field for rooms was displaying incorrectly when a room had existing bookings. The change removes a filtering step that prevented the system from accurately calculating the next available time, ensuring the field always reflects upcoming booking opportunities.
Original PR description
Steps to reproduce:
1. Install `room`
2. Create a room.
3. Create a booking for the current time (so the room becomes occupied).
4. Create another booking for tomorrow.
5. Open the list view of rooms.
Current Behavior:
- The `Next Booking Start` field is empty for the created room, despite Having future bookings.
Cause:
- The method `_compute_next_booking_start` filters the rooms using `self.filtered('is_available')`. Since the room is currently occupied (due to the active booking), the room is excluded from the query entirely.
Solution:
- Remove the `is_available` filter from the search domain. The next booking start time is now calculated for all rooms, regardless of whether they are currently available or occupied.
opw-5360101
Forward-Port-Of: odoo/enterprise#10212912 changes
Enhancements to existing features
This update enables IoT devices to connect to the Point of Sale system without requiring a secure HTTPS certificate. By using HTTP and a local address space, the system now supports IoT devices, improving their functionality and reliability. This change was implemented to align with recent Odoo updates.
Original PR description
Enterprise PR: https://github.com/odoo/enterprise/pull/106183 This is a backport of odoo/odoo#237147. Since odoo#235702, there is a `point_of_sale.use_lna` system parameter. When it is set, ePOS requests will use HTTP instead of HTTPS, and the `targetAddressSpace: "local"` option is used in the `fetch` request. This bypasses the need for a HTTPS certificate. This commit adds the same functionality to all IoT requests from the POS. This should allow the IoT box to function correctly without a HTTPS certificate. task-5353672 --- 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 corrects a bug where the overtime indicator displayed incorrect hours (40h) when employees worked across multiple companies. The fix ensures that the system correctly considers the employee's company affiliation when calculating overtime, resulting in accurate time tracking across all company setups. This improves the reliability of time reporting.
Original PR description
Steps to reproduce: ------------------------- 1. Install Timesheets and Time Off. 2. Create an employee and create a Time Off in the past week, then approve it. 3. Open All Timesheets for that…
Steps to reproduce: ------------------------- 1. Install Timesheets and Time Off. 2. Create an employee and create a Time Off in the past week, then approve it. 3. Open All Timesheets for that employee and observe the overtime indicator. 4. Enable a multi-company environment by creating another company. 5. Remove the `company_id` from the employee’s working schedule (40h/week). Issue: ---------- The overtime indicator shows an incorrect value. It displays 40h instead of the expected 32h. Cause: ---------- Since there is no company defined on the working schedule, `self.company_id.id` becomes False. The actual leave records are linked with the employee’s company, so the search results in an empty recordset. As a result, the employee leave is ignored. Solution: -------------- Take the resource company into account when building the domain, before falling back to the calendar company. opw-5499737 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This pull request addresses several key issues within the account_edi_ubl_cii module, primarily focusing on ensuring correct export of UBL invoice data according to PEPPOL standards. Specifically, it fixes inconsistencies in `DeliveryParty` node structure, adds support for intrastat commodity codes, and updates allowance charge reasons for improved accuracy and compliance with business expert group requirements.
Original PR description
#### [FIX] account_edi_ubl_cii: `DeliveryParty` export Follow-up to commit 0b3c12670e5f606a36e7d94982656ed998d67322 In the aforementioned commit we added the `DeliveryParty` node under the `Delivery`…
#### [FIX] account_edi_ubl_cii: `DeliveryParty` export
Follow-up to commit 0b3c12670e5f606a36e7d94982656ed998d67322
In the aforementioned commit we added the `DeliveryParty` node under
the `Delivery` tag.
But there are 2 remaining issues with it.
- In BIS 3.0 the `DeliveryParty` tag has only one child `PartyName` (which is mandatory)
https://docs.peppol.eu/poacc/billing/3.0/syntax/ubl-invoice/cac-Delivery/cac-DeliveryParty/
This was done for the version with the new helpers (`account_edi_ubl_cii.use_new_dict_to_xml_helpers`)
but not the version without the helpers.
- For UBL 2.0 the `DeliveryParty` tag was added for the version
without the new helpers but not the version with the helpers.
That is fixed in this commit.
#### [FIX] account_edi_ubl_cii: export intrastat commodity code
Currently we do not export the intrastat commodity code of products.
But a field for it is available after installing `account_intrastat`.
After this commit the intrastat code is exported in the tag
`cac:CommodityClassification/cbc:ItemClassificationCode[@listID="HS"]`.
#### [FIX] account_edi_ubl_cii: update AllowanceChargeReasonCode for EPD
Currently we are using the code `66` ("New outlet discount") as
`AllowanceChargeReasonCode` for early payment discounts.
After this commit we use `64` ("Special agreement") since it seems
more fitting / general.
#### [FIX] account_edi_ubl_cii: BEG test cases: minimal invoice
This commit adds a test corresponding to the test case "Testcase01" / "Minimal invoice"
from the business expert group.
https://efacture.belgium.be/fr/article/business-expert-group-ressources
#### [FIX] account_edi_ubl_cii: BEG test cases: multi-currency
This commit adds the following nodes to the BIS 3.0 XML in case
the document currency is different from the company currency.
- `cbc:TaxCurrencyCode`: gives the company currency (it is supposed to
be the currency in which the taxes for the invoice will be paid)
- A second `cac:TaxTotal` node that only contains a `cbc:TaxAmount` node
giving the total tax amount in company currency / the currency specified
by `cbc:TaxCurrencyCode`.
See here:
- https://docs.peppol.eu/poacc/billing/3.0/bis/#_vat_accounting_currency
Some local formats had this information already. The logic was removed
there. The affected modules were:
- `l10n_anz_ubl_pint`
- `l10n_jp_ubl_pint`
- `l10n_my_ubl_pint`
- `l10n_ro_edi`
See also here:
- https://docs.peppol.eu/poac/aunz/pint-aunz/bis/#_tax_in_accounting_currency
- https://docs.peppol.eu/poac/my/pint-my/bis/#_tax_in_accounting_currency
- https://docs.peppol.eu/poac/sg/2024-Q2/pint-sg/bis/#_invoice_totals_in_gst_accounting_currency
This is in line with the following test cases from the business
expert group. They were added as tests in this commit
(https://efacture.belgium.be/fr/article/business-expert-group-ressources)
- "Testcase 10": "Invoice in USD and EUR vat"
- "Testcase 11": "Invoice in USD and EUR vat and 2021"kkjkkj
#### [FIX] account_edi_ubl_cii: PaymentMeansCode from payment method
Currently the `PaymentMeans/PaymentMeansCode` node is filled
w/o considering the "Preferred Payment Method Line" (`preferred_payment_method_line_id`)
set on the move.
We choose
- for invoices: 30 ('credit transfer') or ZZZ ('mutually
defined') depending on whether a bank account is set.
- for bills: 57 ('standing agreement')
After this commit we use the Code of the Payment Method of the
"Preferred Payment Method Line" to determine the the PaymentMeansCode
We also add the following Payment Methods so that the user has more choices.
- Credit Card
- Debit Card
- Bankgiro
- Standing Agreement
- SEPA Credit Transfer
#### [FIX] account_edi_ubl_cii: BEG test cases: cash discount
Consier a paid invoice for which we granted an early payment discount.
in case the XML is generated after the invoice is paid (discounted amount)
we do not account for that fact in the XML generation.
The total amounts in the `cac:LegalMonetaryTotal` node are not adjusted
- The `cbc:TaxExclusiveAmount` and `cbc:TaxInclusiveAmount` and
`cbc:PrepaidAmount` should reflect the reduced amounts
- This is i.e. problmeatic for the `cbc:PrepaidAmount`. It would show
the total (unreduced) amount of the invoice; more than was actually paid.
In the XML for an unpaid invoice there are
The `cac:AllowanceCharge` node(s) representing the potential early payment discount and
`cac:AllowanceCharge` node(s) raising the total back to the unreduced amount.
In case the early payment discount was applied the latter node(s) can
/ should be removed.
This is in line with "Testcase06" from the business expert group.
(https://efacture.belgium.be/fr/article/business-expert-group-ressources)
The following examples were added as tests in this commit
- "Testcase05": "Cash Discount" (not paid yet)
- "Testcase06": "Discount with cash payment" (XML generated after paid
and epd applied)
#### [FIX] account_edi_ubl_cii: sale order discount as AllowanceCharge
Global discounts from sales orders are just displayed as invoice
lines on the inovice.
Currently they are treated the same as any other invoice lines for
the XML generation.
But they should be displayed as an `AllowanceCharge` instead.
After this commit that is the case.
The `AllowanceCharge` node has
- `AllowanceChargeReasonCode`: `95`
- `AllowanceChargeReason`: `Global discount`
To add a global discount follow theses steps
1. Ensure `sales` is installed
2. Go to Settings -> Sales -> Pricing section and enable "Discounts"
3. On a Quotation / Sale Order there should now be a "Discount"
right above the widget displaying the total amounts.
Click it.
4. Select "Global Discount" and a percentage.
5. A line using a special discount product is added.
6. Click "Create Invoice"
7. The same line is now on the invoice
#### references
task-4885680This update fixes a bug where the VAT (Tax ID) was not correctly displayed in document previews and generated invoices. The issue stemmed from a missing rendering logic in the document layout template. Now, VAT information is accurately reflected in all document layouts.
Original PR description
Steps to reproduce 1. Install `account`. 2. Go to Settings → Configure Document Layout. 3. Enter a value in the Tax ID field. 4. Generate a document (invoice / preview document). Issue Unlike other fields in the document layout, the `Tax ID` value is not updated and does not appear in the document preview. Cause The VAT (Tax ID) rendering logic was missing from the document layout template XML. Solution Add proper logic to display the Tax ID using the company VAT Before: <img width="1089" height="750" alt="image" src="https://github.com/user-attachments/assets/8d27808f-d605-447c-807a-d5f3450eef36" /> After: <img width="1080" height="722" alt="image" src="https://github.com/user-attachments/assets/0af04d77-a318-4e39-9a4b-0911f2446e60" /> opw-5373374
This update fixes an error in the Point of Sale session reports where discount amounts were calculated incorrectly. The fix ensures that discounts are accurately applied based on the correct fiscal position, leading to more reliable financial reporting. This improves the accuracy of sales data.
Original PR description
Steps: ---- - Create a fiscal position with 2 different taxes - Add a line in POS - Apply fiscal position and add line discount - Finish the order cycle - Download the session report Issue: ---- - The discount amount was calculated incorrectly in the session report Cause: ---- - The discount amount calculation used taxes before applying the fiscal position Fix: ---- - Used `tax_ids_after_fiscal_position` for tax calculation while computing the discount amount task-5421215 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a bug that occurred when generating invoices with multiple tax lines, specifically within the Belgian localization and Peppol integration. The issue stemmed from incorrect aggregation of tax amounts, leading to a division-by-zero error. The fix ensures accurate tax calculations during invoice creation.
Original PR description
Steps: - Belgian localisation - Activate peppol - Have two fixed sales taxes (T1 3.5 and T2 4.5) - Have 4 product: - P1: Any sale price, taxes 21% and T1 - P2: Any sale price, taxes 21% and T2 - P3: sale price 0, taxes 0% and T1 - Create an invoice, with following invoice lines: - P1, quantity 2 - P2, quantity 2 - P3, quantity -4 - Confirm and send it to peppol -> Traceback (ZeroDivisionError) The reason is that we try to extract emptying taxes like "Vidanges" and aggregate them into new base lines, but we treat all these taxes as they are the same but they are not always the same. Therefore we aggregate both price unit and quantity and we try to divide the aggregated price by the aggregated quantity. In our case we end up with a price unit of 2 (9 + 7 - 14) and a quantity of 0 (2 + 2 + -4) which leads to a zero division error. The fix adds a grouping function in order to group the extra lines by taxes before aggregating them. opw-5384928
This update fixes an issue where the description field in the calendar popover was not wrapping text correctly, leading to truncated or overflowing content. The team added the 'text-wrap' class to the calendar view, ensuring descriptions display properly and are fully visible. This enhances the user experience when viewing calendar events.
Original PR description
Changes done: - [x] `calendar`: Add `class="text-wrap"` in the description field of the calendar view to use it in the popover - [x] `web`: Define the appropriate class in the calendar popover field **Before** <img width="548" height="428" alt="antes" src="https://github.com/user-attachments/assets/77060ee6-30a1-47ed-8ba4-d5c2baa33fe3" /> **After** <img width="559" height="627" alt="despues" src="https://github.com/user-attachments/assets/cc9dfb47-3f98-4b5b-80c2-c3e5c15df0b0" /> @Tecnativa TT60670 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update simplifies the process of changing paper formats in reports. Previously, users were forced to reset dimensions, causing an unnecessary popup. Now, switching paper formats is smoother and more intuitive, allowing users to directly swap without the previous limitations.
Original PR description
Description of the issue/feature this PR addresses: When you set a `custom` Paper size, you can't swap to another one without setting the `Page height (mm)` and `Page width (mm)` to 0 just to swap it again, this could be just skiped since the paperformat uses the computed fields made on `_compute_print_page_size` to get the proper height and width. Current behavior before PR: This happens when you swap Paper size from `custom` to any other.  Desired behavior after PR is merged: After deleting this validation, should swap without this popup, and we could save the original values if the user wants to swap again to custom format. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update ensures that freight costs are accurately reflected in international delivery customs documents generated by Sendcloud. Previously, these costs were missing, leading to potential discrepancies in customs declarations. This change aligns with Sendcloud's API specifications and improves the accuracy of international shipping documentation.
Original PR description
Issue ----- For international deliveries, the customs document does not include the freight costs. Steps to reproduce ----- - Create an international sale (eg BE -> US) - Validate delivery - Open the commercial invoice > Freight costs is set to 0 Change ----- The `freight_costs` should be included in the `customs_information` field of the request (along with all customs-related data, as other fields have been deprecated) https://api.sendcloud.dev/docs/sendcloud-public-api/branches/v2/parcels/operations/create-a-parcel#:~:text=object%2E-,customs%5Finformation ----- Ticket: opw-5486742
This update resolves an issue where salary attachments would display an empty employee field after an employee was archived. The fix ensures that salary attachments accurately reflect the current employee status, even when an employee is no longer active, improving data consistency.
Original PR description
Steps To Reproduce: Create a salary attachment for an employee. Archive that employee. The corresponding salary attachment has an empty `Employee`. Issue: `employee_ids` many2many field doesn't take archived records into consideration, So when an employee is archived, it leads to emptying the record. Fix: Add active_test context to field definition and domain to form view of salary attachment so the employee remains on salary attachment and for new record creation, so it doesn't take archived employees. task-5438657 Forward-Port-Of: odoo/enterprise#102985
A client reported issues processing payments via Bankgiro (Swedish bank giro). This pull request corrects a typo and adjusts the order of data fields in the payment processing, ensuring Bankgiro payments now function correctly. This resolves a reported payment failure.
Original PR description
After PR: https://github.com/odoo/enterprise/pull/104777 The client reported that payment with bankgiro account doesn't works. Here are the problems found: - Typo : Should be `RfrdDocAmt` instead of `RfdDocAmt` - RfrdDocAmt should be inserted before CdtrRefInf - CdtNoteAmt should be before RmtdAmt opw-5427505
This update resolves an issue caused by recent changes to the Swiss Federal Tax Administration's website. The import of tax rates for payroll has been adjusted to reflect the new URLs, ensuring accurate tax calculations for Swiss businesses using this module. This ensures continued compliance with Swiss tax regulations.
Original PR description
Due to recent updates on the Federal Tax Administration website, the single-canton import feature was made temporarly unavailable, this PR adjusts the new URLs for downloading the tax rates Forward-Port-Of: odoo/enterprise#106288
6 changes
Security fixes and vulnerability patches
This update fixes a security vulnerability where temporary access tokens (RDTs) were being logged in application logs. This exposed sensitive customer information like names and addresses, which could be shared externally. The change now prevents logging of these tokens, reducing the risk of data exposure.
Original PR description
Previously, the connector logged all SP-API responses for debugging purposes. When operation is `createRestrictedDataToken`, this would also log the `restrictedDataToken` in plaintext. RDTs are short-lived credentials that grant access to PII (buyer names, addresses, etc.) and should not appear in application logs. While the token is only stored in memory while in use, logs are frequently shared in support tickets, error reports, and monitoring systems without the same access controls, making credential exposure far more likely. This commit adds a parameter to disable logging for operations that return sensitive data. opw-5491878
Resolved issues and error corrections
This update resolves an issue where enabling tracking on custom HTML fields within invoices caused update failures. The change hides the 'Enable Ordered Tracking' option for these fields, preventing the errors and ensuring data updates function correctly. This improves invoice management stability.
Original PR description
From https://github.com/odoo/odoo/pull/241367#issuecomment-3711040501 Nothing prevent tracking from being enabled on HTML fields, but if it is enabled, updates of the field systematically fail. This commit avoids this error by hiding the "Enable Ordered Tracking" for HTML fields. Steps to reproduce: - Install sale and web_studio - Activate debug mode - Add a custom HTML field inside the invoice form view - Open the "More..." of the field (or go to Settings/Technical/Field) and go to the new field - Set "Enable Ordered Tracking" to 1 - Save - Go to an invoice and modify the new field - Save => An error was displayed task-5236436
This update optimizes how new messages are processed within the Odoo platform. Previously, each tab repeatedly sent channel updates, leading to performance issues and errors. Now, only one tab sends these updates, significantly reducing load and improving overall system performance.
Original PR description
Before this commit, each tab was sending a channel_fetched when receiving a new message. This would result in serialization error on the backend as well as performance reduction in case of high load of messages. After this PR, only one tab will send the `channel_fetched` using the `multi_tab` service. task-5180400 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where the web editor would sometimes fail to save changes after applying history. The fix ensures a smoother and more reliable saving process for users editing HTML content within Odoo. This improves the overall user experience and prevents data loss.
Original PR description
backport of https://github.com/odoo/odoo/pull/216370 __ opw-5405048
This update allows users to reset Vendor Bills (e-invoices) created from ANAF to a draft state, even if they've already been processed with an EDI. This change improves the flexibility of managing e-invoices within the accounting system. Future versions (18.0+) will consolidate this functionality into the `l10n_ro_edi` module.
Original PR description
Adjusting the visibility check for "Reset to draft" button to allow Vendor Bills received from ANAF to be reset even when they have a EDI state. Will require to be shifted to `l10n_ro_edi` in 18.0+ as the efactura module is merged into it. task-5892651 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an error that occurred when processing refund orders containing multiple products. Previously, the system would encounter a technical issue preventing refunds with many items. This fix ensures refunds with multiple products are processed correctly, improving the reliability of the Point of Sale system.
Original PR description
Description of the issue/feature this PR addresses: When you create a refund order, and there's many products theres an error Current behavior before PR: Error, this is the traceback. ``` RPC_ERROR…
Description of the issue/feature this PR addresses: When you create a refund order, and there's many products theres an error
Current behavior before PR: Error, this is the traceback.
```
RPC_ERROR
Odoo Server Error
Traceback (most recent call last):
File "/home/odoo/src/odoo/odoo/models.py", line 5896, in ensure_one
_id, = self._ids
ValueError: too many values to unpack (expected 1)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/odoo/src/odoo/odoo/http.py", line 1803, in _serve_db
return service_model.retrying(self._serve_ir_http, self.env)
File "/home/odoo/src/odoo/odoo/service/model.py", line 152, in retrying
result = func()
File "/home/odoo/src/odoo/odoo/http.py", line 1831, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
File "/home/odoo/src/odoo/odoo/http.py", line 2035, in dispatch
result = self.request.registry['ir.http']._dispatch(endpoint)
File "/home/odoo/src/odoo/addons/website/models/ir_http.py", line 235, in _dispatch
response = super()._dispatch(endpoint)
File "/home/odoo/src/odoo/odoo/addons/base/models/ir_http.py", line 221, in _dispatch
result = endpoint(**request.params)
File "/home/odoo/src/odoo/odoo/http.py", line 772, in route_wrapper
result = endpoint(self, *args, **params_ok)
File "/home/odoo/src/odoo/addons/web/controllers/dataset.py", line 29, in call_button
action = self._call_kw(model, method, args, kwargs)
File "/home/odoo/src/odoo/addons/web/controllers/dataset.py", line 21, in _call_kw
return call_kw(Model, method, args, kwargs)
File "/home/odoo/src/odoo/odoo/api.py", line 484, in call_kw
result = _call_kw_multi(method, model, args, kwargs)
File "/home/odoo/src/odoo/odoo/api.py", line 469, in _call_kw_multi
result = method(recs, *args, **kwargs)
File "/home/odoo/src/odoo/addons/point_of_sale/wizard/pos_payment.py", line 70, in check
order._process_saved_order(False)
File "/home/odoo/src/odoo/addons/point_of_sale/models/pos_order.py", line 184, in _process_saved_order
self._compute_total_cost_in_real_time()
File "/home/odoo/src/odoo/addons/point_of_sale/models/pos_order.py", line 412, in _compute_total_cost_in_real_time
lines._compute_total_cost(stock_moves)
File "/home/odoo/src/odoo/addons/point_of_sale/models/pos_order.py", line 1537, in _compute_total_cost
product_cost = self.refunded_orderline_id.total_cost / self.refunded_orderline_id.qty
File "/home/odoo/src/odoo/odoo/fields.py", line 1148, in __get__
record.ensure_one()
File "/home/odoo/src/odoo/odoo/models.py", line 5899, in ensure_one
raise ValueError("Expected singleton: %s" % self)
ValueError: Expected singleton: pos.order.line(16923, 16924, 16925)
```
Desired behavior after PR is merged:
No traceback error?
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr