Daily updates from Odoo
Navigate
Branch
Monday, February 9, 2026
162 changes
35 changes
New functionality added to Odoo
This update adds Thai translations for key chart of accounts elements, including account names, descriptions, tax groups, and asset names. This improves the Odoo accounting system's usability and accuracy for Thai businesses, aligning with local tax regulations and reporting requirements.
Original PR description
The following files are updated with the respective Thai translations: - COA: name, description - Taxes: name - Tax Group: name - Asset model: name Task-5875167 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247116
Resolved issues and error corrections
This update resolves an error that occurred when generating Time Off reports for French and Indian companies. The issue stemmed from a mismatch in how a reporting parameter was handled, causing a technical error. This fix ensures accurate time off reporting functionality for both locales.
Original PR description
Currently, an error occurs when user opens Time Off per Employee Analysis. **Steps to Reproduce:** - Install `l10n_fr_hr_holidays` with demo data. - Switch to a `French company`. - Create a time off…
Currently, an error occurs when user opens Time Off per Employee Analysis. **Steps to Reproduce:** - Install `l10n_fr_hr_holidays` with demo data. - Switch to a `French company`. - Create a time off for any employee (if none exists). - Go to `Time Off` > `Reporting` > `By Employee`. `TypeError: HrLeave._get_durations() got an unexpected keyword argument 'additional_domain'` After [this commit], _get_durations accepts an additional_domain parameter. However, this parameter is not defined in the _get_durations method in the French and Indian localizations. When a user opens Time Off by Employee in the French or Indian localization, the compute method is executed to calculate leave durations, and additional_domain is passed as an argument [1], which raises the error [2] [3]. This commit adds the additional_domain parameter to the Indian and French localizations. In the French localization, it also passes check_leave_type, as its value is passed internally within the method [4]. [this commit]: https://github.com/odoo/odoo/commit/1c3f5633ef87f6d9c5a6169eefd51cd42ef442d5#diff-38469def2f870bb866f971f57797dd7c21b6a95d52a8eae72f832f0eea2434f9R575 [1]- https://github.com/odoo/odoo/blob/8db5a8cf07fa9c2b677b061b5897f757cb1f7260/addons/hr_holidays/report/hr_leave_employee_report.py#L94 [2]: https://github.com/odoo/odoo/blob/80e29d864b3e54ea68d2731da4c0f2f917f5d56a/addons/l10n_in_hr_holidays/models/hr_leave.py#L218 [3]: https://github.com/odoo/odoo/blob/80e29d864b3e54ea68d2731da4c0f2f917f5d56a/addons/l10n_fr_hr_holidays/models/hr_leave.py#L112 [4]: https://github.com/odoo/odoo/blob/9d4103c061c5fbe9913fa721ea3e6d417bc89e93/addons/hr_holidays/models/hr_leave.py#L531 sentry-7213025295 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where non-manager users were receiving an error message when opening validated time off records. The fix prevents unnecessary updates to a field that wasn't required, ensuring a smoother experience for all users. This change improves usability for employees accessing their time off details.
Original PR description
Steps to reproduce: ------------------- 1. Install `l10n_in` and `l10n_in_hr_holidays` 2. Switch to an Indian company 3. Create a user and related employee without Time Off rights 4. Log in with the…
Steps to reproduce: ------------------- 1. Install `l10n_in` and `l10n_in_hr_holidays` 2. Switch to an Indian company 3. Create a user and related employee without Time Off rights 4. Log in with the new user and create a past time off 5. Approve the time off as an time off manager/admin 6. Open the validated time off record as the employee Issue: ------ Opening a validated time off raises the following UserError: ```python You must have manager rights to modify/validate a time off that already begun. ``` Cause: ------ The `_get_durations` method in `l10n_in_hr_holidays` was updating the `l10n_in_contains_sandwich_leaves` field every time it was executed. When a user opened a validated time off record, this triggered a `write()` operation. Since non-manager users are not allowed to write on already started validated leaves, this caused a [UserError](https://github.com/odoo/odoo/blob/047d5b61a5f3fc5c41f5bc3975938a53b5da49a7/addons/hr_holidays/models/hr_leave.py#L793-L798) The field `l10n_in_contains_sandwich_leaves` does not need to be updated when `l10n_in_is_sandwich_leave` is False. See [[1]](https://github.com/odoo/odoo/blob/047d5b61a5f3fc5c41f5bc3975938a53b5da49a7/addons/l10n_in_hr_holidays/models/hr_leave.py#L156-L157) & [[2]](https://github.com/odoo/odoo/blob/047d5b61a5f3fc5c41f5bc3975938a53b5da49a7/addons/l10n_in_hr_holidays/models/hr_leave.py#L62) And this [part of the code](https://github.com/odoo/odoo/blob/047d5b61a5f3fc5c41f5bc3975938a53b5da49a7/addons/l10n_in_hr_holidays/models/hr_leave.py#L160-L173) is responsible to update `l10n_in_contains_sandwich_leaves` value. **NOTE:** Opening future validated time off records as a non-manager user triggers `AccessError` as it is not allowed to update the validated time off record. Solution: --------- Ensure that `l10n_in_contains_sandwich_leaves` is updated only when `indian_leaves` is applicable. opw-5373055 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246078 Forward-Port-Of: odoo/odoo#240056
This update resolves an issue where emails couldn't be sent to applicants who had been archived in the recruitment system. The fix ensures that archived applicants are correctly included when sending emails, preventing a disruption in the applicant communication process. This improves the reliability of the recruitment workflow.
Original PR description
Version: - 17.0 Steps to reproduce: - Create an applicant. - Archive the applicant. - Select the archived applicant. - Click the Send Email action. Issue: - Unable to Send Emails to Refused Applicants Cause: - The applicant_ids many2many field does not include archived applicants. Because of this, when an applicant is archived, the field becomes empty. Solution: - Add active_test to the field context. Task - 5786195 Forward-Port-Of: odoo/odoo#244691
The Gantt progress bar now displays the correct operation duration after switching workcenters. Previously, the duration remained inaccurate when changing workcenters, due to a bug in how the system calculated the finished date. This update corrects this calculation to ensure accurate progress visualization.
Original PR description
**Issue** Changing the workcenter of a workorder to another with a different time efficiency does not correctly update `date_finished`, causing the Gantt progress bar to show an incorrect expected…
**Issue** Changing the workcenter of a workorder to another with a different time efficiency does not correctly update `date_finished`, causing the Gantt progress bar to show an incorrect expected duration. **Steps to reproduce** 1. Create two workcenters marked as alternatives (100% and 50% efficiency). 2. Create a BOM operation that produces 100 products with a 1h expected duration each, on the 100% workcenter. 3. Create and plan an MO using this BOM. 4. In Planning > Planning by Workcenter (Gantt), drag the workorder to the 50% efficiency workcenter. → Expected duration remains 100h instead of 200h. 5. Drag the same workorder back to the 100% workcenter. → Expected duration becomes 200h instead of 100h. **Cause** `date_finished` is recomputed in `write()` using the *previous* workcenter’s efficiency, because the duration calculation happens before the new `workcenter_id` is applied: https://github.com/odoo/odoo/blob/18.0/addons/mrp/models/mrp_workorder.py#L471 Since the Gantt progress bar uses the interval [`[date_start, date_finished]`](https://github.com/odoo/enterprise/blob/18.0/mrp_workorder/models/mrp_workorder.py#L672C13-L674C107) to compute the expected duration (via `_web_gantt_progress_bar_workcenter_id`), the displayed duration becomes wrong. opw-5224272 Forward-Port-Of: odoo/odoo#245236 Forward-Port-Of: odoo/odoo#239021
This update resolves an issue where users were unexpectedly logged out when viewing images through certain security proxies (like Cisco Secure Email). The fix disables automatic session saving for image requests, preventing Odoo from creating a new session and triggering the logout. This ensures consistent functionality across browsers.
Original PR description
## Problem A logout occurs when an image in the chatter is requested through a third-party security proxy (like Cisco Secure Email or Microsoft SafeLinks) via a boomerang redirect following this…
## Problem
A logout occurs when an image in the chatter is requested through a third-party security proxy (like Cisco Secure Email or Microsoft SafeLinks) via a boomerang redirect following this flow:
- A user (Person A) opens an Odoo record. The chatter contains an image previously sent by a correspondent (Person B) whose email client or mail server rewrote the image URL to point to a security proxy.
- Firefox tries to load the image. The URL points to `cisco.com/...`. (for example)
- The proxy scans the link and redirects the browser back to the original Odoo URL: `odoo.com/web/image/...`.
- Firefox follows the strict (now deprecated) `rfc6265bis` rule: it looks at the whole redirect chain.
Since it sees a cross-site hop (cisco.com), it flags the final request as cross-site.
-> Because Odoo's session_id is `SameSite=Lax`, Firefox refuses to send
the cookie on this "false" redirect
- Odoo receives the request at `/web/image` without a session_id.
- Odoo creates a new, empty session to process the request.
- At the end of the request, because save_session is True by default, Odoo sends a `Set-Cookie: session_id=NEW_EMPTY_ID` header in the response.
- The browser receives this `Set-Cookie` header, and this time *applies a different policy*: it considers the header as same-origin, allowing it to overwrite the previously valid session cookie with this new one that corresponds to a fresh, unauthenticated session.
- The user is instantly logged out of their current Odoo tab.
## Context on Web Compatibility
This "redirect chain consideration" was a controversial part of the `RFC6265bis` draft.
Chrome and Safari never fully implemented it because telemetry showed it broke ~1% of the web. In March 2024, the HTTP Working Group (HTTPWG) officially decided to remove this requirement from the spec (reverting to a more permissive model) because it was deemed not web-compatible. Firefox, however, still enforces this strict behavior in many versions.
## How to we fix this
We set `routing={'save_session': False}` on the `/web/image controller`.
- This prevents Odoo from sending the `Set-Cookie` header if the session is dirty or new.
- Even if Firefox sends the request without a cookie, Odoo won't "reply" with a new session ID.
- The user's legitimate session cookie remains untouched in the browser.
## Sources
- HTTPWG Decision (March 2024): https://github.com/httpwg/http-extensions/issues/2104
- Reverting RFC6265bis: https://github.com/httpwg/http-extensions/pull/2750
opw-5184217
opw-4698750
opw-5166151
Forward-Port-Of: odoo/odoo#242582
Forward-Port-Of: odoo/odoo#242061This update resolves an issue where stock account postings were failing for a second company in a test environment. The fix ensures the correct company's account information is used during processing, guaranteeing accurate stock valuation postings across all companies. This improves data reliability and prevents disruptions to financial reporting.
Original PR description
Prior to this PR: In my test setup, there are 2 companies. The cron '_cron_post_stock_valuation()'is manually triggered while the user is in Company 1. Processing for Company 1 works correctly. When the loop reaches Company 2, the process crashes as the account fetched is the one from self.env.company which is the wrong company. After this PR: The correct company is being used to fetch the accounts. therefore everything is posted correctly. OPW - 5447337 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247408
This change reverts a recent update that prevented public holidays from being correctly applied to work schedules without a company assigned. Previously, the system incorrectly ignored public holidays when a schedule lacked a company. This fix ensures public holidays are properly reflected in time off requests and schedules.
Original PR description
Revert of https://github.com/odoo/odoo/commit/a95af8b78a94a795e05a0adf299837adc0ef2117 and https://github.com/odoo/odoo/commit/f4f9ecb3e4801b3d382abc24c478fe5e533c9bf8 **Steps to reproduce** 1.…
Revert of https://github.com/odoo/odoo/commit/a95af8b78a94a795e05a0adf299837adc0ef2117 and
https://github.com/odoo/odoo/commit/f4f9ecb3e4801b3d382abc24c478fe5e533c9bf8
**Steps to reproduce**
1. Remove the company of the Working Schedule (needs to be done in
a multi-company environment from the UI) used by an employee.
2. Using the company of this employee, create a Public Holiday
(for the employee's schedule or all schedules).
Issues:
- the public holiday doesn't appear in the Time Off dashboard
- when taking a time off on that day, the public holiday is
included in the duration
**Cause**
After the fix in https://github.com/odoo/odoo/commit/a95af8b78a94a795e05a0adf299837adc0ef2117 , it will lead
to a search domain for public holidays of `('company_id', 'in', [False])`
when the working schedule has no company, ignoring any public
holidays with a company set. This is especially problematic since the
company of the public holiday is always forced.
https://github.com/odoo/odoo/blob/7bce5f3f95429a4d4ba034a66c350ee2a5868567/addons/resource/models/resource_calendar_leaves.py#L49-L51
**Solution**
Since the intent of the original fix https://github.com/odoo/odoo/commit/f4f9ecb3e4801b3d382abc24c478fe5e533c9bf8
was to correct an issue related to the computation of some `project.task`
fields calling a resource method (`get_work_duration_data`), we can revert
the fix and later fix the original issue directly in `project`, without
impacting `hr`/`resource` modules.
opw-5496999
opw-5401425
Forward-Port-Of: odoo/odoo#247139
Forward-Port-Of: odoo/odoo#244052This update resolves a problem where Safari browsers, particularly when used in collaboration mode, would display incorrect HTML editor content. The fix ensures the HTML editor accurately reflects changes made by users, regardless of the browser used (Chrome or Safari). This improves the consistency and reliability of the HTML editor for all users.
Original PR description
Before this commit: safari returns invalid document in collaboration, typically when a chrome user is sending history steps with undo. Reproduction steps: 1. In chrome, use an existing task with…
Before this commit: safari returns invalid document in collaboration, typically when a chrome user is sending history steps with undo. Reproduction steps: 1. In chrome, use an existing task with empty description or create a task in the project (first create the task title in the kanban view, then click edit), enter 4 lines of text 2. In one of the middle lines, delete one character --> undo --> add a new character 3. Save the task, open the task in Safari incognito, log in as demo (not admin), go to the task and click the description field 4. TraceBack: IndexSizeError: The index is not in the allowed range. After this commit: we use the range of the DOM selection to set the offsets of activeSelection. If the DOM selection is too wrong to be corrected, e.g. the selection's anchor node isn't the same with range's start container (or end container if direction is right to left), we do not set new activeSelection but just return the previous activeSelection task-5428788 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247484 Forward-Port-Of: odoo/odoo#246056
This update replaces a real tax ID placeholder in the base_vat module for Turkey. This change prevents users from accidentally using the placeholder for actual transactions, ensuring data integrity and compliance. It's a minor update focused on security and accuracy.
Original PR description
The previous placeholder used a real tax ID. Replacing it with a dummy prevents users from using it to submit transactions. task-5441218 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247454 Forward-Port-Of: odoo/odoo#242189
This update fixes an error that occurred during upgrades of Odoo 18, specifically when upgrading from version 17. The issue stemmed from a missing requirement for production locations in warehouses, which was addressed by incorporating a solution from the MRP module. This ensures smoother upgrades and prevents disruptions to stock management.
Original PR description
The warehouses need at least a Production location[^2] to avoid triggering an error, but they are not considered a missing location. The function is borrowed from the `mrp` module[^mrp]. This error was found during upgrades. To reproduce: - In 17, install repair and don't install mrp. - Archive the production locations. - Upgrade to 18. - It will trigger an error[^1] while upgrading stock. [^1]:https://github.com/odoo/upgrade/blob/b46cf7ea8770c5d428ea3d569148eb76d16903b9/migrations/stock/saas~17.3.1.1/end-migrate.py#L16 [^2]:https://github.com/odoo/odoo/blob/ab3c2d52bcaee516eae319ccd20088eb48c819f1/addons/repair/models/stock_warehouse.py#L67 [^mrp]:https://github.com/odoo/odoo/blob/ab3c2d52bcaee516eae319ccd20088eb48c819f1/addons/mrp/models/stock_warehouse.py#L278-L283 Forward-Port-Of: odoo/odoo#245805
This update removes a problematic feature from the dynamic SVG builder to prevent errors and improve stability. The 'image shape' option, previously available for dynamic SVGs, was causing issues due to unsupported shape functionality. Removing this option ensures a smoother user experience.
Original PR description
The image shape option was added for dynamic SVG with the new builder in saas-18.4. However, this seems to be an error since shapes are not supported with dynamic SVG. The image shape option will not appear anymore in such cases to avoid tracebacks for the user. task-5451405 Forward-Port-Of: odoo/odoo#247440 Forward-Port-Of: odoo/odoo#242506
This update restores the ability for support staff to edit the IAP token within the IAP account form. Previously, this token was locked down, hindering the process of migrating databases between environments. This change ensures smoother database transitions and operational efficiency.
Original PR description
Currently the IAP token (`account_token`) is readonly in the IAP account form view. It was made readonly in this commit https://github.com/odoo/odoo/commit/8a96f0fc3f18bd1ccfa96e654ef6f74b21593288#diff-f05503a4bccde75e6ef0c6ab5cd0dbd9fa0e32a30da505bdfcab8c7ed3a4a24cR33 Support needs to edit it when moving a DB from test to production though. After this commit it is editable (again; like in lower versions). task-None
This update fixes an error that occurred when all variants of a product were deleted, preventing the Shop page from loading correctly. The issue stemmed from an outdated system requirement that no longer allowed empty IDs. This change ensures the Shop page remains functional even after variants are removed, improving the user experience.
Original PR description
When all variants of a product template are deleted, opening the Shop page on the website raises a traceback. Steps to reproduce the error: - Install ``website_sale`` module - Go to settings > Enable…
When all variants of a product template are deleted, opening the Shop page on the website raises a traceback. Steps to reproduce the error: - Install ``website_sale`` module - Go to settings > Enable variants - Create a product template > In Attributes & Variants Tab > add one attribute with two values > Save - Click on the variants smart button > select all > delete - Go to Website > Shop Traceback: ```py AssertionError: Invalid falsy real id ``` https://github.com/odoo/odoo/blob/b6598c11a3580cfc6ff1ffeb67b0d388c55383d1/addons/website_sale/controllers/main.py#L456 After [commit](https://github.com/odoo/odoo/commit/4290724a4c8c57fba4f4d3d688d38f65dadcc38f), falsy IDs are no longer allowed in ``browse()``. When all variants of a product template are deleted, ``product._get_first_possible_variant_id()`` returns False. This falsy value is later passed to ``browse()``, which triggers the above traceback. [1]: https://github.com/odoo/odoo/commit/4290724a4c8c57fba4f4d3d688d38f65dadcc38f sentry-7201563878 --- 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 height of image gallery snippets would unexpectedly reset when images were reordered. The fix ensures users can set and maintain custom heights for gallery snippets, providing consistent control over their appearance. Additionally, minor template issues were addressed.
Original PR description
Steps to reproduce Scenario A 1. Go to Website → drop an Image Gallery snippet → A default height value appears in the `"Height"` input. 2. Select an image → change its order in the carousel → The…
Steps to reproduce Scenario A 1. Go to Website → drop an Image Gallery snippet → A default height value appears in the `"Height"` input. 2. Select an image → change its order in the carousel → The snippet height is automatically reset to `70%` of the screen height. Scenario B 1. Change the height value of the snippet from the `"Height"` option. 2. Select an image → change its order in the carousel → The snippet height is again reset (and the option value is overridden). Issue The original height behavior was introduced in [1] to make the slideshow mode auto-adapt to `70%` of the viewport height. This diff also removed height CSS for other modes where the height should depend on the content [2] Subsequent adaptations: [3] added a default height (`500px`) in XML, [4] removed it during a design refactoring, [5] restored the possibility to control the height of the image gallery snippet using the `"Height"` option. Keeping the same JS logic that forces the snippet height, led to the behavior explained above: even when the user manually sets a height, any action triggering `slideshow()` (e.g., image reorder) forces the height back to 70% of `window.innerHeight`. Fix 1. Remove the outdated JS code that automatically updates the height. 2. Keep the slideshow behavior consistent with [2] by excluding it from the height CSS removal logic. The snippet now starts with a default height and only changes when edited through the `"Height"` input. Additional fixes This commit also fixes a few minor issues in the new carousel items template introduced in [4]: items having an `"undefined"` class, and a missing margin style in the main snippet template. [1]: https://github.com/odoo/odoo/commit/239b6bc0b5a2a644486737f2b0b71e7e6c0a2edf [3]: https://github.com/odoo/odoo/commit/9069d0127c176317436b67b23ae5677dd9d53de7 [4]: https://github.com/odoo/odoo/commit/9042b1cae7b630b20e0670788b7a4ed9e4c97609 [5]: https://github.com/odoo/odoo/commit/d5d138e833344e857a420d865d4b12f1acdb0e7c task-3414281 Forward-Port-Of: odoo/odoo#243914 Forward-Port-Of: odoo/odoo#126766
This update fixes an issue where TDS report amounts were incorrectly displayed as negative values in version 19.1. The fix adds a necessary negative sign prefix to the report formulas, ensuring TDS amounts are shown accurately as positive values, aligning with previous versions.
Original PR description
**Steps to reproduce:** * Install the **l10n_in** module. * Create vendor bills with applicable **TDS taxes** (e.g. Section **194C**, **194A**, **195**). * Post the bills. * Go to **Accounting → Reporting → TDS Report**. **Observed behavior:** * TDS amounts are displayed as **negative values** across all sections (192, 193, 194A–Q, 195, etc.). * This differs from versions up to **18.3**, where TDS amounts were shown as positive. **Cause:** * In v19, the automatic **+/− sign handling** was removed from the tax grid logic. [REF](https://github.com/odoo/odoo/commit/17a6117ed88c29b5bc4db0c872bcdbc109a7d98b) * TDS report formulas were missing an explicit **negative sign prefix**, causing amounts to appear inverted. **Fix:** * Add the required **negative sign prefix** to all TDS section formulas in `account_tax_report_tds_data.xml`. * Ensures TDS amounts are displayed as **positive values**. * Applies to all TDS sections. opw-5502385 Forward-Port-Of: odoo/odoo#247123
This update resolves an issue where users with read-only access to shared documents were encountering errors when opening the chatter associated with those documents. The fix ensures the system verifies a user's access rights before attempting to update document thumbnails, preventing the error and improving usability.
Original PR description
How to reproduce: - Install documents - Create a folder at the root (company) not shared to anyone (including internal user) - Open that folder and ensure the chatter is closed - Upload a document in it and share it with Marc Demo with view access - Connect with Marc Demo, click on that shared document and open the chatter You get an error because the client try to update the thumbnail of the attachment for the chatter but the user has only view access to it. The user doesn't have write access to the attachment because it is linked to a document with only read access. To solve the problem, we modify the check that trigger the thumbnail update to also check that the user has access to the related record. Task-5360962 Forward-Port-Of: odoo/odoo#244205
This update corrects a visual issue with the mega menu on the website, specifically aligning the toggle elements in desktop views when using the 'Hamburger' template. The fix ensures consistent alignment across different screen sizes, improving the user experience. This resolves a previous misalignment that was present in the mobile view but not the desktop.
Original PR description
The PR [1] updated the templates for many headers to adapt the nav-item positions in desktop/mobile views. However, the hamburger menu was not updated correctly. In the desktop view, the mega menu toggle elements were not aligned properly (unlike in the mobile view). This commit fixes the PR by adding the necessary <xpath>. Steps to reproduce the issue: - Go to Website - Add a Mega Menu (edit menu) - Click on the header - Set the template to "Hamburger" - Set the text alignment to center for the desktop view => The mega menu toggle is not centered. task-5416632 --------------------------------------------- [1]: https://github.com/odoo/odoo/pull/225672 Forward-Port-Of: odoo/odoo#242475
This update resolves an issue where reducing order quantities incorrectly triggered additional picking operations when using multi-step delivery routes for kits. The fix ensures accurate quantity calculations during order fulfillment, preventing unnecessary stock movements and improving order processing efficiency. This impacts users utilizing the multi-step delivery feature.
Original PR description
### Steps to reproduce: 1. In the settings enable: Multi-steps route 2. Put your warehouse in 2-step deliveries 3. Create a kit product: - With one component - There is one component in the stock 4.…
### Steps to reproduce: 1. In the settings enable: Multi-steps route 2. Put your warehouse in 2-step deliveries 3. Create a kit product: - With one component - There is one component in the stock 4. Create and confirm a SO with 1 x K 5. Process the pick and ship 6. Return the delivery 7. Set the sol qty to 0 #### > Two unexpected pickings are created to put the kit in output ### Cause of the issue: Decreasing the sol quantity to 0 will call the `_action_launch_stock_rule` in order to create and run procurements related to that quantity change. However, the quantity currently handled by other procurements is determined here by the `_compute_kit_quantities`: https://github.com/odoo/odoo/blob/87e176ad76c9d7b87cd622ae38a8b9a62813b1cb/addons/sale_stock/models/sale_order_line.py#L388 https://github.com/odoo/odoo/blob/87e176ad76c9d7b87cd622ae38a8b9a62813b1cb/addons/sale_mrp/models/sale_order_line.py#L154-L166 https://github.com/odoo/odoo/blob/87e176ad76c9d7b87cd622ae38a8b9a62813b1cb/addons/mrp/models/stock_move.py#L578-L580 Now, the issue is that `_compute_kit_quantities` does not handle move chains properly, as all delivery moves contribute to the `incoming_qty` and all return moves contribute to the `outgoing_qty`. This results in an `incoming_qty` of 1 (for the pick) + 1 (for the ship) and an `outgoing_qty` of 1 (for the 1-step return), that is a `qty_processed` of 1. As a result, the procurement will be generated for a quantity of `0 - 1` (rather than 0): https://github.com/odoo/odoo/blob/87e176ad76c9d7b87cd622ae38a8b9a62813b1cb/addons/sale_stock/models/sale_order_line.py#L388-L402 which leads to the unexpected picking creations. opw-5432558 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246141
This update fixes a discrepancy in the French chart of accounts where expense accounts were incorrectly assigned sale taxes instead of purchase taxes. This change ensures accurate tax calculations for expense reporting in the French version of Odoo, aligning with accounting regulations. The fix was driven by a previous support ticket (opw-5891867).
Original PR description
**PROBLEM** In the fr chart of account, default taxes for expense account are sale taxes while they should be purchase taxes. opw-5891867
This update resolves an issue where portal users couldn't properly close recurrent tasks. The fix uses a temporary bypass of security restrictions to ensure the task state is correctly updated when a portal user changes the task's status. This enhancement improves the portal user experience and ensures tasks are managed as expected.
Original PR description
to reproduce: ============= - create a project with recurrent task and share it with a portal user - log in with the portal user and open the recurrent task - change the state to 'Done' and save -> the state is not changed to 'Done' and the task is not closed problem: ======== the method responsible for creating the next occurrence of a recurrent task executes some operations that portal users are not allowed to do, causing the whole operation to fail and preventing the task from being updated. solution: ========= use sudo() to bypass access rights checks when creating the next occurrence of the recurrent task. This is safe because the operations being performed do not involve any sensitive data or actions that could compromise security. opw-5442919 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247001
This update ensures the Odoo codebase is checked for code style issues using Ruff, a modern Python linter. The change includes support for the OLS noqa directive, improving code readability and consistency. This is a routine maintenance update to maintain best practices for our development environment.
Original PR description
- update for ruff 0.15.0 - support OLS noqa Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247771
This update resolves a bug that prevented a key tour from running correctly. The fix automatically ensures the product column is visible during the tour process, eliminating a manual step. Additionally, the update improves compatibility with the purchase product matrix module.
Original PR description
Commit 01848b5 missed a case causing the `test_add_section_from_product_catalog_on_invoice_tour` tour to fail. To resolve this, `showProductColumn()` is now called automatically within `addSectionFromProductCatalog()`. This ensures the product column is visible before content verification, removing the need for manual calls in other tours. Additionally, the `showProductColumn()` trigger is updated to support both `product_id` and `product_template_id`, ensuring compatibility with the `purchase_product_matrix` module. runbot-234872 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247176
This update fixes an issue where the IoT Box sometimes updated before the database, leading to outdated handler files. By ensuring the correct ETags are removed, the system now reliably re-downloads handler files to the IoT Box, maintaining data consistency. This prevents errors and ensures proper functionality.
Original PR description
The IoT Box will, most of the time, update before the database does. In such event, the custom handlers will be removed from the IoT Box, but the etag of the files downloaded from the server will be kept, making the db return a 304 (not modified) when trying to download the handlers again. We now ensure that this etag is removed, so that the database sends the files again.
This update fixes a confusing user experience where the 'New Project' and 'Share Project' buttons used the same shortcut (Alt+R). The shortcut has been changed to Alt+C to prevent accidental activation of the wrong function, ensuring a smoother project creation process.
Original PR description
Steps to Reproduce: - - Go to Project → open any project. - Press Alt key to display shortcut hints. - Both New and Share buttons show the same shortcut. Issue: - The New button and the Share Project button use the same shortcut, leading to a conflict. Cause: - The New button and the Share Project button share the same shortcut (Alt+R) causing the wrong action to trigger. Solution: - Changed the shortcut for the New button from Alt+R to Alt+C to avoid conflict and ensure correct behavior. task-5270075 Forward-Port-Of: odoo/odoo#237694
A shortcut issue was resolved that caused users to unintentionally change task priorities instead of creating new tasks. The New button's shortcut was changed from Alt+R to Alt+C to prevent this conflict and ensure the intended functionality is consistently available.
Original PR description
Steps to Reproduce: - - Open Project → Tasks. - Press Alt key to view shortcut hints. - New button control show Alt+R. - Pressing Alt+R triggers priority change instead of creating a new record. Issue: - Pressing the shortcut displayed on the New button (Alt+R) does not create a new task but instead changes the task priority. Cause: - The New button and the Priority widget share the same shortcut (Alt+R), causing the wrong action to trigger. Solution: - Changed the shortcut for the New button from Alt+R to Alt+C to avoid conflict and ensure correct behavior. task-5270075 Forward-Port-Of: odoo/odoo#237555
This update resolves an issue where hourly accrual plans were incorrectly ignoring attendances that spanned multiple days. The fix adjusts how attendances are calculated within the accrual plan, ensuring that all worked hours are accurately accounted for, regardless of overlapping times. This improves the accuracy of time-off accruals.
Original PR description
### Issue: Attendances overlapping on two days are ignored for hourly accrual plans based on attendances. ### Steps to reproduce: - Install 'hr_holidays_attendance' - In Time Off > Configuration >…
### Issue: Attendances overlapping on two days are ignored for hourly accrual plans based on attendances. ### Steps to reproduce: - Install 'hr_holidays_attendance' - In Time Off > Configuration > Accrual Plan, create a new plan - Based on worked time - Hourly rule - Attendances as Source - In Management > Allocations, create an allocation for an employee using the new accrual plan - Create an Attendance for this employee in the period of the Accrual Plan - Check-in at 22pm for example - Check-out at 7am - Run the cron "Accrual Time Off: Updates the number of time off" - The Allocation ignores the worked time from the attendance ### Cause: `_get_accrual_plan_level_work_entry_prorata()` is called on each day of the accrual period. So `start_dt` is `datetime.datetime(2026, 1, 2, 0, 0)` and `end_dt` is `datetime.datetime(2026, 1, 3, 0, 0)` for example. This means that the search will always excludes attendances overlapping on two days. https://github.com/odoo/odoo/blob/26f3026ed45cc409cd7f67fa219d44f1adbac9b7/addons/hr_holidays_attendance/models/hr_leave_allocation.py#L79-L83 ### Solution: To count the attendances on several days, we need to split these attendances by day because `_get_accrual_plan_level_work_entry_prorata()` is only called with an interval of one day from midnight to midnight. First we get all attendances overlapping with the day by changing the domain in the search. Then we could simply take the difference between `max(attendance.check_in, start_dt)` and `min(attendance.check_out, end_dt)` but we also need to remove the lunch breaks (they were not counted in `attendance.worked_hours`). This would mean duplicating the code present in `_compute_worked_hours()`. To avoid this we create a new method for `hr.attendance` named `_get_worked_hours_in_range()`. That returns the number of hours worked due to this attendance in a given time frame. This new method can be used in both cases to get the needed value. opw-5172669 Forward-Port-Of: odoo/odoo#247472 Forward-Port-Of: odoo/odoo#246270
This update fixes inconsistencies in how stock valuation is calculated during purchase invoices. The changes streamline the process, ensuring accurate currency reconciliation and aligning with recent Odoo updates. It improves the reliability of purchase order valuation calculations.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245551
This update resolves an issue where date-filtered data disappeared in POS tours after page refreshes. The fix introduces a mechanism to save and restore the frozen time using session storage, ensuring tours continue to function correctly and tests pass reliably. This improves the overall user experience during POS training and demonstrations.
Original PR description
Mocking time in tours via `freezeDateTime` is lost when the page reloads , causing date-filtered data to disappear and tests to fail. Introduce `withTimeFreeze(millis, steps)`, which persists the mock timestamp in `sessionStorage`. POS now checks this storage on module load to automatically re-apply the freeze, ensuring the clock survives refreshes while handling cleanup after the steps finish. runbot-232601 Related Enterprise PR: odoo/enterprise#106724 Forward-Port-Of: odoo/odoo#247596
This update fixes an inconsistent visual issue in the Field Service Report generated from the Bubble document layout. Previously, table borders appeared with mixed rounded and sharp edges. The fix adds a class to the table tags, ensuring a consistent and professional look for these reports.
Original PR description
Steps to reproduce: -------------------------------- 1. Install `industry_fsm_sale` module 2. Go to Settings > Configure Document Layout 3. Select the Bubble document layout and save 4. Open any…
Steps to reproduce: -------------------------------- 1. Install `industry_fsm_sale` module 2. Go to Settings > Configure Document Layout 3. Select the Bubble document layout and save 4. Open any Field Service task 5. Use the Products smart button to add one or more products 6. Click the Settings icon > Print > Field Service Report Observation: -------------------------------- In Time & Material tables using the Bubble layout, table borders show a mix of rounded corners and sharp edges, resulting in inconsistent visuals Issue: -------------------------------- The table tags in the report were missing the `table-borderless` class. As a result, the layout-applied rounded borders conflicted with the default table borders Solution: -------------------------------- Add the `table-borderless` class to the affected table tags so the tables inherit consistent rounded borders from the document layout Before: <img width="787" height="317" alt="before_css" src="https://github.com/user-attachments/assets/dac136a8-022a-4c36-8cdb-1c0fbb048f3e" /> After: <img width="816" height="372" alt="after_css" src="https://github.com/user-attachments/assets/b5f96e75-2cd3-44cf-89e3-9a3b564c8369" /> opw-5401612 Forward-Port-Of: odoo/enterprise#105616
This update fixes an issue where the Kanban view for manufacturing orders wasn't correctly filtering by the selected operation type. Previously, all active manufacturing orders were displayed. Now, the view accurately shows only those orders associated with the currently chosen operation type, ensuring accurate order tracking.
Original PR description
**Steps to reproduce:** * Install the *stock_barcode_mrp* module. * Go to *Inventory* ‣ *Configuration* ‣ *Operation Types*. * Create two operation types with *Type of Operation* set to…
**Steps to reproduce:**
* Install the *stock_barcode_mrp* module.
* Go to *Inventory* ‣ *Configuration* ‣ *Operation Types*.
* Create two operation types with *Type of Operation* set to *Manufacturing*.
* Create two manufacturing orders.
* In each manufacturing order, under the *Miscellaneous* tab
set a different *Operation Type* created above.
* Ensure sufficient *On Hand Quantity* exists for a product used in manufacturing.
* Open the *Barcode* application.
* Open one of the created manufacturing operation types.
**Observed behavior:**
* The kanban view displays **all** manufacturing orders whose picking
types are active, instead of only those related to the selected operation type.
**Cause:**
* In 19.0, the context key *`'search_default_picking_type_id': self.id`* was removed
from `_get_action` function in this [commit](https://github.com/odoo/odoo/commit/9ed7109b8f11260084374f2d7fa7073a9ad3c240)
* Previously, this context value restricted results to the current picking type by default.
* The method `get_action_picking_tree_ready_kanban` in *stock_barcode_mrp*
now overrides the domain with only *`('picking_type_id.active', '=', True)`*.
* This domain checks that the picking type is active but does not filter by
the selected picking type, causing unrelated MOs to be shown.
**Fix:**
* This ensures only manufacturing orders belonging to
the selected operation type are displayed.
---
opw-5819358
Forward-Port-Of: odoo/enterprise#105327This update resolves an issue where self-order kiosks would freeze if a terminal sent a 'cancel' signal. Now, the system treats this 'cancel' event as an error, allowing users to restart their transaction and ensuring a smoother user experience. This prevents kiosk downtime and improves order completion rates.
Original PR description
If the transaction isn't handled after some time, the terminal itself sends a cancelation event. As the kiosk doesn't handle cancelations, it results in the user being stuck with "Follow instructions on the terminal", but the terminal not processing any transaction anymore. We now treat the "cancel" event as an error to allow the user restart the transaction. Forward-Port-Of: odoo/enterprise#106731
This update resolves an issue that prevented users from creating new payslip runs within the Hong Kong payroll module. The problem stemmed from an incorrect value being passed to the system, triggering an error. The fix ensures a proper list is always provided, allowing users to successfully generate payslips.
Original PR description
Currently an error occurs when user tries to create a new payslip run.
Steps to replicate:
- Install `l10n_hk_hr_payroll_empf` with demo and switch to Hong Kong company.
- Go to Payroll > Payslips > Pay Runs > Click New > Continue.
Error:
```
File "/home/odoo/src/odoo/saas-19.1/odoo/orm/models.py", line 5202, in browse
assert all(ids) or all(isinstance(x, NewId) or x for x in ids), "Invalid falsy real id"
AssertionError: Invalid falsy real id
```
Cause:
- While making the orm call the [resId] was being passed as False, that further calls the browse and caused the error to occur.
Solution:
- Passed an empty list instead of passing a falsy ID to the ORM call.
[resId]: https://github.com/odoo/enterprise/blob/55a71ba4d0c2f3e4478d47c7edb442009f4fc1c4/l10n_hk_hr_payroll_empf/static/src/views/payslip_run_form/hr_payslip_run_form.js#L12
sentry-7207509338This update resolves an issue where journal items displayed in general ledger reports were incorrectly linked to account groups. The fix addresses a technical problem caused by a change in Odoo's data structure, ensuring accurate reporting of financial data. This prevents errors and ensures users see the correct financial information.
Original PR description
Currently journal items shown don't belong to the account group that they should belong to, and from saas-18.3 an error will be generated after following the below steps or step mentioned in ref PR…
Currently journal items shown don't belong to the account group that they should belong to, and from saas-18.3 an error will be generated after following the below steps or step mentioned in ref PR [1]. - Install `Accounting (accountant)` with demo data - Create account groups e.g., name as `Test 1` and code prefix `1 to 1` - Go to the general ledger report - Click on `Journal Items` of the account group line `1 Test 1` Error from saas-18.3: `ValueError: Cannot convert account.account.group_id to SQL because it is ...` This error occurs because PR with ref [1] in 17.0 added the` group_id` field of the `account.account` model to the search domain. However, in 18.0, commit [2] modified this field so that it is no longer stored. As a result, when a search domain includes this `non-stored` field, Odoo skips the domain evaluation and logs a error at code line [3]. Consequently, the changes introduced by commit [1] have no functional effect from 18.0. Also, starting from saas-18.3, passing such a non-stored field in a domain raises an explicit error at code line [4], instead of being silently ignored. This commit resolves the issue by introducing an SQL query that returns the account ids related to `record_id(account group id)` include `record_id` as `None`. [1]: https://github.com/odoo/enterprise/pull/100191 [2]: https://github.com/odoo/odoo/commit/854c3b27aa5476c208572f19e64f8f3364bfc381#diff-19ef5a530c506fdee93fe0d113e61946b87fae7dd2d360558da69c0014f766b2R114-R767 [3]: https://github.com/odoo/odoo/blob/71e86f38c7699aaea980c929c67835a3495edf55/odoo/osv/expression.py#L1166-L1174 [4]: https://github.com/odoo/odoo/blob/00517e9e085c6fa9e00bedb8aee122a60e407fea/odoo/orm/fields.py#L1201 sentry-7100657414 Forward-Port-Of: odoo/enterprise#103137
This update resolves an issue where users with limited sign rights couldn't access the sample template. The fix ensures that users can correctly create and manage sign items within the sample template, allowing them to test and utilize the sample document. This improves the user experience for those exploring the sign workflow.
Original PR description
**Issue** Users without 'Admin' Sign rights could in some cases not access the sample template. **Steps to reproduce** 1. Go to 'Templates' and archive the existing one in order to have the 'Try our…
**Issue** Users without 'Admin' Sign rights could in some cases not access the sample template. **Steps to reproduce** 1. Go to 'Templates' and archive the existing one in order to have the 'Try our sample document' shown and click on it. 2. Add some sign items to the template, and send it for a signature request. 3. With an user having only 'User: Own Templates' Sign rights, go to 'Templates' and click 'Try our sample document'. Access Error: Blame the following rules: - sign.item: group_sign_user: Create and manage template items **Cause** When the template has an associated sign request, it is copied. The problem is that the user currently doesn't have enough rights to create sign items for the copied template: https://github.com/odoo/enterprise/blob/2e8fb2ca274a0cf15d7b78a663bffe9cbb700153/sign/security/security.xml#L92-L101 **Change** Change the `user_id` of the new template to allow creating the sign items for it. opw-5254566 Forward-Port-Of: odoo/enterprise#105656 Forward-Port-Of: odoo/enterprise#102227
6 changes
Resolved issues and error corrections
This update fixes an inconsistent visual issue in the Field Service Report generated from the Bubble document layout. The report's tables had conflicting border styles, resulting in a jarring appearance. By adding a specific CSS class, the report now consistently uses rounded borders, improving its overall professionalism and readability.
Original PR description
Steps to reproduce: -------------------------------- 1. Install `industry_fsm_sale` module 2. Go to Settings > Configure Document Layout 3. Select the Bubble document layout and save 4. Open any…
Steps to reproduce: -------------------------------- 1. Install `industry_fsm_sale` module 2. Go to Settings > Configure Document Layout 3. Select the Bubble document layout and save 4. Open any Field Service task 5. Use the Products smart button to add one or more products 6. Click the Settings icon > Print > Field Service Report Observation: -------------------------------- In Time & Material tables using the Bubble layout, table borders show a mix of rounded corners and sharp edges, resulting in inconsistent visuals Issue: -------------------------------- The table tags in the report were missing the `table-borderless` class. As a result, the layout-applied rounded borders conflicted with the default table borders Solution: -------------------------------- Add the `table-borderless` class to the affected table tags so the tables inherit consistent rounded borders from the document layout Before: <img width="787" height="317" alt="before_css" src="https://github.com/user-attachments/assets/dac136a8-022a-4c36-8cdb-1c0fbb048f3e" /> After: <img width="816" height="372" alt="after_css" src="https://github.com/user-attachments/assets/b5f96e75-2cd3-44cf-89e3-9a3b564c8369" /> opw-5401612 Forward-Port-Of: odoo/enterprise#105616
This update ensures that a failure message is now correctly displayed when a quality check is marked as failed. Previously, the system didn't show the intended failure notification. The fix corrects a technical issue related to how the system handles quality check states, ensuring users receive the expected feedback.
Original PR description
*= quality_control, quality_mrp_workorder, mrp_workorder Currently, when a user fails a quality check using the quick-action button, the failure message defined for that quality control point isn’t…
*= quality_control, quality_mrp_workorder, mrp_workorder Currently, when a user fails a quality check using the quick-action button, the failure message defined for that quality control point isn’t shown. **Steps to produce:** * Install `Quality` and `Manufacturing` with demo data * Go to MRP > Configuration > Operations > Manual Assembly * Create a pass/fail quality point with a failure message * Create and confirm an MO for `Table Top` * Go to Shop Floor > Activate work centers if inactive > Manual Assembly * Fail the assembly using the quick-action button Replication video: [Link](https://drive.google.com/file/d/1gBHrvQEAavhjU4lS-bKQHQjAa9qDHj6-/view?usp=sharing) **Observed Behavior:** * No failure message is displayed when the quality check is failed. **Root cause:** * This happens because pressing the quick-action button triggers `failCheck` [1] , which calls `doActionNext` [2], which then runs the server function `action_fail_and_next` [3]. That function sets `quality_state = fail` and calls [4] to get the view. But since [3] wraps that view inside a dictionary, the check in [5] never passes, so the message never appears. **Solution:** * Pass the view correctly to display the failure message. Since the quick action already marks the quality state as failed we can hide the Confirm and Back buttons by passing the context and checking it in the view to show a single OK button, similar to earlier versions. **Before:** <img width="1673" height="813" alt="image" src="https://github.com/user-attachments/assets/029e347b-5f2c-463a-833e-3b55677137b6" /> **After:** <img width="1687" height="829" alt="image" src="https://github.com/user-attachments/assets/e4c85093-ea0d-44ca-bc9c-0fab5ac08fbc" /> [1]: https://github.com/odoo/enterprise/blob/59c06537d82fedd1916b7aeb808dc73904f6a751/quality_mrp_workorder/static/src/mrp_display/quality_check.js#L83-L86 [2]: https://github.com/odoo/enterprise/blob/59c06537d82fedd1916b7aeb808dc73904f6a751/mrp_workorder/static/src/mrp_display/mrp_record_line/quality_check.js#L147-L163 [3]: https://github.com/odoo/enterprise/blob/59c06537d82fedd1916b7aeb808dc73904f6a751/quality_mrp_workorder/models/quality.py#L86-L89 [4]: https://github.com/odoo/enterprise/blob/59c06537d82fedd1916b7aeb808dc73904f6a751/quality_mrp_workorder/models/quality.py#L48-L68 [5]: https://github.com/odoo/enterprise/blob/19.0/mrp_workorder/static/src/mrp_display/mrp_record_line/quality_check.js#L154-L161 opw-5403465 Forward-Port-Of: odoo/enterprise#102095
This update resolves an issue where journal items displayed in general ledger reports were incorrectly linked to account groups. The problem stemmed from a change in Odoo 18.0 that prevented a previous fix from working. The update now uses a more robust SQL query to accurately retrieve the correct account IDs, ensuring correct reporting.
Original PR description
Currently journal items shown don't belong to the account group that they should belong to, and from saas-18.3 an error will be generated after following the below steps or step mentioned in ref PR…
Currently journal items shown don't belong to the account group that they should belong to, and from saas-18.3 an error will be generated after following the below steps or step mentioned in ref PR [1]. - Install `Accounting (accountant)` with demo data - Create account groups e.g., name as `Test 1` and code prefix `1 to 1` - Go to the general ledger report - Click on `Journal Items` of the account group line `1 Test 1` Error from saas-18.3: `ValueError: Cannot convert account.account.group_id to SQL because it is ...` This error occurs because PR with ref [1] in 17.0 added the` group_id` field of the `account.account` model to the search domain. However, in 18.0, commit [2] modified this field so that it is no longer stored. As a result, when a search domain includes this `non-stored` field, Odoo skips the domain evaluation and logs a error at code line [3]. Consequently, the changes introduced by commit [1] have no functional effect from 18.0. Also, starting from saas-18.3, passing such a non-stored field in a domain raises an explicit error at code line [4], instead of being silently ignored. This commit resolves the issue by introducing an SQL query that returns the account ids related to `record_id(account group id)` include `record_id` as `None`. [1]: https://github.com/odoo/enterprise/pull/100191 [2]: https://github.com/odoo/odoo/commit/854c3b27aa5476c208572f19e64f8f3364bfc381#diff-19ef5a530c506fdee93fe0d113e61946b87fae7dd2d360558da69c0014f766b2R114-R767 [3]: https://github.com/odoo/odoo/blob/71e86f38c7699aaea980c929c67835a3495edf55/odoo/osv/expression.py#L1166-L1174 [4]: https://github.com/odoo/odoo/blob/00517e9e085c6fa9e00bedb8aee122a60e407fea/odoo/orm/fields.py#L1201 sentry-7100657414 Forward-Port-Of: odoo/enterprise#103137
This update resolves an error that prevented non-employee users from creating expenses linked to uploaded documents. The issue stemmed from a required field ('employee_id') not being populated correctly. The fix now displays a user-friendly error message instead of crashing, ensuring a smoother experience for all users.
Original PR description
Currently an exception is generated when the non-employee user tries
to generate expenses from the documents.
Steps to produce an error:
- Install the `documents_hr_expense` module without demo data
- Delete employee `Administrator`
- Upload any PDF/image file inside the company's `Internal` folder
- Click on the uploaded document and click on the `Create an Expense` button
Error: `ValueError: NotNullViolation('null value in column "employee_id" of ...`
This error occurs because `employee_id` is required when creating an
expense. Since the current user is not linked to an employee record,
`employee_id is` set to false, which causes the issue.
This commit resolves the issue by raising a `UserError` when the current
user is not linked to an employee.
sentry-7192984733
Forward-Port-Of: odoo/enterprise#104966
Forward-Port-Of: odoo/enterprise#104762This update fixes an issue where Modelo 390 reports for past years were generating empty BOE files. The fix ensures the report correctly uses the specified year's data, resolving a discrepancy between the report and the actual tax information. This improves the accuracy of tax reporting for Spanish companies.
Original PR description
### Issue: When exporting Modelo 390 reports for a past year, the BOE file was empty — all values were 0 ### Cause: In `export_boe()`, the `report_lines` were get based on the `section_report`…
### Issue: When exporting Modelo 390 reports for a past year, the BOE file was empty — all values were 0 ### Cause: In `export_boe()`, the `report_lines` were get based on the `section_report` options However, `section_reports` do not store the date or return periodicity of the selected report As a result, using their options always fetched data for the current period instead of the specified year ### Note: `_generate_mod_390_page2()` also had issues: some lines were missing or incorrectly indexed The mod 360 format, it strict in the structure with specific index so it may produce invalid documents The latest documentation for mod 390: https://sede.agenciatributaria.gob.es/static_files/Sede/Disenyo_registro/DR_300_399/archivos_25/dr390e2025.xlsx ### Steps to reproduce: - Install `l10n_es_reports` and switch to ES Company - Create an Invoice and a Bill (Any product, Price: 100.00, Tax: 21%, Invoice Date: 01/01/2025) - Open Tax Return, switch to Mod 390, and set year to 2025 - You should see data in the 2 first sections - Use the gear icon, and download the BOE - Use the gear icon to download the BOE, fill the wizard (Natural Person – Name: Test, Principal activity: Test, Activity Code: 12345), and generate the file Before the fix: all values in the BOE were 0 instead of matching the report opw-5457374 Forward-Port-Of: odoo/enterprise#106676 Forward-Port-Of: odoo/enterprise#104928
This update simplifies the sales order reporting for subscription customers. The 'remaining hours' field, which could be misleading due to the recurring nature of subscriptions, has been hidden. This ensures a clearer and more intuitive experience for our customers and reduces potential confusion.
Original PR description
This change hides the `remaining_hours_so` field when the sales order line is linked to a subscription. Unlike standard service or time-based sales orders, where this field reflects the difference between the quantity ordered and the quantity delivered, the concept does not translate well to subscription logic. In the context of a subscription, the service is delivered on a recurring period (monthly, yearly, etc.). Delivery quantities continuously accumulate over time, and because the subscription renews indefinitely until cancellation, the “remaining hours” calculation quickly becomes misleading. In many cases it can drift into negative values, giving the impression of an error or over-consumption when, in reality, the subscription is simply following its recurring delivery cycle. To avoid confusing end-users and to maintain a clean, intuitive interface, we hide this field whenever the line is part of a subscription. opw-5246238 Forward-Port-Of: odoo/enterprise#99813
19 changes
Resolved issues and error corrections
This update ensures that invoice dates sent to ECPay (a payment processor) are formatted correctly for Taiwan's time zone. Previously, dates were stored in UTC, causing errors when ECPay searched for invoices. This fix resolves a critical issue preventing successful invoice processing and ensures accurate record-keeping.
Original PR description
sending to ECPay The date store in Odoo is in utc format, we need to convert it to tw time when sending the date to ECPay. The APIs are using the date to search for the invoices, if the date is not correct, it cannot find the invoices and return error. task-5884616 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246039
This update fixes an issue where the Product ConfiguratorPopup in the Point of Sale module wasn't showing the correct price from the configured pricelist. The fix ensures that the pricelist price is now displayed, providing accurate pricing information to users during product selection. This improves the user experience and prevents pricing discrepancies.
Original PR description
Steps to reproduce: - Configure POS → enable Allow Flexible Pricelist and assign the Default pricelist. - Create product A with variants. - Add product A to the Default pricelist. - Set a fixed price…
Steps to reproduce: - Configure POS → enable Allow Flexible Pricelist and assign the Default pricelist. - Create product A with variants. - Add product A to the Default pricelist. - Set a fixed price for product A in that pricelist. - Open POS session. - Select product A in POS. Observation: - In ProductConfiguratorPopup dialog, pricelist price is not considered Cause: - After this [commit](https://github.com/odoo/odoo/commit/5e77c14912324bf967a55a1a40bb01071eca5c8b) the text appears from `get title()` method, which do not consider pricelist Fix: - we now consider pricelist for displaying title. **Before** <table> <tr> <td> <img width="400" height="300" alt="image" src="https://github.com/user-attachments/assets/6faac3e4-a579-41db-a2ad-fdc9c24e422f" /> </td> <td> <img width="400" height="300" alt="image" src="https://github.com/user-attachments/assets/14035707-aa23-4fb3-97d7-d0ce2f6e6b46" /> </td> </tr> </table> **After** <img width="340" height="225" alt="image" src="https://github.com/user-attachments/assets/3beeaf76-fc1a-42a5-9f3c-dabc43389d36" /> opw-5270319 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#237899
This update resolves an issue where emails couldn't be sent to applicants who had been archived in the recruitment system. The fix ensures that archived applicants are correctly included when sending emails, preventing a disruption in the applicant notification process. This improves the reliability of our recruitment workflow.
Original PR description
Version: - 17.0 Steps to reproduce: - Create an applicant. - Archive the applicant. - Select the archived applicant. - Click the Send Email action. Issue: - Unable to Send Emails to Refused Applicants Cause: - The applicant_ids many2many field does not include archived applicants. Because of this, when an applicant is archived, the field becomes empty. Solution: - Add active_test to the field context. Task - 5786195 Forward-Port-Of: odoo/odoo#244691
This update replaces a real tax ID placeholder in the base_vat module for Turkey. This change prevents users from inadvertently using the placeholder for actual tax submissions, ensuring data integrity and compliance. It’s a minor update focused on security and accuracy.
Original PR description
The previous placeholder used a real tax ID. Replacing it with a dummy prevents users from using it to submit transactions. task-5441218 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247454 Forward-Port-Of: odoo/odoo#242189
This update resolves an issue where users were unexpectedly logged out when viewing images through certain security proxies (like Cisco Secure Email). The fix disables automatic session saving for image requests, preventing Odoo from creating a new session and triggering the logout. This ensures smoother operation with Firefox and other browsers.
Original PR description
## Problem A logout occurs when an image in the chatter is requested through a third-party security proxy (like Cisco Secure Email or Microsoft SafeLinks) via a boomerang redirect following this…
## Problem
A logout occurs when an image in the chatter is requested through a third-party security proxy (like Cisco Secure Email or Microsoft SafeLinks) via a boomerang redirect following this flow:
- A user (Person A) opens an Odoo record. The chatter contains an image previously sent by a correspondent (Person B) whose email client or mail server rewrote the image URL to point to a security proxy.
- Firefox tries to load the image. The URL points to `cisco.com/...`. (for example)
- The proxy scans the link and redirects the browser back to the original Odoo URL: `odoo.com/web/image/...`.
- Firefox follows the strict (now deprecated) `rfc6265bis` rule: it looks at the whole redirect chain.
Since it sees a cross-site hop (cisco.com), it flags the final request as cross-site.
-> Because Odoo's session_id is `SameSite=Lax`, Firefox refuses to send
the cookie on this "false" redirect
- Odoo receives the request at `/web/image` without a session_id.
- Odoo creates a new, empty session to process the request.
- At the end of the request, because save_session is True by default, Odoo sends a `Set-Cookie: session_id=NEW_EMPTY_ID` header in the response.
- The browser receives this `Set-Cookie` header, and this time *applies a different policy*: it considers the header as same-origin, allowing it to overwrite the previously valid session cookie with this new one that corresponds to a fresh, unauthenticated session.
- The user is instantly logged out of their current Odoo tab.
## Context on Web Compatibility
This "redirect chain consideration" was a controversial part of the `RFC6265bis` draft.
Chrome and Safari never fully implemented it because telemetry showed it broke ~1% of the web. In March 2024, the HTTP Working Group (HTTPWG) officially decided to remove this requirement from the spec (reverting to a more permissive model) because it was deemed not web-compatible. Firefox, however, still enforces this strict behavior in many versions.
## How to we fix this
We set `routing={'save_session': False}` on the `/web/image controller`.
- This prevents Odoo from sending the `Set-Cookie` header if the session is dirty or new.
- Even if Firefox sends the request without a cookie, Odoo won't "reply" with a new session ID.
- The user's legitimate session cookie remains untouched in the browser.
## Sources
- HTTPWG Decision (March 2024): https://github.com/httpwg/http-extensions/issues/2104
- Reverting RFC6265bis: https://github.com/httpwg/http-extensions/pull/2750
opw-5184217
opw-4698750
opw-5166151
Forward-Port-Of: odoo/odoo#242582
Forward-Port-Of: odoo/odoo#242061This update simplifies sales order reporting for subscription customers. The ‘remaining hours’ field, which could be misleading due to recurring delivery cycles, has been hidden when a sales order is linked to a subscription. This ensures a clearer and more accurate view of service consumption for our subscribers.
Original PR description
This change hides the remaining_hours_so field when the sales order line is linked to a subscription. Unlike standard service or time-based sales orders, where this field reflects the difference between the quantity ordered and the quantity delivered, the concept does not translate well to subscription logic. In the context of a subscription, the service is delivered on a recurring period (monthly, yearly, etc.). Delivery quantities continuously accumulate over time, and because the subscription renews indefinitely until cancellation, the “remaining hours” calculation quickly becomes misleading. In many cases it can drift into negative values, giving the impression of an error or over-consumption when, in reality, the subscription is simply following its recurring delivery cycle. To avoid confusing end-users and to maintain a clean, intuitive interface, we hide this field whenever the line is part of a subscription. opw-5246238 Forward-Port-Of: odoo/odoo#241099
This update resolves a previous issue where switching between invoice and credit note types on already-posted transactions caused errors. Now, users can switch these types without needing to export, delete, and re-import documents, streamlining the accounting process. This change improves user experience and reduces potential data loss.
Original PR description
Previously, switching an Invoice to a Credit Note (or vice versa) on a posted in_()/out_() move raised a blocking error. This forced users to export, delete, and re-import the document with the correct move type. This **PR** relaxes the restriction for posted moves whose sequence has been manually cleared, allowing the `Switch Invoice/Credit Note` action to proceed in that specific case. **task**-5905206 Forward-Port-Of: odoo/odoo#247349
This update fixes an error that occurred during upgrades of Odoo 18.3, specifically when upgrading stock modules. The fix ensures warehouses have the necessary 'Production location' to prevent upgrade failures, drawing on a previously used function from the MRP module. This improves upgrade stability.
Original PR description
The warehouses need at least a Production location[^2] to avoid triggering an error, but they are not considered a missing location. The function is borrowed from the `mrp` module[^mrp]. This error was found during upgrades. To reproduce: - In 17, install repair and don't install mrp. - Archive the production locations. - Upgrade to 18. - It will trigger an error[^1] while upgrading stock. [^1]:https://github.com/odoo/upgrade/blob/b46cf7ea8770c5d428ea3d569148eb76d16903b9/migrations/stock/saas~17.3.1.1/end-migrate.py#L16 [^2]:https://github.com/odoo/odoo/blob/ab3c2d52bcaee516eae319ccd20088eb48c819f1/addons/repair/models/stock_warehouse.py#L67 [^mrp]:https://github.com/odoo/odoo/blob/ab3c2d52bcaee516eae319ccd20088eb48c819f1/addons/mrp/models/stock_warehouse.py#L278-L283 Forward-Port-Of: odoo/odoo#245805
This update fixes an issue where month names were incorrectly displaying based on the user's locale instead of the Odoo environment's language. This ensures month names are consistently shown in the correct language for each user, improving the user experience. The change impacts several HR and accounting modules.
Original PR description
Month name is using the locale language instead of the env language Get month name in the env language Enterprise PR: odoo/enterprise#106175 Task [link](https://www.odoo.com/odoo/project.task/5902364) task-5902364 Forward-Port-Of: odoo/odoo#247489 Forward-Port-Of: odoo/odoo#246790
This update corrects a bug where a duplicate skill was incorrectly added to an employee's resume after a validation error occurred during skill selection. The fix ensures that changes made during the validation process are properly discarded, preventing unintended skill additions and maintaining data integrity.
Original PR description
Steps to reproduce: --------------------------------- 1. Install `hr_skills` module 2. Open the Employees app and open any employee record 3. Go to the Resume tab 4. In the Skills section, click Add…
Steps to reproduce: --------------------------------- 1. Install `hr_skills` module 2. Open the Employees app and open any employee record 3. Go to the Resume tab 4. In the Skills section, click Add for any skill type 5. Select a skill that is already added to the resume 6. Click Save & Close in the Select Skills wizard 7. A validation error is displayed, click Close 8. Close the Select Skills wizard. Observation: --------------------------------- After closing the wizard, another default skill is added to the resume even though a validation error was raised. Issue: --------------------------------- In the following code: https://github.com/odoo/odoo/blob/57c1c510425dcd491c794a0262063db398348640/addons/hr_skills/static/src/fields/skills_one2many/skills_one2many.js#L79-L82 During record save, the validation error scenario was not handled properly. When a validation error occurred, changes made to the virtual record were not discarded, causing the initial (invalid) changes to be incorrectly retained instead of being rolled back Solution: --------------------------------- When a validation error occurs while adding a skill, discard all changes made to the virtual record before throwing the error. This ensures that no unintended skill is added. opw-5423196 Forward-Port-Of: odoo/odoo#247464 Forward-Port-Of: odoo/odoo#240697
This update optimizes the process of exporting financial data (FEC) from large Odoo databases. Previously, the export generated extremely large files, leading to memory issues. Now, the system streams the data directly to the user, preventing memory overload and improving export speeds for extensive transactions.
Original PR description
On large databases (millions of account moves), The FEC exported file can be huge. This resulted in memory error since at some point we have the entire file in memory. This commit aims to overcome this issue by streaming the content of the file to the user. task-5404142 Forward-Port-Of: odoo/odoo#246005 Forward-Port-Of: odoo/odoo#240981
This update fixes a misconfiguration in the Italian tax settings. The 0% EU S tax code was incorrectly assigned. This change ensures the correct code is used based on whether the transaction is for goods or services, aligning with Italian tax regulations and improving accuracy.
Original PR description
In Italy, the code depends strictly on whether the transaction is for Goods or Services. N3.2 is for Intra-community supply of GOODS (Cessioni Intracomunitarie di beni) N2.1 is for Intra-community supply of SERVICES (Prestazioni di Servizi) This commit fixes the exoneration code on the 0% EU S tax from N3.2 to N2.1. task-5870894 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247144 Forward-Port-Of: odoo/odoo#245675
This update fixes a visual inconsistency in the Field Service Report generated from the Bubble document layout. Previously, table borders appeared with mixed rounded and sharp edges. The fix adds a class to the table tags, ensuring consistent rounded borders and a cleaner, more professional look for the report. This improves the overall presentation of field service data.
Original PR description
Steps to reproduce: -------------------------------- 1. Install `industry_fsm_sale` module 2. Go to Settings > Configure Document Layout 3. Select the Bubble document layout and save 4. Open any…
Steps to reproduce: -------------------------------- 1. Install `industry_fsm_sale` module 2. Go to Settings > Configure Document Layout 3. Select the Bubble document layout and save 4. Open any Field Service task 5. Use the Products smart button to add one or more products 6. Click the Settings icon > Print > Field Service Report Observation: -------------------------------- In Time & Material tables using the Bubble layout, table borders show a mix of rounded corners and sharp edges, resulting in inconsistent visuals Issue: -------------------------------- The table tags in the report were missing the `table-borderless` class. As a result, the layout-applied rounded borders conflicted with the default table borders Solution: -------------------------------- Add the `table-borderless` class to the affected table tags so the tables inherit consistent rounded borders from the document layout Before: <img width="787" height="317" alt="before_css" src="https://github.com/user-attachments/assets/dac136a8-022a-4c36-8cdb-1c0fbb048f3e" /> After: <img width="816" height="372" alt="after_css" src="https://github.com/user-attachments/assets/b5f96e75-2cd3-44cf-89e3-9a3b564c8369" /> opw-5401612 Forward-Port-Of: odoo/enterprise#105616
This update fixes an issue where the barcode scanning process wasn't correctly creating quality checks for products tracked by lot. The change ensures that each unique lot within a receipt triggers a separate quality check, improving inventory accuracy and quality control processes. This resolves a discrepancy in how the system was generating quality checks when using the 'Put-In-Pack' feature.
Original PR description
**Steps to reproduce:** * Install the `stock_barcode`, `quality_control` modules. * Go to *Inventory > Configuration > Settings* and enable **Packages**. * Create a product with **By Lot** tracking…
**Steps to reproduce:** * Install the `stock_barcode`, `quality_control` modules. * Go to *Inventory > Configuration > Settings* and enable **Packages**. * Create a product with **By Lot** tracking enabled and set a barcode reference. * Create a quality control point for this product with following configuration: * Operation: *Receipts* * Control per: *Quantity* * Control Frequency: *All* * Product: the previously created lot-tracked product. * Create a receipt for this product with a quantity of 6 and `mark as todo`. * Open the *Barcode* app and process the receipt. * Scan the product barcode. * Scan some quantity of the product with lot *LOT01* and put those units into a package(Put-In-Pack). * Scan the remaining quantity with lot *LOT02* and put those units into a different package(Put-In-Pack). * Click on **Quality Checks**. **Observed behavior:** * Only one quality check is created, even though the receipt contains two different lots that should each generate a quality check. **Cause:** * In `_inverse_qty_done`, move lines are marked as *picked* when `qty_done` is equal to quantity(Demand). * During the `write` operation, quality checks are created only for move lines that are not picked, which prevents creating a quality check for each lot. * Relevant code: https://github.com/odoo/enterprise/blob/464dc0c65548f3f440b293b534616743ddd5e130/quality_control/models/stock_move_line.py#L39 https://github.com/odoo/enterprise/blob/464dc0c65548f3f440b293b534616743ddd5e130/stock_barcode/models/stock_move_line.py#L67-L71 **Fix:** * Ensure that quality check points are generated correctly when validating products through the Barcode app using the Put in Pack option. --- opw-5405221 Forward-Port-Of: odoo/enterprise#105535 Forward-Port-Of: odoo/enterprise#102714
This update resolves an error that prevented correct journal item links from appearing in the general ledger reports, specifically within Odoo Enterprise version 18.3. The issue stemmed from a change in how Odoo handles data fields, and this fix ensures that the reports now accurately display the correct account groups for journal items.
Original PR description
Currently journal items shown don't belong to the account group that they should belong to, and from saas-18.3 an error will be generated after following the below steps or step mentioned in ref PR…
Currently journal items shown don't belong to the account group that they should belong to, and from saas-18.3 an error will be generated after following the below steps or step mentioned in ref PR [1]. - Install `Accounting (accountant)` with demo data - Create account groups e.g., name as `Test 1` and code prefix `1 to 1` - Go to the general ledger report - Click on `Journal Items` of the account group line `1 Test 1` Error from saas-18.3: `ValueError: Cannot convert account.account.group_id to SQL because it is ...` This error occurs because PR with ref [1] in 17.0 added the` group_id` field of the `account.account` model to the search domain. However, in 18.0, commit [2] modified this field so that it is no longer stored. As a result, when a search domain includes this `non-stored` field, Odoo skips the domain evaluation and logs a error at code line [3]. Consequently, the changes introduced by commit [1] have no functional effect from 18.0. Also, starting from saas-18.3, passing such a non-stored field in a domain raises an explicit error at code line [4], instead of being silently ignored. This commit resolves the issue by introducing an SQL query that returns the account ids related to `record_id(account group id)` include `record_id` as `None`. [1]: https://github.com/odoo/enterprise/pull/100191 [2]: https://github.com/odoo/odoo/commit/854c3b27aa5476c208572f19e64f8f3364bfc381#diff-19ef5a530c506fdee93fe0d113e61946b87fae7dd2d360558da69c0014f766b2R114-R767 [3]: https://github.com/odoo/odoo/blob/71e86f38c7699aaea980c929c67835a3495edf55/odoo/osv/expression.py#L1166-L1174 [4]: https://github.com/odoo/odoo/blob/00517e9e085c6fa9e00bedb8aee122a60e407fea/odoo/orm/fields.py#L1201 sentry-7100657414 Forward-Port-Of: odoo/enterprise#103137
This fix resolves an issue where Modelo 390 reports for past years were incorrectly generating empty BOE files. The update ensures the report period is correctly identified, pulling accurate data for the specified year. This guarantees accurate tax reporting for Spanish businesses.
Original PR description
### Issue: When exporting Modelo 390 reports for a past year, the BOE file was empty — all values were 0 ### Cause: In `export_boe()`, the `report_lines` were get based on the `section_report`…
### Issue: When exporting Modelo 390 reports for a past year, the BOE file was empty — all values were 0 ### Cause: In `export_boe()`, the `report_lines` were get based on the `section_report` options However, `section_reports` do not store the date or return periodicity of the selected report As a result, using their options always fetched data for the current period instead of the specified year ### Note: `_generate_mod_390_page2()` also had issues: some lines were missing or incorrectly indexed The mod 360 format, it strict in the structure with specific index so it may produce invalid documents The latest documentation for mod 390: https://sede.agenciatributaria.gob.es/static_files/Sede/Disenyo_registro/DR_300_399/archivos_25/dr390e2025.xlsx ### Steps to reproduce: - Install `l10n_es_reports` and switch to ES Company - Create an Invoice and a Bill (Any product, Price: 100.00, Tax: 21%, Invoice Date: 01/01/2025) - Open Tax Return, switch to Mod 390, and set year to 2025 - You should see data in the 2 first sections - Use the gear icon, and download the BOE - Use the gear icon to download the BOE, fill the wizard (Natural Person – Name: Test, Principal activity: Test, Activity Code: 12345), and generate the file Before the fix: all values in the BOE were 0 instead of matching the report opw-5457374 Forward-Port-Of: odoo/enterprise#106676 Forward-Port-Of: odoo/enterprise#104928
This update resolves an error that prevented non-employee users from creating expenses from documents. The issue stemmed from a required field ('employee_id') not being populated correctly. The fix now displays a user-friendly error message instead of crashing, ensuring a smoother experience for all users.
Original PR description
Currently an exception is generated when the non-employee user tries
to generate expenses from the documents.
Steps to produce an error:
- Install the `documents_hr_expense` module without demo data
- Delete employee `Administrator`
- Upload any PDF/image file inside the company's `Internal` folder
- Click on the uploaded document and click on the `Create an Expense` button
Error: `ValueError: NotNullViolation('null value in column "employee_id" of ...`
This error occurs because `employee_id` is required when creating an
expense. Since the current user is not linked to an employee record,
`employee_id is` set to false, which causes the issue.
This commit resolves the issue by raising a `UserError` when the current
user is not linked to an employee.
sentry-7192984733
Forward-Port-Of: odoo/enterprise#104966
Forward-Port-Of: odoo/enterprise#104762This update simplifies the sales order reporting for subscription customers. The ‘remaining hours’ field, which could be misleading due to the recurring nature of subscriptions, has been hidden when a line is linked to a subscription. This ensures a clearer and more intuitive experience for our customers.
Original PR description
This change hides the `remaining_hours_so` field when the sales order line is linked to a subscription. Unlike standard service or time-based sales orders, where this field reflects the difference between the quantity ordered and the quantity delivered, the concept does not translate well to subscription logic. In the context of a subscription, the service is delivered on a recurring period (monthly, yearly, etc.). Delivery quantities continuously accumulate over time, and because the subscription renews indefinitely until cancellation, the “remaining hours” calculation quickly becomes misleading. In many cases it can drift into negative values, giving the impression of an error or over-consumption when, in reality, the subscription is simply following its recurring delivery cycle. To avoid confusing end-users and to maintain a clean, intuitive interface, we hide this field whenever the line is part of a subscription. opw-5246238 Forward-Port-Of: odoo/enterprise#99813
This update automatically generates unique employee IDs and sets the initial marital status to a person's birthday if they are single. This simplifies data entry and ensures more accurate employee records within the CH payroll module, enhancing the overall user experience.
Original PR description
For quality of life improvement, the unique employee identification is now automatically generated and initial marital status date is set to the birthday by default if the person is single Forward-Port-Of: odoo/enterprise#106752
1 change
Resolved issues and error corrections
This update resolves an issue where journal items displayed in general ledger reports were incorrectly linked to account groups. The fix ensures accurate reporting by modifying the SQL query to correctly retrieve related account IDs, addressing a problem introduced in a previous update. This prevents a 'ValueError' from occurring.
Original PR description
Currently journal items shown don't belong to the account group that they should belong to, and from saas-18.3 an error will be generated after following the below steps or step mentioned in ref PR…
Currently journal items shown don't belong to the account group that they should belong to, and from saas-18.3 an error will be generated after following the below steps or step mentioned in ref PR [1]. - Install `Accounting (accountant)` with demo data - Create account groups e.g., name as `Test 1` and code prefix `1 to 1` - Go to the general ledger report - Click on `Journal Items` of the account group line `1 Test 1` Error from saas-18.3: `ValueError: Cannot convert account.account.group_id to SQL because it is ...` This error occurs because PR with ref [1] in 17.0 added the` group_id` field of the `account.account` model to the search domain. However, in 18.0, commit [2] modified this field so that it is no longer stored. As a result, when a search domain includes this `non-stored` field, Odoo skips the domain evaluation and logs a error at code line [3]. Consequently, the changes introduced by commit [1] have no functional effect from 18.0. Also, starting from saas-18.3, passing such a non-stored field in a domain raises an explicit error at code line [4], instead of being silently ignored. This commit resolves the issue by introducing an SQL query that returns the account ids related to `record_id(account group id)` include `record_id` as `None`. [1]: https://github.com/odoo/enterprise/pull/100191 [2]: https://github.com/odoo/odoo/commit/854c3b27aa5476c208572f19e64f8f3364bfc381#diff-19ef5a530c506fdee93fe0d113e61946b87fae7dd2d360558da69c0014f766b2R114-R767 [3]: https://github.com/odoo/odoo/blob/71e86f38c7699aaea980c929c67835a3495edf55/odoo/osv/expression.py#L1166-L1174 [4]: https://github.com/odoo/odoo/blob/00517e9e085c6fa9e00bedb8aee122a60e407fea/odoo/orm/fields.py#L1201 sentry-7100657414 Forward-Port-Of: odoo/enterprise#103137
6 changes
Enhancements to existing features
This update moves project budgets from the side panel to the dashboard's top menu, streamlining access for users. This change simplifies the dashboard and focuses attention on profitability, while also providing direct access to budget information. It improves the user experience for managing project budgets.
Original PR description
Before: Budgets and milestones were located in the project's right-side panel. After: Budgets are now accessible from the dashboard's top menu, providing a cleaner side panel focused on profitability and direct access to the budget list view. Task-5164128
This update refines the design of wizards used in the l10n_mx_edi module, specifically addressing the unnecessary storage of data within the database. By removing persistent storage, we've streamlined the process and improved the overall efficiency of these key workflows.
Original PR description
It's a wizard, we should not store it permanently in db.
Resolved issues and error corrections
This update fixes an issue where the Kanban view for manufacturing orders was incorrectly displaying all active orders instead of those related to the selected operation type. The change was caused by a removal of a context key in the Odoo 19.0 release, leading to a domain filter that didn't properly restrict results. Now, the Kanban view accurately filters manufacturing orders by the chosen operation type.
Original PR description
**Steps to reproduce:** * Install the *stock_barcode_mrp* module. * Go to *Inventory* ‣ *Configuration* ‣ *Operation Types*. * Create two operation types with *Type of Operation* set to…
**Steps to reproduce:**
* Install the *stock_barcode_mrp* module.
* Go to *Inventory* ‣ *Configuration* ‣ *Operation Types*.
* Create two operation types with *Type of Operation* set to *Manufacturing*.
* Create two manufacturing orders.
* In each manufacturing order, under the *Miscellaneous* tab
set a different *Operation Type* created above.
* Ensure sufficient *On Hand Quantity* exists for a product used in manufacturing.
* Open the *Barcode* application.
* Open one of the created manufacturing operation types.
**Observed behavior:**
* The kanban view displays **all** manufacturing orders whose picking
types are active, instead of only those related to the selected operation type.
**Cause:**
* In 19.0, the context key *`'search_default_picking_type_id': self.id`* was removed
from `_get_action` function in this [commit](https://github.com/odoo/odoo/commit/9ed7109b8f11260084374f2d7fa7073a9ad3c240)
* Previously, this context value restricted results to the current picking type by default.
* The method `get_action_picking_tree_ready_kanban` in *stock_barcode_mrp*
now overrides the domain with only *`('picking_type_id.active', '=', True)`*.
* This domain checks that the picking type is active but does not filter by
the selected picking type, causing unrelated MOs to be shown.
**Fix:**
* This ensures only manufacturing orders belonging to
the selected operation type are displayed.
---
opw-5819358
Forward-Port-Of: odoo/enterprise#105327This update prevents subscription discounts from being reset when the subscription's start date or plan is changed. Previously, date changes triggered a recalculation that wiped out manually entered commercial discounts. Now, the system checks if the line items have actually changed before recalculating discounts, ensuring user-defined discounts are maintained.
Original PR description
Before this commit, changing the `start_date` or `plan_id` on a Subscription would trigger a recomputation of the `discount` field on all order lines. This triggered the standard `_compute_discount`…
Before this commit, changing the `start_date` or `plan_id` on a Subscription would trigger a recomputation of the `discount` field on all order lines. This triggered the standard `_compute_discount` method, which recalculates the price and discount based on the Pricelist, effectively wiping out any manually entered commercial discounts. This occurred because the `_compute_discount` method in `sale_subscription` depends on `order_id.start_date` to calculate pro-rated amounts for upsells. However, it was unconditionally calling `super()`, which runs the standard pricelist logic even when the line content itself (Product, Qty) had not changed. This commit introduces a check to detect if the line content has actually been modified by the user (comparing against the database origin). - If the line content (Product, Qty, UoM) is unchanged, we skip the `super()` call to preserve the manual discount. - If the line content is changed (or it is a new line), we allow `super()` to run to update the price according to the pricelist. This ensures that contextual changes (like shifting the start date) do not destroy manual data entered on the lines. task: 5788384
This update simplifies how Odoo identifies downpayments by moving the related field from a custom 'is_downpayment' field to the 'display_type'. Previously, this required complex overrides across multiple modules, leading to potential instability. This change ensures downpayment logic is more reliable and easier to maintain.
Original PR description
*: helpdesk_sale_timesheet, industry_fsm_sale, l10n_mx_edi_landing, l10n_pe_edi, sale_external_tax, sale_subscription, --- Description of the issue this commit addresses: Currently the detection of whether a line (account move, sale order, purchase order) or a move is a downpayement relies on a `is_downpayment` field one the lines models. This creates complexity as overridable methods are put on account models so that when other module with downpayments are installed, they get overriden and the downpayment behavior is implemented. This means that the account module always calls those helper just in case of if one of those modules is installed. --- Desired behavior after this commit is merged: This commit migrates the `is_downpayment` field to a new value for the `display_type` field so that checking for downpayment doesn't rely on whether some other module is installed. --- Odoo PR: https://github.com/odoo/odoo/pull/246933 task-5871102
A recent error on the payment page when using Avatax with point of sale (POS) has been resolved. This was caused by an outdated method that no longer existed. The fix simply removed the problematic code, ensuring smooth payment processing.
Original PR description
Step to reproduce: - configure pos for Avatax from settings - open pos and settle a order - notice a error message on payment page Cause: - error is due to usage of `replaceDataByKey` which is removed in [1] [1] https://github.com/odoo/odoo/commit/3e94fe90ded58d498f0098cd9ed8679cbe500b8f Fix: - we removed the method as now we do not rely on it. opw-5089351 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/enterprise#106135 Forward-Port-Of: odoo/enterprise#102101
3 changes
Resolved issues and error corrections
This update fixes a visual inconsistency in the Field Service Report generated from the Bubble document layout. Previously, table borders appeared with mixed rounded and sharp edges. The fix adds a consistent border style to the tables, ensuring a cleaner and more professional appearance for this report.
Original PR description
Steps to reproduce: -------------------------------- 1. Install `industry_fsm_sale` module 2. Go to Settings > Configure Document Layout 3. Select the Bubble document layout and save 4. Open any…
Steps to reproduce: -------------------------------- 1. Install `industry_fsm_sale` module 2. Go to Settings > Configure Document Layout 3. Select the Bubble document layout and save 4. Open any Field Service task 5. Use the Products smart button to add one or more products 6. Click the Settings icon > Print > Field Service Report Observation: -------------------------------- In Time & Material tables using the Bubble layout, table borders show a mix of rounded corners and sharp edges, resulting in inconsistent visuals Issue: -------------------------------- The table tags in the report were missing the `table-borderless` class. As a result, the layout-applied rounded borders conflicted with the default table borders Solution: -------------------------------- Add the `table-borderless` class to the affected table tags so the tables inherit consistent rounded borders from the document layout Before: <img width="787" height="317" alt="before_css" src="https://github.com/user-attachments/assets/dac136a8-022a-4c36-8cdb-1c0fbb048f3e" /> After: <img width="816" height="372" alt="after_css" src="https://github.com/user-attachments/assets/b5f96e75-2cd3-44cf-89e3-9a3b564c8369" /> opw-5401612 Forward-Port-Of: odoo/enterprise#105616
This update fixes an issue where failure messages weren't shown when a quality check was marked as failed. The change ensures that the correct failure message appears immediately after a quality check is marked as failed, improving user feedback and process clarity. This was achieved by correctly passing the view to display the failure message.
Original PR description
*= quality_control, quality_mrp_workorder, mrp_workorder Currently, when a user fails a quality check using the quick-action button, the failure message defined for that quality control point isn’t…
*= quality_control, quality_mrp_workorder, mrp_workorder Currently, when a user fails a quality check using the quick-action button, the failure message defined for that quality control point isn’t shown. **Steps to produce:** * Install `Quality` and `Manufacturing` with demo data * Go to MRP > Configuration > Operations > Manual Assembly * Create a pass/fail quality point with a failure message * Create and confirm an MO for `Table Top` * Go to Shop Floor > Activate work centers if inactive > Manual Assembly * Fail the assembly using the quick-action button Replication video: [Link](https://drive.google.com/file/d/1gBHrvQEAavhjU4lS-bKQHQjAa9qDHj6-/view?usp=sharing) **Observed Behavior:** * No failure message is displayed when the quality check is failed. **Root cause:** * This happens because pressing the quick-action button triggers `failCheck` [1] , which calls `doActionNext` [2], which then runs the server function `action_fail_and_next` [3]. That function sets `quality_state = fail` and calls [4] to get the view. But since [3] wraps that view inside a dictionary, the check in [5] never passes, so the message never appears. **Solution:** * Pass the view correctly to display the failure message. Since the quick action already marks the quality state as failed we can hide the Confirm and Back buttons by passing the context and checking it in the view to show a single OK button, similar to earlier versions. **Before:** <img width="1673" height="813" alt="image" src="https://github.com/user-attachments/assets/029e347b-5f2c-463a-833e-3b55677137b6" /> **After:** <img width="1687" height="829" alt="image" src="https://github.com/user-attachments/assets/e4c85093-ea0d-44ca-bc9c-0fab5ac08fbc" /> [1]: https://github.com/odoo/enterprise/blob/59c06537d82fedd1916b7aeb808dc73904f6a751/quality_mrp_workorder/static/src/mrp_display/quality_check.js#L83-L86 [2]: https://github.com/odoo/enterprise/blob/59c06537d82fedd1916b7aeb808dc73904f6a751/mrp_workorder/static/src/mrp_display/mrp_record_line/quality_check.js#L147-L163 [3]: https://github.com/odoo/enterprise/blob/59c06537d82fedd1916b7aeb808dc73904f6a751/quality_mrp_workorder/models/quality.py#L86-L89 [4]: https://github.com/odoo/enterprise/blob/59c06537d82fedd1916b7aeb808dc73904f6a751/quality_mrp_workorder/models/quality.py#L48-L68 [5]: https://github.com/odoo/enterprise/blob/19.0/mrp_workorder/static/src/mrp_display/mrp_record_line/quality_check.js#L154-L161 opw-5403465 Forward-Port-Of: odoo/enterprise#102095
This update resolves an error that occurred when creating attendance records for employees without defined 'Working Hours'. The fix prevents a system crash caused by attempting to access data within an empty dictionary, ensuring smoother attendance creation processes. This improves the reliability of the attendance module.
Original PR description
This error occurs when attempting to create an attendance for an employee who has no `Working Hours` defined.
Steps to reproduce:
- Install `hr_work_entry_attendance` module
- Employees > `Administrator` > Settings > Set `Default Ruleset` in Overtime Ruleset > Payroll > Set Contract and `Work Entry Source` is in `Attendance`
- Attendance > Create New Attendance(with Extra Hours) and Save
- Remove `Working Hours` of employee
Traceback:
`KeyError: 52`
We encounter this error at [1] because `lunch_by_resource` is empty "**{}**", and we attempt to access a key in this empty dictionary.
[1]- https://github.com/odoo/enterprise/blob/b94ae7a4f8ae91ad98977a439db41a6939a6b617/hr_work_entry_attendance/models/hr_version.py#L80
sentry-716830935223 changes
Resolved issues and error corrections
This update fixes an issue where the general note message was being printed multiple times for each Point of Sale order. This resulted in unnecessary printer usage and potential delays. Now, the note message is printed only once, streamlining the POS process and improving efficiency.
Original PR description
Before this commit: =================== The general note message was printed multiple times for a single order, resulting in duplicate prints on the printer. After this commit: ==================== Ensure the general note message is printed only once, preventing duplicate prints. Task-5502902
This update resolves an issue where emails couldn't be sent to applicants who had been archived in the recruitment process. The fix ensures that archived applicants are correctly included when sending emails, preventing a disruption in communication. This improves the reliability of the applicant notification system.
Original PR description
Version: - 17.0 Steps to reproduce: - Create an applicant. - Archive the applicant. - Select the archived applicant. - Click the Send Email action. Issue: - Unable to Send Emails to Refused Applicants Cause: - The applicant_ids many2many field does not include archived applicants. Because of this, when an applicant is archived, the field becomes empty. Solution: - Add active_test to the field context. Task - 5786195 Forward-Port-Of: odoo/odoo#244691
This update resolves an issue where the 0% EU S tax code was incorrectly applied in Italy. The change ensures the correct code (N2.1) is used based on whether the transaction is for goods or services, aligning with Italian tax regulations. This correction improves tax reporting accuracy for Italian businesses.
Original PR description
In Italy, the code depends strictly on whether the transaction is for Goods or Services. N3.2 is for Intra-community supply of GOODS (Cessioni Intracomunitarie di beni) N2.1 is for Intra-community supply of SERVICES (Prestazioni di Servizi) This commit fixes the exoneration code on the 0% EU S tax from N3.2 to N2.1. task-5870894 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245675
This update resolves an issue with the calculation of Spanish taxes (Mod 390) by accurately incorporating balances from specific accounts into the relevant tax reporting sections. This ensures compliance with Spanish tax regulations and improves the accuracy of financial reporting within the Odoo system. The change was part of a larger effort to improve the Spanish localization.
Original PR description
In this commit: Fixing 390 computation: - Add balance from 27, 29, 649 and 31 to casilla 33. - Add balance from 28, 30, 650 and 32 to casilla 34. Related PR : https://github.com/odoo/enterprise/pull/105597 task-5732679 Forward-Port-Of: odoo/odoo#245828
This update resolves an issue where switching between invoice and credit note types on existing, posted transactions caused errors. Now, users can switch these types even if the transaction's internal/external move sequence has been manually cleared, streamlining the process and eliminating the need for manual data re-import.
Original PR description
Previously, switching an Invoice to a Credit Note (or vice versa) on a posted in_()/out_() move raised a blocking error. This forced users to export, delete, and re-import the document with the correct move type. This **PR** relaxes the restriction for posted moves whose sequence has been manually cleared, allowing the `Switch Invoice/Credit Note` action to proceed in that specific case. **task**-5905206 Forward-Port-Of: odoo/odoo#247349
This update corrects a calculation error in the Point of Sale system when applying taxes. Specifically, it ensures that the total price displayed accurately reflects the base product price plus the correct tax amount, regardless of how taxes are configured. This fix resolves an issue where tax calculations were inconsistent, leading to incorrect totals.
Original PR description
When a fiscal position maps a tax-included tax to a tax-excluded tax (or vice versa), the price unit must be adjusted to keep the base amount consistent. This adjustment was missing in the POS…
When a fiscal position maps a tax-included tax to a tax-excluded tax (or vice versa), the price unit must be adjusted to keep the base amount consistent. This adjustment was missing in the POS frontend after the tax computation refactoring in v18+. Background: In v17, the computePriceAfterFp method handled this price adaptation: https://github.com/odoo/odoo/blob/36688ce4dad4b3d508b4fd3d778a06a5a7036408/addons/point_of_sale/static/src/app/store/pos_store.js#L1102-L1133 This method was removed in: https://github.com/odoo/odoo/commit/ab0bdf019212 The refactoring introduced: https://github.com/odoo/odoo/blob/0d7e3d4c0ea976e37871ca44a10a442cce7caa85/addons/account/static/src/helpers/account_tax.js#L472-L481 However, the POS module was not updated to call this helper when preparing base lines for tax computation. Steps to reproduce: 1. Create a tax configured as "Included in Price" (21) 2. Create a tax configured as "Excluded from Price" (21) 4. Create a fiscal position that maps the included to the excluded tax 4. Add the fiscal position to a contact 5. Create a product with the included tax, priced at 100 6. In POS, add the contact as the client and add the product 7. Total incorrectly shows 121 (or 100 + tax) instead of 100 Ticket [link](https://www.odoo.com/odoo/project.task/5877918) opw-5877918 ------------------------------------------------------------------------ I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update allows employees to actively use the chatter feature while creating or viewing their own expense reports. Previously, they could only add attachments and messages when the expense was in draft mode. This change improves communication and allows employees to provide additional information or respond to inquiries related to their expenses.
Original PR description
An employee that created his expense was only able to add attachments and post message in the chatter when the expense was in draft. After this, it will still be able to attach attachment and post message without having the right to edit the expense. This is better as the employee will be able to answer questions that have been asked or add more proof if required. task-4966942 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update allows for seamless payment matching between parent and child companies within Odoo. Previously, matching was limited to purchase orders; now, it extends to bills, streamlining financial reconciliation across company structures. This enhancement improves accuracy and efficiency in managing intercompany transactions.
Original PR description
On bills, the `purchase_vendor_bill_id` field already allows matching with cross-company purchase orders. This commit extends this behavior to payment matching. Steps to reproduce: - Create a child company from a parent company. - Create a purchase order in the child company. - Create a bill in the parent company. - In the bill’s payment matching, the child company’s purchase order should be available. opw-5416947
This update resolves an issue where the quantity displayed in the shopping cart wasn't accurately reflecting changes made by the user. The fix ensures that the cart correctly displays the updated quantity after a product is added or its quantity is modified, improving the shopping experience. This was a minor bug impacting order accuracy.
Original PR description
**Steps to produce:** - Install `website_sale` with demo data. - Go to the shop page. - Select product `Customizable Desk` > click `Add to cart`. - In the wizard, change the quantity to 100 and…
**Steps to produce:** - Install `website_sale` with demo data. - Go to the shop page. - Select product `Customizable Desk` > click `Add to cart`. - In the wizard, change the quantity to 100 and directly click `Checkout`. **Issue:** - The cart shows the product with quantity = 1 instead of the edited value. Root cause: - When the user clicks Checkout, both `setQuantity` and `onConfirm` are triggered almost simultaneously. - At [1], the `_setQuantity` method is called, but due to the await before the quantity update is completed, the update may not finish in time. As a result, the previous quantity is sometimes used during checkout instead of the newly selected one. Solution: - we can update the quantity immediately before awaiting `_updateCombination`, ensuring that the correct quantity is already set when onConfirm runs. [1]: https://github.com/odoo/odoo/blob/f4eabe47a602301013afa63da6bdf87809903d29/addons/sale/static/src/js/product_configurator_dialog/product_configurator_dialog.js#L225 opw-5435672 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update improves the generation of UBL files for BIS3 invoices. Previously, files lacking an EndpointID were automatically flagged as invalid due to PEPPOL compliance rules. This change adds necessary constraints within Odoo itself, ensuring UBL files are correctly formatted and compliant without immediate rejection.
Original PR description
If EndpointID is not set, the generated file is invalid due to the 2 following rules: [PEPPOL-EN16931-R010] Buyer electronic address MUST be provided. [PEPPOL-EN16931-R020] Seller electronic address MUST be provided. Since this is a configuration issue, there is no point of sending such files to be rejected right away. Instead, let's add those 2 contraints ODOO-side. task-5890887 --- 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 copy button within Odoo forms wasn't working correctly. By explicitly setting the button type to 'button', the fix prevents the button from submitting the form, ensuring it functions as intended. This improves the user experience when copying data.
Original PR description
Previously, the type of the button in the template of the CopyButton utility component was left unspecified. Because the default type for buttons is "submit", the copy button will not work if it is placed within a `<form>` element, and will instead submit the form (see [1]). This commit just forces the type of the button to "button" which has no default behavior, meaning it can be used even inside of `<form>` elements without issues. [1]: https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/button#type
This update fixes a problem where the BoM report wasn't correctly displaying the selected variant. The issue stemmed from how the system ordered variant information, leading to a mismatch between the backend and frontend. This change ensures the report consistently reflects the variant the user intended to view.
Original PR description
Steps to reproduce on runbot ------------------ Select a product with several variants and a Bill of Materials (e.g. Stool). Change the variants order so that their ids are not ordered, this can be…
Steps to reproduce on runbot ------------------ Select a product with several variants and a Bill of Materials (e.g. Stool). Change the variants order so that their ids are not ordered, this can be done by modifying the default_code for example (e.g. Internal Reference for variant "Color: Green" set to "A"). When accessing the BoM report, you won’t be able to switch to one of the possible variants (in the example the Dark Blue variant). Why it is happening ------------------ The default variant to be displayed when opening the report is selected in the backend using the product_variant_id field. This field is computed as the first element in product_variant_ids as they are ordered in the model. We then send this variant’s information to the frontend and a dictionary containing every variant (key= id and value = display_name). In the serialization process, the object is reordered based on the keys. Thus, if the variants were not ordered based on their ids in python, the order will change. The displayed variant is correct as it has been passed directly but the frontend also computes the currentVariant attribute. This is computed as the first element in the dictionary but in this case, it is not the one that has been selected in the backend, as the order changed. As a result, you see the report for a variant A but the frontend considers you are on the report for variant B so you cannot switch to variant B as you are supposed to be already on it. The fix ------------------ I propose to use the explicitly passed id as the currentVariantId. opw-5409493 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#241603
This update resolves an issue preventing users with restricted company access from reloading translations. The fix bypasses a privilege check within the translation process, allowing users to continue updating language terms. This improves usability for users who don't have access to all company data.
Original PR description
When a user doesn't have access to all companies, he couldn't reload the translation terms. However, the exception occurs in the call to _get_chart_template_data, which doesn't especially require privileges, because it is static data. With this commit, we bypass the lack of company access to retrieve this data, and let the user continue the language reloading process. Task-id: [5916490](https://www.odoo.com/odoo/project.task/5916490) Forward-Port-Of: odoo/odoo#247540
This update fixes a previous issue where mention suggestions prioritized recent chat conversations over relevant followers. Now, suggestions will prioritize users who are followers of the record, ensuring more targeted and effective communication within Odoo's chat features. This change enhances the user experience by surfacing the most important contacts.
Original PR description
Before this commit, mention suggestions prioritized partners from recent chats over the record's followers. This commit fixes the behavior by reordering the sequence numbers to have the following priority order: Thread followers > Internal users > Recent chat partners. <img width="1051" height="316" alt="image" src="https://github.com/user-attachments/assets/6de527d1-b55d-4c00-b81f-15052147f9d6" /> task-5313114 Forward-Port-Of: odoo/odoo#237145
This update ensures a consistent visual style for mentions across both the small and full composer views. The changes improve readability and prevent overflow issues, particularly on smaller devices, leading to a better user experience when composing messages.
Original PR description
Use the same style in full composer than in small composer. Tweak style to account for small device, better handle overflows task-5916878 Before / After (small composer) <img width="342" height="466" alt="image" src="https://github.com/user-attachments/assets/234ff152-3c5a-4c82-b257-2800a752dd3a" /> <img width="496" height="476" alt="image" src="https://github.com/user-attachments/assets/60b3d12d-38ea-429a-9dec-441886ac022e" /> Before / After (full) <img width="413" height="394" alt="image" src="https://github.com/user-attachments/assets/c51e053f-7eb2-4ee0-8a9a-bd068ee9ded0" /> <img width="487" height="555" alt="image" src="https://github.com/user-attachments/assets/d0a3514d-aa1f-4d89-8fe4-7964ec20a288" /> Forward-Port-Of: odoo/odoo#247562
This update resolves an issue that occurred when the 'l10n_sa_edi' module was used with 'SA Company' configurations where the company street address was missing. The fix ensures the system correctly handles this situation, preventing a technical error during OTP request processing. This ensures smooth operation for users utilizing the SA-specific tax reporting features.
Original PR description
This error occurs when attempting to set the "OTP" received from "ZATCA". Steps to reproduce: - Install `l10n_sa_edi` module > Switch to `SA Company` - Go to `SA Company` and remove `Street` - Journals > Open journal with type 'Sale' > ZATCA > Onboard Journal > Enter any OTP > Request Traceback: `TypeError- value argument must be a str` At [1], the error occurs because the company has an empty street field, causing the value argument to be a `boolean` instead of the expected `string`. [1]- https://github.com/odoo/odoo/blob/40a0b44231fd9a725ccf3667c4992e691e24cde7/addons/l10n_sa_edi/models/certificate.py#L71 sentry-7185302332 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a bug where syncing an order with point changes could incorrectly trigger processing for all orders, including draft ones. This change ensures that draft orders are not unnecessarily processed, improving order stability and preventing potential errors. It addresses a technical issue impacting order processing reliability.
Original PR description
Before this commit, when a draft order with point changes existed, syncing an order would trigger the post processing of all orders, including draft ones. This could lead to issues. opw-5370267 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where serial numbers disappeared when creating repair orders with products initially tracked by quantity. The fix ensures that serial numbers are correctly associated with stock movements, preventing the UI from hiding newly created lines. This improves the accuracy of repair order tracking and reporting.
Original PR description
Steps to reproduce: 1. Create a storable product with tracking set to 'By Quantity'. 2. Update the Quantity on Hand (e.g., 100 units). 3. Change the product tracking to 'By Serial Number'. 4. Create…
Steps to reproduce: 1. Create a storable product with tracking set to 'By Quantity'. 2. Update the Quantity on Hand (e.g., 100 units). 3. Change the product tracking to 'By Serial Number'. 4. Create a Repair Order for this product. 5. Add a line, select a specific Serial Number, and click Save. 6. Observe that the serial number disappears. Cause: When reserving stock that was originally created as 'Generic' (no serial), the `_prepare_move_line_vals` method returns `lot_id=False`. The repair view uses `_compute_lot_ids` to display selected lots, which filters out any move lines where `lot_id` is False. This causes the new line to be effectively invisible to the UI immediately after creation. Solution: In the `_set_lot_ids` inverse method, explicitly force the `lot_id` into the create values dictionary (`move_line_vals`). This ensures that even if Odoo reserves generic stock, the resulting move line is born with the correct Serial Number identity, keeping it visible and valid. opw-5156267
This update fixes a problem where browser translation plugins were incorrectly replacing editable content with translated versions, disrupting the auto-save feature. Adding the `translate="no"` attribute to editable fields now prevents this interference, ensuring content is saved correctly.
Original PR description
Browser translation plugins were altering editable content by replacing the original content with translated versions, which caused issues when paired with auto-save. To prevent this behavior, the attribute `translate="no"` has been added to editable fields. task-5485078
This update fixes an issue where suggested mentions in the full composer weren't correctly sorted, preventing users from easily seeing followers. The fix ensures that mentions are now properly sorted, prioritizing followers for a more efficient and user-friendly experience. This improves collaboration within the system.
Original PR description
Fetch/sort suggestion in the full composer don't receive the thread param which leads to follower not being sorted at the top. task-5917226 Forward-Port-Of: odoo/odoo#247581
This update optimizes how Odoo retrieves messages, leading to faster loading times and a smoother user experience, particularly when accessing email activity records. The changes address a previous issue where message access was slow, especially when browsing records multiple times. This enhancement improves overall system responsiveness and efficiency.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245744
This update corrects a bug where VAT reports generated in Odoo were missing email addresses for certain customers. The fix ensures that email addresses are correctly populated in the XML export, addressing a mandatory field requirement and improving reporting accuracy. This ensures compliance and reliable data export.
Original PR description
**Steps to reproduce:** - Install l10n_be_reports and contacts - Switch to a Belgian company (e.g. BE Company CoA) - Go to Contacts - Open the company contact (i.e. BE Company CoA) - Add an invoice address withtout email - Create an invoice: * Customer: [a Belgian customer with a VAT number] * Invoice Lines: [a line with a tax] - Confirm the invoice - Go to "Accounting / Reporting / Belgium / Partner VAT Listing" - Export the XML **Issue:** In the XML, "<EmailAddress>" is empty althouth it is mandatory. **Cause:** The email is retrieved from the invoice address, but there is no fallback on the parent contact if it is empty. **Solution:** Fallback on the email of the parent contact as it is the case for the phone. opw-5870750 Forward-Port-Of: odoo/enterprise#105654
This update resolves an issue with Spanish tax reporting (l10n_es_reports) related to withholding taxes. Specifically, the system now correctly handles the 'type for 347' field in invoices, ensuring accurate tax calculations and compliance. This change improves the reliability of financial reporting for Spanish businesses using Odoo Enterprise.
Original PR description
- Moves that use withholding taxes should have the `type for 347` unselected and left blank. Related PR : https://github.com/odoo/odoo/pull/245828 task-5732679 Forward-Port-Of: odoo/enterprise#105597
7 changes
Enhancements to existing features
This update enhances the generation of electronic transport documents (eTransport) for Romanian businesses. It includes logging of sent XML files for tracking, ensures accurate pricing using standard unit costs, and implements necessary rounding to comply with Romanian tax regulations. These changes improve the reliability and compliance of eTransport shipments.
Original PR description
- Adding logging of sent XML into move chatter - Adjusting the XML generator to use standard unit price - Adding rounding for product values as required by the XML structure task-5892338 --- 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 resolves a bug where importing journal entries in foreign currencies could fail due to rounding discrepancies. The issue stemmed from individual line rounding, leading to an imbalance between debit and credit. This fix ensures journal entries with foreign currency transactions can be reliably imported and balanced.
Original PR description
**PROBLEM** If you create/import a journal entry using a foreign currency, it can happen that the journal entry is balanced in said foreign currency but isn't balanced in the company currency,…
**PROBLEM** If you create/import a journal entry using a foreign currency, it can happen that the journal entry is balanced in said foreign currency but isn't balanced in the company currency, preventing you from creating/importing the journal entry. When creating the journal entry, you could add a line to balance this, but if you import it, you can't. **STEP TO REPRODUCE** 1. Set the exchange rate: 1€ = 0.134068$ 2. Import the journal entry named issue.csv (can be found in the ticket page or the PR). **CAUSE** Because we round each line individually, we may end up with a rounding issue that leads to debit/credit not being equal. opw-4668369 | Reference | account_move_journal.id | Date | Journal Items / Account | Journal Items / Currency | Journal Items / Amount in Currency | |-----------|--------------------------|---------|-------------------------|--------------------------|------------------------------------| | Bunq | Miscellaneous Operations | 8/15/25 | 1010 | EUR | -34.9 | | | | | 1050 | EUR | 34.9 | | | | | 1100 | EUR | 2.69 | | | | | 1200 | EUR | 32.21 | | | | | 1300 | EUR | -34.9 |€
This update fixes a discrepancy where quote PDFs were incorrectly displaying customer addresses even when the 'Customer Addresses' setting was disabled. The fix mirrors the behavior of invoices, ensuring that quotes consistently show only one address when this setting is active. This improves data accuracy and a better user experience.
Original PR description
## Versions 17.0+ 16.0 too but template change is not worth risking stable policy. ## Issue There is a behavior mismatch between invoices and quotes/orders addresses display. Disabling "Customer…
## Versions
17.0+
16.0 too but template change is not worth risking stable policy.
## Issue
There is a behavior mismatch between invoices and quotes/orders addresses display. Disabling "Customer Addresses" setting should only display one address on generated documents. Yet, it has no effect on quotes and orders while it has on invoices.
## Steps to reproduce
- Go to Settings:
- Look for "Customer Addresses";
- Ensure the box is checked (and save).
- Go to Sales / Orders / Customers:
- Create a new customer and add addresses under the "Contacts & Addresses" tab:
- Add one "Delivery Address";
- Add one "Invoice Address" (with different values).
- Click the "Sales" smart button to create a new quote for that customer:
- Add any product;
- From the cog, click Print > PDF Quote.
- Confirm the order (deliver if needed);
- Create regular invoice;
- Confirm the invoice;
- From the cog, click Print > Invoices.
- Both documents display a shipping address.
Start again with "Customer Addresses" setting disabled and watch the shipping address disappear from the invoice while still present on the quote document.
*N.B.: Same behavior with the preview*
## Fix
Mimic invoices' behavior in https://github.com/odoo/odoo/blob/1bd2d63eb80020e6e213c889e83cca2950d4dcd4/addons/account/views/report_invoice.xml#L12
opw-5400368This update fixes a potential issue where external users could be assigned activities within Odoo. A new filter has been added to the system to ensure activities are only assigned to internal employees, improving data accuracy and security.
Original PR description
Description: Added an domain on the 'activity_user_id' field in the mail_activity_schedule_views xml file. The domain blocks the assignment of activities to users who are not internal. task-5424577
This update corrects a reporting issue where unreserved stock was incorrectly included in the stock in transit forecast. The fix ensures that only non-available quantities are considered, providing a more accurate view of inventory movement for sales forecasting. This improves the reliability of sales order predictions.
Original PR description
**Issue** It is possible to have unreserved quantity, outside the stock location, considered as 'stock in transit' in the forecast report. This is an issue because that means some quantities, that…
**Issue** It is possible to have unreserved quantity, outside the stock location, considered as 'stock in transit' in the forecast report. This is an issue because that means some quantities, that are not meant to be moved to the stock location, are linked to a delivery. **Steps to reproduce** - Activate 3 step receipt on your warehouse - Create a new product 'Test' and adds 1 Unit in WH/Input and 1 Unit in WH/Quality - Create a sales order for 2 Units and check the forecast report of Test -> 2 units are recorded as 'stock in transit' links to the so delivery while they should not. **Cause** The forecast report is computed here: https://github.com/odoo/odoo/blob/f0196258ed41f56790db94747192545ae56c78b5/addons/stock/report/stock_forecasted.py#L17-L24 The lines are computed here: https://github.com/odoo/odoo/blob/f0196258ed41f56790db94747192545ae56c78b5/addons/stock/report/stock_forecasted.py#L125 Currently, stock in transit is calculated by: Aggregating quantities per product and location (including unreserved quantities): https://github.com/odoo/odoo/blob/f0196258ed41f56790db94747192545ae56c78b5/addons/stock/report/stock_forecasted.py#L327-L328 Removing the reserved stock, then summing per product: https://github.com/odoo/odoo/blob/f0196258ed41f56790db94747192545ae56c78b5/addons/stock/report/stock_forecasted.py#L353-L354 Assigning the result as 'stock in transit' (since free_stock is 0 here): https://github.com/odoo/odoo/blob/f0196258ed41f56790db94747192545ae56c78b5/addons/stock/report/stock_forecasted.py#L361 This method incorrectly includes unreserved quantities from intermediate locations. **Solution** Since we only want non-available quantity to be considered as stock in transit, we use the reserved quantity instead. No need to substract the free quantity anymore since free quantity are no reserved by definition. opw-5865378
This update resolves a problem where project breadcrumbs disappeared after migrating databases from older versions to the latest. The change ensures correct breadcrumb functionality when opening projects from sale orders, particularly after upgrading from version 16. This improves the user experience and data visibility.
Original PR description
Steps to reproduce: 1. Create a db with having 'sale' & 'project' installed in version 16. 2. Create a sale order having linkage to more than single project. 3. Migrate the db to version 19. 4. When…
Steps to reproduce:
1. Create a db with having 'sale' & 'project' installed in version 16.
2. Create a sale order having linkage to more than single project.
3. Migrate the db to version 19.
4. When clicking on the project stat button the breadcrumb traceability will not be there.
Issue:
-> In v16.4 the target defined for the action `project.open_view_project_all` is removed from [here](odoo/odoo@a92d686)
When migrating a database from v16 to v19 and opening projects from a sale order linked to multiple projects, the stat button triggers `action_view_project_ids`, which in turn calls
`project.open_view_project_all` for records having len('projects_ids') > 1 from [here]
(https://github.com/odoo/odoo/blame/19.0/addons/sale_project/models/sale_order.py#L220) Because the persisted target is `main`, breadcrumb traceability will be lost. The issue will arise in the DBs coming from version 16 or lesser. Therefore, it would be necessary to address this immediately and set correct target for window_action for databases >= v17
This commit explicitly sets the action target to `current` to restore proper breadcrumb behavior and align it with standard odoo record.
OPW-5448916
Description of the issue/feature this PR addresses:
Current behavior before PR:
Desired behavior after PR is merged:
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update simplifies the initial setup for new employees in the payroll module. The system now automatically generates a unique employee ID and sets the marital status to the employee's birthday by default for single individuals. This streamlines the onboarding process and reduces manual data entry for HR staff.
Original PR description
For quality of life improvement, the unique employee identification is now automatically generated and initial marital status date is set to the birthday by default if the person is single