Daily updates from Odoo
Tuesday, June 30, 2026
259 changes
20 changes
Enhancements to existing features
The Australian payroll rules have been updated for the 2026-27 financial year, including revised tax rates and formulas. The change also corrects how the Medicare exemption is applied from 2024 onward, helping ensure payroll calculations and historical corrections stay accurate.
Original PR description
Update tax rates and formulas for the 2026-27 financial year in the Australian payroll module. This commit also amends the tax rates and formulas from 2024 onwards. The Medicare exemption is now properly factored into the tax rates from the 2024-25 fiscal year forward, with the revised formula applied accordingly. Data for pre-2024 remains supported to facilitate importing historical payslips for corrections, aligning with the ATO rule allowing amendments for up to 5 years after the original payslip date. 6252689 Forward-Port-Of: odoo/enterprise#121561
Users can now choose a date directly from the stock report search panel instead of opening a separate inventory-at-date screen. This makes it faster to review stock levels at a past moment while keeping all current filters, and users can switch back to live stock with one click.
Original PR description
Backport of odoo/odoo#264699 Instead of navigating to a separate view via the 'Inventory at Date' wizard, users can now pick a date directly in the search panel. This sets 'to_date' in the context, causing quantities to be computed at the chosen date while preserving all active filters (category, warehouse, search terms). The date picker uses 1-minute rounding for precise timestamp selection, and defaults to the current time when opened. A 'Current stock' link appears to clear the date and return to live quantities. task-6152466 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
This change adds an initial aging report for stock values and quantities, letting users analyze remaining inventory by period in pivot-style reports. It makes these figures available on demand for reporting, which improves visibility into inventory aging and stock valuation trends.
Original PR description
First implementation of the aging report. It's not optimized yet. The values are simply coming from the existing compute method. Task: 5967087 ##stats for 100 products We can see the quantity on hand has | | naive impl (30 % without qty) | naive impl (0 % without qty)| |--------|--------|--------| | 450 m/M | 1.9sec | 3.1sec | | 2000m/M | 8.6sec | 26sec | 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
Charts in spreadsheets can now display an info icon that opens additional information. Users can add a short description and a “see more” link from the design panel, making charts easier to understand and giving viewers a quick path to more context.
Original PR description
It's now possible to add a information text and/or a see more link to a chart. Accessible with the info icon on the chart. Editable in the design side panel. Task: 5365254
Resolved issues and error corrections
This update adjusts the holiday calendar side panel to work with the latest Owl framework version used in Odoo. It helps keep the scheduling interface stable and prevents issues caused by outdated component behavior.
Original PR description
This commit is a follow-up of 197d0ca5, as part of the Owl 3 migration, replace onWillUpdateProps hook with the appropriate Owl 3 alternatives 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
When users switch companies while viewing a payroll pay run, the system now checks access before reloading the page. This prevents a brief error message from appearing and takes users directly back to the pay run list when the record is not accessible in the new company context.
Original PR description
Steps to reproduce: 1- Open a payrun 2- Switch companies Issue: You get an access error for a moment and then get redirected to payrun list view Cause: When switching companies, the payrun reloads but since it is in the context of a different company, you get an access error. Solution: First check in js before fetching that you have access to the payrun, if not, redirect to the list view instead. Task-6008140 Forward-Port-Of: odoo/enterprise#120004
Fixed an issue where some conversation threads could fail to show their messages after reloading. This helps ensure users reliably see the latest messages instead of an empty placeholder.
Original PR description
The Thread component mirrors `thread.isLoaded` into the `state.mountedAndLoaded` flag that gates whether the real messages (as opposed to the empty phantom placeholder) are rendered. The mirroring…
The Thread component mirrors `thread.isLoaded` into the `state.mountedAndLoaded` flag that gates whether the real messages (as opposed to the empty phantom placeholder) are rendered. The mirroring effect both read `mountedAndLoaded` as a dependency and wrote it. `useEffect` records its dependency array before running the body, so right after the effect sets `mountedAndLoaded` to true the recorded dependencies still hold the pre-write pair `[isLoaded=true, mountedAndLoaded=false]`; that update only settles on a later, microtask-deferred patch. When a second reload runs `reset()` in that window, it drives `mountedAndLoaded` back to false while `isLoaded` stays true. The settling patch then computes the very `[true, false]` pair that was already recorded, so the effect never re-runs: `mountedAndLoaded` is stranded at false and no message is ever rendered. Depend on a monotonic `resetCount` bumped by `reset()` instead of on `mountedAndLoaded` itself. It is never written by the effect, so the recorded dependencies can no longer match the current ones after a reset and the effect always re-runs to re-sync `mountedAndLoaded` with `isLoaded`. `reset()` keeps clearing `mountedAndLoaded` as before (the false dip is needed for the reload scroll handshake), so the behaviour is otherwise unchanged. https://runbot.odoo.com/odoo/error/940032 Forward-Port-Of: odoo/odoo#272589 Forward-Port-Of: odoo/odoo#272281
We fixed an automated test in the chat features that was sometimes failing at random. The check now looks directly at the chat title instead of relying on a brief loading moment, making test runs more reliable and reducing false failures.
Original PR description
The hoot `:text('X')` pseudo-class matches an element only when its whole inline text equals "X". `.o-mail-ChatWindow:text('slytherins')` therefore matched the chat window only during the brief frame where it showed nothing but its title, before the thread body (start message, composer) was rendered. Catching that frame is a race, so the assertion times out intermittently on runbot.
Assert against the title element itself: add a dedicated `o-mail-ChatWindow-name` class on it and match it with `.o-mail-ChatWindow-name:text('X')`. This is exact and no longer depends on the rest of the window being empty.
https://runbot.odoo.com/odoo/error/939914
Forward-Port-Of: odoo/odoo#272567
Forward-Port-Of: odoo/odoo#272380This update corrects how sales margins are calculated when different tax display modes are used on documents. It ensures the reported margin stays accurate and consistent for users regardless of how taxes and prices are shown.
Original PR description
A newly introduced feature in commit 001d3255cd134656970c98b6e367d6ae3ec77124 caused the tax and price computation to differ, making the margin computation to be inaccurate depending on the document tax mode chosen. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where the ticket screen numpad could appear when it should stay hidden in certain point-of-sale setups. It improves the consistency of the interface for users working with specific POS configurations, such as Urban Piper and HR-related flows.
Original PR description
Steps to reproduce: =================== - Ensure `pos_hr` and `pos_urban_piper` is installed. - Install `l10n_in_pos_urban_piper`. - Open a draft Urban Piper order and notice that the numpad is visible. Cause: ====== - The numpad visibility depends on a `t-if` condition in XML. - Due to the asset loading order, this condition gets overridden by another module. Fix: ==== - Move the visibility logic to a getter method. - Override the getter in other modules instead of using XML to control the visibility. Task-6299415 Related Enterprise PR: https://github.com/odoo/enterprise/pull/120571 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an unstable automated test in the messaging app that could fail intermittently under slower conditions. It does not change user behavior, but it helps ensure future releases are tested more reliably.
Original PR description
The "Jump to old reply should prompt jump to present (RPC small delay)" test clicked the jump-to-present button right after clicking the in-reply, without waiting for the jump to the old reply to render. The button only shows once that load has settled, so under load the button could still be absent when the click polled for it, making the test flaky. Wait for the messages to be reloaded around the old reply before clicking, mirroring the non-delayed sibling test. https://runbot.odoo.com/odoo/error/941200
This update corrects a display issue in the Point of Sale ticket screen where some buttons and the numpad could appear when they should be hidden. It also improves consistency across installed extensions and fixes a dark-mode styling issue for the prep order time field.
Original PR description
Issue 1: ====== Numpad Visibility in TicketScreen of draft urban piper orders Steps to reproduce: =================== - Ensure `pos_hr` and `pos_urban_piper` is installed. - Install…
Issue 1: ====== Numpad Visibility in TicketScreen of draft urban piper orders Steps to reproduce: =================== - Ensure `pos_hr` and `pos_urban_piper` is installed. - Install `l10n_in_pos_urban_piper`. - Open a draft Urban Piper order and notice that the numpad is visible. Cause: ====== - The numpad visibility depends on a `t-if` condition in XML. - Due to the asset loading order, this condition gets overridden by another module. Fix: ==== - Move the visibility logic to a getter method. - Override the getter in other modules instead of using XML to control the visibility. - Also fixed the css issue for prep order time input when using it in dark mode --- Issue 2: ====== Invoice button visible on Chile Company's TicketScreen Steps to reproduce: =============== - Ensure `pos_urban_piper` is installed, open the Chile company's PoS Config - In the ticket screen, we have an invoice button on paid orders. Cause: ===== - Button visibility handled through XML conditions; this condition gets overridden by another module. Fix: === - Move the visibility logic to the getter method and override it in submodules to control visibility. Task-6299415 Related Community PR: https://github.com/odoo/odoo/pull/270088
This change prevents a crash that could happen when a user canceled a new webhook record and then tried to create another one right away. It improves stability in Studio’s Webhook screen and avoids an interruption caused by a timing issue after a frontend update.
Original PR description
Go in studio => Webhook tab Click on new Click cancel and back to list view again click on new Before this commit, there was a crash due to a race condition that appeared after owl3 migration. This commit solves this by protecting the first update in favor of the second opw-6332360 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
The spreadsheet app was updated to the latest version, bringing several usability fixes and small interface improvements. Users should see smoother chart interactions, better font handling on Linux, and fewer pop-up issues when editing spreadsheets and charts.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/b0b4c4027f [REL] version 19.4.0 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/b0b4c4027f [REL] version 19.4.0 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/4ce11c6918 [IMP] package: update to owl alpha 40 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/209e5072a9 [IMP] header_size: make getters consistent [Task: 6332479](https://www.odoo.com/odoo/2328/tasks/6332479) https://github.com/odoo/o-spreadsheet/commit/4520b613fe [IMP] statistic bottom bar : close the menu [Task: 6316288](https://www.odoo.com/odoo/2328/tasks/6316288) https://github.com/odoo/o-spreadsheet/commit/2ab649b389 [FIX] sheet: close the color picker on external click [Task: 6322171](https://www.odoo.com/odoo/2328/tasks/6322171) https://github.com/odoo/o-spreadsheet/commit/2ab8f9a641 [IMP] charts: annotation tool [](https://www.odoo.com/odoo/2328/tasks/) https://github.com/odoo/o-spreadsheet/commit/0ff30dd158 [REV] typing: exclude non-exported symbols in type resolution [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/f982c69ff5 [IMP] package: update owl to 3.0.0-alpha.39 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/e40bf0cc08 [IMP] tools: run esm version is node [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/61f99a225c [FIX] Fonts: Add default font for Linux [Task: 6328646](https://www.odoo.com/odoo/2328/tasks/6328646) https://github.com/odoo/o-spreadsheet/commit/2687933537 [FIX] typing: exclude non-exported symbols in type resolution [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/1263a6e8de [FIX] components: use owl3 syntax [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya (rmbh) <rmbh@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com> Co-authored-by: Marceline Thomas (matho) <matho@odoo.com>
This update prevents a rare conflict when uploading vendor bills with automatic OCR enabled. It makes sure the bill’s access token is saved earlier, so OCR processing no longer clashes with the bill creation flow and cause processing failures.
Original PR description
When a new bill is created from an attachment, the import flow may commit inside `_extend_with_attachments`. If automatic OCR is enabled, this commit can run the OCR postcommit callback, which writes on the same account.move. The access token was flushed after that import flow, so it races with the OCR callback and triggers a serialization failure. Create and flush the access token before entering the import flow, so the write happens before OCR postcommit callbacks can run. task-[6340793](https://www.odoo.com/odoo/project/967/tasks/6340793) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change moves a self-order-related check out of the standard Point of Sale flow and into the self-order feature where it belongs. It helps prevent failures in automated testing and keeps the regular Point of Sale behavior aligned with its intended scope.
Original PR description
This commit moves the usage of `has_valid_self_payment_method` from `point_of_sale` to `pos_self_order`, where it belongs. The method usage was introduced in https://github.com/odoo/odoo/pull/269502, causing runbot failures Runbot Errors- [941124](https://runbot.odoo.com/odoo/error/941124), [941125](https://runbot.odoo.com/odoo/error/941125), [941126](https://runbot.odoo.com/odoo/error/941126)
The chatter now refreshes properly when a record is reloaded without changing to a different record. This means new attachments and similar updates appear immediately, instead of requiring a full browser refresh or showing outdated indicators.
Original PR description
Since 71336f7f7d25 ("[REF] mail: introduce useOnChange hook"), the chatter only refetched its data (attachments, followers, ...) when the thread identity changed. A same-record form reload keeps the same thread, so nothing was refetched: an attachment created on the record without a message_post (e.g. the pdf generated by "Send & Print", or an account return validation) only showed up after a full browser refresh, the paperclip icon staying stale.
The messages were still refreshed because Thread listens to MAIL:RELOAD-THREAD and calls fetchNewMessages(); the chatter had no such listener. Add the symmetric listener so the chatter reloads its data on a same-record reload too.This fix ensures an employee’s basic salary is classified correctly on Form 2316. Salaries below the tax-exempt cap are now reported as non-taxable, while salaries above the cap remain taxable, which helps prevent incorrect payroll tax reporting.
Original PR description
Previously, a regular (non-MWE) employee's basic salary was always reported as taxable (item 39), regardless of amount. This commit fixes that by checking the yearly basic salary against the tax-exempt cap. If it is below the cap, it is now reported as non-taxable (item 29) and when the amount is above the cap it will be taxable (item 39) Backport of odoo/enterprise@a7362ad273ba8c38aa0908f0765526f8ed8b8193 task-6328424
Searching messages could previously send the same request twice, which could slow down the interface and create unnecessary load. This update ensures the search only runs once per action, improving responsiveness and reliability when users look for messages.
Original PR description
Previously, searching messages could trigger two RPCs for a single search. This was caused by the search effect executing 'run()' even after the search had already been performed. This PR ensures that the search effect only clears results when inactive, preventing duplicate search RPCs. task-6311095 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Code cleanup and technical improvements
This change removes old, unused code related to the Gantt progress bar redesign. It helps keep the product codebase cleaner and easier to maintain without changing how users work.
Original PR description
Cleans up residual dead code left over from the progress bar redesign in https://github.com/odoo/enterprise/pull/118045. Since the `GanttRowProgressBar` component is no longer referenced anywhere in the new layout architecture, its corresponding files have been deleted.
10 changes
Enhancements to existing features
This update makes the timesheet assistant clearer and more reliable for users. It now gives more specific guidance when the connection or browser extension is missing, shows better suggestions when items are deleted, and uses the most relevant project information to reduce confusion.
Original PR description
Forward-Port-Of: odoo/enterprise#121247 Forward-Port-Of: odoo/enterprise#115859
For Swedish companies, Odoo can now extract the organization number from the VAT number and use it to prefill the company registry field. This reduces manual entry and helps keep business identification details consistent.
Original PR description
Organization number is part of the VAT number Official reference: https://www.skatteverket.se/foretag/moms/kopavarorochtjanster/inkopfranandraeulander/kopavarorfranandraeulander.4.3a7aab801183dd6bfd380005738.html > I Sverige börjar alla VAT-nummer med bokstäverna SE (landskoden) och avslutas med siffrorna 01. Om du har en enskild firma följs landskoden av de 10 siffrorna i ditt personnummer. Om du har ett bolag eller en förening följs landskoden av de 10 siffrorna i organisationsnumret. VAT-numret skrivs utan bindestreck. which translates to > In Sweden, all VAT numbers begin with the letters SE (the country code) and end with the digits 01. If you are a sole proprietor, the country code is followed by the 10 digits of your personal identification number. If you are a corporation or an association, the country code is followed by the 10 digits of your organization number. The VAT number is written without a hyphen. Forward-Port-Of: odoo/odoo#269590
Polish invoices sent outside KSeF now include the required QR code and KSeF number directly on the PDF. This makes the invoices compliant with Polish e-invoicing rules and easier to verify for recipients.
Original PR description
While communicating outside KSeF, invoices must have a QR Code and their KSeF number displayed. QR Code content spec is available here: https://github.com/CIRFMF/ksef-api/blob/main/kody-qr.md opw-6211058 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#271713
Resolved issues and error corrections
This fix brings back the intended behavior for pages using the `s_nb_column_fixed` class, which hides the column count option in the builder. It ensures that layouts marked this way no longer show an option that should be locked, improving consistency for content editors.
Original PR description
The class 's_nb_column_fixed' was used to hide the column count option, but it got lost during the refactoring and doesn't work since 18.4. This commit restores it. task-6234267 Forward-Port-Of: odoo/odoo#271975 Forward-Port-Of: odoo/odoo#268005
This fix keeps overtime durations more accurate when they are recorded for payroll calculations. It prevents small rounding errors from affecting the amount paid for overtime work.
Original PR description
Overtime duration computed as fractional hours was rounded to 3 decimal places before being stored on the overtime line. Since 1 decimal hour = 3600 seconds, this gives only 3.6 seconds of precision and the rounding can go in the wrong direction due to floating-point representation. The fix consists in replacing the duration rounding to 4 decimals when building overtime work entries so stored durations keep sub-second precision needed for money computation. task-6212231 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#270417 Forward-Port-Of: odoo/odoo#268889
Overtime hours are now stored with more precise decimal values, so small time differences are not lost before payroll calculations. This helps ensure overtime pay is computed more accurately and consistently.
Original PR description
Overtime duration computed as fractional hours was rounded to 3 decimal places before being stored on the overtime line. Since 1 decimal hour = 3600 seconds, this gives only 3.6 seconds of precision and the rounding can go in the wrong direction due to floating-point representation. The fix consists in replacing the duration rounding to 4 decimals when building overtime work entries so stored durations keep sub-second precision needed for money computation. task-6212231 Forward-Port-Of: odoo/enterprise#120786 Forward-Port-Of: odoo/enterprise#119721
This update corrects how the Peru address fields are linked in the website checkout form. It prevents an error that could stop customers from completing checkout after upgrading, ensuring the page loads correctly again.
Original PR description
Issue: ------ `l10n_pe.address_form_fields` inherits from `portal.address_form_fields` but targets a `<div>` element that has been moved to `portal_address_extended.address_extended_form_fields` in…
Issue:
------
`l10n_pe.address_form_fields` inherits from `portal.address_form_fields` but targets a `<div>` element that has been moved to `portal_address_extended.address_extended_form_fields` in [saas~19.2].
Traceback:
----------
```py
Error while rendering the template:
ValueError: Element '<div id="div_city_id">' cannot be located in parent view (view: l10n_pe.address_form_fields)
Template: website_sale.address
Reference: 1973
Path: /t/t/div/div/form/div/t
Element: <t t-call="website_sale.address_form_fields"/>
```
Steps to reproduce:
-------------------
1. Install `l10n_pe` and `website` in v19
2. Upgrade to v19.2
3. Go to the website and add a product to the cart
4. Go to checkout → Traceback
Root cause:
-----------
The view is adapting an element owned by a sibling view, making the inheritance hierarchy conceptually wrong and fragile.
Solution:
---------
Update the `inherit_id` of `l10n_pe.address_form_fields` to `portal_address_extended.address_extended_form_fields` so it correctly inherits from the view that owns the targeted element.
opw: [6302145]
[saas~19.2]: https://github.com/odoo/odoo/commit/026c6f9f2a388ee509a135c53e38f5bb3d08ff73#diff-83bb066f4477532b76aadd957ae736d0c0b67bc66b48d6f47c035e8cfb4773deR7-R21
[6302145]: https://www.odoo.com/odoo/70/tasks/6302145?debug=1
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#271246This fix prevents cost-of-goods-sold entries from being treated like regular tax base lines when bills are confirmed. As a result, manually adjusted taxes on vendor bills are no longer overwritten during the accounting update, reducing unexpected changes for users.
Original PR description
## Description of the issue/feature this PR addresses: Setup plus video 1. Go to settings, enable "Automatic Valuation" and "Storeable Locations". 2. Navigate to Product Categories. 3. Create a new…
## Description of the issue/feature this PR addresses: Setup plus video 1. Go to settings, enable "Automatic Valuation" and "Storeable Locations". 2. Navigate to Product Categories. 3. Create a new product category with the costing method Standard Price and the inventory valuation Automatic. 4. Navigate to Products, click into any product. 5. Add the new product category to this product under General Information. 6. Add any tax in the purchase tax field. 7. In the Accounting tab of the product, add any account to the Price Difference Account field. https://drive.google.com/file/d/1i2DHEt0g9G5Edad_QB3QaFkOT49cbMAZ/view?usp=sharing Instructions to reproduce error 1. Navigate to Purchase. 2. Add a customer, then add the configured product. 3. Add a tax to the line. Ensure that the tax and price_unit are nonzero. 4. Confirm the order. 5. Receive the product. 6. Create the bill. 7. Edit the tax on the vendor bill, then save the changes. Notice that the changes are kept. 8. Select Confirm. Notice that the changes to the tax line are not kept, and that the COGS lines appeared (with taxes applied to them). 9. Reset the bill to draft. 10. Click into the configured product and remove the product category. 11. Repeat steps 7-8 . No COGS lines, and the tax line is the manually set value. ## Current behavior before PR: COGS lines with taxes have no net effect on any tax lines as they cancel each other out. However, their creation triggers the recalculation of all tax lines, undoing any manual adjustments to tax lines. ## Desired behavior after PR is merged: This commit ensures that COGS lines are not considered base tax lines, so that their creation does not trigger the recalculation of other base tax lines. opw-5387248 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#271262 Forward-Port-Of: odoo/odoo#262442
This update makes the public chat test flow more reliable by ensuring the attachment menu closes before the message is sent. It also corrects a test setup issue so the right conversation data is updated between runs, helping prevent flaky failures during automated testing.
Original PR description
Attempt at fixing the following race condition. It's not clear what causes it, but these changes make the test more robust and might help future investigations. discuss_channel_public_tour opens the composer "More Actions" menu to attach files but feeds the hidden file input directly, so the menu is never closed and is still open when Send is clicked. Close it and wait for it to disappear before sending, to avoid clicking Send while the dropdown is dismissing. Also fix _open_group_page_as_user, which updated the last message body of self.channel instead of self.group between the two tour runs. https://runbot.odoo.com/odoo/error/243436 Forward-Port-Of: odoo/odoo#272606 Forward-Port-Of: odoo/odoo#272425
This change prevents Romanian-specific stock batch behavior from being applied in situations where it should not be. It fixes an error that affected automated system checks and helps keep the stock workflow stable.
Original PR description
The Romanian specifics were applied without condition which caused runbot errors. Note that this was revealed later on (saas-19.3) after a change in the generic stock test setup. runbot-241098 Forward-Port-Of: odoo/odoo#271985
11 changes
Enhancements to existing features
Polish invoices sent outside KSeF now include the required QR code and the KSeF number directly on the PDF. This helps businesses stay compliant with local e-invoicing rules and makes invoices easier to validate and share.
Original PR description
While communicating outside KSeF, invoices must have a QR Code and their KSeF number displayed. QR Code content spec is available here: https://github.com/CIRFMF/ksef-api/blob/main/kody-qr.md opw-6211058 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#271713
Resolved issues and error corrections
When a sign template was duplicated, both copies could accidentally share the same role settings. This fix makes each duplicated template keep its own independent roles, so changes in one template no longer affect the other.
Original PR description
When duplicating a sign template, its sign items were copied but their `responsible_id` was kept as a reference to the same `sign.item.role` records. As a result, editing a role on one template (e.g. assigning a partner through `assign_to`) leaked to the other template sharing it. Copy the role when copying a sign item so each template owns its own roles. task-6288951 Forward-Port-Of: odoo/enterprise#119864
This fix brings back the behavior that hides the column count option when a specific layout class is used. It ensures website content editors see the intended editing options again, matching how the builder worked before the refactoring.
Original PR description
The class 's_nb_column_fixed' was used to hide the column count option, but it got lost during the refactoring and doesn't work since 18.4. This commit restores it. task-6234267 Forward-Port-Of: odoo/odoo#271975 Forward-Port-Of: odoo/odoo#268005
This change updates a salary configurator test so it includes the employee’s private address information. It helps ensure the test reflects real-world employee data and prevents false failures in the salary setup flow.
Original PR description
Task-6329628 Forward-Port-Of: odoo/enterprise#121935 Forward-Port-Of: odoo/enterprise#121626
This update keeps restaurant order quantities correctly in sync after split payments when the Germany Fiskaly setup is enabled. It prevents already-paid items from remaining on the parent order, so staff cannot accidentally charge the same lines multiple times from the Orders view.
Original PR description
In POS Restaurant with Germany Fiskaly enabled, splitting and paying from a table works once, but repeating the same flow from the Orders tab lets the parent order show lines that were already paid…
In POS Restaurant with Germany Fiskaly enabled, splitting and paying from a table works once, but repeating the same flow from the Orders tab lets the parent order show lines that were already paid in previous splits. Functionally, the cashier can keep splitting and paying the same line again and again because the parent draft order is not updated consistently in that path. Steps to reproduce: ------------------- * Enable POS Restaurant with l10n_de Fiskaly * Create a table order (e.g. 3 meals + 3 drinks) * Open Split Bill, move 1 meal + 1 drink, and pay * From Orders tab, open the remaining parent order and repeat split + pay * Reopen the parent order from Orders tab > Observation: The parent order still contains quantities that were already split/paid, so the same items can be paid multiple times from the Orders tab. Why the fix: ------------ The Fiskaly `syncAllOrders` override diverged from core sync behavior in the split flow: it ignored explicit `options.orders` and did not await transaction creation for inactive transactions. In the split-bill path this could skip or desynchronize parent-order updates, leaving stale quantities on the parent order. The fix restores expected sync semantics by honoring `options.orders` and awaiting transaction creation before deciding sync eligibility. opw-6175880 Forward-Port-Of: odoo/enterprise#117206
When a POS order is edited in the backend, taxes on new lines could disappear after saving even though they were shown correctly on screen. This update makes sure those tax values are saved properly, preventing incorrect totals during returns or exchanges.
Original PR description
The `tax_ids` field on `pos.order.line` is defined with `readonly=True`. When editing a POS order from the backend (e.g. during a return/exchange flow), the `_onchange_product_id` method correctly…
The `tax_ids` field on `pos.order.line` is defined with `readonly=True`. When editing a POS order from the backend (e.g. during a return/exchange flow), the `_onchange_product_id` method correctly sets `tax_ids` from the product, and the computed `tax_ids_after_fiscal_position` displays the mapped taxes in the UI. However, because `tax_ids` is readonly, the web client does not include it in the save payload. As a result, the taxes are silently dropped on save and `tax_ids_after_fiscal_position` recomputes to empty. Steps to reproduce: 1. Create and pay a POS order with a product that has taxes 2. Go to the backend (Point of Sale > Orders) and open that order 3. Initiate a return for the order 4. In the return order, add a new product (exchange scenario) 5. Observe that taxes are correctly shown on the new line 6. Click Save 7. The taxes disappear from the order line The fix adds `force_save="1"` to the `tax_ids` field in both the list and form views of `pos.order.line`, consistent with how `price_subtotal` and `price_subtotal_incl` are already handled in the same views. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261672 Forward-Port-Of: odoo/odoo#253680
This fix prevents inventory cost adjustment lines from being treated like normal tax bases when bills are confirmed. As a result, manually edited tax amounts on vendor bills are no longer overwritten during confirmation, which avoids unexpected changes for users.
Original PR description
## Description of the issue/feature this PR addresses: Setup plus video 1. Go to settings, enable "Automatic Valuation" and "Storeable Locations". 2. Navigate to Product Categories. 3. Create a new…
## Description of the issue/feature this PR addresses: Setup plus video 1. Go to settings, enable "Automatic Valuation" and "Storeable Locations". 2. Navigate to Product Categories. 3. Create a new product category with the costing method Standard Price and the inventory valuation Automatic. 4. Navigate to Products, click into any product. 5. Add the new product category to this product under General Information. 6. Add any tax in the purchase tax field. 7. In the Accounting tab of the product, add any account to the Price Difference Account field. https://drive.google.com/file/d/1i2DHEt0g9G5Edad_QB3QaFkOT49cbMAZ/view?usp=sharing Instructions to reproduce error 1. Navigate to Purchase. 2. Add a customer, then add the configured product. 3. Add a tax to the line. Ensure that the tax and price_unit are nonzero. 4. Confirm the order. 5. Receive the product. 6. Create the bill. 7. Edit the tax on the vendor bill, then save the changes. Notice that the changes are kept. 8. Select Confirm. Notice that the changes to the tax line are not kept, and that the COGS lines appeared (with taxes applied to them). 9. Reset the bill to draft. 10. Click into the configured product and remove the product category. 11. Repeat steps 7-8 . No COGS lines, and the tax line is the manually set value. ## Current behavior before PR: COGS lines with taxes have no net effect on any tax lines as they cancel each other out. However, their creation triggers the recalculation of all tax lines, undoing any manual adjustments to tax lines. ## Desired behavior after PR is merged: This commit ensures that COGS lines are not considered base tax lines, so that their creation does not trigger the recalculation of other base tax lines. opw-5387248 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#271262 Forward-Port-Of: odoo/odoo#262442
Employees can now submit expenses even if they do not have a manager assigned, avoiding an error that blocked the process. They can also continue adding comments and attachments to their own expenses after they are no longer in draft, which makes it easier to answer questions and provide supporting documents.
Original PR description
# [FIX] hr_expense: Submitting an expense without a manager doesn't work If a user tries to submit an expense without having a manager, this will fail with "You are neither a Manager nor a HR Officer". To fix this, we are not going to check when the manager is the user that expense is linked to. --------- # [FIX] hr_expense: Employee cant use chatter on his own expenses 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](https://www.odoo.com/odoo/all-tasks/4966942) Forward-Port-Of: odoo/odoo#272957 Forward-Port-Of: odoo/odoo#224575
Odoo has updated the GIF integration settings to use Klipy instead of Tenor. This change helps ensure GIF features keep working after Tenor’s service is retired, but existing API keys must be replaced with valid Klipy keys.
Original PR description
Tenor API will be terminated on June 30, 2026: https://developers.google.com/tenor/guides/quickstart This commit makes the Tenor API key input settings use a Klipy GIF API key instead of a Tenor GIF API key. To keep GIF working after this commit, the API key must necessarily be changed to a Klipy GIF API key, as the old Tenor API key would be considered as an invalid Klipy API key. Task-5491965 Upgrade: https://github.com/odoo/upgrade/pull/10516 Forward-Port-Of: odoo/odoo#272630 Forward-Port-Of: odoo/odoo#250113
This update ensures Romanian-specific stock handling is only applied when it should be. It prevents test and system errors caused by those settings being enabled unconditionally, improving stability for automated checks and future updates.
Original PR description
The Romanian specifics were applied without condition which caused runbot errors. Note that this was revealed later on (saas-19.3) after a change in the generic stock test setup. runbot-241098 Forward-Port-Of: odoo/odoo#271985
This update fixes the Peru Kardex PLE inventory reports so they calculate quantities and values more accurately, especially when there are later purchases or negative opening balances. It also keeps landed costs visible as separate report lines, improving compliance and making the report easier to reconcile.
Original PR description
*Continuing on the work from https://github.com/odoo/enterprise/pull/111526, new PR because we cannot push to it.* Adapt the Kardex PLE 12.1/13.1 reports from the SVL-based approach in 18.0 to the stock.move-based approach required in 19.0. Key changes: - Use traceable IDs (account_move_id/stock_move_id) for CUO field - Back-calculate opening balance cost at report date instead of using current standard_price, which is wrong when post-period purchases have changed the average cost - Filter storable products only (is_storable) matching v17/v18 behavior - Handle negative opening balance quantities correctly - Add bridge module l10n_pe_reports_stock_landed_costs to show landed costs as separate Kardex lines (operation_type=26) without forcing stock_landed_costs as a hard dependency Forward-Port-Of: odoo/enterprise#121855
2 changes
Resolved issues and error corrections
This update corrects the Peru Kardex PLE stock reports so they produce more accurate inventory and cost figures in 19.0. It also adds support for showing landed costs separately, while keeping that functionality optional so businesses do not need an extra dependency unless they use it.
Original PR description
*Continuing on the work from https://github.com/odoo/enterprise/pull/111526, new PR because we cannot push to it.* Adapt the Kardex PLE 12.1/13.1 reports from the SVL-based approach in 18.0 to the stock.move-based approach required in 19.0. Key changes: - Use traceable IDs (account_move_id/stock_move_id) for CUO field - Back-calculate opening balance cost at report date instead of using current standard_price, which is wrong when post-period purchases have changed the average cost - Filter storable products only (is_storable) matching v17/v18 behavior - Handle negative opening balance quantities correctly - Add bridge module l10n_pe_reports_stock_landed_costs to show landed costs as separate Kardex lines (operation_type=26) without forcing stock_landed_costs as a hard dependency Forward-Port-Of: odoo/enterprise#121855
Fixed an issue where Auto Plan could assign a person based only on the project, even if that person was not linked to the selected role. This ensures planning suggestions stay consistent with the role chosen on the slot, avoiding incorrect assignments.
Original PR description
## Issue When using the *Auto Plan* feature on a planning slot with a Role and a Project set, a resource which operated on the same project will be chosen if available, without taking into account…
## Issue
When using the *Auto Plan* feature on a planning slot with a Role and a Project set, a resource which operated on the same project will be chosen if available, without taking into account the Role set on the slot.
## Steps to reproduce
1. Install Project Planning (`project_forecast`)
2. In Planning > Configuration > Roles, create two planning roles A and B
- Role A: Assign a resource R
- Role B: No resource
3. Open Planning (Schedule by Resource), and go back a few weeks (to prevent overlaps with potential demo data)
4. Create two new slots:
1. Set Role B and a random Project P, then click Auto Plan: there should be no available resource (because we didn't set any resource for Role B)
2. Set Role A and the same Project P, then click Auto Plan: it should assign the resource R assigned to Role A
5. After assigning a resource to the slot for Role A, edit the Open Shift for Role B again and click Auto Plan: **it assigns the same resource R, even though that resource is not assigned to Role B.**
## Cause
The `_get_open_shifts_resources` override in `project_forecast` looks for resources that were assigned to slots related to the same project. It does not filter resources based on the requested role.
https://github.com/odoo/enterprise/blob/885edbc270a86ab76e0a6eff4acb5767c0fe29d1/project_forecast/models/planning_slot.py#L104-L116
This means that resources that are not part of the requested role can be assigned to the slot, as long as the resource operated on another slot for the same project.
opw-6325744
Forward-Port-Of: odoo/enterprise#1220351 change
Resolved issues and error corrections
Expense reports now enforce limits on attached files, helping keep submissions within expected size and number constraints. This reduces the risk of overly large expense claims and improves reliability when employees submit expenses.
Original PR description
--- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#272732
3 changes
Resolved issues and error corrections
When Belgian CODA bank statements are imported, the full communication text is now used as the payment reference in cases where the reference was not structured. This makes imported transactions easier to identify and match with the right payments.
Original PR description
### Issue: When a CODA file was imported, the communication was fetched but it wasn't use as the payment ref Causing difficulty to match with the transactions ### Cause: For simplicity reason, the payment_ref and the communication where different The `payment_ref` was fetched once and replace The `communication` was always completed by new lines ### Steps to reproduce: - Install `l10n_be_coda` - Set the account on the Bank Journal to GR5605700000000928073840752 - Import the Simplied CODA (On the ticket) from the bank dashboard Before the fix, the ref was just `Liquidation des ventes par carte Mastercard` instead of the full communication that can be found in the chatter opw-6245848
The test for the Colombia POS flow was adjusted so it no longer expects one exact document number. This prevents occasional failures when the document number increases during repeated test runs, making the test more stable without changing business behavior.
Original PR description
**Why the fix:** This step failed from time to time as we did some batch testing on the runbot with the same database, and because of this, the Número de Documento increased, making it SETF990000002 or more. This error existed before 68da209 but by fixing the refund flow in said commit, this error has been appearing way more frequently. As this has already happened a few times in 18.2, it is still the targeted version for this fix. We now use a regex to make sure that we have **Número de Documento: SETF** followed by some numbers, but we do not specify that it should be SETF990000001 anymore. runbot-241997
This change fixes an issue that prevented PDF downloads for a specific type of Guatemalan vendor bill. Users can now generate and download the document successfully after sending it to SAT, without running into error messages.
Original PR description
**Steps to reproduce:** - Install the `l10n_gt_edi` module and switch to a `GT Company`. - Create a new vendor bill with: - Vendor: GT Company - GT Document Type: `FESP` - Add taxes `VAT Withholding…
**Steps to reproduce:** - Install the `l10n_gt_edi` module and switch to a `GT Company`. - Create a new vendor bill with: - Vendor: GT Company - GT Document Type: `FESP` - Add taxes `VAT Withholding 12%` and `ISR Withholding 5%` in Invoice lines. - `Confirm` the bill and `Send to SAT`. - From the gear icon, click `Download` > `PDF`. **Error1:** `KeyError: 'gran_total'` **Error2:** `KeyError: 'retencion_grand_total'` **Root Cause:** In commit [1], the code at [2] missed calling `_l10n_gt_edi_add_base_values()` before `_l10n_gt_edi_add_withholding_values()`. However, `_l10n_gt_edi_add_withholding_values()` uses the `gran_total` value, which is initialized by `_l10n_gt_edi_add_base_values()`, resulting in a `KeyError`. Additionally, the report template at [3] references `retencion_grand_total` instead of the correct key `retencion_gran_total`, causing another `KeyError`. **Fix:** This commit prevents errors and ensures users can successfully download the PDF by applying a fix similar to [4], [1]: https://github.com/odoo/enterprise/commit/44afd19e4ed0827e343af0e584c81e579935c9e8 [2]: https://github.com/odoo/enterprise/blob/9846b337cfe1876017c7c2ce3041569d7a2ac03f/l10n_gt_edi/models/account_move.py#L305-L328 [3]: https://github.com/odoo/enterprise/blob/9846b337cfe1876017c7c2ce3041569d7a2ac03f/l10n_gt_edi/views/report_invoice.xml#L72 [4]: https://github.com/odoo/enterprise/blob/9846b337cfe1876017c7c2ce3041569d7a2ac03f/l10n_gt_edi/models/account_move.py#L790-L800 opw-6323049 Forward-Port-Of: odoo/enterprise#122030
5 changes
Enhancements to existing features
Odoo can now use email contact data captured by the Gmail browser extension to improve timesheet suggestions. When emails are read or composed, the related people can be matched to projects or tasks and added as helpful key suggestions, making it easier to find the right work items faster.
Original PR description
[IMP] timesheet_grid: Gmail watcher In this commit, Odoo now consumes data from the new Gmail Chrome and Firefox web extension, which captures the from, to, cc, and bcc fields of read and composed emails and sends them to Activity Watch. Odoo retrieves these events, extracts the emails, searches for partners linked to projects and/or tasks, and adds them to suggestions as keyEvents. task-5956040 Forward-Port-Of: odoo/enterprise#120727 Forward-Port-Of: odoo/enterprise#112014
Employers can now record transport subscriptions paid directly to a provider on Belgian payroll slips. This ensures the amount is reflected in the employee’s individual statement and the 281.10 tax report, while keeping the employee’s actual net pay unchanged.
Original PR description
Before this commit, when an employer paid an employee's transport subscription directly (e.g. a bus company billing the company), there was no way to record that amount on the payslip, so it never appeared on the individual account or the 281.10 fiscal report. After this commit, two CP200 salary rules handle it: an input rule (TRANSPORT_3P) adds the encoded subscription to the net, and a deduction rule (TRANSPORT_3P_DED) subtracts the same amount before the net, keeping real net pay unchanged. The declared amount now flows into 281.10 box 14a, alongside other public transport reimbursements. task-6293778
Users can now set a down payment as either a percentage or a fixed amount before an order is confirmed. The system keeps both values in sync automatically, and disabling prepayment is now done by setting the down payment to zero, simplifying the configuration.
Original PR description
Previously, we could only specify a down payment as a percentage. Now users can specify a fixed amount for the down payment required before confirming the order. When the amount changes, the percentage is automatically recalculated, and vice versa. When configuring the template, only a percentage can be set. We removed the online payment toggle and field. So now, to disable the prepayment feature, we have to set the down payment to 0. The **require_payment** field has been removed, and we now use _prepayment_percent = 0_ to indicate that _require_payment = False_. PR: https://github.com/odoo/odoo/pull/270071 Upgrade: https://github.com/odoo/upgrade/pull/10509 task-6293915
Resolved issues and error corrections
This fix lets the Barcode app correctly register several serial numbers or lots during one manufacturing session instead of keeping only the last one. It prevents validation errors and ensures the finished product is saved with the right production details, which makes manufacturing workflows more reliable.
Original PR description
Steps to reproduce ------------------ Serial-tracked finished product: 1. Create a serial-tracked finished product and an un-tracked component. 2. Create a Manufacturing Order with quantity 2 and…
Steps to reproduce ------------------ Serial-tracked finished product: 1. Create a serial-tracked finished product and an un-tracked component. 2. Create a Manufacturing Order with quantity 2 and confirm it. 3. Open the Barcode app, scan the MO, then scan a first serial number SN_X1. 4. Scan a second serial number SN_X2. 5. Validate. Lot-tracked finished product: 1. Create a lot-tracked finished product with a one-component BoM and an existing lot LOT_A. 2. Create a Manufacturing Order and confirm it. 3. Open the Barcode app, scan the MO, then scan the existing lot LOT_A. 4. Scan a different, not-yet-existing lot LOT_B. 5. Validate. Issue ----- Only the last scanned serial is registered on the MO, and validation then fails because the count of producing serials does not match qty_producing for a serial-tracked finished product. updateLine overwrote lot_producing_ids with [args.lot_id] on every scan, so the first serial was dropped when the second one was scanned, and the same branch never staged a freshly typed lot_name, so a brand-new serial typed on a serial-tracked MO was lost before reaching the backend. https://github.com/odoo/enterprise/blob/4a2f1da5466740b7758d1962e5241620845d616b/stock_barcode_mrp/static/src/models/barcode_mrp_model.js#L407 Two behaviours of the shared barcode dispatcher make a single accumulating branch insufficient. The final-product line must keep exposing a producing lot, otherwise the base hasUnassignedQty check counts a scanned serial as zero once a quantity is already set, leaving qty_producing stuck below the demand. https://github.com/odoo/enterprise/blob/f622064871bf55b93890606d16407c50cf4419a6/stock_barcode/static/src/models/barcode_model.js#L1446 But exposing a producing lot makes the dispatcher treat the next serial as a conflicting tracking number, since the base _canOverrideTrackingNumber considers a different lot name non-overridable. https://github.com/odoo/enterprise/blob/f622064871bf55b93890606d16407c50cf4419a6/stock_barcode/static/src/models/barcode_model.js#L796-L798 So the scan is diverted to a new line through the override gate instead of updating the header line. https://github.com/odoo/enterprise/blob/f622064871bf55b93890606d16407c50cf4419a6/stock_barcode/static/src/models/barcode_model.js#L1585 For a lot-tracked finished product the producing lot can be corrected by scanning a different value, but the lot branch only stored a freshly typed value in lot_name and overwrote lot_producing_ids with the single existing lot. https://github.com/odoo/enterprise/blob/4a2f1da5466740b7758d1962e5241620845d616b/stock_barcode_mrp/static/src/models/barcode_mrp_model.js#L404-L407 The header reads its lot from lot_producing_ids whenever that relation is set and only falls back to lot_name when it is empty. https://github.com/odoo/enterprise/blob/4a2f1da5466740b7758d1962e5241620845d616b/stock_barcode_mrp/static/src/components/header.js#L45-L58 The save path only promotes lot_name to a producing lot when lot_producing_ids is empty, so scanning an existing lot then a new one neither displayed nor recorded the new lot and the finished product was produced under the old lot. https://github.com/odoo/enterprise/blob/4a2f1da5466740b7758d1962e5241620845d616b/stock_barcode_mrp/static/src/models/barcode_mrp_model.js#L628 Solution -------- Accumulate scanned serials by appending to lot_producing_ids instead of replacing it, and stage a freshly typed lot_name as a new producing lot when the finished product is tracked by serial, so every serial reaches the backend. Keep the final-product line exposing the last producing lot so each scanned serial is still counted as one unit instead of resetting the quantity to zero once several serials are registered. Override _canOverrideTrackingNumber for the final-product line so a serial scan updates the header line rather than being diverted to a new line, which is the only valid path for the finished product since it is a single header line backed by the lot_producing_ids relation. Persist the producing serials with explicit x2many commands, separating already-existing lots from freshly typed ones, so both are written on the MO. Reject a serial that is already registered on the MO so the same number cannot be produced twice in one session. For a lot-tracked finished product, build a producing lot from the scanned value, using the existing lot or a freshly typed lot name, and store it in lot_producing_ids so the new lot is both displayed and persisted through the same x2many commands as the serial case. Leave the produced quantity unchanged when the scanned lot differs from the one already registered, since replacing the lot is a correction and not an extra unit, and keep incrementing it when the same lot is scanned again. opw-6189620 Forward-Port-Of: odoo/enterprise#121849 Forward-Port-Of: odoo/enterprise#116890
Code cleanup and technical improvements
This change moves a shared address-splitting helper into a more central location used by several local reporting modules. It does not change business behavior, but it simplifies maintenance and keeps the affected country-specific reports aligned on the same logic.
Original PR description
https://github.com/odoo/odoo/pull/269676
1 change
Resolved issues and error corrections
We fixed an issue in Kenyan PoS orders where selling a combo could wrongly trigger an eTIMS registration warning and block payment. The combo itself is now ignored for eTIMS checks, so only the actual products inside the combo need to be registered, allowing the order to be completed normally.
Original PR description
Steps to reproduce ------------------ 1. Install l10n_ke_edi_oscu_pos. 2. Select the Kenyan company. 3. Enable eTIMS on the PoS. 4. Register the products inside a combo, but not the combo itself. 5.…
Steps to reproduce ------------------ 1. Install l10n_ke_edi_oscu_pos. 2. Select the Kenyan company. 3. Enable eTIMS on the PoS. 4. Register the products inside a combo, but not the combo itself. 5. Sell the combo in the PoS. Observation ----------- We see a warning that the combo must be registered to eTIMS, and the order can't be validated. What's happening ---------------- In the PoS a combo adds a 0 price parent line for the combo product, but the combo is not a real item to send to eTIMS, only the products inside it are, and (as per step 4) the combo is not registered. `checkEtimsFields` sees the combo as not registered, so it raises the warning in `showUnregisteredProductsWarning` and blocks the payment in `validateOrder`. Fix --- In the backend, we skip sending the parent combo line to eTIMS, and on the frontend, we make the combo parent line not need eTIMS registration, so the warning and the block don't apply to it. opw-6253306 Forward-Port-Of: odoo/enterprise#121991 Forward-Port-Of: odoo/enterprise#119362
5 changes
Resolved issues and error corrections
This change resolves a test failure affecting Swedish SEPA payments when two related modules are installed together. It updates the test setup so the payment format works consistently and avoids false failures in automated checks.
Original PR description
Here https://github.com/odoo/enterprise/pull/114662 we changed the way the CdtrAgt node is used in the SEPA XML file for Sweden. But this change broke a test when both account_iso20022 & l10n_se_bban are installed, leading to a Non-expected child error. This commit skip the failling test if l10n_se_bban is installed, and add a new one to replace it. runbot-938366 runbot-938367
This change updates an accounting import test to use a smaller, prebuilt XML example instead of a generated one. It makes the test easier to maintain and more reliable, helping ensure partner bank details are retrieved correctly during invoice imports.
Original PR description
Move the partner retrieval bank account number test to the `test_ubl_import_bis3_invoice_be_retrieve_partner.py` file and use a partial XML instead of a generated XML.
Mass mailing emails now build unsubscribe and related links from the recipient’s own website instead of a global default. This prevents users in multi-company setups from being sent to a login page when they try to opt out, making the unsubscribe flow reliable and consistent.
Original PR description
In a multi-company setup with a website per company, the unsubscribe link in mass mailing emails could send recipients to the login page instead of the unsubscribe confirmation page. ### Steps to…
In a multi-company setup with a website per company, the unsubscribe link in mass mailing emails could send recipients to the login page instead of the unsubscribe confirmation page.
### Steps to reproduce
1. Enable multi-company and create a second company `Company B`.
2. Create two websites with different domains, one per company:
- `Website A` on the main company, domain `http://website-a.test`
- `Website B` on `Company B`, domain `http://website-b.test`
3. Set the system parameter `web.base.url` to `http://website-a.test`. System parameters are global, so this value applies to the whole database regardless of the company you switch to.
4. Create a contact and set its `Company` field to `Company B`.
5. In Email Marketing, create a mailing with recipient model `Contact`, target the contact above, pick any template with an unsubscribe link, and send it.
6. Open the email in an incognito window and click the unsubscribe link: you land on the login page instead of the unsubscribe page.
### Cause
Mass mailing builds the unsubscribe link in two steps.
First, each email body is rendered for its recipient. While rendering, relative URLs like `/unsubscribe_from_list` are turned into absolute URLs by prepending a base URL. That base URL comes from the recipient record itself: `recipient.get_base_url()`. The `website` module overrides this so that, when the record has a company, it returns that company's website domain. For a contact in `Company B`, the body ends up with `http://website-b.test/unsubscribe_from_list`.
Second, right before sending, `mail_mail._prepare_outgoing_list` replaces that placeholder URL with a per-recipient signed URL pointing to `/confirm_unsubscribe`. It does this by plain string replacement: it looks for `{base_url}/unsubscribe_from_list` in the body and swaps it. The `base_url` used here came from `self.mailing_id.get_base_url()`. A mailing has no company, so its base URL falls back to the global `web.base.url`, which in our setup is `http://website-a.test`.
The two base URLs no longer match. The body contains the website B URL, but the replacement code searches for the website A URL. The search fails, the placeholder stays in the email, and the recipient clicks a link to `/unsubscribe_from_list`. That route only redirects to `/mailing/my`, which requires being logged in, so the user lands on the login page.
### Fix
Compute the base URL from the recipient record (the same record used when rendering the body) instead of the mailing. The two URLs then agree and the replacement works. Fall back to the mailing's base URL if there is no recipient model on the mail.
opw-4914203This update fixes a crash that could happen when a negative forecast demand was entered in the last planning period. It also ensures any leftover negative quantity is applied to the first forecast, matching the intended planning behavior.
Original PR description
Steps to reproduce: - Fresh DB - Add a negative number to the forecast demand in the last period Cause: A variable was used without declaration Fix: According to odoo/enterprise#56128, it was intended that any remaining negative quantity to add should be added to the first forecast.
This update prevents Helpdesk users from selecting customers that belong to a different company when creating a ticket quickly from the Kanban view. It helps avoid cross-company data mistakes and makes customer selection match the company of the ticket team.
Original PR description
Steps to reproduce: - Create two companies (Company A and Company B) - Create one partner in each company - Enable both companies for the user - Open Helpdesk and go to the tickets Kanban view for a Company A team. - In the quick create form, the customer dropdown shows customers from Company B Issue: - Customers from other companies are visible in the customer field, Cause: - The partner_id field in the quick create view had no domain, so it displayed partners from all allowed companies. Solution: - Added a domain on partner_id in the ticket quick create form view. task-4971466 Forward-Port-Of: odoo/enterprise#121944
1 change
Resolved issues and error corrections
The Mexican trial balance XML report now follows the SAT-recommended order for account nodes. This brings the generated file in line with the official structure, helping avoid validation or review issues when submitting reports.
Original PR description
**Steps to reproduce:** - Install the `l10n_mx_reports` module and switch to a Mexican company. - Navigate to Accounting > Reporting > Trial Balance. - From the dropdown menu, click `SAT (XML)`. -…
**Steps to reproduce:** - Install the `l10n_mx_reports` module and switch to a Mexican company. - Navigate to Accounting > Reporting > Trial Balance. - From the dropdown menu, click `SAT (XML)`. - Open the generated XML file and inspect the `<BCE:Ctas>` nodes. **Observation:** - The generated XML uses the following attribute order: `Debe > NumCta > Haber > SaldoFin > SaldoIni` - However, the SAT-recommended structure is: `NumCta > SaldoIni > Debe > Haber > SaldoFin` **Root Cause:** At [1], the attributes of the `<BCE:Ctas>` node are defined in an order that differs from the SAT-recommended structure. While the XML remains valid, the generated report does not match the layout recommended by the Mexican government specification. **Fix:** This commit reorders the `<BCE:Ctas>` attributes to follow the SAT-recommended structure, aligning the generated XML with the behavior introduced at [2] for `saas-19.3`. backport-of: https://github.com/odoo/enterprise/pull/115374 [1]: https://github.com/odoo/enterprise/blob/cb9c19272309d793379fa4d23145162f72fa5552/l10n_mx_reports/data/templates/cfdibalance.xml#L15-L20 [2]: https://github.com/odoo/enterprise/blob/acf0929a88ec788aecd44f6b4c647e468dc0a319/l10n_mx_reports/data/templates/cfdibalance.xml#L17-L22 opw-6297711