Daily updates from Odoo
Thursday, July 9, 2026
46 changes · master
New functionality added to Odoo
Adds the Vietnam-required General Ledger report format S03b-DN so companies can produce reports aligned with Vietnamese Accounting Standards. The report calculates and displays counterpart accounts, debit and credit balances, period totals, and flags entries that need better labeling for accurate reporting.
Original PR description
Vietnamese Accounting Standards (VAS) require a specific format for the General Ledger (S03b-DN), which strictly mandates the display of counterpart accounts for every transaction line, along with…
Vietnamese Accounting Standards (VAS) require a specific format for the General Ledger (S03b-DN), which strictly mandates the display of counterpart accounts for every transaction line, along with specific debit/credit balances and period totals. Because Odoo's default general ledger does not natively compute and display counterparts in the exact layout required by VAS, a custom report engine and handler were introduced. Technical decisions: * Implemented a custom SQL query to calculate counterpart accounts dynamically. Instead of forcing rigid data entry constraints on the user, it uses a matching heuristic based on balanced amounts and identical labels to pair counterpart lines (handling 1-to-1, 1-to-N, and proportional splits). * Tax journal lines are isolated, grouped by account, and split proportionally to ensure accurate counterpart reflection. * Added a post-processor and custom UI warnings to handle edge cases where lines cannot be matched cleanly (e.g., complex N-to-N entries without matching labels). These are isolated into an "Uncategorized" section to prompt the user to correct their entry labels. task-6092253
Enhancements to existing features
Expenses created from company card usage now generate an activity categorized as a document. This makes the follow-up clearer for employees and managers handling expense receipts and supporting paperwork.
Original PR description
Improvement of some UX about expense: - When an expense is created via a card use, the type of the created activity is now 'Document' task-6237021
The VoIP call screen now shows "Calling..." while an outgoing call is still connecting instead of displaying a timer at 00:00. This gives users a clearer indication of the call state and avoids confusion before the call is answered.
Original PR description
task-6361911
The timesheet leaderboard header has been redesigned to show the billable time target and the current month period. This gives users clearer context for their performance metrics and helps them compare progress against monthly expectations.
Original PR description
In this commit, we redesign the timesheet-leaderboard KPI header. Specifically, we add the billable time target and the current month period. task-6103977
Businesses can now assign specific deferred revenue or expense accounts to individual income and expense accounts, while still keeping company-wide defaults as a fallback. Deferred revenue and expense reports also show upcoming recognition split between amounts due within 12 months and after 12 months, improving financial visibility.
Original PR description
*accountant, reports Purpose: Supporting multiple deferred accounts allow businesses to use different deferred revenue/expense accounts based on the related income or expense account, while maintaining the existing company-wide deferred account settings as default. Changes: A "Deferred Account" field is added to the income or expense type accounts form to allow the user to override the defaults. On deferred revenues/expenses reports, the column "Later", representing amount to be recognized, is split into two columns, "Within 12 months" to represent amounts to be recognized within the year and "After 12 months" to represent amounts to be recognized after a year. task-6293902
Invoice extraction now uses the account name and tax to label grouped tax lines instead of relying on partner names and dates read by OCR. This reduces confusing or incorrect labels caused by OCR misreads and makes invoice review more reliable.
Original PR description
Previously, when a user enabled 'Single Invoice Line Per Tax', the tax group contained the partner name and date. However, the OCR would sometimes misclassify the partner name, resulting in random text appearing in the label. To fix this, we decided to use the account name and tax as the label instead. task-6159843
UK VAT return filing now warns users when their company belongs to a tax unit and guides them to file through that tax unit. When a tax unit return is filed, the HMRC connection and submission use the tax unit VAT number, reducing filing errors and compliance risk.
Original PR description
BEFORE: - Before this commit, when the current company is a member of the tax unit, there is no blocking level error for the user to select the tax unit. - And the vat used while creating a connection to the HMRC or while sending a tax report to the HMRC is of the current company. AFTER: - After this commit, there is one blocking level error, which tells the user that the current company is part of a tax unit, and on confirmation, the tax unit will automatically be selected for the current report. - And if the return contains the data of a tax unit, then the vat set on the tax unit will be considered while establishing the connection and sending the tax report to HMRC. Task-5865605 Forward-Port-Of: odoo/enterprise#123166 Forward-Port-Of: odoo/enterprise#107253
Hong Kong payroll can now use the scheduled payroll data update process. This helps keep standard, non-customized salary rules current automatically, reducing manual maintenance for users.
Original PR description
Currently, the "Payroll: Update data" cron doesn't work for HK payroll as we never set up the _get_data_files_to_update. We can set up the list of data files to keep up to date to better support our users by automatically keeping non-edited salary rules up to date. task-6360339 Forward-Port-Of: odoo/enterprise#123204 Forward-Port-Of: odoo/enterprise#122777
The self-ordering point of sale module now relies on the existing point of sale box module for printer box details instead of defining them again. This reduces duplication and helps keep configuration behavior consistent across related point of sale features.
Original PR description
Remove `proxy_obox_id` from `pos.printer` model, in `obox_pos_self_order` and change `obox_pos_self_order` dependency to `obox_point_of_sale` instead of `obox`. The field `proxy_obox_id` is defined in `obox_point_of_sale` module.
Point of Sale appointment dialogs now have better sizing and spacing, making them easier to read and use. Dialogs also get a consistent backdrop so users can close them more easily, improving the overall experience.
Original PR description
This PR adapts the size and spacing of POS dialogs to improve the design and usability of the interface. It also adds backdrop to POS dialogs to allow the user to easily close a dialog when needed. This allows for greater consistency, as previously only a few dialogs had this backdrop. task-5187182 commu-PR: https://github.com/odoo/odoo/pull/258131
Project document folder access is now updated when people are added to or removed from a project. This helps ensure collaborators get editing access when invited and lose access when no longer following restricted projects.
Original PR description
Before this change: - Subscribing or unsubscribing a partner from a project did not impact access rights on the related documents folder; users always retained access to the folder. After this change: - Subscribing a partner grants `edit` access to the project folder. - Unsubscribing removes access when `privacy_visibility` is `invited_users` or `followers` task-5993203
Sales teams can now manually choose which website is linked to an order when it was not created through eCommerce. This helps customer email links and preview actions open the correct website, also covering related subscription and rental flows.
Original PR description
The goal of this change is to allow manually selecting the website linked to an order (if the order does not come from eCommerce). This ensures that email links and the Preview button open the correct website. This change also applies to the Rental module. PR: https://github.com/odoo/odoo/pull/255763 Upgrade: https://github.com/odoo/upgrade/pull/9804 task-6059112
This update changes many accounting-related automated tests to run in a more realistic test environment instead of relying on elevated administrator access. This helps ensure future changes are validated under conditions closer to everyday use, reducing the risk of hidden permission-related issues.
Resolved issues and error corrections
IoT device logs sent to the server are now recorded at a lower severity level. This reduces unnecessary alert noise and helps prevent monitoring tools like Sentry from being overwhelmed, without changing user-facing IoT behavior.
Original PR description
Each time IoT box sends its logs to the server (route `/iot/log`), we then print them with the same log level. However, IoT box logs can be quite noisy (for instance when there are some connection issues), which affects the logs. Sentry side, it also implies a huge wave of useless events that reach the limits of our subscription. The logs management have been improved on next versions. In the meantime, we should at least decrease the logger level so we can keep working on Sentry Forward-Port-Of: odoo/enterprise#122426
The Avalara tax configuration screen now points users to the current documentation page. This prevents users from landing on an outdated help article when looking for setup guidance.
Original PR description
Documentation URL changed from `finance/accounting/taxes/avatax/avalara_included` to `finance/accounting/taxes/avalara`. task-6371352
Cancelled UrbanPiper delivery orders are now excluded from active delivery counts. This prevents affected POS sessions from failing to reopen after a delivery provider cancels an order.
Original PR description
### Steps to reproduce 1. Configure UrbanPiper and start a POS session. 2. Receive an order from the delivery provider. 3. Accept the order and mark it as **Ready**. 4. Cancel the order from the…
### Steps to reproduce 1. Configure UrbanPiper and start a POS session. 2. Receive an order from the delivery provider. 3. Accept the order and mark it as **Ready**. 4. Cancel the order from the delivery provider. 5. Reopen the running POS session. ### Current behavior When a delivery provider cancels an order, the `delivery_status` is updated to `cancelled`, while the POS order state remains (`draft`, `paid`, or `done`). As a result: * Cancelled deliveries are still included in the active delivery order count. * `_get_urbanpiper_order_count()` attempts to map the `cancelled` status, which is not present in `status_map`, raising a `KeyError`. * The POS UI fails to load, preventing users from reopening the running session. ### Expected behavior Cancelled delivery orders should not be considered active delivery orders and should not be included in the delivery status count, allowing the POS session to open normally. ### Solution Exclude orders with `delivery_status = 'cancelled'` from the active delivery order count computation. This prevents the `KeyError` and ensures cancelled delivery orders are ignored when computing active delivery statistics. [Video reproducing the issue](https://drive.google.com/file/d/1XdiylekWV-q6LTbvhCgbyd_KDKlG2imz/view?usp=sharing) --- **opw-6353861** Forward-Port-Of: odoo/enterprise#122798
This fix prevents users without Payroll permissions from seeing an error when opening Working Schedules in the Employees app. It adds an access check so Belgian payroll-specific reorganisation data is only read when the user has the right permissions.
Original PR description
**Steps to Reproduce:** 1)Create a database in v19.2. 2)Install the l10n_be_hr_payroll module. 3)Open the login user's profile and set the Payroll access rights to No (null). 4)Navigate to Employees…
**Steps to Reproduce:** 1)Create a database in v19.2. 2)Install the l10n_be_hr_payroll module. 3)Open the login user's profile and set the Payroll access rights to No (null). 4)Navigate to Employees → Configuration → Working Schedules. **Actual Result:** A traceback is triggered after opening the record. ```python Failed to read field resource.calendar.l10n_be_reorganisation_measure_ids You are not allowed to access 'BE: Reorganisation Measure.' (l10n.be.reorganisation.measure) records. This operation is allowed for the following groups: - Payroll/Assistant Contact your administrator to request access if necessary. ``` **Issue:-** The traceback is caused by the following commit introduced in v19.2 [here](https://github.com/odoo/enterprise/commit/e1092393ff99e9dad84ea8b9d6066e0bc61d6312) In this commit, a new computed field `l10n_be_reorganisation_measure_ids` was added on `resource.calendar`. The field is computed and store=true when the read function is called, and reads the data from the database at that time; The payroll doesn't have any access rights due to the error **Solution:** To fix this issue, a group access check is added inside the field Ticket:- 6245936 Forward-Port-Of: odoo/enterprise#119518
The Journal Audit report PDF now avoids adding an empty final page when the global tax summary is not included. This improves report presentation and prevents users from receiving or sharing documents with unnecessary blank pages.
Original PR description
Steps to reproduce: 1. Set the active company as My Company (san francisco) 2. Navigate to Accounting > Review > Journal Audit 3. Remove all journals from the report except Bank and Misc. 4. Use the PDF action button to print the report. 5. The last page of the report is completely empty. https://drive.google.com/file/d/1otpniJgt1UNCe2hrUBwqIK58dGuXpu8T/view?usp=sharing This commit ensures that the Journal Audit report does not have blank pages when the global tax summary section is not present. It uses some features of QWeb outlined in the following docs article: https://www.odoo.com/documentation/19.0/developer/reference/frontend/qweb.html#loops opw-6224670 Forward-Port-Of: odoo/enterprise#122704 Forward-Port-Of: odoo/enterprise#121068
Twitter/X posts now save the reply count provided by the platform's API. This lets users see comment activity alongside other engagement metrics, giving a more complete view of post performance.
Original PR description
Twitter/X tweet metrics returned by the API include the number of replies in the `public_metrics.reply_count` field. This commit stores that value on social stream posts so the comments count can be displayed alongside other engagement metrics. API Documentation: https://docs.x.com/x-api/fundamentals/metrics#post-metrics Task-6251172 Forward-Port-Of: odoo/enterprise#120182
Fixes issues in subscription loyalty flows so recurring invoices grant the right reward points and respect the selected point calculation mode. It also prevents incorrect negative reward invoice lines when points run out and restores missing recurring options in loyalty rules and rewards.
Original PR description
This commit fixes the following problems in the new module: - New invoices sometimes could not grant points according to the specified rules. - The reward point mode was not being taken into account and was giving a flat amount of points. - Reward lines were being invoiced with a negative amount when there was no more points in the loyalty card. - The 'Recurring' option in conditional rules and reward were not showing sometimes for an unknown reason. task-6153127 Forward-Port-Of: odoo/enterprise#116713
Timesheet Assistant suggestions are now cleaner and more accurate, with leave time excluded from suggested totals and to-do tasks hidden until they are linked to a project. Users also get keyboard shortcuts and default names for unnamed suggestions, making timesheet entry faster and less confusing.
Original PR description
## Expected Behavior After Commit - Remove the green highlight when selecting a suggestion. - Add shortcuts for timesheet creation buttons. - Allow calendar events to be considered side activities - Exclude leave time from total hours, as leave time is already counted in the timesheet. - Do not show to‑do tasks (tasks without a project) in suggestions. - Restore previous suggestions for to‑do tasks when they later become linked to a project. - Add a default name for suggestions that do not have one. - Add hotkeys to Timesheet Assistant task-[6191451](https://www.odoo.com/odoo/project/4105/tasks/6191451) Forward-Port-Of: odoo/enterprise#121085 Forward-Port-Of: odoo/enterprise#120057
The scheduled check for Mexican electronic invoice status now correctly continues when more documents remain than the configured batch size. This prevents invoices from being left unprocessed after the first batch, improving reliability for companies using Mexican e-invoicing.
Original PR description
Steps to reproduce ----------------- - Install l10n_mx_edi; - Switch to the mexican company; - Create 3 invoices for the mexican company (you will need to set an UNSPSC code on the products); - Send them to CFDI; - Go to the scheduled action "Automatic update of state on the SAT" and add "batch_size=2" to the method's parameters; - Manually run the cron; - Only two invoices will be updated, the cron is not retriggered to process the remianing one. Why is it hapening ------------------ We set a limit of batch_size + 1 in the search method, and the cron is retriggered if and only if the number of documents fetched is equal to the batch size, meaning there is no more documents to fetch. This should be triggered if we fetched more documents than the batch size. opw-6328118 Forward-Port-Of: odoo/enterprise#122659
Hong Kong payroll now calculates payment in lieu of notice based on the employee's actual contract start date instead of assuming a full prior 12 months. This improves accuracy for employees who have worked less than a year or have other partial-period situations, reducing payroll errors.
Original PR description
Currently, the calculation of the payment in lieu of notice is assuming the employee worked a whole 12 months prior to it being paid. This is of course not always going the be case, and when it happens our calculation is often incorrect. We update the salary rule to calculate a more accurate total days (which is no longer based on a fixed 12-month period but takes into account the contract's start date). We also now calculate the number of months more accurately by taking, once again, the contract's start date into account. Also adding a few test cases to test a bit more some special case we didn't yet test correctly. task-6348903 Forward-Port-Of: odoo/enterprise#122580
This fixes an issue in Planning tests where the schedule could open on the wrong week when run on Sundays. The change makes the split shift flow more reliable by avoiding a layout problem caused by the side panel, reducing false failures and improving confidence in planning updates.
Original PR description
Forward-Port-Of: odoo/enterprise#123069
Task progress shading in the Gantt view now shows the correct proportion of completed work. This makes planning views easier to read and prevents users from misinterpreting partially completed tasks as barely started.
Original PR description
Steps to reproduce: ------------------------------------------- 1. Install the Timesheet module with demo data 2. Go to any FSM task > set allocated hours to 20h 3. Fill the timesheet for the same…
Steps to reproduce: ------------------------------------------- 1. Install the Timesheet module with demo data 2. Go to any FSM task > set allocated hours to 20h 3. Fill the timesheet for the same task for 10h 4. Navigate to FSM > My Tasks > Gantt view Observation: ------------------------------------------- Look at the task on the Gantt chart. The shading is barely visible because it covers only 0.5% of the bar, not 50% Issue: ------------------------------------------- In the commit https://github.com/odoo/odoo/pull/137570/changes/4a93d9aee957dd3feb3db0cb69eb3b8f0f4a4683 The progress field computation was changed from storing percentage values (0-100) to storing decimal values (0-1). Specifically, the `_compute_progress_hours` method was modified. This change was made to standardize the progress field storage format, with the understanding that the UI layer would multiply by 100 when displaying the value. While most views (form, list, kanban, etc.) were updated to multiply the progress by 100 for display purposes, the Gantt view's pill progress bar was missed. Solution: ------------------------------------------- Overrides the `enrichPill` method to multiply the `_progress` value by 100 before it's passed to the template. This ensures the Gantt pill progress bars display correctly without modifying the core web_gantt module. Before --------------------------- <img width="268" height="368" alt="image" src="https://github.com/user-attachments/assets/6d35927f-bd3f-47fc-9101-e2e188d419b8" /> After: -------------------------- <img width="250" height="371" alt="image" src="https://github.com/user-attachments/assets/fe7133e0-26d1-4c5f-b903-48826fda9488" /> opw-6038983 Forward-Port-Of: odoo/enterprise#122899 Forward-Port-Of: odoo/enterprise#111270
Users creating purchase approval requests will no longer be blocked when a product has vendor pricing records linked to vendors they are not allowed to access. This keeps RFQ approval creation working correctly in multi-company setups while respecting access permissions.
Original PR description
**Issue** Having supplier pricelists with at least one vendor inaccessible to the current user can trigger an access error when creating an RFQ approval request. **Steps to reproduce** - Have two…
**Issue** Having supplier pricelists with at least one vendor inaccessible to the current user can trigger an access error when creating an RFQ approval request. **Steps to reproduce** - Have two companies A and B and two users u1 and u2 - user u2 only have access to company A - With user u1: - Create two vendors v1 and v2 without any company assigned - Create vendor pricelists for a product for each vendor and assign the company A to the pricelist - Add the company B for the vendor v2 - With user u2: - Open approval application - Try to create an approval for an RFQ for that product (the vendor v1 will be automatically selected) - Save it -> An access error is thrown **Cause** Saving the approval request computes `has_no_seller`, which calls `_select_seller`: https://github.com/odoo/enterprise/blob/03c737685ff6dfc95a8bc72491646774fc426b1f/approvals_purchase/views/approval_product_line_views.xml#L9 https://github.com/odoo/enterprise/blob/03c737685ff6dfc95a8bc72491646774fc426b1f/approvals_purchase/models/approval_product_line.py#L32 https://github.com/odoo/enterprise/blob/03c737685ff6dfc95a8bc72491646774fc426b1f/approvals_purchase/models/approval_product_line.py#L62-L70 Which filtered the right seller https://github.com/odoo/odoo/blob/c37e76850d3ff790b76493bd1003d80e170bd4bf/addons/product/models/product_product.py#L759 By preparing the sellers: https://github.com/odoo/odoo/blob/c37e76850d3ff790b76493bd1003d80e170bd4bf/addons/product/models/product_product.py#L721 https://github.com/odoo/odoo/blob/c37e76850d3ff790b76493bd1003d80e170bd4bf/addons/product/models/product_product.py#L712 Please note that `self.seller_ids` contains both sellers (even v2) By filtering the suppliers: https://github.com/odoo/odoo/blob/c37e76850d3ff790b76493bd1003d80e170bd4bf/addons/product/models/product_supplierinfo.py#L104-L105 But at that point, one of the supplier in `self`, can be accessed, thus an access error is thrown while trying to access its associated `partner_id`. opw-6203910 Forward-Port-Of: odoo/enterprise#121008 Forward-Port-Of: odoo/enterprise#120251
Bank statement imports now show a specific error when a file contains only zero-amount transactions. This helps users understand the real issue instead of seeing a misleading duplicate-import message.
Original PR description
When importing bank statements, files containing only zero-amount transactions trigger the same generic "duplicate" UserError as files that have already been imported. We now explicitly check for zero-amount lines separately to raise a distinct UserError. opw-6237659
Fixes an issue that prevented the Planning Analysis report from opening when Field Service Planning was installed. The Priority filter is now placed correctly, avoiding a crash and restoring access to the report.
Original PR description
Steps to reproduce: - 1. Install `planning_field_service`. 2. Open Planning > Reporting > Planning Analysis. Issue: - The view crashes with `UncaughtPromiseError > Error: Attribute "domain"` is missing, and the Planning Analysis report cannot be opened. Cause: - The xpath adding the "Priority" filter anchors on `//filter[@name='unpublished_shifts']`, which is a child of the "Status" filter. As a result, "Priority" is inserted inside "Status", and it requires a `domain` on any filter nested inside another filter. "Priority" has none. Fix: - Anchor the xpath on `//filter[@name='status']` instead. task-6358804 Forward-Port-Of: odoo/enterprise#122751
Fixed an error that could stop Belgian CODA bank statement files from importing when they contained type 4 blocks. This helps Belgian accounting users complete bank imports reliably without manual workarounds or support intervention.
Original PR description
### Issue: After the fix in commit (https://github.com/odoo/enterprise/commit/3ef8ae7a6b8eb362e18c74dfab9aadce792b5dc2), importing a CODA file containing a type 4 block raises a traceback ### Cause: That commit introduced `communication_struct_by_ref_move`, which iterates over all lines and accesses `line['communication_struct']` Type 4 lines are not assigned a `communication_struct` value by the parser in `_get_coda_file_statements` Accessing the key directly raises a `KeyError` in `_get_coda_final_statements` in `communication_struct_by_ref_move` ### Steps to reproduce: - Install `l10n_be_coda` - Switch to the BE company - Create a Bank Journal with account `BE33737018595246` - Go to the Accounting Dashboard and import a CODA file containing a type 4 block (Like the one on the ticket) Before the fix, a traceback is raised on import opw-6363148 Forward-Port-Of: odoo/enterprise#123222
This fix ensures the snippet selection dialog appears in front of the email editing window when the AI chatbox is active. Users can now add snippets normally without the editor becoming blocked or save and discard actions freezing.
Original PR description
When an AI chatbox is active, all non-error dialog modals are set to be behind the chatbox through their z-index. This causes an issue where the dialog modal to add new snippets to a mailing is set behind the fullscreen edit window, preventing its use and freezing the use of some commands (save & discard). This commit restores the snippet dialog's z-index to its original value. task-6321624
Users can now dismiss the installer and web watcher warning banners in the Timesheets Assistant without seeing an error. This keeps the assistant interface clean and avoids confusion from banners that previously stayed visible after closing them.
Original PR description
Issue: - Closing the installer banner or the web watcher warning banner in the Timesheets Assistant raises an Owl error and leaves the banner visible. Cause: - Both buttons bind their handler with a bare method name, e.g. `t-on-click="onDismissConnectionWarning"`. Bare identifiers are resolved against the template rendering context, which no longer exposes component methods. Fix: - Reference the handlers through `this`. task-6373382 Forward-Port-Of: odoo/enterprise#123527
This update corrects how accounting reports are extended and moves Luxembourg-specific export logic into the appropriate wizard. The change reduces maintenance risk and helps keep localization behavior isolated without changing day-to-day business workflows.
Original PR description
[FIX] account_reports: fix inheritance account.report is a Model, not an AbstractModel. Inheriting it as an AbstractModel had not effect so far, but this is the proper way. ---------------------------------- [FIX] l10n_lu_reports: no l10n-specific code on account.report Unless absolutely necessary, localizations should never inherit account.report and define all the custom code they need in custom handlers. In this case, this code was only used for an export through a wizard, so we moved it to that wizard.
This fixes an error that could prevent users from opening the task Gantt view when grouping tasks by Sale Order Item. The progress calculation now uses the current task hours field, so project and sales teams can view grouped planning information without interruption.
Original PR description
### Steps to reproduce - Install `sale_timesheet_enterprise`. - Go to **Tasks → All Tasks**. - Switch to the **Gantt** view. - Group by **Sale Order Item** (`sale_line_id`). ### Issue A traceback is…
### Steps to reproduce - Install `sale_timesheet_enterprise`. - Go to **Tasks → All Tasks**. - Switch to the **Gantt** view. - Group by **Sale Order Item** (`sale_line_id`). ### Issue A traceback is raised when loading the Gantt view with group by `sale_line_id`: ```text ValueError: Invalid field 'planned_hours' on model 'project.task' for 'planned_hours:sum' ``` ### Root cause The Gantt progress bar computation for the `sale_line_id` grouping performs a `_read_group()` aggregation on the `planned_hours` field of `project.task`. However, `planned_hours` was renamed to `allocated_hours` during the saas-16.5 migration, so the former field no longer exists on `project.task`. As a result, the aggregation raises a `ValueError`. Migration reference: https://github.com/odoo/upgrade/blob/e638c6ce00d9d8936d034ad7130fef51565b9195/migrations/project/saas~16.5.1.2/pre-migrate.py#L10 Issued PR: https://github.com/odoo/enterprise/pull/49685 ### Fix Use `allocated_hours`, the renamed equivalent of `planned_hours`, when computing the Gantt progress bar. This restores the Gantt view when grouping tasks by **Sale Order Item** and prevents the traceback. Forward-Port-Of: odoo/enterprise#122994 Forward-Port-Of: odoo/enterprise#122297
This fixes an issue where website content generated through the AI Assistant could disrupt later editing. AI-created snippets now render without extra editor metadata, so users can continue dragging snippets and editing the page normally after saving.
Original PR description
Steps to see the issue: - Open website and start editing - Click on "AI Assistant" button - Ask it to drop a popup - Save the page and start editing again => Snippets aren't droppable and the `#wrap` of the page isn't editable. This happens because snippets inherit branding when they are rendered, so they have `data-oe-id` and others on them, which breaks the usual website flow. This occurs since [1], which added website_id to the context, and in website inherit_branding is set to true automatically, which doesn't happen without the website id. [1]: https://github.com/odoo/enterprise/commit/f9a1c8deeb74749fd176bfc8825c621f214b1985 task-6376299
Several automated tests were corrected so they use valid invoice, tax, product, and AI configurations. This helps prevent false test failures and keeps quality checks aligned with real business rules across support, expenses, manufacturing, purchasing, rentals, and localization flows.
Original PR description
https://github.com/odoo/odoo/pull/274672
The Belgian payroll 274 report now calculates deducted amounts correctly by avoiding double counting of SME exemptions. This helps businesses produce more accurate payroll tax declarations and uses the proper capped amount for the 274.34 report.
Original PR description
Prior to this commit, there was a bug where the deducted amount double counted the SME exempted amount in the 274 report. This commit fixes this.
This fixes Colombian electronic invoice PDF layouts so the company address is no longer pushed out of view when using Folder or Wave designs with long taglines. It also keeps the invoice title from overlapping the QR code, improving the readability and compliance presentation of exported invoices.
Original PR description
Issue: On Wave and Folder layout, the address of the company doesn't appear on invoices. Steps to reproduce: - In a Colombian company, - Set company layout to Folder - Add a long tag line, - Create an invoice, - Send it to DIAN - Export to PDF Current behavior: - Company address is missing in the header Cause: Tag line + logo and address take 100% of the display width. However, loca add a QR code on the left, so it takes QR Code + 100% width. Therefore, address was out of the PDF. Moreover, for Folder layout, some resizing was done and as soon as there was a tag_line, the `rem` was downsized, allowing the invoice title: "Factura Electrónica de Venta SETP/*\*\*/\*\*\*\*" to be displayed entirely. The fix of the previous issue stopped the resizing, then the invoice title got overridden by the QR Code (same as without tag_line before this fix). opw-6239030 Forward-Port-Of: odoo/enterprise#122205 Forward-Port-Of: odoo/enterprise#119678
Field service interventions now require both start and end dates before they can be completed. Send and Publish actions are also hidden when no date is set, helping teams avoid incomplete or incorrectly scheduled work.
Original PR description
After this PR: - Both dates are required to use the 'Complete' action button on an intervention - If the start date is set on an intervention, the end date should be required (and vice versa) - We hide the 'Send' and 'Publish' buttons if there is no date set task-6234939 Forward-Port-Of: odoo/enterprise#123148 Forward-Port-Of: odoo/enterprise#118411
Features or functions removed from Odoo
This change reverses a previous option that allowed users to choose the Stripe operating mode for expense cards. It was removed because selecting the wrong mode could put live Stripe accounts and funds at serious risk, and the feature will be redesigned with safer safeguards.
Original PR description
This reverts commit 48bb5669e8d05c835e3a3db1a1d8889a2cc137f4. The reason for the reversal is the high potential of destroying your live account and locking you out of your account money by mistake. The initial task will be reworked to ensure this case may not happen
Code cleanup and technical improvements
The product catalog integration was updated to match recent platform changes and simplify related customizations. This should make catalog behavior more consistent across manufacturing, field service, rentals, and subscriptions while reducing maintenance effort.
Original PR description
Adapt the catalog uses and overrides to the community changes Improve and clean catalog overrides as well. See odoo/odoo#271273
This change updates Odoo Studio's form editor internals to stay compatible with the next version of the web framework. It should not change day-to-day behavior, and existing tests confirm key form editor displays still work as expected.
Original PR description
Replaced 2 `useLayoutEffect` calls with `useEffect` and `onMounted` because `useLayoutEffect` is deprecated in OWL3. Effect #1 reacted to `viewEditorModel.showInvisible` (a reactive proxy field),…
Replaced 2 `useLayoutEffect` calls with `useEffect` and `onMounted` because
`useLayoutEffect` is deprecated in OWL3.
Effect #1 reacted to `viewEditorModel.showInvisible` (a reactive proxy field), using
the root DOM element only as a guard. Migrated to `useEffect`: reading
`this.viewEditorModel.showInvisible` inside the callback auto-subscribes the effect so
it re-runs on every toggle. To make the root element subscribe the effect on mount,
`useRef("compiled_view_root")` (owl2-compat, untracks the underlying ref signal) was
replaced with `this.rootRef = signal.ref()`, and `form_editor_compiler.js` was updated
to bind the compiled root's `t-ref` to `__comp__.rootRef` so the signal receives the
DOM element at mount time.
Effect #2's only dependency was `[rootRef.el]`; it ran a single time when the DOM was
ready, so `onMounted` is the faithful equivalent.
The `useLayoutEffect` refactored in this PR had test coverage — below are some tests
that failed when the effect was commented out, and are now passing:
- @web_studio/view_editors/form_editor/correctly display hook in form sheet
- @web_studio/view_editors/form_editor/empty form editor
- @web_studio/view_editors/form_editor/invisible form editor
see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2624601/build/116553774This change updates Odoo Studio's internal view-editing components to use the newer supported interface mechanisms. It helps keep Studio compatible with the next framework version while preserving existing editing behavior covered by tests.
Original PR description
Replaced `useLayoutEffect` with `onMounted`/`onPatched` (for the `data-studio-xpath` attribute) and `useListener` (for the click listener) because `useLayoutEffect` is deprecated in OWL3. The…
Replaced `useLayoutEffect` with `onMounted`/`onPatched` (for the `data-studio-xpath` attribute) and `useListener` (for the click listener) because `useLayoutEffect` is deprecated in OWL3. The `useStudioRef` hook previously used `useLayoutEffect` to both set a `data-studio-xpath` attribute on the element and attach a capture-phase click listener. The ref was a string-named compat `useRef`, so its `.el` getter untracks the signal — meaning a reactive `useEffect` would never re-subscribe when the element mounts. For `data-studio-xpath`, `onMounted`/`onPatched` reproduce the "set once el exists, re-apply on element recreation" semantics with synchronous layout timing, which Studio requires because it reads the attribute directly off the DOM. The click listener was initially migrated to `useListener(() => ref(), …)`, but was later converted to `onMounted`/`onPatched`/`onWillUnmount` element-tracking to properly handle the null ref at setup time. As a final step the ref itself was promoted to a native `signal.ref()`, returned by the hook and bound in each consumer template via `t-ref="this.<name>"`. `FieldStudio` reuses the inherited `this.fieldRef` signal (contributed by the companion odoo PR) rather than declaring its own. The useLayoutEffect refactored in this PR had test coverage — below are some tests that failed when the effect was commented out, and are now passing: - @web_studio/view_editors/form_editor/restore active notebook tab after adding/removing an element - @web_studio/view_editors/form_editor/label edition - @web_studio/view_editors/form_editor/many2one field edition see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2624591/build/116553824 Community PR: https://github.com/odoo/odoo/pull/275094
The mobile integration has been reorganized internally while keeping the existing service available for compatibility. This prepares the mobile framework for newer technology changes without changing the expected user experience, including barcode-related mobile flows.
Original PR description
In this commit, we rewrite the mobile service as a plugin. For legacy purposes, we keep the mobile service (as a service). We also adapt the codebase to reflect the changes on the service.
This update modernizes how certain stored values are initialized across accounting, payroll, appointments, helpdesk, ESG, and localization features. It is mainly an internal improvement that should make module setup and upgrades more consistent without changing day-to-day workflows.
Original PR description
https://github.com/odoo/odoo/pull/256914
This update standardizes how internal record values are prepared before being saved, reducing the risk of inconsistent behavior when several records are updated together. It also adjusts related business apps so they continue to handle grouped updates reliably without changing visible workflows.
Original PR description
``Field.write`` calls ``convert_to_cache`` with ``records``, not with a single ``record``. Therefore, ``convert_to_cache`` must return the same value for all records in the recordset. The only exception is ``_RelationalMulti.write``, which does not call ``convert_to_cache``. In that case, ``_RelationalMulti.convert_to_cache`` may depend on each record's current value, so we explicitly assert that ``records`` contains at most one record.
This update reorganizes how relationship field details are defined internally, aligning Enterprise code with a related Community change. It should help keep reporting, AI field tools, and Studio customizations consistent without changing day-to-day user workflows.
Original PR description
Community: https://github.com/odoo/odoo/pull/196498