Saturday, August 29, 2026
75 changes · master
New functionality added to Odoo
Odoo now adds support for sending Greek customer invoices through e-invoo, an AADE-certified provider, instead of transmitting them directly to myDATA. This helps Greek businesses meet local legal requirements for electronic invoicing while keeping the process integrated in Odoo.
Original PR description
Greek customer invoices were transmitted directly to myDATA, but this is not legally compliant as odoo is not AADE-certified yet. Add a bridge module that routes outgoing Greek invoices through the Greek EDI IAP service and e-invoo, an AADE-certified YPAHES provider. IAP PR: [1788](https://github.com/odoo/iap-apps/pull/1788) task-[6395556](https://www.odoo.com/odoo/project/967/tasks/6395556) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#281739
Adds a new option that lets users temporarily hide the chatter panel on forms and bring it back when needed. This gives users more horizontal space for complex forms while keeping chatter access available through a small side toggle.
Original PR description
Created as an example for a support speeddate session. Description of the issue/feature this PR addresses: Forms with a chatter panel can lose a significant amount of horizontal space to the chatter,…
Created as an example for a support speeddate session. Description of the issue/feature this PR addresses: Forms with a chatter panel can lose a significant amount of horizontal space to the chatter, even when the user does not need to interact with it. This can make forms with a lot of content more difficult to use. This PR adds a lightweight global toggle to hide and show the chatter on demand. The toggle is displayed as a small floating tab on the right edge of the viewport and is only shown on views where a chatter is present. Current behavior before PR: The chatter panel is always visible and permanently takes up horizontal space on forms where it is available, even when the user does not need it. Desired behavior after PR is merged: Users can hide the chatter when they need more horizontal space and reopen it when needed using the floating toggle on the right edge of the viewport. The toggle is only displayed on views that contain a chatter. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr (no)
Enhancements to existing features
This change speeds up internal database column lookups by replacing a slower generic system view with a leaner query that fetches only the needed details. It can reduce time spent on these checks during operations such as upgrades, improving overall performance without changing user-facing features.
Original PR description
Using the view `information_schema.columns` is slow compared to a simplified query using PG catalog tables. Here we propose to cherry pick the parts of the view that we actually use. Below we show…
Using the view `information_schema.columns` is slow compared to a simplified query using PG catalog tables. Here we propose to cherry pick the parts of the view that we actually use.
Below we show the timings of both queries as reported by the system on an upgrade 18->master with a runbot DB (many modules installed). All values are in milliseconds.
```
Original:
min: 0.931
max: 16.786
mean: 1.8790601284296555
sum: 25750.64
len: 13704
New:
min: 0.224
max: 11.832
mean: 0.8649024372446001
sum: 11852.623
len: 13704
```
Total time spent in queries was halved as seen in the `sum` statistic above.
Technically, the new queries are base on the original information schema view definition as returned by `\d+ information_schema.columns`. With all unused info removed.
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#285419
Forward-Port-Of: odoo/odoo#216309Resolved issues and error corrections
When an X (Twitter) account token becomes invalid, Odoo now disconnects the account instead of showing a generic error while refreshing the feed. This reduces confusion for social media users and helps them reconnect the account to restore the feed.
Original PR description
Bug === If the token because invalid, then an UserError is raised instead of disconnecting the account. This is because we "blind raise" all errors we get from X, instead of filtering the error linked to the stream configuration. Task-6499283 Forward-Port-Of: odoo/enterprise#129560 Forward-Port-Of: odoo/enterprise#129110
Features or functions removed from Odoo
This update removes separate filename fields that are no longer needed when handling uploaded files across payroll, employee documents, and related reports. It simplifies forms and report records while keeping the actual file attachments available, reducing clutter and maintenance overhead for users and administrators.
Code cleanup and technical improvements
This update simplifies internal website tour testing utilities by removing redundant waiting steps and an unused helper. It should make automated tests easier to maintain without changing how users experience Odoo.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Miscellaneous changes
Related: https://github.com/odoo/enterprise/pull/129706
Original PR description
Related: https://github.com/odoo/enterprise/pull/129706
Related: https://github.com/odoo/odoo/pull/285307
French B2G invoices can now be identified and routed through Chorus Pro via the approved platform instead of Peppol. This improves compliance for invoices sent to French public sector customers, with added status tracking for sent, suspended, and completed cases.
Original PR description
B2G invoices are not sent via Peppol but to Chorus Pro (via the approved platform). Chorus Pro is the platform with ID 9999 on the annuaire. Any invoice to partner associated with that platform on…
B2G invoices are not sent via Peppol but to Chorus Pro (via the approved platform). Chorus Pro is the platform with ID 9999 on the annuaire. Any invoice to partner associated with that platform on the annuaire is considered B2G (business to government). From a user point of view nothing much changes, except that they have to set some additional fields for which we rely on the existing module `l10n_fr_facturx_chorus_pro`. From a technical PoV we store the information whether a partner is behind Chorus Pro in the `peppol_supported_documents` field. (By putting the special document identifier for Chorus Pro invoices there.) We retrieve the information whether a partner is behind Chorus Pro / B2G from the annuaire lookup. The following new lifecycle statuses have been added. They are required for the functional tests for the Chorus Pro connection. - Sent (sent by the platform) - Suspended - Completed (to "resume" the "Suspended" state) See the related IAP PR: https://github.com/odoo/iap-apps/pull/1804 task-6278159 Forward-Port-Of: odoo/odoo#284677
The cohort view now loads subscription data much faster by reducing unnecessary database work. This cuts wait times dramatically for users viewing cohort reports, improving day-to-day reporting performance.
Original PR description
`get_web_cohort` used to do N+1 queries (2N+1 for 'backward' mode). Now, it's one a single query (N+1 for 'backward' mode) On our odoo instance, going to the Subscription's cohort view: | | Time | SQL queries | |--------|--------|--------| | Before | 45s | 207 | | After | 1.3s | 27 | (speedscopes attached to the task) ## Before <img width="2516" height="735" alt="image" src="https://github.com/user-attachments/assets/fdd598d1-7c11-4c13-a480-a7bf07fc2b6f" /> ## After <img width="2516" height="1350" alt="image" src="https://github.com/user-attachments/assets/7a3f1b86-ab91-4966-84d7-e9b7b69506e0" /> task-6485857
Accounting now uses a more targeted database lookup when finding recent journal entries by date. This can dramatically reduce wait times in affected cases, improving responsiveness for users working with accounting records.
Original PR description
This commit adds an index on `(journal_id, date)` to speed up `_get_last_sequence_domain`. The slow part is `.search(domain, order='date [desc|asc]', limit=1)` Because of the order by date,…
This commit adds an index on `(journal_id, date)` to speed up `_get_last_sequence_domain`. The slow part is `.search(domain, order='date [desc|asc]', limit=1)` Because of the order by date, postgresql scans the index on `date`, assuming a row will be quickly matched. If this assumption is wrong though, it'll scan a large part of the index or all of it, which is slow. This is the case with account move 17102258 on odoo.com at the time of writing this. - before - 1st query https://explain.dalibo.com/plan/6b8ff62b1572ah1a - 2nd query https://explain.dalibo.com/plan/41243cgccg5798gb - after - 1st query https://explain.dalibo.com/plan/4fd2c7ed28g7b138 - 2nd query https://explain.dalibo.com/plan/2heh6c6965c88h71 - ~~1st query https://explain.dalibo.com/plan/f874a31f4b07hdeb~~ - ~~2nd query https://explain.dalibo.com/plan/e8h09725gfh4c2e9~~ full `web_read` - before ~1min 10s - after ~650ms task-6481393 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#283159
Self-billing bills now keep separate numbering per partner, improving traceability and reducing confusion in accounting records. Self-billing invoices can also be imported into a dedicated sales journal, preventing regular sales invoices from accidentally using self-billing numbering patterns.
Original PR description
This PR handles 2 cases : ===== PART 1 ===== Self-billing bill sequences should be unique per partner, as implemented in v19+. This PR backports that behavior to 17.0. ===== PART 2 ===== Previously, the `is_self_billing` option on `account.journal` was available only for purchase journals. This caused an issue when importing a self-billing invoice into a regular sales journal with quick edit mode (accounting firm) enabled. In such cases, the newly created invoices would use the self-billing sequence pattern, leading to traceability issues. This PR allows the creation of self-billing sales journals to prevent this issue. task-6103142 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#282642 Forward-Port-Of: odoo/odoo#259935
Companies in the same Odoo database that share the same French SIREN can now benefit from an already successful PDP registration verification. This reduces repeated manual KYC work when many branches or related companies need to be registered.
Original PR description
We have some clients that have several hundreds of companies/branches on the same db, with the same SIREN (incubateur or the like). They will need to do the kyc (that will be identical, as it's the same SIREN) for all the companies. It's especially cumbersome if it needs manual intervention So, if one company on that database, with the same SIREN, managed to register, then it means it has succeded the kyc. Meaning we can bypass the kyc for the other identifiers as well. task-6515315 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#285236
Odoo now uses a dedicated backend icon font and standard icon codes from Google, reducing unnecessary file changes when icons are updated. This makes maintenance simpler and slightly reduces font sizes loaded by browsers, while preserving backend rendering for reports and emails.
Original PR description
[IMP] web, html_editor, mail: add backend-only Material Symbols font --- __Before commit__ Every time a new icon was added, a large part of `material_symbols_pua_codepoints.py` was overwritten. This…
[IMP] web, html_editor, mail: add backend-only Material Symbols font --- __Before commit__ Every time a new icon was added, a large part of `material_symbols_pua_codepoints.py` was overwritten. This happened because `generate_icons.py` assigned new PUA codepoints to every icon each time it ran. Google already assigns predefined codepoints to these icons, which are included in `material_symbols_outlined_subset.woff2` but were previously unused. __After commit__ The font `material_symbols_backend.woff` is introduced for backend-only usage, such as report generation and backend mail icon rendering. It replaces the per-style WOFF1 files and the PUA-only font. The standard codepoints from Google are now used for the icons. We still need to assign custom codepoints to filled icon variants because they are separate icons in the optimized version. We do this by adding an offset of 0x100000 (using a bitwise AND of 0xFFFF for edge cases to remain within the standard Plane-16 Private Use Area). __Benefits__ - Adding a new icon produces a significantly smaller diff. - A single WOFF1 replaces the two per-style ones, and is the only format both backend consumers can read: wkhtmltopdf cannot parse WOFF2, and Pillow needs the codepoints in the cmap. - Existing codepoints are removed from WOFF2 files, making fonts fetched by browsers a few kB lighter.
Batch transfer functionality is now built directly into Inventory instead of requiring a separate add-on and several connector modules. This simplifies setup and maintenance for businesses that use warehouse batching, while keeping the feature controlled by a setting.
Original PR description
This main PR's purpose is to move the `stock.picking.batch` model from `stock_picking_batch` to `stock` module, which let us remove the `stock_picking_batch` and a bunch of bridge modules, and replace them by a setting. Other changes: - Move `StockPickingType` code from `stock_picking.py` file into its own file (`stock_picking_type.py`); - Remove `show_operations` field because this field is unused and we forgot to remove it in master. See commits' message for more information. **Enterprise PR**: odoo/enterprise#128175 **Upgrade PR**: odoo/upgrade#11054 task-6154300
The Automatic Check-Out settings in Attendance are easier to understand and configure. Time-based options now look and appear closer to their related choices, reducing confusion when setting employee check-out rules.
Original PR description
The Specific Time option was introduced for Automatic Check-Out, but its field visually resembles a duration field rather than a specific time. This updates the Specific Time field to match the UI used for similar fields in Time Off, positions the Tolerance and Specific Time fields next to their corresponding radio options, and displays the fields of unselected options in light grey. Task-6476495 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The time off dashboard now shows the number of pending allocation requests, rather than adding up the days or hours in those requests. This makes it easier for managers and employees to understand how many items need attention.
Original PR description
change the number of pending allocation to represent how many pending allocation instead of the number of the days or the hours in the pending allocations Task Id: 6482732
The website countdown block now offers a clearer set of layout choices, combining previous layout and template settings into one simpler option. Editors also get more focused text formatting controls and a warning when a countdown may be outdated, helping prevent display issues on published pages.
Original PR description
[IMP] website: merge countdown snippet layout and template options Following [commit](https://github.com//odoo/odoo/commit/74a9e5bb734708497456ed2bc91465f95505b2d7), we'd like to improve the…
[IMP] website: merge countdown snippet layout and template options Following [commit](https://github.com//odoo/odoo/commit/74a9e5bb734708497456ed2bc91465f95505b2d7), we'd like to improve the countdown snippet. Key changes: 1. Merge Layout and Template into a single layout option with the following layouts: - Circle - Text Inline - Dominoes (replaces Boxes) - Wrapped Numbers - Text - Big Numbers (replaces Clean) 2. Enable toolbar for both metrics and indicators 3. Remove Edge Spacing 4. Convert Circle layout to Text Inline format: display the countdown on the left with reduced size. 6. Retain Circle-specific options plus all Text Inline options when possible. task-5242156 --- [IMP] website, html_builder: show notification if countdown is outdated We would like to show the notification to user saying that the countdown is outdated if it should be updated. This commit also changes wording in that notification to indicate that it may cause problems. task-5242156 --- [IMP] website, html_editor: add countdown toolbar namespace For metrics in countdown, we don't want to show all toolbar groups, but rather just font and decoration groups buttons. This commit adds a new namespace for that, and adds that namespace to buttons we want to display. task-5242156
Customers can now use sales order payment links to pay any amount, including partial payments or amounts above the order total. Sales orders are confirmed as soon as the first successful payment is received, making the buying process faster and more flexible.
Original PR description
This PR removes payment amount restrictions on Sales Order payment links, allowing customers to pay any amount, including amounts greater than the order total. Sales Orders are now confirmed on the first successful payment, regardless of the amount paid. For Enterprise PR see : https://github.com/odoo/enterprise/pull/124636 For Upgrade PR see : https://github.com/odoo/upgrade/pull/10818
Odoo now stores attachment file names directly with the uploaded file instead of in separate fields. This reduces duplicate data behind the scenes while keeping document uploads and downloads working as expected for users.
Original PR description
```py bin = fields.Binary() bin_filename = fields.Char() # removed ``` File name is now defined in side the `bin` field. Remove most of these fields as the filename is part of the binary field now. https://github.com/odoo/enterprise/pull/129066 https://github.com/odoo/upgrade/pull/11124 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update adds missing automated checks for timesheet reporting, billing, attendance comparisons, printable reports, and employee deletion safeguards. It helps ensure existing timesheet features continue to work correctly and reduces the risk of regressions in payroll, billing, and project reporting workflows.
Original PR description
* = hr_timesheet_attendance, sale_timesheet Add tests for timesheet features introduced by previous tasks and left uncovered: - measures of the timesheets analysis report: billable and non-billable time, revenues and margin (task-2783955), and the revenues of each type of service (task-3368808) - timesheets of a project billed manually, without any sales order item (task-3565762) - timesheets, attendance and difference costs of the timesheets/attendance analysis report (task-2782768) - 'Timesheets' printable report of a selection of timesheets, of a task, of a project, of a sales order and of an invoice (task-2826265) - employee delete wizard, which refuses to delete an employee having timesheets and offers to archive them instead (task-2938632)
The view switcher now uses a visible light grey hover effect instead of a barely noticeable white overlay. This makes it easier for users to see which view option they are pointing at, improving everyday navigation clarity.
Original PR description
This PR updates the `:hover` state for the view switcher component, which was previously using white with an opacity, which was not visible. Instead, reuse the same approach as dark mode and use a lighter shade of grey. task-6512176
Hong Kong payroll now combines severance pay, long service payment, and payment in lieu of notice into one termination payslip. This reduces HR administration and makes final employee payments clearer and simpler to process.
Original PR description
Up until now, we have been maintaining separate structures for all termination pays (severance pay, long service payment, payment in lieu of notice). While this is one way of doing this, it is not necessarily the best. It asks the HR team to issue up to three payslip on the last month of an employee to cover all statutory payments; and it also makes paying the employee more complex. According to feedbacks, it is actually preferable to issue a single merged payslip that includes all payments, both for clarity and simplicity, which is what we will now do. task-6174257
A new warning is shown in the Belgian payroll holiday attest form to remind users that changes are only saved when the main employee form is saved. This helps prevent users from accidentally losing holiday attest information entered in the sub-form.
Original PR description
Since the holiday attest dialog is a sub-form, it will only save if the main employee form is saved. To alert users, we created a new warning that appears next to the constraints in the holiday attest form. Task Id: 6482500
Inventory batch picking support has been moved into the main stock-related apps, removing several separate bridge modules. This simplifies maintenance while keeping barcode, quality control, and fleet workflows aligned with the updated inventory structure.
Original PR description
*: quality_control_picking_batch, stock_barcode, stock_barcode_picking_batch, stock_barcode_quality_control, stock_barcode_quality_control_picking_batch, stock_fleet_enterprise The `stock.picking.batch` model were moved from `stock_picking_batch` to `stock`, and the module `stock_picking_batch` doesn't exist anymore. This commit adapts the code to this change in the enterprise modules. Since we had some brigde modules, some modules are merged: - `quality_control_picking_batch` is merged into `quality` and `quality_control`; - `stock_barcode_picking_batch` is merged into `stock_barcode`; - `stock_barcode_quality_control_picking_batch` is merged into `stock_barcode_quality_control`. In summary, removed modules are: - `quality_control_picking_batch`; - `stock_barcode_picking_batch`; - `stock_barcode_quality_control_picking_batch`. **Community PR**: odoo/odoo#282884 **Upgrade PR**: odoo/upgrade#11054 [task-6154300](https://www.odoo.com/odoo/966/tasks/6154300)
The app switcher background has been adjusted to look more consistent across light and dark modes, Studio views, and custom image backgrounds. This improves readability and visual polish for users while preserving compatibility with other areas that reuse the same background component.
Original PR description
* web_studio This commit applied general adaptions related to the background app switcher. - Align the design across all cases: light/dark mode, Studio open/ closed, and custom image backgrounds - Optimize contrast with app icons - Improve rendering when Studio is enabled - Adapt the background implementation to restore compatibility with other apps where o_home_menu_background is used (e.g. event registration). task-6511279
The Belgian payroll Dimona flow is clearer and safer for HR users. Dimona statuses are now read-only, manual declaration screens show the correct action and guidance, and certificate setup explains how it supports automated submissions.
Original PR description
Feedback from the Dimona UX review: - The Dimona badge on the employee form sat before the review state pill and was a dropdown, so the state could be set by hand. That state reflects what was…
Feedback from the Dimona UX review: - The Dimona badge on the employee form sat before the review state pill and was a dropdown, so the state could be set by hand. That state reflects what was declared to the ONSS, not a user choice: it becomes a read-only badge, placed after the review pill, and "Send Dimona" stays the only way to act on it. dropdown_selection_badge honors a readonly attribute on the field node for this; props.readonly could not be used, as list and kanban records are never in edition, which would freeze the review state badge as well. - The manual declaration wizard always showed "Dimona IN" with the text of an entrance declaration, whatever had to be declared. Its title and description now follow the next action (in, out, update, cancel or issue), and the ONSS link points to the Dimona portal instead of the DmfA instructions. - The ONSS certificate setting only said "Configure ONSS certificate". It now states what the certificate is for, automating Dimona, DMFA and DRS submissions via the API, and links to the ONSS page explaining how to obtain the credentials. - The Dimona declaration fields on the employee offered to create a declaration from the autocomplete, which would record a declaration that was never sent to the ONSS. task-6470879
Sales Order payment links no longer track a maximum payment amount, aligning subscriptions with the updated payment behavior. This removes an unnecessary warning path and keeps related tests in sync, with minimal impact for users.
Original PR description
Removed the `amount_max` field from the payment link feature as it is no longer needed after removing payment amount restrictions on Sales Order payment links. The field was previously only used to display an alert when the payment amount exceeded the allowed maximum. Updated the tests accordingly. Task-6238148 For Community PR see : https://github.com/odoo/odoo/pull/268214 For Upgrade PR see : https://github.com/odoo/upgrade/pull/10818
This update adds missing automated checks for several timesheet workflows, including grid behavior, validation views, helpdesk ticket reports, and planning profitability measures. It helps ensure existing timesheet features remain reliable while also removing unused legacy code that no longer supports active workflows.
Original PR description
* = helpdesk_timesheet, project_timesheet_forecast_sale Add tests for timesheet features introduced by previous tasks and left uncovered: - filters of the timesheets search view: My Team, My Department, My Projects, My Tasks, Draft and Validated - rows of the grid view sorted alphabetically (task-3610476) - empty lines added in the grid view for the entries of the previous period (task-3077292) - redirection to the form view when a grid row holds too little data to create a timesheet (task-3602605) - 'To Validate' grid view opening on the previous period (task-3893907) - measures of the planning & timesheets analysis report: planned and effective costs, revenues, margins and billable time (task-2849291) - 'Timesheets' printable report of a helpdesk ticket (task-2826265)
Checkout now more reliably requires Chilean and Mexican invoicing information before customers proceed to payment. This prevents shoppers from accidentally bypassing required billing details and avoids checkout steps being incorrectly shown or hidden based on another visitor's session.
Original PR description
Commit odoo/odoo@1facbc0646bd made the checkout validate every `website.checkout.step` through a single flow, but the localization invoicing steps were left out. These steps are shown or hidden by…
Commit odoo/odoo@1facbc0646bd made the checkout validate every `website.checkout.step` through a single flow, but the localization invoicing steps were left out. These steps are shown or hidden by publishing or unpublishing a shared step record on each checkout. This is unreliable: the cart and payment pages don't refresh it, so the step can be left in the state set by another visitor. The step is also only validated when the visitor goes through it, so opening `/shop/payment` directly skips it. An override also forces `try_skip_step` off so the checkout page cannot jump past the step. This commit filters the Chilean and Mexican step out of the breadcrumb steps domain per request when it is not needed, instead of toggling the shared record, and checks it in the validation flow so opening `/shop/payment` redirects back to it while incomplete. Forcing `try_skip_step` off is no longer needed. Chile stores the taxpayer type on the invoicing customer so the check also works when the billing contact is not the ordering one. Mexico uses a best-effort check, since a customer who wants no invoice looks the same as one who skipped it. task-6045788 See also: - https://github.com/odoo/odoo/pull/276844 - https://github.com/odoo/upgrade/pull/10806
Grouped list views now automatically hide sections that no longer contain records when those empty sections are not intentionally preserved. This reduces clutter and helps users focus on relevant information after actions change the contents of a group.
Original PR description
Having empty groups in list view can add unnecessary info for the user, especially when an action empties a group without triggering a full rendering (see Accountant > Journal Audit Review). This commit add a new filtering step to the `RelationalModel` group reading post process which filters out empty groups when the view is not grouped by a default groupBy nor the grouping field has the `group_expand` property. task-6465612
This fix keeps the appointment page controls properly sized when editing the website, preventing a dropdown button from appearing squeezed. It also hides an unnecessary loading indicator in editor mode, making the page easier and cleaner to configure.
Original PR description
Introduced in [1], and in a series of related changes, the time selection page has been reworked to be managed more from the JS, using the Interaction benefits. The entity selection is now a custom dropdown, handled in the JS. When editing the page with the website editor, the button is squashed, because no content is rendered inside. This is not the case for other ones as either a select element, either have a t-out dynamic content that will still instanciate some content at loading. Therefore, instead of meddling with a complex JS, add some simple styling to make sure the element has a consistent height. Also, hide the loader when editing the page in a similar way. [1] odoo/enterprise@a5712d284a87af7530f186ecad765d2cfaf1f9d2 Task-6482389 Forward-Port-Of: odoo/enterprise#129646
This fixes an issue where color labels used outside the color picker could lose their intended styling, such as resource colors in Planning configuration. The change makes color styling consistent across screens and display modes, improving visual clarity for users.
Original PR description
The `o_colorlist_item_color_*` classes were scoped to `.o_colorlist > button` by 1aa9b957afdd , but they are also used standalone outside any colorlist, e.g. in Planning's `many2one_avatar_resource` field. `web_enterprise`'s dark-mode counterpart also defines them unscoped, so the two stylesheets disagreed. Move the color rules back to the root scope. The colors themselves and the `color-contrast()` text color introduced by the refactoring are kept. Steps to reproduce: - Go to "Planning" - Open "Configuration" => the resources in the "Resources" column. 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#283821 Forward-Port-Of: odoo/odoo#283232
This update fixes a failing automated guided test for the Knowledge calendar by switching it to the newer standard text entry method. It helps keep quality checks reliable and removes reliance on an outdated helper that is no longer used.
Original PR description
[Related PR 1] modified `editSelectMenuInput` to use the standard 'edit' action instead of a custom action, and moved several tours off of the helper function, but missed the knowledge calendar tour. In combination with [Related PR 2] which changed the conditions of editing a select input to not include the intial 'click' action, causes this tour to now fail to properly input the text value. This commit fixes this issue by using the new standard approach with the 'edit' action. Since there are no tours which make use of `editSelectMenuInput`, it is also deprecated and to be removed in master. Related PR 1: https://github.com/odoo/odoo/pull/264913 Related PR 2: https://github.com/odoo/odoo/pull/266912 runbot-941336 Forward-Port-Of: odoo/enterprise#128462
This update prevents barcode EPC generation from failing when tracked and untracked stock move lines are processed together. It keeps valid tracked items aligned correctly and gives untracked items a clear error instead of causing broader list-view failures.
Original PR description
Problem: `_compute_electronic_product_code` built `tracking_number_list` by filtering out move lines without a lot_id/lot_name, but kept iterating over the full, unfiltered `move_line_ids`. As soon…
Problem: `_compute_electronic_product_code` built `tracking_number_list` by filtering out move lines without a lot_id/lot_name, but kept iterating over the full, unfiltered `move_line_ids`. As soon as a tracked product had an untracked move line mixed in with tracked ones (e.g. a manufacturing byproduct move line with no lot), the two lists fell out of sync: at best tracking numbers got assigned to the wrong move line, at worst `tracking_number_list[i]` went out of range and raised an IndexError. Solution: Exclude untracked move lines from `move_line_ids` before building `tracking_number_list`, so both stay the same length and index- aligned. Untracked lines get their own explicit "no tracking number" error instead of breaking the alignment for the rest. Steps to reproduce: Open runbot V19 -> go to moves history (Inventory) -> add `electronic_product_code` to list view using studio -> remove filter/select all records -> https://anotepad.com/notes/jwxyskc2 Forward-Port-Of: odoo/enterprise#128521 Forward-Port-Of: odoo/enterprise#123859
Website helpdesk forms now keep the translations from the original form template. This ensures customers see the form in the website or visitor language, instead of the language used by the employee who created the helpdesk team.
Original PR description
When a helpdesk team has its website form enabled, a dedicated qweb view is generated from the `ticket_submit_form` template. The arch was read in the language of the user creating or editing the…
When a helpdesk team has its website form enabled, a dedicated qweb view is generated from the `ticket_submit_form` template. The arch was read in the language of the user creating or editing the team, so a team set up by an English user language produced an English form even when the website served another language. Steps to reproduce ================== 1. Set a language other than English as the website default language. 2. While your user language is English, create a helpdesk team with the website form enabled. 3. Open the team form on the website. => The form is rendered in English instead of the website language. Root cause ========== `_ensure_submit_form_view` read the template arch without forcing a language, so it used the current user's language and stored only that value on the generated per-team view. Fix === Read the template arch in the default language of the team's website, so the generated form matches the website language regardless of the user's own language. opw-6303903 Forward-Port-Of: odoo/enterprise#129265 Forward-Port-Of: odoo/enterprise#121164
Fixed an issue in the Sign app related to user group handling. This helps ensure the right access or grouping behavior is applied when users work with signing features.
Original PR description
opw-6518598 Forward-Port-Of: odoo/enterprise#129647
This fixes an error that could block website editors from saving SEO cover images when unrelated expense attachments existed in the system. The change keeps attachment checks focused on the selected file, avoiding unnecessary access checks on records the user should not see.
Original PR description
### Issue: A user with Website Editor rights but no Accounting or Expense access gets an `AccessError` when using Optimize SEO to add a cover image, if another user has an expense with an attachment…
### Issue:
A user with Website Editor rights but no Accounting or Expense access gets an `AccessError` when using Optimize SEO to add a cover image, if another user has an expense with an attachment
### Steps to reproduce:
- Install `ai` and `hr_expense`
- With Admin, upload an image as an expense
- Update Demo user rights (Accounting: No, Expenses: No, Website: Editor and Designer)
- Log in as Demo
- Go to Website > Site > This page > Optimize SEO
- In Cover Image, add any image, select it and save
Before the fix, an `AccessError` is raised
### Cause:
When Save is triggered, `ai.attachment.vacuum.mark_attachments_used()` is called with the outer domain:
`[('attachment_id', 'in', [3868])]`
The `ai.attachment.vacuum` security rule uses:
`domain_force = [('attachment_id.res_access_write', '=', True)]` https://github.com/odoo/enterprise/blob/474ee25f82a3980530aae4c3450c69d925b6076e/ai/security/security.xml#L1-L24
During optimization, the dotted path is decomposed into an `any` condition:
`('attachment_id', 'any', [('res_access_write', '=', True)])` https://github.com/odoo/odoo/blob/dcb9ad42ba302a5ed0ec334daf4c8a4cb5ec0931/odoo/orm/domains.py#L999-L1004
`_optimize_any_domain_at_level` tries to narrow the comodel scan by reusing the outer constraint on `attachment_id` via `search_domain` in context
It finds `c` where `c.field_expr == 'attachment_id'`, but `c.value` is `{3868}` — a plain set of ids, not a `Domain`
Since the code only recognized `Domain` values, it treated this as unknown and fell back to `comodel_domain = Domain.TRUE`
`_search_res_access` for `ir.attachment` then scanned every attachment using:
`['&', ('res_model', '!=', False),
'|', ('res_id', '!=', False), ('create_uid', '!=', 5)]`
This matches a lot of attachments because the initial `attachment_id` constraint is missing
This scan included an attachment linked to an expense the current user cannot read
`_inaccessible_comodel_records` in `hr_expense` then checked all expenses linked to the found attachments and raised the `AccessError`
This fallback also triggers a second failure when the database contains more than 10 000 attachments: `_search_res_access` caps its unbounded scan at `MAX_SEARCH_LIMIT` and raises `ValueError("Cannot search, too many attachments")`
Confirmed by seeding ~10 500 attachments and reproducing the error
### Notes:
A new test in `test_any_domain_search_context.py` verifies in isolation that unrelated attachments are never scanned when a plain `in` condition narrows the search
opw-6467087
Forward-Port-Of: odoo/odoo#285384
Forward-Port-Of: odoo/odoo#284678A test workflow for Knowledge calendar editing was updated to use the current standard editing behavior. This helps keep automated checks reliable and prevents false failures during product validation.
Original PR description
[Related PR 1] modified `editSelectMenuInput` to use the standard 'edit' action instead of a custom action, and moved several tours off of the helper function, but missed the knowledge calendar tour. In combination with [Related PR 2] which changed the conditions of editing a select input to not include the intial 'click' action, causes this tour to now fail to properly input the text value. This commit fixes this issue by using the new standard approach with the 'edit' action. Since there are no tours which make use of `editSelectMenuInput`, it is also deprecated and to be removed in master. Related PR 1: https://github.com/odoo/odoo/pull/264913 Related PR 2: https://github.com/odoo/odoo/pull/266912 runbot-941336 Forward-Port-Of: odoo/odoo#283328
Point of Sale managers can now open payment method settings without running into an access error. The change gives POS managers the read access needed for online payment provider information while keeping the field hidden from users without the right roles.
Original PR description
Only admin users have read access to the `payment.provider` model. Opening the PoS payment method form as a non-admin would raise an access error because the `online_payment_provider_ids` many2many field tries to fetch `payment.provider` records on form load. Grant read-only access on `payment.provider` to `group_pos_manager` so POS admins can use the field. Restrict the field's group in the form view to `point_of_sale.group_pos_manager,base.group_system` so it is not rendered for users without either role. opw-6208656 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#278792 Forward-Port-Of: odoo/odoo#263837
This fixes an error that prevented sale timesheet reports from being printed when using German or other translated languages. The report now identifies the description column in a language-independent way, making printing more reliable for multilingual users.
Original PR description
Currently a traceback is occurring when the user tries to print a sale timesheet report in the German language. **<h3>To reproduce the issue:</h3>** 1) Install the `sale_timesheet` module. 2) Create…
Currently a traceback is occurring when the user tries to print a sale timesheet report in the German language. **<h3>To reproduce the issue:</h3>** 1) Install the `sale_timesheet` module. 2) Create a `service` product configured to create a `project and task` on the order. 3) Create a confirmed SO with that product 4) Add a timesheet line to the SO from the `Recorded` stat button 5) Switch to the German language 6) Print `Timesheet(Zeiterfassung)` report 7) A traceback occurs **<h3>Error:</h3>** ``` ValueError: Element „<xpath expr="//th/span[text()='Description']">“ kann nicht in der übergeordneten Ansicht lokalisiert werden ``` **<h3>Cause:</h3>** The xpath relies on the plain text `Description` to identify the `<th>` element. https://github.com/odoo/odoo/blob/5f63fb1af418cc75ff2e382b0455002e7a798071/addons/sale_timesheet/report/report_timesheet_templates.xml#L3-L4 The xpath cannot find the Description header when the language is changed because the text is translated in the base template. As a result, the xpath fails due to the missing target. **<h3>Fix:</h3>** Use a language-independent `name` attribute as the `xpath` anchor. So the `Description` column can be reliably matched regardless of the active language. **<h3> Note:</h3>** This fix requires both modules update, which is generally risky in stable branches. However, this template was recently introduced in [saas-19.4](https://github.com/odoo/odoo/pull/191969/changes#diff-9f4f0d28ffb3aa9fcc4a5f1037bdf532e1e71c4e9703e13b6856ddfd79e15e69R4). So there should be no existing customers using it yet, except saas customers coming from a new database. Therefore, applying this fix in 19.4 is less risky. opw- 6475623 Forward-Port-Of: odoo/odoo#284096
This update replaces an older loop style with the preferred clearer wording in several core areas. It helps keep the codebase aligned with automated quality checks, reducing maintenance friction without changing user-facing behavior.
Original PR description
Ruff checks on runbot flagged `while 1:` Preferred syntax is to use `while True` [UP048](https://docs.astral.sh/ruff/rules/while-one) runbot-945983 Forward-Port-Of: odoo/odoo#284900 Forward-Port-Of: odoo/odoo#283962
Tax returns will no longer be incorrectly marked as paid when someone replies to or sends a normal chatter message. Payment finalization now only happens from the intended tax payment instructions flow, preventing accidental status changes and reducing accounting confusion.
Original PR description
Before this fix: Replying to or sending a message from the chatter of a tax return could incorrectly change its state to Paid. This happened because action_send_mail() automatically called _action_finalize_payment() for account.return records. After this fix: Payment finalization only happens when the composer is opened from the tax payment instructions flow. Normal chatter messages and replies will no longer change the tax return state to Paid. task-6469536 Forward-Port-Of: odoo/enterprise#129161
Bank payment XML files now use uppercase encoding labels to satisfy stricter validation by some banking providers, such as SIX in Switzerland. This reduces the risk of warnings or rejected payment files when exchanging data with banks.
Original PR description
The W3C recommendations for XML state that the encoding defined for an XML document should not be case-sensitive. However, some banking providers (SIX for Switzerland) are stricter and may throw warnings or errors if upper-case is not used. https://www.w3.org/TR/2008/REC-xml-20081126/#NT-EncodingDecl opw-4948708 Forward-Port-Of: odoo/enterprise#129596 Forward-Port-Of: odoo/enterprise#125807
This fixes a dark mode display issue in the Point of Sale where some search and form fields could show dark text on a dark background. POS users can now read and enter information reliably when working in dark mode, reducing confusion during sales or restaurant operations.
Original PR description
**Description of the issue/feature this PR addresses:** When using the POS in dark mode, certain form control elements display black text on a dark background, making them illegible. This occurred…
**Description of the issue/feature this PR addresses:** When using the POS in dark mode, certain form control elements display black text on a dark background, making them illegible. This occurred because the POS application lacked the `color-scheme` CSS property. While the backend web client correctly applied this property, its absence in the POS meant the browser still assumed a light theme, forcing default User Agent styles (black text) onto native form controls that escaped standard view helpers. This commit resolves the issue by applying the `$o-webclient-color-scheme` variable to the POS application. This signals the browser to render form controls and UI elements based on the current web client color scheme, ensuring text remains legible within the POS app. **Steps to reproduce:** - POS > Open Restaurant Register - Hamburger icon (top right) > Switch to Dark Mode - Register > vertical ellipses icon (bottom left) > Quotation/Order > type in the search bar > observe black text on dark grey background **Current behavior before PR:** <img width="1911" height="588" alt="Before 1" src="https://github.com/user-attachments/assets/99581745-23eb-45e1-96f7-bca78853369c" /> <img width="1919" height="550" alt="Before 2" src="https://github.com/user-attachments/assets/b7eb9726-e2d2-492b-ad2b-6c0cc6613bb8" /> **Desired behavior after PR is merged:** <img width="1910" height="433" alt="After 1" src="https://github.com/user-attachments/assets/419b7a2a-234e-47c8-854e-22adf6a7c5c1" /> <img width="1915" height="513" alt="After 2" src="https://github.com/user-attachments/assets/8f1cf5c9-5ad1-4aac-9879-840d6d9d537e" /> opw-6508945 Forward-Port-Of: odoo/odoo#284831
Point of Sale settings now keep all employees added to Advanced rights when saving configurations that also use employee login and delivery integrations. This prevents selected staff from disappearing after save, so access permissions remain as intended.
Original PR description
Steps to reproduce ------------------ 1. Go to the Point of Sale settings and select a shop. 2. Enable UrbanPiper and set a delivery provider. 3. Enable "Log in with Employees". 4. Add two employees…
Steps to reproduce ------------------ 1. Go to the Point of Sale settings and select a shop. 2. Enable UrbanPiper and set a delivery provider. 3. Enable "Log in with Employees". 4. Add two employees to the "Advanced rights" field. 5. Save. Observation -> Only the employee of the PoS manager is left, the two employees are gone. Why it's happening ------------------ When saving from the settings, `pos.config` is written with the context key `from_settings_view`, which tells `_preprocess_x2many_vals_from_settings_view` that the commands received for an `x2many` field are the complete new list, so every record not in these commands is unlinked. The `write` of `pos_hr` always puts `advanced_employee_ids` in the values, even when the caller does not write this field, to keep the employees of the PoS managers in the list (1766d6d40a45). Since b48ddcce7bf in enterprise, UrbanPiper writes on the config a second time during the same save, still with `from_settings_view`. That write does not touch the employees, so `pos_hr` fills `advanced_employee_ids` with the managers only (cf 1766d6d40a45), and the ones that were just saved are unlinked. The fix ------- When `pos_hr` adds the field by itself, keep the employees already set on the config instead of starting from an empty list. opw-6500207 Forward-Port-Of: odoo/odoo#284961
This fixes an automated Knowledge calendar walkthrough that could fail when creating or editing calendar item properties. The change helps keep quality checks stable so future updates can be validated more reliably.
Original PR description
In `knowledge_calendar_command_tour`, we were experiencing two issues 1. First, when we change the properties of a new calendar item, we were running into an issues where the tour would fail due to…
In `knowledge_calendar_command_tour`, we were experiencing two issues 1. First, when we change the properties of a new calendar item, we were running into an issues where the tour would fail due to not being able to locate the dropdown option to create a new property. This only occurs if you don't set a step delay on the tour. This happens because in the `editSelectMenuInput` helper, we first check if the dropdown is open bfore we proceed. Since the tour runs so fast, we detect that the dropdown for the first property is open, so we pass the check. However, this then closes since we've moved on to the next dropdown, and since nothing has been input into the next dropdown, the create option doesn't appear. Now, we ensure that the create option will be present before attempting to click it 2. Later in the tour, we attempt to edit the properties on a new calendar item. We previously used `edit` to edit the property name, however this resulted in the "Select a template" modal being opened, which broke the tour, since we needed to click elements behind it. Using `fill` instead to populate the text field doesn't produce this behavior, allowing the tour to proceed without error. [runbot-939647](https://runbot.odoo.com/odoo/error/939647?debug=assets) Forward-Port-Of: odoo/enterprise#128830
The inventory report now prints with aligned columns and complete table borders when locations are grouped. This prevents confusing or unprofessional-looking PDF reports after warehouse inventory counts.
Original PR description
When new columns were added to the stock inventory report, the location grouping row was not updated. This results in mismatched column counts, causing missing gridlines and broken borders in the PDF output Fixed by ensuring the location row's column count matches the header <img width="603" height="200" alt="image" src="https://github.com/user-attachments/assets/86872bee-f315-4bdd-b3f2-a525e3bb5fe0" /> ### Steps to reproduce: - Ensure warehouses are activated in the settings - Go to Barcode -> Count Inventory - Add a Product - Select the gear Icon then "Print Inventory" - You will notice that the location row has missing gridlines opw-6307728 Forward-Port-Of: odoo/odoo#275918
Fixed the Real Margin report so that drilling into pivot results opens the standard analytic entries list instead of the timesheet list. This preserves expected navigation for project margin analysis and gives users access to the right detail records from the report.
Original PR description
**Steps to reproduce:** 1. Open a project. 2. Click on the Real Margin stat button or top menu action. 3. The pivot view opens by default. 4. Click on a cell in the pivot view to drill down into the list view. **Issue:** The system opens the timesheet list view instead of the standard analytic entries list view. **Cause:** Overwriting action['views'] erased the default list view, causing to fall back to the timesheet view during drill-down. **Fix:** Used a list comprehension to inject the custom pivot view while preserving the original view types. Added all view options to the Real Margin top bar. task-6192267 Forward-Port-Of: odoo/odoo#270494
This fixes an intermittent issue in an automated CRM forecast check by ensuring the system waits until an opportunity is fully marked as won before moving on. It helps keep internal quality checks stable and reduces false failures during release validation.
Original PR description
The crm_forecast tour is red randomly on runbot on the Won banner step. We click the won button and go back directly, so the kanban can be loaded before the lead is won. Now we wait for the ribbon first. runbot-242139 Forward-Port-Of: odoo/odoo#284721
New onsite learning events created from the Onsite view or an employee resume now appear immediately after creation. The update relaxes the visibility rules and automatically links the current user's employee record, reducing confusion and duplicate event creation.
Original PR description
Onsite events created from the "Onsite" view or the employee resume selector do not appear immediatlely after creation This occurs because currently the domain for onsite events requires that the…
Onsite events created from the "Onsite" view or the employee resume selector do not appear immediatlely after creation This occurs because currently the domain for onsite events requires that the event to have multiple slots as well as to have at least one employee registered to it. Therefore, newly created records often fail these criteria and remain hidden. In further versions, this pr: https://github.com/odoo/odoo/pull/246285/ changes the domain of the event selector in the employee resume by removing the dependency on the multiple slots and filtering by the specific employee for registration. This change is not stable to backport as it indroduces the `employee_id` field as an invisible field in the xml to be able to compare in the domain. This commit partly changes both domains to not require the multiple slots anymore, while still showing all events for which an employee is registered. This commit also ensures that when an event is created from the Onsite view or selector, the current user's employee will be registered to it. Steps to reproduce - Go to employees->Learning->Onsite - Select New and create an event - Go back to Onsite Courses - You will not see the created event (unless it is multi_slot and an employee was registered) opw-5915686 Forward-Port-Of: odoo/odoo#284200 Forward-Port-Of: odoo/odoo#258952
Fixes an issue where confirming a sales order again after cancellation could fail to create the expected event registration. This helps ensure customers who re-confirm event orders are properly registered, including through portal or preview flows.
Original PR description
**Steps to reproduce:** - Create a SO and add the Event Registration - Standard product and specify an event - Confirm the SO then select "Create/Update registrations" - Cancel the SO, then "Set to…
**Steps to reproduce:** - Create a SO and add the Event Registration - Standard product and specify an event - Confirm the SO then select "Create/Update registrations" - Cancel the SO, then "Set to Quotation" - Select "Preview" and confirm the Sale Order again - There will not be any new registration created when there should be one. **Behavior:** Usually when a sale order is confirmed the `action_sale_order_event_registration` form will be opened which when filled correctly creates registrations. However in certain cases: confirming from the customer portal, or simply closing the form when it is opened, will not trigger `action_make_registration` which creates registrations if it is not already the case `action_confirm()` should be creating the registrations correctly on its own anyway by calling ´init_registrations()´ : https://github.com/odoo/odoo/blob/beed378cde592bc96c1e79a976ac775264b843ed/addons/event_sale/models/sale_order_line.py#L49-L66 This function tries to create each missing registrations by looking at the amount in the so_line and deducting the already created registrations, however since some of them can be cancelled, this computation is wrong. And leads to registration not being created when they should. opw-6444127 Forward-Port-Of: odoo/odoo#280426
This fix prevents Belgian payroll paid time off allocation from failing when an employee has no work schedule available. It adds a safety check and tests so the payroll process handles missing calendar data more reliably.
Original PR description
. Add check for the resource calendar before calling _get_days_per_week_for_period() method . Add corresponding tests task-6479161 Forward-Port-Of: odoo/enterprise#128319
The project margin grid view has been corrected so the real margin top bar displays updated information as intended. This helps sales and project users review profitability figures more clearly and consistently.
Original PR description
- update the grid view in project real margin top bar task-6192267 Forward-Port-Of: odoo/enterprise#122586
This fixes an issue where manually adjusted prices on optional quotation items could be overwritten when a customer changed the quantity in the portal preview. Sales teams can now trust that custom prices remain as intended while still allowing standard pricelist updates when no manual price was set.
Original PR description
When a user manually sets a price on an optional line (overriding the pricelist), and then changes the quantity in the portal preview, the manual price is lost and gets reset to the pricelist price.…
When a user manually sets a price on an optional line (overriding the pricelist), and then changes the quantity in the portal preview, the manual price is lost and gets reset to the pricelist price. Steps to reproduce: --- - Install Sales module and enable Pricelists. - Create a product with qty-based pricelist rules: - min qty: 1 → price: 100 - min qty: 10 → price: 80 - Create a quotation with an optional section containing this product. - Manually change the product price to 150 (overriding pricelist). - Mark the section as optional and preview the quotation. - Change the quantity to 10 in portal preview. Issue: --- - The manually set price (150) is incorrectly reset to the pricelist price (80). Root cause: --- - After [commit], if there is no config parameter set and if there is an active pricelist, we simply call `_reset_price_unit()` without checking whether the price was manually set or not. - Additionally, `_reset_price_unit()` calls `update()` which writes `price_unit` and `technical_price_unit` one by one as separate `write()` calls. The `write()` method has a guard([1]) that strips a lone `technical_price_unit` write unless `sale_write_from_compute` is set in context. Without this flag, `technical_price_unit` is silently discarded, causing it to drift from `price_unit`. On the next qty change, this mismatch is detected as a manual price, permanently blocking further pricelist updates. Solution: --- - Check whether the price was manually set before calling `_reset_price_unit()`, and pass `sale_write_from_compute=True` in context so both `price_unit` and `technical_price_unit` are written correctly. [commit]: https://github.com/odoo/odoo/commit/93b6bdd6a4909bc0b45b90ab6a2d0734a218292d [1]https://github.com/odoo/odoo/blob/fffd987cc98d1ea0cd04e24dda2ed8b64a219cdc/addons/sale/models/sale_order_line.py#L1391-L1399 opw-6426634 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#285212 Forward-Port-Of: odoo/odoo#281107
Closed or renewed subscriptions will no longer incorrectly appear in Orders to Invoice because prepaid recurring lines are cleared when billing should stop. Postpaid lines remain invoiceable where needed, so delivered products can still be billed after closure.
Original PR description
When a closed subscription could still show up in the Orders to Invoice because its recurring lines kept their "to invoice" status. This was misleading since no further period should be billed. When a subscription is churned (or renewed), prepaid lines are now flagged as nothing to invoice. Postpaid lines are left as is so that already delivered products can still be billed after closing. task-6227787 Forward-Port-Of: odoo/enterprise#117797
Project settings forms now align section headings more consistently and let setting descriptions use the available space before wrapping. This makes project-related configuration screens easier to read and reduces visual clutter for users.
Original PR description
In the project form settings: - The sections that sit on the same horizontal level should have their header aligned. - Settings description should use all the horizontal space available before wrapping to the next line Task-6360046 Forward-Port-Of: odoo/odoo#284771
This fixes a problem that could stop PDF quotes from being generated when Quote Builder documents included dynamic fields. Sales teams can now print these quotes without encountering an error in affected Python and PDF library setups.
Original PR description
Issue: --- Due to this issue, generating PDF Quote using Quote Builder with dynamic fields leads to a traceback. This was partially fixed by: e16edc7b0d9f56cb7769068ecf7d64ff8b0f6359 Steps: --- 1-…
Issue: --- Due to this issue, generating PDF Quote using Quote Builder with dynamic fields leads to a traceback. This was partially fixed by: e16edc7b0d9f56cb7769068ecf7d64ff8b0f6359 Steps: --- 1- Using a python 3.13 env, install requirements.txt. (You could instead uninstall pypdf2 and install pypdf==5.4.0) 2- Enable Quote Builder. 3- Create a SO and in quote builder tab, select a document. This document should have dynamic fields. e.g. you could use`Office Furnitures Header` document. 4- Print -> PDF Quote. Cause: --- In previous fix, we fixed the traceback when no dynamic field is set. However, if you have a dynamic field, then inside `PdfWriter._update_field_annotation()`, the font is get from `DR` dict inside acroform: https://github.com/py-pdf/pypdf/blob/f20954f2241640feb484800e191373f8fbdfa44b/pypdf/_writer.py#L917-L929 Even if we are not setting a font, we need to have an empty `DR` dict inside acroform, in order to avoid calling `get` on a none object, which is leading to the traceback. Also in previous fix we were losing `NeedAppearances` inside `AcroForm` by creating new dict which wasn't right. opw-6392001 Forward-Port-Of: odoo/odoo#278881
Checkout now checks whether an invoicing step is required for each shopper individually instead of relying on a shared published state. This prevents customers from skipping required Taiwanese e-invoice details by going directly to payment and avoids one visitor's checkout state affecting another's.
Original PR description
Commit 1facbc0646bd made the checkout validate every `website.checkout.step` through a single flow, but the localization invoicing steps were left out. These steps are shown or hidden by publishing…
Commit 1facbc0646bd made the checkout validate every `website.checkout.step` through a single flow, but the localization invoicing steps were left out. These steps are shown or hidden by publishing or unpublishing a shared step record on each checkout. This is unreliable: the cart and payment pages don't refresh it, so the step can be left in the state set by another visitor. The step is also only validated when the visitor goes through it, so opening `/shop/payment` directly skips it. An override also forces `try_skip_step` off so the checkout page cannot jump past the step. This commit filters the invoicing step out of the breadcrumb steps domain per request when it is not needed, instead of toggling the shared record. The cart is passed to the breadcrumb helpers and their cache is removed so the filter runs for each visitor. The Taiwanese step is now checked by the validation flow, so opening `/shop/payment` redirects back to it while incomplete. The checkout page now jumps to the next step, which is the invoicing step when required, so forcing `try_skip_step` off is no longer needed. task-6045788 See also: - https://github.com/odoo/enterprise/pull/124616 - https://github.com/odoo/upgrade/pull/10806
Employee forms now only allow eligible users with the required employee access rights to be selected as time off or attendance managers. This prevents low-access users from being assigned manager responsibilities they should not have.
Original PR description
Before this commit, even light users with no access rights could be selected as time off or attendance managers on employee forms. By design, a light user shouldn't be selectable, and even regular users should require a specific access right. We restricted the domain of the leave manager field so that only users who possess the "User" or "Administrator" role and the "Employees" access right (or higher) can be selected. We did the same change for the attendance manager field. Task-6498276 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Time Off app now correctly finds time types when users search by their code. This removes a redundant app-specific search setup so the app uses the shared search behavior that already supports code searches.
Original PR description
Prior to this commit, searching for a time type by its code in the Time Off app yielded no results. This occurred because `hr_holidays` maintained its own search view (`view_holidays_status_filter`), which lacked the code filtering present in `hr_work_entry`. Since filtering on `create_calendar_meeting` is no longer needed, this view is entirely redundant. This commit removes `view_holidays_status_filter` so that `hr_holidays` falls back on the base search view from `hr_work_entry`, which already handles searching by code. Task: 6502422
This fixes an internal point-of-sale loyalty test so expired gift cards are consistently recognized as expired regardless of timezone. It helps prevent false test failures and keeps quality checks reliable without changing customer-facing behavior.
Original PR description
In the test "test_physical_gift_card", the expiration date of the expired gift card was set as date.today() - timedelta(days=1). It was then compared in a test against the current date to check if the gift card was expired. The problem was that the test would compare date.today() - timedelta(days=1) which is a day before the day of the run in the server timezone to a date in the American timezone. Between 0 and 6am, the expiration date would be the same date as the present day for the test timezone. This led to a gift card which was accepted instead of being flagged as invalid. We fix the issue by putting the expiration date a day before. runbot-error: 946584 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The website configurator now shows the upload logo icon without cutting off its left edge. This small visual fix makes the setup flow look cleaner and avoids confusion during website customization.
Original PR description
Steps to reproduce: - Open the website configurator. - Continue to the color palette selection. => The upload logo icon is cropped on its left side. Before this commit, the gradient did not cover icon parts extending beyond the glyph box. After this commit, extra inline space lets the gradient cover the entire icon.
Checks created from templates and assigned to a tax return are visible again when users generate and open that type of tax return. This restores expected review controls in the Accounting app and helps teams verify tax filings without missing configured checks.
Original PR description
commit introducing the issue: https://github.com/odoo/enterprise/commit/034e0157eed0f19471879ca133faa40b7f0aabf3 Since this commit, it's no longer possible to see a check defined from a check template in a tax return. Steps to reproduce: - Go to Accounting / Configuration / Checks - Create a new one, give it a name, a random cycle and assign it a to a tax return - Open the tax returns view, generate them, and open a tax return of the same type -> The check should be visible Forward-Port-Of: odoo/enterprise#129707
The Belgian payroll salary simulation now opens correctly for eligible full-time employees instead of showing an error. This prevents disruption when HR users estimate employee salary details.
Original PR description
Steps to reproduce: - Go to a full-time employee form eligible for employment bonus (e.g. Laurie Poiret). - Click on the salary simulation button. - A traceback is raised (UnboundLocalError: 'paid_days'). Reason: `paid_days` and `total_days` were not defined in simulation context. As a result, testing the full-time condition (`paid_days < total_days`) raised an UnboundLocalError. Solution: Set `paid_hours = total_hours = paid_days = total_days = 1` when running in salary simulation context. Task-6485330
The attendance Gantt view now correctly displays progress bars for employees who have no attendance records, making empty schedules easier to understand. It also improves the warning display so managers can better distinguish attendance-based employees with missing entries.
Original PR description
[FIX] hr_attendance_gantt: missing progress bars for empty employees On the attendance gantt view, employees without any attendances would have their progress bar hidden, and their label being something like `0h / 8h (+-8h)` in orange. This PR changes it to get the expected behavior: we should also show the progress bar for employees without attendances, and, instead of showing it in yellow all the time, show it when attendance-based employees have no attendances. Since we need to `patch` a renderer class from `hr_attendance_gantt` in `hr_work_entry_attendance`, we need to make the link between those two modules explicit in the manifest file (otherwise hoot tests will fail) This should not change much, as `hr_work_entry_attendance` already installs `hr_attendance_gantt` through an auto_install chain. See this [Discord discussion](https://discord.com/channels/678381219515465750/687338039717920792/1537826154814378167) (in french, sorry) task-6453757
The social media comments window now shows the correct like icon and supports liking Tweets from the comments view. Users also get clearer feedback when creating leads from social posts, and social users have more consistent access to live post information.
Original PR description
Bug === Since https://github.com/odoo/enterprise/commit/86659741990de2ba9c8bf738207edf0e8a0ba8c4 the like icon in the comment in the modal view is broken. We added a new getter `likesIcon` but we didn't use it... Improvements ==== Show create message when creating lead. Make the access of `social.live.post` consistent with the access of `social.post`. Task-6425391
This update corrects visual problems introduced by the Frost design changes in the Accounting bank reconciliation screens. It helps keep statement line review and reconciliation clear and usable for accounting users.
Original PR description
Odoo frost created some css problem this pr will address them no task id
Restored padding around the Helpdesk teams dashboard so the page has proper visual spacing again. This makes the Helpdesk homepage easier to read and keeps the layout consistent after a shared Kanban layout change.
Original PR description
This PR restores a padding around the Teams Kanban view on the Helpdesk homepage. As the vertical padding was removed from the generic ungrouped Kanban component with the assumption it often stands below the `ControlPanel` which provides the right spacing, we need to ensure some scenario like the one in Helpdesk work well. task-6516134
This fix adjusts test dates so they are compared using the correct timezone. It helps prevent false test failures in point-of-sale planning checks, improving release reliability without changing user-facing behavior.
Original PR description
In the tests, the planning slot start and end times were set compared to current datetime in the server timezone. But in the tests, we have a timezone which is american. This leads to incorrect comparisons and that is why in the tests of pos_sale_planning, the dates of the planning slots were adjusted. runbot-error: 946614
Employer-initiated departure reasons in Belgian payroll are now handled like dismissals. This ensures notice details, 13th month eligibility, and outplacement information are calculated and shown correctly during the end-of-collaboration process.
Original PR description
New departure reasons were added previously but their computation for the end of collaboration process was missing. Selecting employer-initiated reasons (codes `358` and `359`) didn't treat them as "Fired" so the notice duration, notice start date, and 13th month eligibility were not calculated and the `Outplacement` field stayed hidden. This treats these reasons as "Fired" in the departure model and updates the view to display the `Outplacement` field when needed. Task-6499788
Original PR description
https://github.com/odoo/odoo/pull/284302
The Point of Sale code has been reorganized by removing an internal helper service as part of preparation for the next OWL framework version. This should not change day-to-day cashier workflows, but it helps keep the POS interface maintainable and ready for future upgrades.
Original PR description
In order to migrate to OWL3 the contextual_utils_service is removed.
This update removes outdated code that handled settings no longer used by dynamic website snippets and event snippets. It keeps the website builder code simpler and easier to maintain without changing visible behavior for users.
Original PR description
remove data-url and the unused default for event cards This was a part of https://github.com/odoo/odoo/pull/258135, but it can be merged independently
Updates internal automated tests for the Knowledge app to use the standard way of editing selection fields. This keeps the test suite aligned with platform changes and helps maintain reliability without changing user-facing behavior.
Original PR description
editSelectMenuInput is being removed from web_tour's stepUtils (only used here); inline its two call sites as plain edit steps, same as the pattern used everywhere else for SelectMenu inputs.
Point of Sale code was reorganized by removing an older internal helper service. This helps prepare the system for a future OWL3 migration without introducing expected changes to day-to-day cashier workflows.
Original PR description
In order to migrate to OWL3 the contextual_utils_service is removed.
Original PR description
Related: https://github.com/odoo/odoo/pull/285307