Monday, September 21, 2026
50 changes · master
Enhancements to existing features
The timesheet assistant animation now ends more smoothly by keeping the focus on the timesheet screen and showing the total time captured. The example entries look more realistic with client names and clearer task labels, making the assistant feel more polished and easier to understand.
Original PR description
Before these changes, the animation cut harshly to the end message. Now the focus stays on the timesheet screen at the end, showing the total time captured. The message is clearer, and the logs now carry a client to look like real timesheets. task-6090601 Forward-Port-Of: odoo/enterprise#126838
Manufacturing order PDF reports now have clearer styling and include more useful production details. Business users can see produced lot or serial numbers, deadlines, consumed quantities, quantities still to consume, and component serial numbers directly in the report.
Original PR description
Improved styling and added extra information to the MO pdf. The lot/serial numbers for the produced products are now displayed on the pdf. The deadline is also displayed. Furthermore the consumed and to consume quantity of each part are now displayed, same as the serial numbers associated with the parts. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#287596
Romanian eTransport declarations can now be generated for supported dropshipping scenarios, including domestic and international B2C flows. This helps businesses using dropshipping comply with Romanian transport reporting requirements, while unsupported B2B dropship cases now show clear errors.
Original PR description
Before this commit: Dropship operations were not supported by the Romanian eTransport integration. As a result, eTransport declarations could not be generated for dropshipping flows. After this commit: eTransport declarations can now be generated for dropship operations, allowing the supported dropshipping scenarios to be processed through the Romanian eTransport workflow. task-6391489 Forward-Port-Of: odoo/odoo#289344 Forward-Port-Of: odoo/odoo#280199
The partner amount due button now uses a more general label and shows signed amounts instead of always displaying absolute values. Open item views also include payable items by default, giving users a clearer picture of customer and supplier balances.
Original PR description
With this commit:- - We changed the label of the smart button and gave generic name. - The button will not show the absolute value, but simple values with a sign will be shown. - Open items will also have the 'payable' filter by default. task-6528204 Forward-Port-Of: odoo/enterprise#131910
The Sales dashboard now updates its cards after users run actions on selected sales orders. This keeps counts and amounts current without requiring a manual page refresh, improving confidence in dashboard data during daily sales work.
Original PR description
**Target: 20+** **Description of the issue/feature this PR addresses:** The Sales dashboard doesn't dynamically reflect changes made through actions. **Current behavior before PR:** Selecting several sale orders in the list view and running an action updates the records but the dashboard cards above keep showing stale counts/amounts until the page is manually refreshed. **Desired behavior after PR is merged:** After such a action completes, the dashboard automatically reloads and shows up-to-date data. Forward-Port-Of: odoo/odoo#288506
This update keeps light gray visual elements looking consistent after the broader web client redesign changed the meaning of the secondary color. It helps avoid unexpectedly darker backgrounds, borders, alerts, and icons across several Odoo apps, preserving the intended user experience.
Original PR description
- requires: https://github.com/odoo/enterprise/pull/131768 With the webclient redesign deployed for Odoo 17, we used to set `$secondary` to `$gray-300`, a light gray, while Bootstrap's secondary is a…
List views now give clearer feedback while users edit multiple records, replacing separate save and discard buttons with a status indicator. Clicking, focusing, and validation behavior is more reliable, so users are less likely to lose track of required corrections during bulk edits.
Original PR description
Main changes: - Add `ListStatusIndicator` to replace Save/Discard buttons. - Improve cell click and focus behavior in `ListRenderer`. - Update cursor styles for selected and read-only cells (editable fields will have text cursor otherwise default cursor). - Remove the mass-edit pencil button. task-6463104
Point of Sale global discount lines now show the applied percentage when relevant and avoid showing unnecessary unit price details for fixed discounts. This makes discounts easier for staff and customers to understand across POS screens, receipts, customer displays, and self-ordering flows.
Original PR description
..., point_of_sale, pos_self_order, pos_discount_self_order (ADD) --- Global discount lines did not indicate the applied percentage and displayed redundant unit price information for fixed discounts. Include the percentage in the name of percentage discount lines and hide their unit price details. Apply this consistently to the POS, receipts, customer displays, and self-ordering interfaces. --- Task: https://www.odoo.com/odoo/project/1737/tasks/6537486
This update brings the spreadsheet component to a newer version with improvements for resizing rows and columns, better handling of zoom values, and fixes that prevent blank spreadsheet grids. Users should see a smoother and more reliable spreadsheet experience in Odoo dashboards and spreadsheet views.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/63c49a88a3 [REL] 20.1.0-alpha.2 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/63c49a88a3 [REL] 20.1.0-alpha.2 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/62ac6604c6 [FIX] header_resize_editor: remove unnecessary toString() [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/4bcd7f6f33 [IMP] zoom: clip out-of-range values instead of ignoring them [Task: 6515617](https://www.odoo.com/odoo/2328/tasks/6515617) https://github.com/odoo/o-spreadsheet/commit/b7e1d79a4d [FIX] stores: prevent blank grid when zoom value is empty [Task: 6515617](https://www.odoo.com/odoo/2328/tasks/6515617) https://github.com/odoo/o-spreadsheet/commit/c2bc431a3c [REL] 20.1.0-alpha.1 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/0d33ec1665 [IMP] headers: resize rows and columns from context menu [Task: 6234780](https://www.odoo.com/odoo/2328/tasks/6234780) https://github.com/odoo/o-spreadsheet/commit/b704a2d032 [REF] viewports: centralize Cartesian coordinate lookup [Task: 6234780](https://www.odoo.com/odoo/2328/tasks/6234780) https://github.com/odoo/o-spreadsheet/commit/0bd4c2d221 [IMP] headers: cap row and column sizes [Task: 6234780](https://www.odoo.com/odoo/2328/tasks/6234780) https://github.com/odoo/o-spreadsheet/commit/1307c3f3a9 [REF] env: remove side panel methods [Task: 6566084](https://www.odoo.com/odoo/2328/tasks/6566084) 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>
Spanish Veri*Factu invoice problems that are detected before submission are now marked as rejected and shown in the usual invoice views. The sales journal dashboard also highlights invoices with Veri*Factu errors, helping accounting teams spot and resolve issues sooner.
Original PR description
Users had no easy way to spot sale invoices that are broken from a Veri*Factu standpoint: the account.move field only ever reached the 'rejected' state after a real submission attempt to the AEAT got…
Users had no easy way to spot sale invoices that are broken from a Veri*Factu standpoint: the account.move field only ever reached the 'rejected' state after a real submission attempt to the AEAT got a negative answer. Invoices that fail local validation before anything is sent (e.g. more than one main tax on a line) generate a l10n_es_edi_verifactu.document with errors filled in but state left empty, so they never showed up as rejected anywhere and could sit unnoticed until someone opened the invoice's Veri*Factu tab. Widen L10nEsEdiVerifactuDocument._get_state() so a document also counts as 'rejected' whenever it has errors set, regardless of the literal state value. This reuses the existing account.move computed/stored l10n_es_edi_verifactu_state field as the single source of truth instead of duplicating the check against the UI-only, non-stored warning fields, so every consumer of that state (list view badge, search filters) picks up the change for free. On top of that, add a "Veri*Factu Error(s)" entry to the sale journal's dashboard kanban card, with its own search filter, so these invoices are visible from the accounting dashboard without having to open each one individually. task-6463206 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update improves Belgian payroll cafeteria plan handling by adding support for net contributions and salary sacrifice calculations. It helps ensure salary simulations respect minimum wage rules and blocks offers when salary sacrifice exceeds the allowed ratio.
Original PR description
### 1 -HR_PAYROLL - flow minimaliste : - Ajout de deux champs (sans compute / depends) - Règles salariales ### 2 - Salary config Calcul du salaire à partir du YC : ce qui descend en dessous du barème min passe en **net_contrib**. => Impact sur le calcul du YC/WAGE Calcul du salary sacrifice par rapport à un pourcentage donné dans l'offre. Au-delà d'un certain ratio, l'utilisateur ne peut pas valider le formulaire. Méthode de calcul : SS = (wage sans benefices) - (wage de la simulation)
This update improves accounting behavior for companies that operate without VAT, especially in Belgium, by adding better handling of 0% non-deductible taxes and preventing errors when taxes are missing. It also refreshes the invoicing registration dashboard after Peppol or French PDP registration so users immediately see the correct next step.
Original PR description
#### [IMP] account,l10n_be: `vat_disabled` l10n_be - Add 0% ND tax for `vat_disabled` case - Also set toggle the "Default Purchase Receipt Fiscal Position" - Fix use of `self` in `for company in self` loop - remove duplicate line account - Fix a traceback in case of missing taxes - On XML import: Match the 0% ND tax for invoice lines with tax category 'O' for vat_disabled companies task-6570364 #### [IMP] account_peppol,l10n_fr_pdp: refresh page after registration I.e. this is needed so that the dashboard reloads after registration. Otherwise there is still a button to open the peppol / pdp registration wizard respectively. After the refresh it is gone and replaced by a link to the settings. task-6570364 #### [REF] l10n_be: `vat_disabled` replaced taxes Replace 4 searches with a single `_read_group` task-6570364 Forward-Port-Of: odoo/odoo#288149
HR officers can now enter a fixed monthly reimbursement amount for employees using a private car for home-to-work travel under Belgium's CP200 category. This gives payroll teams more flexibility while ensuring payslips, reporting, and related payroll documents use the chosen reimbursement amount correctly.
Original PR description
For employees under CP200 pay category, the HR officer has now the choice to either specify the private car ride between home and work, or enter a fixed amount that the employer will reimburse monthly to the employee. The private car salary rule has been modified to take into account this amount if set. The monthly amount is the same by default regarding the number of worked days it is computed on. However, the HR offcier can modify the number of days manually, which modifies the monthly amount if recomputed on the payslip. task-6424651
Shop floor and barcode users can now complete quality checks and create quality alerts without needing access to the full Quality app. This keeps the main app hidden for light users while still letting them handle required quality tasks during production or warehouse work, with better employee details available in shop floor screens.
Original PR description
Light users should be able to perform/validate quality checks and create quality alerts through shopfloor/barcode. Task: 6469225 Forward-Port-Of: odoo/enterprise#130431
Companies with VAT disabled will no longer see the generic tax report or reports based on the generic EC sales report. This keeps reporting menus focused on relevant obligations and reduces confusion for users who do not need VAT reporting.
Original PR description
- Disable the generic tax report. - Also disable all reports that have the generic ec sales report as root report. task-6570364 Forward-Port-Of: odoo/enterprise#131471
The spreadsheet component has been updated to a newer version, bringing usability improvements such as resizing rows and columns directly from the context menu. It also adds safeguards around row and column sizing and includes internal cleanup to keep the spreadsheet experience more reliable and easier to maintain.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/c2bc431a3c [REL] 20.1.0-alpha.1 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/c2bc431a3c [REL] 20.1.0-alpha.1 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/0d33ec1665 [IMP] headers: resize rows and columns from context menu [Task: 6234780](https://www.odoo.com/odoo/2328/tasks/6234780) https://github.com/odoo/o-spreadsheet/commit/b704a2d032 [REF] viewports: centralize Cartesian coordinate lookup [Task: 6234780](https://www.odoo.com/odoo/2328/tasks/6234780) https://github.com/odoo/o-spreadsheet/commit/0bd4c2d221 [IMP] headers: cap row and column sizes [Task: 6234780](https://www.odoo.com/odoo/2328/tasks/6234780) https://github.com/odoo/o-spreadsheet/commit/1307c3f3a9 [REF] env: remove side panel methods [Task: 6566084](https://www.odoo.com/odoo/2328/tasks/6566084) 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>
Resolved issues and error corrections
The calendar popover is now easier to use on mobile devices, with a bottom-sheet style design and proper scrolling when content is long. This prevents information from overlapping and helps users view calendar details more comfortably on small screens.
Original PR description
This commit improves the usability of the calendar popover on mobile by adjusting its design to match the bottom sheet. Prior to this commit, when the popover content exceeded its maximum height, it…
This commit improves the usability of the calendar popover on mobile by adjusting its design to match the bottom sheet. Prior to this commit, when the popover content exceeded its maximum height, it was not scrollable, causing the content to overlap. This commit also updates the popover to fix this issue. task-6578705 Requires: - https://github.com/odoo/enterprise/pull/132185 | Before | After | |--------|--------| | <img width="1920" height="925" alt="Screenshot 2026-09-18 at 15 22 27" src="https://github.com/user-attachments/assets/26f83b38-09f1-49b8-b1f5-49ba3a1502f1" /> | <img width="1914" height="925" alt="Screenshot 2026-09-18 at 16 07 26" src="https://github.com/user-attachments/assets/1dc784ab-3224-43da-ba4f-438d482d3c6b" /> | | <img width="430" height="699" alt="Screenshot 2026-09-18 at 17 52 42" src="https://github.com/user-attachments/assets/4ba909f1-dc0c-477a-bc25-3cb699f9b6cd" /> | <img width="441" height="712" alt="Screenshot 2026-09-18 at 17 51 43" src="https://github.com/user-attachments/assets/6c560e21-242d-45a5-8731-a6a9654c775a" /> | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#289220
- requires: https://github.com/odoo/enterprise/pull/131768
With the webclient redesign deployed for Odoo 17, we used to set `$secondary` to `$gray-300`, a light gray, while Bootstrap's secondary is a dark gray. With the new webclient redesign, it is now sets to `$o-gray-700`, closer to the Bootstrap default, so everything built on `$secondary` got darker: `bg-secondary`, `text-bg-secondary`, `border-secondary`, the `-subtle`/`-emphasis` variants, `alert-secondary` and SCSS rules reading `$secondary`.
Usages that meant "light gray" now use `gray-300`, the former value of `$secondary`, or the closest gray token, so they render as before. To get that light look, don't use secondary, instead, use:
```
bg-secondary -> bg-300
text-bg-secondary (no badge) -> text-bg-300
text-secondary (icons, dots) -> text-300
bg-secondary-subtle -> bg-100
text-secondary-emphasis -> text-700
border-secondary-subtle -> border-light-subtle
alert-secondary -> alert-light
border-secondary -> drop it: `border`, `border-top`, ...
already draw `--border-color`
(gray-300); on a `.card`, use `border`
$secondary -> $gray-300
$secondary-text-emphasis -> $gray-700
@each ... in $theme-colors -> map-merge($theme-colors,
("secondary": $gray-300))
```
task-6578378
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#288603The Gantt popover now behaves better on mobile screens by matching the bottom-sheet layout and allowing oversized content to scroll. This prevents information from overlapping or being hidden, making Gantt details easier to view on phones and small devices.
Original PR description
This commit improves the usability of the gantt popover on mobile by adjusting its design to match the bottom sheet. Prior to this commit, when the popover content exceeded its maximum height, it was…
This commit improves the usability of the gantt popover on mobile by adjusting its design to match the bottom sheet. Prior to this commit, when the popover content exceeded its maximum height, it was not scrollable, causing the content to overlap. This commit also updates the popover to fix this issue. task-6578705 Requires: - https://github.com/odoo/odoo/pull/289220 The inner design will be addressed in task-6584243 | Before | After | |--------|--------| | <img width="1915" height="928" alt="Screenshot 2026-09-18 at 15 23 12" src="https://github.com/user-attachments/assets/ca304338-92b9-4898-a43e-a2cf7b26b0f2" /> | <img width="1916" height="928" alt="Screenshot 2026-09-18 at 16 08 23" src="https://github.com/user-attachments/assets/f806c753-c059-485f-a2ef-0f53fb7b75bc" /> | | <img width="434" height="700" alt="Screenshot 2026-09-18 at 17 52 51" src="https://github.com/user-attachments/assets/709a9f4d-cf55-4889-aca2-2747d771391e" /> | <img width="440" height="703" alt="Screenshot 2026-09-18 at 17 52 02" src="https://github.com/user-attachments/assets/c7024d29-2615-4e52-b4ac-7cf542e40223" /> | Forward-Port-Of: odoo/enterprise#132185
New U.S. companies using AvaTax could create tax records without the required accounting account when Accounting was installed without demo data. This fix ensures AvaTax invoice and refund accounts are assigned during company setup, preventing incomplete tax entries on invoices.
Original PR description
Steps to reproduce: - Create a DB and Install `Accounting` without demo data - In Companies > Create New Company with `US` Localization - Switch to US Company > Add `Avatax` Credentials - Create a…
Steps to reproduce: - Create a DB and Install `Accounting` without demo data - In Companies > Create New Company with `US` Localization - Switch to US Company > Add `Avatax` Credentials - Create a Product with `Avatax Category` - Create a Invoice > In Other Info `Fiscal Position` - `Automatic Tax Mapping (AvaTax)` > `Compute Taxes` - In Taxes check newly created tax does not have a account ID Issue: AvaTax fiscal position created from chart templates have empty `avatax_invoice_account_id` and `avatax_refund_account_id` fields on a fresh database without demo data. Problem: Both fields use [defaults] based on `company.account_sale_tax_id`. During initial CoA loading, `_load_data()` creates the AvaTax fiscal position before `_post_load_data()` sets `company.account_sale_tax_id`. The defaults therefore resolve to an empty recordset and no tax account is assigned. This issue does not occur in databases with demo data because the demo company is already loaded, so `company.account_sale_tax_id` is already set when the AvaTax fiscal position is created. Solution: Set the invoice and refund accounts explicitly in the AvaTax fiscal position template to ensure they are correctly assigned during CoA loading. [defaults]: https://github.com/odoo/enterprise/blob/de17c107651394025e9a3d5cbed8d81bcfc2e76d/account_avatax/models/account_fiscal_position.py#L9-L13 opw-6347128 Forward-Port-Of: odoo/enterprise#132315 Forward-Port-Of: odoo/enterprise#126604
This fix ensures shifts without a set date are not automatically scheduled before the selected planning day or before the current time. It prevents planning errors caused by timezone handling, helping teams rely on auto-planning to place work on the intended date.
Original PR description
Prior to this commit, it was possible to schedule dateless shifts (i.e, "Shifts to Schedule") in the past. This was occuring because of the dates passed as input to the auto-plan algorithm, which are in local timezone. However, the auto-planned treated them as server-local timezone (i.e., UTC). We therefore fix (and reduce by the same occasion) the timezone conversions between user-local and server-local. Further, an open shift / dateless shift should not be scheduled before 'now'. ## Steps to reproduce: - Create a shift without date - View one day in the Gantt (e.g., September 18th) - Auto-plan ## Current behaviour: - The shift is scheduled on September 17th ## Expected behaviour: - It should be scheduled on September 18th task-6573957 Forward-Port-Of: odoo/enterprise#132141
Sales quotation templates now preserve section descriptions correctly when sections have no product, preventing blank lines from appearing in new quotations. The update also avoids saving unsupported combo lines into quotation templates, making templates more reliable for sales teams.
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#289534
Payslip work entries now subtract unpaid break time from recorded attendance. This prevents employees from being paid for break hours that should not count as worked time, improving payroll accuracy.
Original PR description
Steps to Reproduce: 1. Create an attendance from 8am to 4pm (8 hours) 2. Add 2h of Break Duration -> This reduces the worked time from 8h down to 6h. 3. Generate a payslip for this employee -> 8h of attendance is included, but it should be 6H instead Fix: Exclude `attendance.break_duration` -if there is one set- from attendance work entries' total value. task-6573873 Forward-Port-Of: odoo/odoo#289266
Public spreadsheets no longer show chart links that send viewers to internal Odoo screens they cannot access. This avoids confusing public users with actions that fail and keeps shared spreadsheets focused on usable content.
Original PR description
Task: 6449019 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#281414
Publicly shared spreadsheets no longer expose internal Odoo-only menu actions or side panels that could confuse users or cause crashes. This keeps the public spreadsheet experience stable while preserving supported public features such as geo charts.
Original PR description
Task: 6449019 Forward-Port-Of: odoo/enterprise#127354
Helpdesk teams can now link multiple community forums without causing errors when customers use the “Ask the Community” option. This keeps the self-service support experience available and avoids broken forum pages for teams that use forums or course-related discussions.
Original PR description
### Steps to Reproduce: 1) Install `website_helpdesk_slides_forum` module 2) On a Helpdesk team, link 2 (or more) forums under `Commnity Forums`. 3) Click on website smart button and then click `Ask…
### Steps to Reproduce: 1) Install `website_helpdesk_slides_forum` module 2) On a Helpdesk team, link 2 (or more) forums under `Commnity Forums`. 3) Click on website smart button and then click `Ask the community` button. ### Error: ``` odoo.addons.base.models.ir_qweb.QWebException: Error while render the template KeyError: '_forums' Template: website_helpdesk_slides_forum.helpdesk_forums ``` ### Root Cause: https://github.com/odoo/enterprise/blob/1bdd673c5fd19e335dc0948d2beed7a282e5e172/website_helpdesk_forum/controllers/website_forum.py#L18-L22 On clicking the "Ask the Community" button calls the `helpdesk_forums` controller. A single forum redirects straight to it. Several forums get rendered through `get_template_xml_id()`, with only `forums` in context. `get_template_xml_id()` is overridden in `WebsiteSlidesForumHelpdesk`, which points to : https://github.com/odoo/enterprise/blob/1bdd673c5fd19e335dc0948d2beed7a282e5e172/website_helpdesk_slides_forum/views/helpdesk_templates.xml#L3-L5 a primary copy of the inner partial `forum_all_all_entries`. That partial needs `_forums` (and, once extended by website_slides_forum, courses_discussions too), both only ever set by the page template's own t-call: [Reference](https://github.com/odoo/odoo/blob/23af2b443735c6d3a2f64e44f9ea5da45638b052/addons/website_forum/views/forum_forum_templates_forum_all.xml#L18-L19) Since `helpdesk_forums` is rendered directly instead of going through `website_forum.forum_all`, `_forums` is never set, hence `KeyError` occurs. The base `website_helpdesk_forum` module has the same root cause one level up, surfacing as a different error: https://github.com/odoo/enterprise/blob/1bdd673c5fd19e335dc0948d2beed7a282e5e172/website_helpdesk_forum/controllers/website_forum.py#L24-L25 `website_helpdesk_forum.forum_all` does not exist anywhere in the codebase. A team with multiple forums, without `website_helpdesk_slides_forum` installed, hits ``` ValueError: View 'website_helpdesk_forum.forum_all' in website 1 not found ``` Instead of a listing page. ### Fix: - Both `get_template_xml_id()` implementations now return the real, working `website_forum.forum_all` page template, which already sets `_forums/courses_discussions` through its own `t-call` and wraps the result in website.layout. - `helpdesk_forums()`'s render values are now built through an overridable `_get_helpdesk_forums_render_values()` hook instead of a hardcoded dict, so subclasses can extend the context. - `website_helpdesk_slides_forum` uses that hook to set `hide_forum_slides_link=True`, and adds one small non-primary view inheriting `website_slides_forum.forum_all_all_entries` that conditions the `/slides` promo link (not the "Course" badge, which doesn't navigate anywhere) on `not` `hide_forum_slides_link`. This targets the link element itself rather than a `t-call` site in `forum_all`, so it correctly applies whether `website_slides_forum` groups a given forum as "regular" or "course-linked". **opw-6332175** Forward-Port-Of: odoo/enterprise#131734 Forward-Port-Of: odoo/enterprise#124104
Barcode receipt screens no longer automatically focus the search bar, preventing product scans from being mistaken for transfer searches. This ensures scanned items are processed by the barcode workflow as intended, while users can still click into search when they need it.
Original PR description
Since odoo/odoo#284146, the search bar could regain focus after the barcode kanban controller blurred it during mounting. As scanners act as keyboards, scanning a product entered its barcode in the search bar and filtered transfers instead of triggering the barcode handler. Disable search bar autofocus through the barcode controller's environment instead of blurring the active element after mounting. Users can still focus the search bar manually when needed. Steps to reproduce: 1. Open the Barcode receipts kanban. 2. Scan a product barcode while the search bar is focused. 3. Observe that the barcode filters transfers as search input. Before this commit: Product barcodes could be captured by the automatically focused search bar and interpreted as a transfer search. After this commit: The search bar is not focused automatically, allowing product scans to be handled by the barcode service. Forward-Port-Of: odoo/enterprise#132217
Accounting predictions now use the most recent past entries instead of older records. This helps improve the relevance of automated suggestions when processing accounting documents, reducing the risk of outdated data influencing predictions.
Original PR description
This commit: https://github.com/odoo/enterprise/pull/38830/changes#diff-6f6931855e0903ff0d3f2b39bd5703ceaef9bdf9a516862b83f38d2d5b21a232 change the order of the predictive queries, removing the sorting order by date. Based on the current docstring: https://github.com/odoo/enterprise/blob/66682012145e5116ebec0183102bc5e930c2c343/account_accountant/models/account_move.py#L676 this is not correct, as we expect to retrieve the previous 100 entries, rather than the oldest ones. Correcting the query order ensures that the most recent entries are considered for predictive purposes. opw-6558929 Forward-Port-Of: odoo/enterprise#132254 Forward-Port-Of: odoo/enterprise#131731
Fixes an issue where users could not see the update or remove options for the currently installed website theme. This restores expected theme management actions and prevents users from being sent only to the preview flow.
Original PR description
Steps to reproduce: - Install a theme on the current website - Open the themes kanban ('Switch theme' in the builder, or Website > Configuration > Themes) - Hover the card of the theme that is…
Steps to reproduce:
- Install a theme on the current website
- Open the themes kanban ('Switch theme' in the builder, or Website > Configuration > Themes)
- Hover the card of the theme that is installed
- 'Update theme' and 'Remove theme' never show up, the card only opens the live preview
The kanban gates that overlay on `is_installed_on_current_website`, which computes `module == self.env.website.theme_id`. Since [1], `env.website` browses `context['website_id']` and has no fallback.
For every route that is not `website=True`, hence for the `/web/dataset/call_kw` through which the kanban reads its records, `ir.http._match` moves `website_id` into `host_id` and deletes it from the context. `env.website` is therefore always empty there, the field is always `False`, and the template falls back to the preview button.
`button_remove_theme` and `button_refresh_theme` resolve that same empty website. The former hands it to `_theme_remove`, which resets the default config on the generic `website_id=False` scope before returning on its `if not website.theme_id` guard; the latter upgrades an empty recordset and silently does nothing.
Fix by falling back to `host_id`, which `_match` sets to the website the user selected, as `_button_immediate_function` and `button_choose_theme` already do.
[1]: https://github.com/odoo/odoo/commit/9d97e0e919a953e4f86e42e32ca24d9790840f68Manufacturing users can now start a work order even when its workstation is marked as blocked. This removes an unnecessary dependency on another user to unblock the workstation when the operator knows it is available, helping production proceed with fewer delays.
Original PR description
Before if a user wanted to start a work order and the workstation was blocked the user had to ask someone with permission to unblock the work center to do so. The constraint is removed and we now assume that if the user wants to start a work order they know that the work center is available. task number: 6516333 Forward-Port-Of: odoo/odoo#285680
Checkout now preserves the delivery date selected by the customer instead of replacing it with the earliest available date before payment. This ensures the promised delivery date on the order matches the customer's choice, improving reliability and reducing fulfillment confusion.
Original PR description
Steps to reproduce: =================== 1. Enable Estimated Delivery on a delivery method, lead 1 day, range 90. 2. On the website, add a product to the cart and go to checkout. 3. Pick a date far in…
Steps to reproduce: =================== 1. Enable Estimated Delivery on a delivery method, lead 1 day, range 90. 2. On the website, add a product to the cart and go to checkout. 3. Pick a date far in the range, then confirm the order. => Promised Delivery is the order date + 1 day, not the date picked. Root cause: =========== `_set_delivery_method` always writes the earliest offered date on `commitment_date`, and `_recompute_cart` calls it again on the way to payment, so the choice is overwritten just before the order is placed. - [1] added the date selector with that unconditional write. Fix: ==== Only fall back to the earliest date when there is none yet, or when the one set is no longer offered, as the checkout already requires. [1]: https://github.com/odoo/odoo/commit/7e51e356728d24ca0aeb14c5ff94a0eac66e188f opw-6538537 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#288271 Forward-Port-Of: odoo/odoo#287236
Users can now start or validate manufacturing work orders even when the related workstation is marked as blocked. This reduces delays by removing the need to ask another user with unblock permissions when the operator knows the workstation is available.
Original PR description
Before if a user wanted to start a work order and the workstation was blocked the user had to ask someone with permission to unblock the work center to do so. The constraint is removed and we now assume that if the user wants to start a work order they know that the work center is available. task number: `6516333` Forward-Port-Of: odoo/enterprise#129869
The Ecuadorian ATS tax export now consolidates transactions from a company and its branches that share the same RUC. This ensures exported tax filings match the consolidated tax return totals and no branch invoices are omitted.
Original PR description
In Ecuador, a company and its branches file under a single RUC, so the ATS is expected to consolidate all of them. However, currently the system exports only the active company report. Steps to…
In Ecuador, a company and its branches file under a single RUC, so the ATS is expected to consolidate all of them. However, currently the system exports only the active company report. Steps to reproduce: - Install the Ecuadorian localization - Create a parent company and a branch, assign the RUC of the parent to the branch, and set the legal name of the branch in Settings - Post a customer invoice with taxes in the parent (e.g. 750) and another one in the branch (e.g. 250) - Activate both companies in the company selector - Go to Accounting > Reporting > Tax return - Select "Report: 104 (EC)", the dashboard shows the consolidated values - Click on the gear icon next to "Tax Return" and select ATS Issue: The exported XML only contains the documents and the totals of the parent company (750). The branch (250) is omitted. Analysis: Currently the ATS export use self.env.company for all searches, which only retrieve the data of the first company set opw-6469807 Forward-Port-Of: odoo/enterprise#132076 Forward-Port-Of: odoo/enterprise#128430
This fix improves the mobile checkout experience by preventing the cart summary from covering address fields when the Android keyboard is open. Shoppers can now fill in checkout details more easily, reducing friction during purchase completion.
Original PR description
The mobile summary element hides the address form on Android Steps to reproduce: 1. Install eCommerce 2. On android (or using browserstack) and without being logged in, go to the eCommerce 3. Add any…
The mobile summary element hides the address form on Android Steps to reproduce: 1. Install eCommerce 2. On android (or using browserstack) and without being logged in, go to the eCommerce 3. Add any product to the cart and go to checkout 4. Click on "Checkout" to enter the address details 5. Open the keyboard by clicking inside the first input 6. The virtual keyboard opens, enter a name and click on "Next" in the virtual keyboard 7. Do this a couple of times: the cart summary element doesn't scroll and the input field is hidden behind it Similar problem happens when you scroll a bit after clicking in the first input: the cart summary element displayed at the bottom is still visible (on top of the virtual keyboard) which hides part of the page and makes it difficult to navigate the page and fill in the details Issue: `sticky-bottom` keeps the element at the bottom of the screen Solution: Remove class `sticky-bottom` from `o_mobile_summary` when we click in one of the input opw-6500503 Forward-Port-Of: odoo/odoo#287464
A cart update issue was fixed so rental product date selectors continue working after customers use quick reorder from the cart. This helps prevent stalled checkout flows for rental purchases and keeps the cart experience consistent.
Original PR description
`updateCartSummary` refreshes `o_wsale_shorter_cart_summary` via `replaceWith`, detaching the node and inserting a new one. `reorderProduct` in quick_reorder.js ends up restarting an interaction on the previous node instead of the new one. For rental products, this leaves the daterange picker rendered but inert after a quick reorder from the cart. This commit updates the existing node instead of replacing it, so its identity is preserved. Issue present since PR: https://github.com/odoo/odoo/pull/234965 Forward-Port-Of: odoo/odoo#288559
This change prevents an error when settling restaurant POS orders that were paid through a customer account. It ensures the payment flow can continue normally when returning later to settle the due amount.
Original PR description
Issue: createOrderIfNeeded could be called without data parameter and it would fail when trying to access the parameter. In this case when being called from deleteOrderAndGoToDefaultScreen in pos_settle_due. Steps to reproduce: - Pay an order with the customer account on a pos restaurant config. - Try to settle it later - The settling fails at the payment 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#288589
Financial reports now display and scroll correctly on iPhones and iPads, preventing the scrollbar from being hidden behind report content. This improves usability for mobile users viewing long accounting reports without changing the desktop experience.
Original PR description
### Issue: On iPhone and iPad (reduced window), the scrollbar is hidden behind the report on long scrollable pages This affects all browsers on iOS and iPadOS — Apple forces the use of WebKit (its…
### Issue: On iPhone and iPad (reduced window), the scrollbar is hidden behind the report on long scrollable pages This affects all browsers on iOS and iPadOS — Apple forces the use of WebKit (its rendering engine) on all of them, including Chrome and Firefox ### Steps to reproduce (on iPhone): - Install `l10n_es` (contains scrollable reports by default) - Switch to the ES company - Open the Tax Report and try to scroll Before the fix, the scrollbar renders behind the report content ### Cause: `o_content` was added unconditionally in commit https://github.com/odoo/enterprise/commit/d60ea6e0f3245e394fd0cee5f22f52aff2a79e2e But its role differs between desktop and mobile, and its presence on mobile triggers a WebKit compositor bug On desktop, `o_content` is required: `.o_action` stays `overflow: hidden`, so only `.o_content` (`overflow: auto`) can scroll the report Per the CSS flexbox spec, a flex item won't shrink below its content size unless its `overflow` is not `visible` Without `o_content`, the div keeps `overflow: visible`, refuses to shrink, overflows `.o_action`, and the excess is silently clipped — content becomes unreachable, not just visually different On mobile, the framework flips scroll responsibility to `.o_action` (`overflow: auto`) and forces `.o_content` back to `overflow: initial` `o_content` is therefore not needed on mobile On WebKit (iOS/iPadOS), keeping `o_content` on mobile is harmful: it sits as a non-scrolling `position: relative` node between the real scroll ancestor (`.o_action`) and descendants that require special compositing — the sticky `thead` and the fixed-position mobile chatter This configuration causes WebKit's compositor to miscalculate the Root layer bounding box This geometry mismatch is the most likely explanation for why the native scroll indicator renders behind the report instead of on top of it Removing `o_content` on mobile avoids this node entirely and restores correct compositor geometry ### Notes: Tested on Android (Blink) with and without `o_content`: no visual difference and identical compositor layer geometry confirmed via Chrome DevTools — no regression introduced The `padding-bottom` on `.o_account_report_scroll_container` is unrelated — it is applied unconditionally and exists for a separate bug (last row clipped on scroll) opw-6191827 Forward-Port-Of: odoo/enterprise#132241 Forward-Port-Of: odoo/enterprise#128528
Fixes an issue where selecting a highlighted OCR date on a vendor bill did not update an already-filled Bill Date field. Users can now correct extracted bill dates from the document preview without the field losing focus and ignoring their selection.
Original PR description
**Steps to reproduce:** 1. Upload a vendor bill with OCR digitization (pdf in ticket attachments) 2. Make sure the Bill Date field already has a value 3. Click into the Bill Date field so the OCR…
**Steps to reproduce:** 1. Upload a vendor bill with OCR digitization (pdf in ticket attachments) 2. Make sure the Bill Date field already has a value 3. Click into the Bill Date field so the OCR boxes appear on the attachment preview 4. Click on a different date box in the attachment to correct the value **Issue:** The field is not updated with the clicked box's value. Instead, the field simply loses focus and the OCR boxes disappear, as if the user had clicked outside the field. This only happens when the date field already has a value; it works fine when the field is empty. **Cause:** - When a date field has a value, the date widget renders it as a button and only swaps in the real `<input>` once focused [1] - Removing the button triggers `onBlurFieldWidget`, and when the datepicker is focused, it triggers `onFocusFieldWidget` once again: https://github.com/odoo/odoo/blob/89650a5f44b5835028dba57a9ff6fa30515bc5ec/addons/web/static/src/views/fields/datetime/datetime_field.js#L204-L214 - The datetime picker's popover uses `useClickAway`, which reacts to `pointerdown` on `window` to detect clicks outside itself and close the popover. - Clicking a box in the attachment preview is therefore caught by this listener before anything else: it closes the popover, removing the currently focused DOM node and firing a `focusout`. - `ExtractMixinFormRenderer` reacted to that `focusout` by resetting the active field and destroying the box overlay. Since the box's own value-selection ran on `click`, the last event in the `pointerdown → mousedown → mouseup → click` sequence, the reset had already been done, so the click was lost. **Fix:** - Apply the box's selection on `pointerdown` instead of `click`, so it runs synchronously in the same event dispatch that triggers the popover's close logic, guaranteeing it executes before any asynchronous re-render can remove the field's state. - Remove the legacy `pointerdown` listener in `ExtractMixinFormRenderer.`. Because our box now listens to `pointerdown`, it was intercepting the event and breaking selection for images [1] - https://github.com/odoo/odoo/pull/218387 opw-6511803 Forward-Port-Of: odoo/enterprise#131935 Forward-Port-Of: odoo/enterprise#130192
This fix prevents certain page interactions from running before their screen components are fully ready. It helps avoid intermittent errors in areas such as API documentation, automation actions, project sharing, search suggestions, emoji selection, resizable panels, and quick record creation.
Original PR description
The commit [1] introduced some issues. The dom events could trigger while the component is not mounted yet. To fix this, this commit introduces a new hook `useExternalRef` which sets a signal to a given element when the current component is mounted and removes it when the component will unmount. The mix `useExternalRef` + `useListener` brings back the removed `useExternalListener` behaviour. [1]: https://github.com/odoo-dev/odoo/commit/918be39e1ad0bd83012cf02840ff412abe9b3548 Forward-Port-Of: odoo/odoo#289046 Forward-Port-Of: odoo/odoo#286159
Point of Sale now reloads its configuration each time it opens, instead of relying on potentially outdated cached data. This ensures cash register balances changed in the backend are accurately reflected for staff at the start of a POS session.
Original PR description
If the cash register balance was updated from the backend, for example by manually adding a reconciliation line, the next time the POS was opened, it could use the cached `pos.config` data and therefore display an outdated cash balance. The POS configuration contains settings and computed values that may change without updating its `write_date`, making it difficult to reliably determine whether the cached data is still up to date. Always force the loading of `pos.config` data when opening the POS to ensure that the latest configuration and cash balance are retrieved from the server. --- Task: https://www.odoo.com/odoo/project/1737/tasks/6574133 Forward-Port-Of: odoo/odoo#288279
Sales order product selection now shows only the units of measure and packaging options that belong to the variant currently selected. This prevents customers and sales users from choosing packaging that is not actually available for that product variant.
Original PR description
Issue Before This Commit: ======================== Currently, when a product variant has multiple UoMs, those UoMs appear for all variants when selecting a product in a Sale Order Line, even though…
Issue Before This Commit: ======================== Currently, when a product variant has multiple UoMs, those UoMs appear for all variants when selecting a product in a Sale Order Line, even though they are only available for a specific variant. Steps to Reproduce: ========================= 1: Install the sale and sale_management modules. 2: Enable Units of Measure and Packagings. 3: Create two variants, V1 and V2, and set an Extra Packaging of 'Pack of 6' on V2. 4: Add the product to a Sale Order Line. A product configuration wizard will open. 5: Select V2. The Unit and 'Pack of 6' UoMs are correctly displayed. 6: Select V1. Both UoMs are still displayed, even though 'Pack of 6' is not available for V1. Cause of the issue: ========================= When the variant is changed to V2 in the wizard, _get_basic_product_information is called. At that point, the condition is true, so available_uoms is updated with the UoMs available for V2. However, when the variant is changed back from V2 to V1, the method is called again, but V1 does not have multiple UoMs. Therefore, product_or_template._has_multiple_uoms() returns False, and available_uoms is not updated. As a result, the UoMs from V2 remain in available_uoms and are incorrectly displayed for V1. After This Commit: ======================== Update _get_basic_product_information to ensure that the available UoMs are updated whenever the variant changes. This ensures that only the UoMs available for the selected variant are displayed. Forward-Port-Of: odoo/odoo#289160 Forward-Port-Of: odoo/odoo#288515
This fix makes key POS sales products mandatory so users cannot remove settings that the checkout flow depends on. It prevents blank screens and errors when selling products or handling sales order down payments in Point of Sale.
Original PR description
Step to reproduce: - install `pos_sale` - create a pos and go to settings - remove product from `Default Sale Product` - start pos and select a product Observation: - we will get a blank screen and…
Step to reproduce:
- install `pos_sale`
- create a pos and go to settings
- remove product from `Default Sale Product`
- start pos and select a product
Observation:
- we will get a blank screen and error in browser console
```
TypeError: Cannot read properties of undefined (reading 'id')
at get orderDisplayProductName (point_of_sale.assets_prod.min.js:20914:497)
at get orderDisplayProductName (point_of_sale.assets_prod.min.js:27593:14)
```
- similar case when we de-select downpayment product and load a SO
with downpayment
Cause:
- `default_product_id` was introduce in commit[1] which is necessary for
description first order line
- if we remove this field, for pos config, `this.config.default_product_id`
is undefined, and accessing its id raises error
[1] https://github.com/odoo/odoo/commit/0ce605f8db9aa9901bf6b14c4888e5bcc0734401
Fix:
- Made both fields required=True, and removed the now-redundant JS-side
guards that previously enforced this on the client.
- Both fields use a callable `default=` that resolves an xmlid created in
pos_sale_data.xml. During module init, ORM invokes this default to
backfill existing rows *before* data files are loaded, so it resolves to
`None`, leaving rows null and causing the NOT NULL constraint to fail.
- Added `_init_column_default_products` (via `init_storage`) to create
minimal placeholder products and register their xmlids ahead of the
constraint check, so the default resolves correctly on first init.
`pos_sale_data.xml` still loads afterward and updates these same records
- With this in place, the previous `post_init_hook` backfill is no longer
needed and has been removed.
Why not adding a upgrade script
- when creeating the new column, as we have defined a `default` property for both fields, they are populated.
- in case a db is missing the xml id for such products, they are re-created and populated again.
- so there is no chance, we will face any error during upgrade.
opw-6458117
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#282002Warehouse batch and wave picking rules now behave more consistently when users select overlapping grouping options. This prevents unnecessary batch creation and cancellation, and ensures automatic batching includes compatible pickings as expected.
Original PR description
Following the merge of batch and wave pickings, there is no longer a clear separation between the 'group_by' settings at the UI level, users can therefore select settings in both modes (e.g. destination and week). This resulted in the creation of a 'batch' picking followed by its cancellation, then a 'wave' one is either selected for merging or created. We have decided to not consider anymore batch pickings when a wave setting is set. Furthermore, if batch creation is set to 'automatic' while compatible pickings exists, the next confirmed picking will include only one of them into the batch, leaving the others as-is. The picking_ids field has also been fixed in the form view. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#288856
The Attendance calendar now visually marks holidays and other unavailable days in grey, matching the experience in the Time Off app. This helps managers and employees interpret attendance schedules more accurately and avoid confusion around non-working days.
Original PR description
The calendar view on Attendance app should look similar to the one on Time Off app, with holidays greyed out. task-6576916 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#289102
This change ensures purchase order notification templates are updated correctly during upgrades. It prevents an error that could occur when editing only the unit price on a confirmed purchase order in migrated databases.
Original PR description
In this commit: eadf127 the `track_po_line_template` template was added in a `noupdate` file. The commit specifies: “put their declaration in no update when not done if template has no technical code or complex dependency on underlying code;” However, this is not actually the case for the two templates in this file. This did not cause any error in v17, but errors started appearing later because of #254602, which modified this code and the related Python code, leading to an error when no product quantity is changed. Steps to reproduce in a 19.3 database migrated from v19: - Create a purchase order with one product line and confirm it. - Only change the unit price of that line. - Error: "Error rendering template: ..." While this can also be considered a migration issue, I think the simpler and more logical solution is to remove the noupdate from this file. opw-6518729 Forward-Port-Of: odoo/odoo#288463
This fixes an accounting issue where some batch payments could remain marked as sent even after the related vendor bill and payment were fully paid. The system now refreshes the payment matching status correctly, helping finance teams see accurate batch payment statuses.
Original PR description
A payment on a journal without outstanding account has no journal entry, so it is matched as soon as it is paid. When the bill it pays is reconciled later on, _compute_state turns it to 'paid', but assigning a field from within a compute doesn't notify the fields depending on it: is_matched stays False and any batch payment holding that payment stays in 'sent' state. Mark is_matched for recomputation explicitly, as 18.0 already does since d8de234. Steps to reproduce: - On the Bank journal, leave the outstanding account empty on the outbound payment method line - Post a vendor bill - Register a payment on it - Put that payment in a batch payment and validate the batch - Create a MISC entry and reconcile the bill with it - Issue: bill and payment are 'Paid' but the batch stays 'Sent'. Forward-Port-Of: odoo/odoo#288981 Forward-Port-Of: odoo/odoo#288460
This fix restores Viva.com payments in self-order kiosks after a recent change caused them to fail when certain access information was missing. Businesses using Viva.com for kiosk payments can continue taking orders without payment interruptions.
Original PR description
Since odoo/odoo#284182, Viva.com is not working in the self order kiosk due to the `accessRight` field not being present. There was already a fallback in place for this situation but a missing optional chaining `?` stopped it from working. This commit adds the `?` to fix the error. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#289145
This fix ensures custom product attribute values entered through Point of Sale are carried into inter-company sales and delivery documents. Businesses using POS ship-later flows with inter-company purchasing will now see the correct product descriptions on related delivery slips, reducing confusion and fulfillment errors.
Original PR description
*= sale_purchase_inter_company_rules Step to reproduce: - install `sale_purchase_stock_inter_company_rules` and pos with demo - from setting : - enable Multi-Step Routes - enable all options for…
*= sale_purchase_inter_company_rules
Step to reproduce:
- install `sale_purchase_stock_inter_company_rules` and pos with demo
- from setting :
- enable Multi-Step Routes
- enable all options for Inter-Company Transactions (for both companies)
- go to routes, un-archive MTO route
- create a product "A" with routes "MTO" and "buy"
- make the product available for pos (add into `Misc` category)
- create a attribute with custom attribute value and link it to "A"
- in vendor list, add "My Company (Chicago)" as vendor
- switch to Chicago company, for same product add some other vendor
- switch back to "My Company (San Francisco)"
- for pos, in setting enable "Allow Ship Later"
- open Furniture pos, create a order with Product "A"
- go to payment page and select "Ship Later" and pay
- a RFQ is created for this pos order, open and confirm it
- switch to "My Company (Chicago)"
- open sale order (remove "my quotation" filter)
- notice a quotation created from company 1, confirm it.
- open linked delivery slip
Observation:
- the delivery slip will not have description (custom value for attribute for A
is lost)
Cause:
- when preparing vals for SO for inter-company transaction from
`_prepare_sale_order_line_data` we never considered order from pos
- hence in this case, order lines never had custom attributed linked to them
- the description is computed from the attributes from SO
- SO never had them to begin with
Fix
- we introduced a method `_get_pcavs_from_pos_order` which fetch such attributes from pos order too
- to accomplish this we introduce a new module As there is no dependency with purchase and pos
opw-6213076
Forward-Port-Of: odoo/enterprise#131896
Forward-Port-Of: odoo/enterprise#119233Indian payroll payment reports now stop when an employee has no bank account on record. This prevents payroll files from being generated with missing payment details, reducing the risk of failed or incomplete salary payments.
Original PR description
The payment report check looked at existing Indian bank accounts with an invalid IFSC. An employee withno bank account added nothing to it, so they passed the check and the report was generated with no account for them. task-6580632 Forward-Port-Of: odoo/enterprise#132097
The Colombian Libro Diario report no longer fails when comparison options are enabled. It also now includes journal entries without a partner and keeps required report headers visible, helping businesses maintain complete legally required reporting.
Original PR description
## [FIX] l10n_co_reports: fix UNION ALL crash with multiple column groups ### Issue: Any comparison mode (Period, Analytic, etc.) in the Libro Diario raises an Odoo Server Error ### Cause: Each…
## [FIX] l10n_co_reports: fix UNION ALL crash with multiple column groups
### Issue:
Any comparison mode (Period, Analytic, etc.) in the Libro Diario raises an Odoo Server Error
### Cause:
Each sub-query in the `UNION ALL` had its own `ORDER BY` SQL only allows one global `ORDER BY` on a `UNION ALL`, or parentheses around each query — neither was the case
### Steps to reproduce:
- Install `l10n_co_reports` and `accountant`
- Enable Developer Mode in Settings
- Open the Libro Diario report and click the gear icon (top right)
- In the Options tab, enable Period Comparison
- Enable the Comparison for the Previous Period
Before the fix, an error is raised
------------------------------
## [FIX] l10n_co_reports: include partnerless entries in Libro Diario
### Issue:
Journal entries without a partner are excluded from the report but are legally required to appear
### Cause:
`_get_domain` called `super()` which adds `('partner_id', '!=', False)` to the domain, filtering out all partnerless entries
The SQL query also used a `JOIN` instead of `LEFT JOIN` on `res_partner`, excluding lines with no partner at the DB level
### Notes:
`NULL` values for `partner_name` or `line_label` caused the JS to hide the corresponding column headers
`header.js` matches columns to their header by `column_group_index`/`expression_label` and skips `None` values
Fixed by using `COALESCE` to return an empty string instead
### Steps to reproduce:
- Install `l10n_co_reports` and `accountant`
- Create a Journal Entry without a partner or label
- Open the Daily Journal Report
Before the fix, the entry doesn't appear
After the fix, check that PARTNER and LABEL headers are visible
opw-6430728
Forward-Port-Of: odoo/enterprise#132066
Forward-Port-Of: odoo/enterprise#129674The VoIP call flow editor now correctly replaces an existing connection when users rewire a call route to a new destination. This prevents broken or rejected links and avoids misleading duplicate-connection warnings, making call flow changes more reliable.
Original PR description
## Summary - Grabbing an already-connected output port and dragging it to a new target used to search for another output port instead of an input port, so the old connector was removed without ever…
## Summary - Grabbing an already-connected output port and dragging it to a new target used to search for another output port instead of an input port, so the old connector was removed without ever being replaced. - Dropping a new connection onto an output port that was already at its connection limit was rejected outright instead of replacing the existing connection. - A successful reconnect could still show "This connection already exists.": `onConnect` feeds the new connection back through props synchronously, and `onWillUpdateProps` can sync it into the store before `connectPorts`'s own post-connect validation runs, making the connection look like a duplicate of itself. ## Test plan - [ ] Open a call flow, connect an output port to a target, then drag that same output port to a different target: the old link is removed and the new one is created in one action. - [ ] Drag a new connection onto an output port that already has one: the old link is replaced instead of showing a rejection. - [ ] Confirm no "This connection already exists." notification appears for a valid reconnect. Forward-Port-Of: odoo/enterprise#131942