Daily updates from Odoo
Navigate
Branch
Wednesday, August 20, 2025
63 changes
38 changes
New functionality added to Odoo
Adds a new Equity app to manage company shares, options, valuations, and cap tables in Odoo. This gives businesses a centralized way to track ownership information and related shareholder records.
Original PR description
This commit add a new module for managing shares, options, and cap table. task-4896887
Adds country-specific support for Croatian EC Sales List and Intrastat reporting, plus Czech Intrastat CSV exports. This helps businesses meet local tax reporting requirements with guided submission instructions, translated help, deadlines, and downloadable PDFs.
Original PR description
Following the implementation of the Tax returns feature in 18.3 which was focused on the general implementation and Belgium, we want to add the specification for other country and in this case Croatia. EC Sales List and Intrastat are a part of this, with VAT Returns as the EC Sales List and Intrastat that are generated when the VAT Return is submitted. We are showing modals with the instructions as well as a Download PDF button to make it easier for them to have access to the PDF since it's important for the users to have the instructions present when submitting those documents. This also includes the deadlines and frequencies for the generation of those documents, and also the translation of the instructions. task-4776230 task-4826249
Manufacturing teams can now view scheduled manufacturing orders in a Gantt chart. This makes it easier to understand timing, expected duration, and status at a glance for better planning.
Original PR description
**Desired behavior after PR is merged:** - Gantt Chart was added to make it easier to visualize scheduled MOs, expected duration and their status. Task: 4931085
Enhancements to existing features
The Romanian SAF-T reporting setup now includes the correct tax types and codes for newly introduced taxes. This helps companies in Romania keep their statutory tax reports aligned with the latest legal requirements.
Original PR description
New taxes were introduced in Romania as per the new tax Law. The PR https://github.com/odoo/odoo/pull/221238/files added new taxes in community. This PR updates the SAF-T Tax Type and Code for the newly added taxes. TaskID:4979168 Forward-Port-Of: odoo/enterprise#92188 Forward-Port-Of: odoo/enterprise#91512
Users are now warned when enabling WhatsApp debug mode that media files will stop being received. This helps prevent accidental disruption to WhatsApp media handling by making the impact clear before the setting is used.
Original PR description
#### Step to reproduce: - go to WhatsApp > Configuration > WhatsApp Buisness Account - enable debug mode #### Previous behavior: - active debug mode #### Expected behavior: - active debug mode - warn user that WhatsApp debug mode will stop medias from being received Other solutions would include the use of: - warning. They are triggered only on `onchange` methods. However, debug_logging is updated through buttons which do not trigger `onchange`. Therefore, to update it through a field it requires some changes in the XML which aren't appropriate for stable. - confirm using a wizard. It would require a new view which is not stable either. opw-4678542 Forward-Port-Of: odoo/enterprise#89995
Signer labels in Sign templates now stay in sequence when people are added or removed. This avoids confusing gaps like “Signer 1, Signer 2, Signer 4” while preserving any custom names users have entered.
Original PR description
Currently, the sidebar of a sign template has an internal id which starts at 0 and is used as an id when you make an orm call to create a new sign.role.item record (a signer on the template). Until…
Currently, the sidebar of a sign template has an internal id which starts at 0 and is used as an id when you make an orm call to create a new sign.role.item record (a signer on the template). Until now, the id is also used to create the name of the signer, as "Signer {id}" but this is problematic if you eliminate signers and then create new ones because it leaves holes in the signer naming. The solution is to always use the length of the array containing the currently assigned signers as the number to insert into the name, since the new signer is always added at the end. Furthermore, when a signer is deleted, we should compute the names of the remaining signers to match their position in the array containing the assigned signers.
For example, if we create 4 signers, Signer {1,2,3,4} and then delete Signer 3, we would like Signer 4 to be renamed Signer 3, since the next added signer will be named Signer 4 according to the length of the array containing them. A small caveat is that we don't want to rename already renamed Signers, because we don't want to lose personalization.
This is the objective of this PR.
Task: 4985491Appointment scheduling now includes easier time-of-day filters, a new chart view, and clearer booking information. This helps teams quickly understand demand, see booked capacity, and manage restaurant appointment resources more efficiently.
Original PR description
**: pos_restaurant_appointment In this commit: --- - Added time-based filters (Morning, Lunch, Evening) in the Kanban view. - Introduced a new Graph view for visualizing appointment data. - Displayed person count on resources that are booked during the event time. - Improved the overall Kanban UI for better readability and interaction. task-4873228
Bank statement imports and automatic matching are optimized for very large accounting databases, reducing the risk of slowdowns and timeouts. This makes reconciliation more reliable and significantly faster, with benchmarked processing time dropping from 185 seconds to 52 seconds for a 200-line import.
Original PR description
[FIX] account_accountant: refactor and optimize _try_auto_reconcile_statement_lines() In big databases, this method called on large recordsets of statement lines would take too much time, or worse:…
[FIX] account_accountant: refactor and optimize _try_auto_reconcile_statement_lines() In big databases, this method called on large recordsets of statement lines would take too much time, or worse: timeout. This is mainly because the 2 SQL queries are doing too complex searches and hence are badly optimized by the query planner. To solve that, * We search for reconciliable accounts outside the queries to avoid a join * We add a trigram index on statement_line.payment_ref and only use ILIKE operations for reference matching so that it can be used * Instead of using complex and costly regexp_split, we search for matches by splitting account_move_line.ref on ' - ' * We move some logic in python, amount matching, rather than in sql * We don't try anymore to match on amounts found in the payment_ref Additionnally, * The algorithm now treats the statement lines with and without partner the same for reference matching, but lines without partner are just ignored for the amount matching, as it's way too dangerous * Bug of with_prefetch, pre-loading the ids of a wrong object, has been fixed * We revert the patch https://github.com/odoo-dev/enterprise/commit/da52bc70cd745f3e9f7a0539528c84aa47b98cc5 because it was only a temporary measure while the time was back to acceptable * The test_matching_rules_with_empty_aml_ref, irrelevant, was removed Benchmark --------- Importing a csv file of 200 statement lines, on a database of 21M account.move.line, and thus triggering the culprit function, takes (hot timings): | Before | After | Speed-up | |--------|-------|----------| | 185 s | 52 s | ~3.5x | see https://github.com/odoo/odoo/pull/218642 Forward-Port-Of: odoo/enterprise#90077
The Helpdesk Customer Ratings menu now opens directly instead of relying on a server-only action. This improves compatibility with offline mode while keeping company-specific rating filters in place.
Original PR description
Before this commit, the "Customer Ratings" action in helpdesk menuitem was a server action. This was incompatible with the framework's offline mode, as it required a live connection to the server for execution. This commit replaces the server action with a direct window action. The dynamic company filtering is now handled by a non-stored computed field with a search method. task-4920367
Users can now start asset imports from a ready-made template that highlights the most important fields. The empty assets screen is clearer and offers a direct template import link, helping reduce setup confusion and import errors.
Original PR description
- Introduced a template file to guide users on which fields are most relevant during asset import, reducing confusion and import errors. - Updated the empty asset screen to include a clickable link: "Import assets using a template." - Removed the sample data banner previously visible on empty screens (e.g., My Company Chicago). task-4886537
Project privacy rules were updated across related business apps to match the latest project privacy options. This helps ensure access to project documents, field service work, forecasts, and timesheets follows the intended privacy setting consistently.
Original PR description
This commit's purpose is to update the ir.rules in accordance to the changes done in the community counterpart of this commit. task - 4029633
Signer names are now loaded once per request instead of repeatedly, reducing unnecessary database work. This makes the Sign template experience smoother and faster, especially for templates with many signer roles.
Original PR description
Currently, the application retrieves signer names multiple times from the database, leading to unnecessary overhead and delays. By modifying the logic to fetch signer names only once per request, we significantly reduce the number of database calls. This change will result in a smoother and faster user experience, especially when dealing with templates that contain many roles. task-4841694
Payroll users can now correct payslips when an employee record changes after a payslip was already generated. The former refund action is now part of a clearer revert-and-correct flow that automatically creates the updated payslip and makes related payslips easier to find.
Original PR description
This PR introduces a correction mechanism for payslips to handle scenarios where a new employee version applies to a period for which a payslip was generated using an older version. The existing "refund" action is renamed to "revert" and is now part of this broader correction process. A new payslip, reflecting the correct employee version, is automatically generated after the reversion. Additionally, UX is improved with smart buttons on payslips, allowing users to easily navigate between the original, reverted, and corrected payslip versions. Task: 4731029
Italian withholding report functionality is being consolidated into the main Italian reports module. This reduces the number of separate Italian localization modules to manage, making setup and maintenance simpler for users and administrators.
Original PR description
In an attempt to simplify italian modules, we are merging `l10n_it_edi_withholding_reports` into `l10n_it_reports`. task-5012581
Point of Sale and related country-specific POS modules now produce clearer diagnostic logs with added context such as where messages come from, variable details, and call traces. This helps support and development teams investigate POS issues faster without changing normal cashier workflows.
Original PR description
*: l10n_de_pos_cert, l10n_de_pos_res_cert, l10n_it_pos, pos_enterprise, pos_iot, pos_mobile Improve console logging in the Point of Sale and related modules. By using the `logPosMessage` utility…
*: l10n_de_pos_cert, l10n_de_pos_res_cert, l10n_it_pos, pos_enterprise, pos_iot, pos_mobile Improve console logging in the Point of Sale and related modules. By using the `logPosMessage` utility function more informations are now included in the console logs, such as the module name, function name, and a message. This makes it easier to track down issues and understand the flow of the application. Also when unfolding the console logs, some additional context is provided: - Variable values (if given to the console method) - Call stack trace (if available) ## Example of a log message: [IndexedDB]: put - Processing 40 items in store pos.order.line ### With its call stack: logPosMessage @ pretty_console_log.js:13 (anonymous) @ indexed_db.js:113 promises @ indexed_db.js:92 create @ indexed_db.js:193 synchronizeLocalDataInIndexedDB @ data_service.js:182 ..... ## Screenshots: <img width="779" height="764" alt="image" src="https://github.com/user-attachments/assets/6be024e4-e849-478b-9cdd-653300fc015a" /> https://github.com/user-attachments/assets/2342ca52-719c-4368-94e6-1e692faf12e0 Forward-Port-Of: odoo/enterprise#92544 Forward-Port-Of: odoo/enterprise#92021
The Sign app now presents signature field settings with clearer labels and a simpler size selector for text fields. Users can also archive unused field types, making configuration easier to manage without deleting records.
Original PR description
Changes include: - Change of the model name text in form and list views from "Signature Item Type" to "Signature fields". - Addition of "active" field in the sign.item.type model to add the option to archive/unarchive records. - Capitalized default value of "tip" field from "fill in" to "Fill in". - Removed "default_width" and "default_height" fields from the form view and substituted them with a new field "field_size" which allows for 3 values (short, normal, long) and, on change, updates the two height and width fields accordingly. This new field is only displayed when the "field_type" is set to Text. - Restructuring of the form view to have on the left normal fields and on the right autocompleted ones. - Change of the names of two columns on the list view: from "Specific Model Linked" to "Linked to" and from "Auto-fill Field" to "Linked field". Task: 4908814 Upgrade PR: [link](https://github.com/odoo/upgrade/pull/7993)
Subscription service products can now be configured to charge either a prorated amount or the full recurring period when added mid-cycle. Goods products continue to always invoice the full period, preserving the existing behavior while giving businesses more billing flexibility for services.
Original PR description
Before this PR, Subscription Goods Products are always invoiced for the full recurring period, even when added from an upsell or another method in between an ongoing invoicing period. For Subscription Service Products, instead, we always calculate the prorated price when adding them in between invoicing dates and we have the customer only pay for the remaining days in the period. The behavior of the Goods is intended and the flow is left untouched while for services, although the default is still to calculate the prorated price, we leave the option of deactivating this and invoicing for the full period price. Under the hood this is done by adding an allow_prorated_price field which is kept False for Goods and has default True for Services. Task: 4932997 [Upgrade PR](https://github.com/odoo/upgrade/pull/8228)
This update streamlines how WhatsApp and live chat participant information is handled behind the scenes. It reduces unnecessary complexity, helping keep messaging features easier to maintain without changing the day-to-day user experience.
Original PR description
This commit reduces the usage of persona for the channel member model, unless we need to support guest and partner, the use of persona should be avoided. Follow up on task-4675777 PR community: https://github.com/odoo/odoo/pull/220063
Point of Sale users now see clearer Epson printer status notifications when printing through an IoT device. If printing fails, the system shows the issue in a popup and gives staff the option to retry, helping reduce checkout delays.
Original PR description
Following odoo/odoo#208958, odoo/odoo#208611 and odoo/odoo#208058, we adapt the the iot printer in PoS to display the printer status in a modal in the PoS, with ability to retry on failure. Community PR: odoo/odoo#223581 Task: 4756311
The automated tests for rental and subscription combo product flows were updated to match the redesigned combo selection window. This helps keep checkout quality checks reliable after the interface change, reducing the risk of unnoticed issues in these sales flows.
Original PR description
Community PR: https://github.com/odoo/odoo/pull/222337 task-4981539
The VoIP call list now shows the most recent calls at the top by default. This makes it easier for users to quickly review the latest activity without manually sorting the list.
The French VAT report submission wizard now includes an express mention option for reports sent through the Aspone service. This helps businesses correctly flag expedited submissions in the required report section.
Original PR description
This commit adds express mention in the wizard to send the tax report to aspone api. The express mention will be added in the zone BC of the tax report. Task-4933083
The work entry planning screens now offer clearer controls for adding, replacing, splitting, deleting, and resetting work entries in Gantt and calendar views. This helps payroll and HR teams manage schedules more efficiently while protecting already validated entries from accidental changes.
Original PR description
Problem ---------- With the new system of date + duration, and the multi_select in the Gantt and the Calendar views, new UX is needed Solution ---------- Gantt: - `_gantt_unavailability` for the gantt grey days - `get_gantt_data` to display employees in contract without work entries (should not happen with the automatic generation) - limit the scales: week and month only - custom popover to add/split/delete work entries - lock system on validated work entries (undraggable,...) - custom multi_select: - quickReplace buttons 6max (depending on the last work entry type created for the user) - eraser instead of trash to reset selected cells (regenerate work entries) - custom add popover to Add and Replace - Add is available everywhere in contract range - Replace will delete all records in a cell and add a new one (cells with validated work entries are skipped) task-4892209
Resolved issues and error corrections
This update keeps the Belgian point of sale certification module compatible with the latest Odoo version by replacing an outdated internal component. It helps prevent errors in POS category handling after upgrading to version 19.0.
Original PR description
Starting from 19.0, odoo.osv is depreciated, so we need to use odoo.fields.Domain instead. [Runbot-230364](https://runbot.odoo.com/odoo/error/230364)
The Journal Audit report no longer crashes when its underlying Journal Report has had all lines removed. Instead of showing an error, the system safely stops processing empty report data, improving reliability for accounting users.
Original PR description
Currently, error occurs when user try to open Journal Audit with no lines. Steps to replicate: - Install `accountant`. - Navigate to `Accountant > Configuration > Accounting reports`, search for `Journal Report` and open it. - Under the Lines tab, delete all the records and save. - Open the `Journal Audit` report, and the error will appear. Error: `IndexError: list index out of range` Cause: - An error occurred because the user deleted all the lines from the report, and the code tried to access the first element [1] of those lines (`lines[0]`) which caused the error. Solution: - Added a check if lines are present, if not then returned from the function. [1]: https://github.com/odoo/enterprise/blob/5670a73ef63d313f6c3df2b1ceeec7f7d6cd6a1b/account_reports/models/account_journal_report.py#L167 sentry-6795898305 Forward-Port-Of: odoo/enterprise#91979
The Sign button is now hidden once a document has been fully signed from the chatter. This avoids confusion for users by removing an action that is no longer needed after signing is complete.
Original PR description
Before this fix, even after a user signed a document from the chatter and The document was fully signed, and the Sign button was still visible. In this PR, the button is hidden once the document is fully signed. Forward-Port-Of: odoo/enterprise#92597
The Swiss payroll wage type view no longer shows the discussion panel after messaging support was removed from the related record. This prevents users from seeing a non-working or irrelevant communication area, keeping the screen clearer and avoiding confusion.
Original PR description
After mail thread was removed from the model, the chatter is still present in the view and should be removed Forward-Port-Of: odoo/enterprise#92316
This change adjusts an internal test so it stays aligned with a recent spreadsheet component update. It helps keep automated quality checks reliable without changing the user-facing document spreadsheet experience.
This update fixes an internal accounting test so it automatically uses the correct year when checking payment references. This helps keep the test suite stable over time and avoids avoidable build failures when dates change.
Original PR description
In `test_matching_rules_with_empty_aml_move_name`, the payment `move_id.name` was hard-coded to use the year "25" in the sequence prefix (e.g. MOVE25/00004). This caused ValidationErrors when the mocked posting date in the test environment belonged to a different year, as the sequence mixin enforces alignment between the move date and sequence year. The test now derives the year suffix dynamically from the actual `move_id.date` to ensure it always matches the posting date used in the test context. This makes the test stable regardless of the current (or mocked) date, removing the need for manual adjustments when fiscal years or test setup dates change. build_error-230659 Forward-Port-Of: odoo/enterprise#92080
The Planning app now validates shift template start and end hours before creating the display name. This prevents a system error when users enter an invalid hour, replacing it with a proper validation message so the form can be corrected safely.
Original PR description
Currently, an error occurs when entering an invalid end hour in the shift template. Steps to Reproduce: - Install the `planning` module. - Go to `Shift Templates`. - Create a new `shift template` and…
Currently, an error occurs when entering an invalid end hour in the shift template. Steps to Reproduce: - Install the `planning` module. - Go to `Shift Templates`. - Create a new `shift template` and enter an `invalid end hour (greater than or equal to 24)` > `save`. `ValueError: hour must be in 0..23` This error occurs after [this commit](https://github.com/odoo/enterprise/commit/a0bb61f5871fe02a0a32691f33dabfb06c9d2ce2), which added the _get_name method to generate the display name without validating the data.when a user enter invalid value in the end hour while creating or editing shift template. The compute method is then triggered, which attempts to generate the display name [1] based on the formatted time. During the formatting of the end time, the hour value is invalid for the time function,and raise the error [2]. This commit ensures that if the start hour or end hour is invalid, it raises a validation error, similar to [this commit](https://github.com/odoo/enterprise/pull/67580/commits/fa566f9de1b8f75510cbc01837fb3ff4764eccdf). [1]- https://github.com/odoo/enterprise/blob/3009d64c72ef3f4e6bae64ddb9e24f48a4f778a5/planning/models/planning_template.py#L54 [2]- https://github.com/odoo/enterprise/blob/3009d64c72ef3f4e6bae64ddb9e24f48a4f778a5/planning/models/planning_template.py#L74-L78 sentry-6792658060 Forward-Port-Of: odoo/enterprise#91779
The Knowledge and Helpdesk Knowledge test tours were adjusted to match updated media dialog behavior from a related accessibility improvement. This helps keep automated checks reliable and reduces the risk of regressions in article editing and file block workflows.
Original PR description
This commit is linked to the [MediaDialog accessibility improvement PR] in community. [MediaDialog accessibility improvement PR]: https://github.com/odoo/odoo/pull/220737 task-3680626
The Planning app now hides the auto-plan option when a shift has no start or end date. This prevents users from triggering an error while working with unscheduled shifts created from sales orders.
Original PR description
**Step to reproduce:** 1. Install sale_planning module 2. Create a product (Sales -> Products): - Set Product Type to Service - Enable Plan Services - Assign both a Planning Role and resources. 3.…
**Step to reproduce:**
1. Install sale_planning module
2. Create a product (Sales -> Products):
- Set Product Type to Service
- Enable Plan Services
- Assign both a Planning Role and resources.
3. Create a sales order for this product.
4. Confirm the Sales Order.
5. Click the "To Plan" button.
6. Switch to List View.
7. Open the Unscheduled Shifts (None) section.
8. Try to generate an Auto Plan.
**Issue:**
A traceback is raised during auto-planning when the start_datetime or end_datetime on the planning slot is missing.
`AttributeError: 'bool' object has no attribute 'astimezone'`
**Cause:**
The `auto_plan_ids()` method assumes that shifts have valid start_datetime and end_datetime.
However, for unscheduled shifts, these fields can be empty (i.e., False), causing the error.
https://github.com/odoo/enterprise/blob/42d829ea6e6a98f251cfffc8fb67b5320a5ada12/planning/models/planning.py#L1076-L1077
**Solution:**
we hide the auto-plan button, in case we do not have startdate or enddate
opw-4812509
co-authored by: Ajit Singh (aksi@odoo.com)
Forward-Port-Of: odoo/enterprise#89383A small cleanup removes an unused internal parameter in the Belgian POS blackbox module. This reduces confusion in the code without changing how users work with the point of sale.
Original PR description
An unnecessary parameter has been added and mistakenly not removed. This commit removes it. Forward-Port-Of: odoo/enterprise#92554
Upsell orders for subscriptions now prevent changes to the commission plan when the original order has Freeze Plan enabled. This avoids misleading sales users into choosing a new plan that would not be used for the resulting commission purchase order.
Original PR description
**Problem:** An inconsistent behavior occurs when a user changes the commission plan while creating an upsell order for a recurring Sales Order (SO). **Steps to reproduce:** 1) Install the…
**Problem:** An inconsistent behavior occurs when a user changes the commission plan while creating an upsell order for a recurring Sales Order (SO). **Steps to reproduce:** 1) Install the Subscriptions and partner_commission modules. 2) Create a subscription SO with a referrer_id and set a recurrence. 3) Enable the Freeze Plan option and create a commission plan from the view 4) Add a rate of 50 and product category as service in the commission rules. 5) In SOL add a subscription product contains recurrence with unit price of 100 6) Confirm the SO → Create Invoice → Confirm → Pay. 7) Go back to the SO and create an upsell for it. 8) Change the commission plan rate to 30 by creating a new plan. 9)Repeat step 4. **Issue:** When you navigate to the referrer record from the SO and open the Purchase Order via the smart button, you will see two Purchase Order lines both showing a value of 50, even though the upsell order had a new commission plan with a rate of 30. **Cause:** When the invoice is marked as paid, a Purchase Order with POL is created using values from the commission plan. For subscription orders, the system intentionally uses the subscription’s original commission plan instead of the updated one. https://github.com/odoo/enterprise/blob/03a5efc04538fce380ec3ea993e7586047fe117e/partner_commission/models/account_move.py#L197-L203 However, the problem is that the commission plan field remains editable in upsell SOs even when the parent SO has Freeze Plan enabled, misleading users into thinking the new commission plan will be applied. **Solution:** Make the commission plan field read-only for upsell SOs when the parent SO has Freeze Plan enabled. opw-4954307 Forward-Port-Of: odoo/enterprise#92217 Forward-Port-Of: odoo/enterprise#92157
AI prompt field selection now avoids showing unnecessary separators when inserting properties. Boolean fields also correctly treat False as a valid value, preventing misleading warnings for users.
Original PR description
Bug === The `False` value is a valid value for boolean type, and the warning should not be displayed for that type. When inserting properties in an AI prompt, the property separator should not be visible. Task-4896271 Forward-Port-Of: odoo/enterprise#92699 Forward-Port-Of: odoo/enterprise#88483
Dutch VAT payment instructions now use the Omzetbelastingnummer when it is available, instead of always relying on the company VAT number. This ensures the payment communication shown to users matches Dutch tax reporting requirements and reduces the risk of incorrect tax payment references.
Original PR description
**Steps to reproduce:** - Install Accounting, l10n_nl and l10n_nl_reports_sbr_ob_nummer - Switch to a Dutch company (e.g. NL Company) - In company form, set VAT and Omzetbelastingnummer - Create an…
**Steps to reproduce:** - Install Accounting, l10n_nl and l10n_nl_reports_sbr_ob_nummer - Switch to a Dutch company (e.g. NL Company) - In company form, set VAT and Omzetbelastingnummer - Create an invoice with tax for previous month - Confirm the invoice - Go to "Accounting / Reporting / Statement Reports / Tax Return" - Select previous month - Create "Closing Entry" and post it - On "Miscellaneous Operations" journal in Accounting dashboard, click on "Pay tax: [date]" link - A wizard will appear fot the VAT payment **Issue:** The value of the "Communication" field is incorrect. **Cause:** The "Communication" field is always computed from the VAT of the company. However, when the "Omzetbelastingnummer" field is set, it should be used instead of the VAT. **Solution:** Use the "Omzetbelastingnummer" field to compute the "Communication" of the VAT payment when it is set. This is done through an overridden method because "Omzetbelastingnummer" is defined in an independent module. opw-4836615 Forward-Port-Of: odoo/enterprise#92691 Forward-Port-Of: odoo/enterprise#92407
This fixes an internal test setup issue for Australian payroll accounting by giving the test user the access rights needed for accounting and HR records. It helps ensure automated checks run reliably without affecting day-to-day users.
Original PR description
[FIX] l10n_au_hr_payroll_account: missing groups The common test file is accessing models in account and hr modules but the user miss groups to have access to them. runbot-230965
Code cleanup and technical improvements
This update improves how report template errors are captured and explained, making it easier to identify where a problem occurred. It is mainly an internal quality improvement that should help teams diagnose and resolve report issues faster.
25 changes
Enhancements to existing features
The Point of Sale browser tab now displays the standard Odoo favicon. This makes the PoS page easier to recognize among open tabs and keeps it visually consistent with the main Odoo interface.
Original PR description
Before this commit: ==================== The POS UI did not display a favicon in the browser tab. After this commit: ================== The standard Odoo Point of Sale favicon is now displayed in the browser tab for the POS UI, consistent with the backend interface. Task-4978320
Inventory transfers with many serialized items now validate much faster. This reduces timeouts and delays for high-volume warehouse operations by creating related records in batches instead of one by one.
Original PR description
### Description: When using serial numbers, pickings with many move lines can cause performance issues during validation. This is due to `_update_reserved_quantity` updating quantities and creating move lines individually. By moving the creation outside `_update_reserved_quantity`, we can batch create move lines per move, significantly improving performances. ### Benchmark: | N° of mls | Before | After | |-----------|---------|-------| | 500 | 1:37 | 1:34 | | 15000 | Timeout | 3:30 | | 30000 | Timeout | 4:29 | ### Reference: opw-4889581 Forward-Port-Of: odoo/odoo#219471
Vendor refunds can now be auto-completed using related purchase orders or past refunds, similar to how vendor bills already work. This reduces manual entry and makes refund creation faster and more consistent for accounting and purchasing teams.
Original PR description
Before: - Users could auto-complete bills from purchase orders and past bills. - However, the auto-complete feature was not available for refunds; users had to manually create refunds even if a related purchase document already existed. After: - Added auto-complete functionality for vendor refunds. - Now, users can auto-complete refunds from purchase orders or past refunds. Impact: - Improves the user experience for creating vendor bills and refunds. - Reduces manual work for users when generating bills and refunds. task-4975196 Due to stability issues, this feature will be implemented from the master branch instead of version 18.0. See : https://github.com/odoo/odoo/pull/223179
UAE payroll now accounts for days when an employee is outside an active contract. This helps payroll calculations better reflect unpaid gaps and improves accuracy for local payroll processing.
Original PR description
days to UAE payroll task-4700453
Resolved issues and error corrections
The Italian accounting localization now includes the missing 0% EU tax for exported services. This ensures invoices can show the correct legal note for these service exports, helping businesses stay compliant with Italian tax requirements.
Original PR description
Description of the issue this commit addresses: The export tax for services is missing in the italian localization. It's required because it has a different legal note than the usual 0% EU tax. --- Desired behavior after this commit is merged: The italian localization has a 0% EU S for exported services in EU with the right legal note. --- task-4715771 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#223423 Forward-Port-Of: odoo/odoo#205521
This fix protects a hidden search setting from being accidentally removed while editing website content. It prevents save errors and keeps website search forms working reliably after page edits.
Original PR description
Problem: In Website, the `order_by` hidden input stores the selected sort order for search. This input can currently be deleted via `oDeleteBackward`, which may break the form behavior. Solution: Make `order_by` input unremovable to ensure form integrity. Steps to reproduce: - Add a "Title" text block - Insert a search element before the text - Delete all the text - Use backspace to delete the header block - Save - > A traceback occurs because the `order_by` input was deleted opw-4863089 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220107
Purchase replenishment now reuses an existing purchase order only when its project matches the replenishment need. This prevents items for one project from being incorrectly grouped into a purchase order for another project or into a project-specific order when no project applies.
Original PR description
Steps to reproduce: - Create a storable product: - Vendor: Azure Interior - Routes: MTO + Buy - Click on the replenishment button → a purchase order is created - Open the PO and set a project - Replenish the product again Problem: The first purchase order is reused even though it has a project, while it should not. Solution: When searching for a candidate purchase order, ensure that the `project_id` matches the procurement values: - A PO with a project can only be reused for procurements with the same project. - A PO without a project can only be reused for procurements without a project. opw-4976606
Payment methods set up in a parent company are now visible when working from a child branch. This prevents missing payment details on contact records and helps branch users access the same payment information as the parent company.
Original PR description
In this bug, the payment method is not shown in the child branch. To reproduce: 1- Create a db with account and contact app installed 2- Create a company and a branch 3- Create a payment method in parent company and add it to contact form of a partner 4- Go to child branch. You can see the payment method is not shown in the contact form. opw-4920219
Selling event tickets in Point of Sale no longer loads every registration tied to that event. This avoids unnecessary background work and reduces the chance of errors when processing event sales.
Original PR description
Before this commit, selling an event in PoS would trigger the loading of all event registrations linked to the event. This was unnecessary and caused issues, as it also attempted to load the related PoS order lines, leading to potential errors. opw-4956313 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Attendance overview list now shows only employees who actually have attendance records when grouped by employee. This reduces clutter and helps managers focus on relevant attendance data without changing the Gantt view behavior.
Original PR description
To reproduce: ============= - Activate the "Attendances" app. - Go to Attendances > Overview. - Switch to list view. - Group by Employee. Issue: ====== The current domain fetches all employees…
To reproduce: ============= - Activate the "Attendances" app. - Go to Attendances > Overview. - Switch to list view. - Group by Employee. Issue: ====== The current domain fetches all employees matching the filter, regardless of whether they have attendance entries in the grouped model. https://github.com/odoo/odoo/blob/5b5f0bf795ca538e91f063f2b3185c12b1d0a992/addons/hr_attendance/models/hr_attendance.py#L677 Fix: ==== Restrict the employee list to only those linked to a resource that appears in the grouped data https://github.com/odoo/odoo/blob/5b5f0bf795ca538e91f063f2b3185c12b1d0a992/odoo/models.py#L2360-L2361 The problem is the behavior of gantt view will change it's behavior So we have to applied only to the list. there's something unique when we call it from the gantt which is `gantt_start_date` property that we will use it so we can differentiate between list and gantt view -- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes internal spreadsheet test utilities so they can handle sorted data consistently. It helps improve the reliability of spreadsheet-related testing, reducing the chance of regressions reaching users.
Original PR description
Task: 4962837 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix ensures invoice sending options and extra electronic invoicing choices are handled consistently across accounting and localization modules. It reduces the risk of duplicate or incorrectly processed sending methods when generating or sending electronic invoices.
Original PR description
It seems pretty straight forward. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an inconsistent automated test failure in the sales stock area by ensuring the test product has the expected stock behavior and quantity. It helps keep validation reliable when localization modules affect inventory rules.
Original PR description
Steps to reproduce the bug: - Install l10n_ke_edi_oscu_stock -Try to run the test: test_package_with_moves_to_different_location_dest Problem: A user error is raised: “There is nothing eligible to put in a pack. Either there are no quantities to put in a pack or all products are already in a pack.” This happens because when only sale_stock is installed, the product type is Consumable, so the move gets assigned directly. However, with l10n_ke, the product becomes Storable, and when assigning the move, the system checks whether there is enough quantity available in stock. Solution: Force the product to remain Storable in all cases and update its stock quantity accordingly. [runbot-108414](https://runbot.odoo.com/odoo/runbot.build.error/108414) Forward-Port-Of: odoo/odoo#222940
Payroll advice reports now use the selected payslips to determine the payroll period instead of relying on the current date. This prevents incorrect or missing period information when generating advice for past payroll runs.
Original PR description
Generating a payroll advice would use the current date in order to find other payslips that are for the current period and use this to fill in the period on the advice. However, if you do this for a past payslip, it will either not find any or get the incorrect period. Changed the behavior to use the actual payslips and get the period from those payslips to fill in the period on the report. opw-4582990
This update makes an automated test for embedded PDF handling work consistently whether an optional file-detection library is installed or not. It helps keep the Documents and Accounting integration stable across different deployment and testing environments without changing user-facing features.
Original PR description
The test `test_embedded_pdf` fails when the magic lib is installed. modified cherry-pick of 22cbdb477 Adapted to work with or without the lib as the lib is not required in version < 19.0.
Applicants could hit a 404 error when trying to review and sign an offer if the signing setup used certain custom roles. The fix finds the correct signing access using the user's email address instead, so contract review and signing works regardless of role assignment.
Original PR description
### Problem: Previously, clicking the "Review Contract & Sign" button triggered an RPC call that attempted to retrieve an access token by filtering on the employee role. If the contract did not…
### Problem: Previously, clicking the "Review Contract & Sign" button triggered an RPC call that attempted to retrieve an access token by filtering on the employee role. If the contract did not include this role, the search returned no results, causing the redirection to fail with a 404 error due to the missing token. ### Description about the solution: This commit updates the search domain to look for a record that matches the current user's email address instead. This ensures the correct access token is retrieved, regardless of role assignment. https://github.com/user-attachments/assets/6c8cd892-2d85-4da7-b756-8b3cbf987b60 ### Steps to reproduce the issue: 1) In the Sign application, create a PDF template with a new role and an HR responsible role. 2) In the Recruitment application, create a new contract template and select the PDF template created above. 3) In the contract role field, select the employee as the signatory for the line having newly created role. 4) For any job position, generate an offer for an applicant. 5) Select the contract template created in step 2. 6) Click the "Send By Email" button to send the contract. 7) Open the URL and complete the personal application form. 8) Click the "Review Contract & Sign" button. 9) The system attempts to open the sign document but ends up on a 404 error page. https://drive.google.com/file/d/1aIWJvDlFtd40T5istjKhDvnWFae9wxIM/view opw-4886526
Odoo now creates a device record for every detected IoT network device instead of reusing existing records across the database. This prevents printers from becoming unavailable when Windows IoT boxes report duplicate identifiers or when multiple IoT boxes share a network and one is offline.
Original PR description
We used to create network device records only for network devices that didn't exist in the whole database. This allowed us not to duplicate printer records for clients that had two iot boxes on the same network. We remove this logic as it over complicates the IoT flow and understanding of clients/support. On Windows IoT Boxes, we sometimes get the same identifier for two different printers on two different networks, making the second printer unusable from the db. More, if for some reason a client has two Windows IoT boxes on the same network, and one is off, he won't be able to print through the first one. Backport of odoo/enterprise#92360 Forward-Port-Of: odoo/enterprise#92528
Receipt validation now correctly triggers automatic lot or serial number label printing after a quality check is passed. This prevents warehouse users from missing required labels and also improves completion handling when receipts contain items with and without quality checks.
Original PR description
## Issue: When 'auto_print_lot_labels' is activated on Receipts Operation Type, and you received a product, the print action wasn't trigger when you validate before making the Quality Check The…
## Issue: When 'auto_print_lot_labels' is activated on Receipts Operation Type, and you received a product, the print action wasn't trigger when you validate before making the Quality Check The wizard is automatically opened but when you click on the Pass button, the wizard was closed without sending the print action ## Cause: The action wasn't return by the wizard function 'action_generate_next_window()' making the only action to be a 'act_window_close' ## Note: The state wasn't correctly set to done for all products when you validate pickings both with and without QCs in them at the same time, it should now be fix Enabling Delivery Slip for the Receipts will make the SN to not be print even after disabling the option ## Steps to reproduce: - Toggle the Lot/SN Labels option in the Hardware Tab for the Operation Type Receipts - Create a Product tracked by Unique Serial Number - Add a Quality Check for the Receipts operation - Create a New Receipt for the product - Mark as Done and Add the Serial Number - Validate the receipt and Pass the check - Before the fix, no document was downloaded opw-4790427
The French VAT report configuration has been updated to use the 2025 reporting year. This keeps the report aligned with the latest official version and avoids automated server test failures while leaving the VAT export content unchanged.
Original PR description
The version for 2025 is out. As far as we can see, the changes don't concern the export of VAT report. So we just change the value to 2025. (2024 non blocking for prod is still accepted in 2025 but it fails for the server test). task-4617663 Forward-Port-Of: odoo/enterprise#92542
Odoo Studio now ignores automatically added helper fields when displaying and arranging views. This prevents invisible system-added fields from interfering with layout editing, helping users make reliable changes in Studio.
Original PR description
…lly added since commit odoo/odoo@6f06420e4a9443c52dc0cb427f8f55eb4aecabce, fields that are present in expression but not in the arch are automatically added. This caused problems in Studio, where those were considered normal nodes, while they should only be there to tell the model what to fetch. This commit aims at not rendering those nodes in a way that prevent them from parasiting the computation of xpaths. opw-4981741
The Planning app no longer shows the auto-plan action for shifts that do not yet have a start or end date. This prevents users from triggering an error when working with unscheduled shifts from sales planning.
Original PR description
**Step to reproduce:** 1. Install sale_planning module 2. Create a product (Sales -> Products): - Set Product Type to Service - Enable Plan Services - Assign both a Planning Role and resources. 3.…
**Step to reproduce:**
1. Install sale_planning module
2. Create a product (Sales -> Products):
- Set Product Type to Service
- Enable Plan Services
- Assign both a Planning Role and resources.
3. Create a sales order for this product.
4. Confirm the Sales Order.
5. Click the "To Plan" button.
6. Switch to List View.
7. Open the Unscheduled Shifts (None) section.
8. Try to generate an Auto Plan.
**Issue:**
A traceback is raised during auto-planning when the start_datetime or end_datetime on the planning slot is missing.
`AttributeError: 'bool' object has no attribute 'astimezone'`
**Cause:**
The `auto_plan_ids()` method assumes that shifts have valid start_datetime and end_datetime.
However, for unscheduled shifts, these fields can be empty (i.e., False), causing the error.
https://github.com/odoo/enterprise/blob/42d829ea6e6a98f251cfffc8fb67b5320a5ada12/planning/models/planning.py#L1076-L1077
**Solution:**
we hide the auto-plan button, in case we do not have startdate or enddate
opw-4812509
co-authored by: Ajit Singh (aksi@odoo.com)
Forward-Port-Of: odoo/enterprise#89383Opening the list side panel in spreadsheets now works even when a saved sort refers to a field that was later removed or renamed. This lets users access the panel and remove the invalid sorting instead of being blocked by a crash after an upgrade.
Original PR description
If a list is sorted on an invalid field and you try to open the list side panel, it crashes. It should open to allow the user to remove the sorting. A list with an invalid sorting field if the spreadsheet was created in a given version, then upgrades to a version where that field has been removed or renamed. Task: 4962837
This fix prevents outdated map locations from remaining visible for child contacts after a parent company address is changed. It keeps contact addresses and map markers aligned, reducing confusion when users view customers or companies on the map.
Original PR description
**Issue:** When adding contacts with incorrect address data, the Map View could display outdated or incorrect markers **Cause:** The `partner_latitude` and `partner_longitude` fields were not reset…
**Issue:** When adding contacts with incorrect address data, the Map View could display outdated or incorrect markers **Cause:** The `partner_latitude` and `partner_longitude` fields were not reset for child contacts when the parent’s address changed **Fix:** We added a `partner_latitude` and `partner_longitude` reset when changing address in write We added `partner_latitude` and `partner_longitude` in the _address_fields to update the value each time it can be required, like on address change or contact creation The extension in the _address_fields is there to detect the changes on children synchronization, because it only replace the value that where present in vals for the fields in that list In that way, it will detect more address changes and trigger the write for the children with the corresponding parent `partner_latitude` and `partner_longitude` We also make sure that those extra _address_fields will not be displayed in the formatted address by removing them from `_formatting_address_fields` **Limitations:** One issue remains during import: the parent-child address synchronization is disabled on contact creation This means children may be created with addresses different from the parent’s and have mismatch positions on Map This can be corrected by updating or re-importing the parent to trigger synchronization **Steps to reproduce:** With Form: - Add a parent contact company with a valid address - Add a child contact related to company, with a valid address - Open the Map View, both address must appear on Map - Modify the parent address to remove street (make it invalid) - Check that the child address match the parent one - Check the Map View, before the fix the child should remain with a wrong position With import: Create an import file (an example is in on the ticket) - Add a sheet for the Parent contact with an valid address - Add a sheet to add the Child contact with a parent_Id, with a valid address - Add a sheet to break the address on the parent, removing the street - Open the contacts app - Import the valid Parent and Child sheets (you need to select Related Company / External ID) - Add a filter to get your created contacts - Check the Map View (You should see both parent and child) - Import the Break parent sheet - Check that the child address match the parent one in the Form - Check the Map View, before the fix the child should remain with a wrong position A file can be found on the ticket with pre-made data **Technical notes:** The reset logic is duplicated from the `base_geolocalize` module, because this module is optional and may not be installed in all cases Since `base_geolocalize` is not always present, its `write` override will not be triggered consistently On the other hand, `web_map` is automatically installed with the Enterprise version of Odoo Therefore, it is necessary to implement this fix in at least one of the two modules to ensure the behavior is active when Enterprise is used We chose to keep the override in both `base_geolocalize` and `web_map` to cover both Community and Enterprise cases reliably An alternative approach would be to move the reset logic directly into `res.partner` in the `base` module, making it always available regardless of installed addons and avoiding the duplication opw-4842910 Forward-Port-Of: odoo/enterprise#90392
WhatsApp template previews no longer mistake underscores inside links or similar text for italic formatting. This prevents portal links and other URL values from being displayed incorrectly, while normal italic formatting with spaced underscores still works as expected.
Original PR description
Steps to reproduce: 1. Go to a WhatsApp template, for e.g. Sale Order. 2. Update the sample value for the Portal Link variable to include an underscore. 3. Click on Preview Issue: Due to the current…
Steps to reproduce: 1. Go to a WhatsApp template, for e.g. Sale Order. 2. Update the sample value for the Portal Link variable to include an underscore. 3. Click on Preview Issue: Due to the current regex, we will apply italic to any underscore we find which is not ideal, mostly when we work with URLs that can contain underscores like "acces_token" which we will try to apply italic to it too. Solution: Following the most common logic for italic formatting, we will only apply italic formatting when the underscore is surrounded by whitespace. This is the same way it already behaves in Whatsapp. If we write it like_this_for example, it will not apply italic formatting, but if we write it like this _this_ it will apply italic formatting. So this for example: **"If we write it like_this_for example"** Will be like - before the fix: **"If we write it like<i>this</i>for example"** Will be like - after the fix: **"If we write it like_this_for example"** opw-4720017 Forward-Port-Of: odoo/enterprise#91217
Currently an exception is generated due to the variables translated into the `Spanish (Latin America)` language. `KeyError: 'tipo'` This commit fixes the issue by using the original variable name instead of translated terms. sentry-6046430921
Original PR description
Currently an exception is generated due to the variables translated into the `Spanish (Latin America)` language. `KeyError: 'tipo'` This commit fixes the issue by using the original variable name instead of translated terms. sentry-6046430921