Daily updates from Odoo
Tuesday, August 12, 2025
24 changes · master
New functionality added to Odoo
Adds a backend salary calculator so HR teams can simulate gross-to-net salary offers directly in Odoo. The change also makes salary offers more flexible by allowing them to use employee or company defaults when no contract template is selected.
Original PR description
task-4569214
Enhancements to existing features
People signing documents through a public link can now see and move to their next pending documents after completing a signature. This makes the signing flow smoother for external partners and reduces missed follow-up documents.
Original PR description
Before this commit, when signing the SENT requests through a link (not logged in Odoo), the next documents to be signed by that partner were not shown. After this commit, the unlogged partner can now go to the next documents after completing the signature of any SENT request received. Co-authored-by: Arnaud Joset <arj@odoo.com> task-4859714
Signature requests created from business records can now reuse an existing signing template while replacing its PDF with an attachment from that specific record. This makes it easier to prepare accurate documents for signing without creating separate static templates for each record.
Original PR description
Before this commit, it was possible to link sign request to records (inheriting mail.thread) but the sign.template were static. This commit allows to copy an existing sign.template and adapt the PDF to one of the attachment of the record. taskid: 4270142
Mobile users now get a dedicated Inbox entry in Discuss and the messaging menu, making mailbox access clearer and faster. Message and composer quick actions are also more consistent across related apps, improving usability in conversations and support workflows.
Original PR description
1. mobile discuss app and messaging menu now has dedicated "Inbox" item _- messaging menu in mobile has to display discuss for mailboxes, therefore the "content" part of Discuss namely `DiscussContent` has been moved into its own component_ 2. message and composer quick actions now use `ActionList` _- action definition and style slightly tweaked_ 3. Discuss action definitions now has typedefs _- registering action is made through `registerXAction()` function, where `X` is thread/message/composer_ 4. `ActionList` component props simplified to `actions` (from `quick`, `other`, `partition`) _- can pass either list of actions (single group) or list of list of actions (actions are visually split in groups)._
Users can now update project budgets while they are still in draft state, including adding new budget lines. This makes budget preparation more flexible and reduces the need to recreate budgets when early details change.
Original PR description
Currently, once the user has created the budget, they are unable to edit it or add new lines, even if the budget is in the draft state. In this commit, we have made it editable in the draft state for the user's convenience. task-4760387
Belgian payroll now excludes PFI contracts when calculating an employee's seniority for departure notice periods. This helps ensure notice periods are generated according to Belgian rules and avoids overstating seniority for affected employees.
Original PR description
When you generate the notice period for leaving employees, you must compute their seniority. In Belgium, PFI contracts should not be taken into account. This commit filters the contracts to ignore PFI ones. task-4788455 Forward-Port-Of: odoo/enterprise#91495 Forward-Port-Of: odoo/enterprise#90902
Helpdesk users can now create additional refunds for an invoice after earlier partial refunds have been paid or are in payment. This keeps invoices available for refunding until the total refunded amount reaches the original invoice total, reducing manual workarounds and supporting more accurate customer service flows.
Original PR description
Previously, users couldn't select an invoice for another refund if all of its credit notes were already paid or in payment — even if the invoice was only partially refunded. For example: If a user created a partial refund for the first time and marked it as paid, the original invoice could no longer be selected for any further refunds. Now, invoices remain available for refunds as long as the total refunded amount is less than the original invoice's amount_total. Task ID: 4582294
Payroll work entries are being simplified to track work duration directly instead of relying on separate start and stop dates. This should make payroll, attendance, leave, expense, and planning calculations more consistent and easier to maintain across related processes.
The mobile Discuss navigation now includes an Inbox entry, making it easier for users to access incoming messages on smaller screens. Related updates ensure messaging, WhatsApp, live chat, and helpdesk interactions continue to work correctly with the navigation change.
Original PR description
Part of task-4967066
Bank statement processing now finds matching partners in batches instead of repeating the same work for every statement line. This reduces database lookups and should make importing or reconciling large bank statements faster and smoother.
Original PR description
The retrieve_partner function is actually executed on each statement line, with multiple search, which is killing performance. This commit change that, so retrieve_partner is executed on a statement line recordset, minimizing the amount of queries on each call. task-4749377 Forward-Port-Of: odoo/enterprise#87444
Businesses can now turn call transcription on or off separately for each VoIP provider instead of having it enabled everywhere when AI VoIP is installed. This helps organizations manage where call data may be transcribed and shared with external services, supporting regional compliance needs.
Original PR description
Until now (after ref.1) call transcription was globally enabled by default once the `ai_voip` module was installed. The only way to prevent transcriptions (and sending data to external entities) was to uninstall the module entirely. This commit introduces a new `transcription_policy` field on the `voip.provider`, allowing transcription to be explicitly disabled per provider. Since providers are typically tied to specific regions, this enhancement improves compliance control across geographies. Planned followup: --- Transcription policy selection field should be expanded with a "user" option, that will allow users to decide if they want their individual calls transcribed. References --- (ref.1) f96d1f4cc52c009a4f55cfaabf7b683bdf9e170d [ADD] ai_voip: end-to-end post-call recording & transcription Related ticket task-4532108
Certified Belgian point of sale setups now guide users to configure the required printer and fiscal data module instead of stopping with an error. When only one fiscal data module is available, the system selects it automatically, reducing setup friction and support needs.
Original PR description
If one wants to use a certified pos without FDM or without printer, open the configuration modal to ease the configuration instead of raising a UserError. If there is only one fdm available, the pos automatically selects this one.
Spreadsheet version history now keeps and shows the actual date each revision was originally made, even after a spreadsheet is duplicated. This helps users better understand when changes happened and trace spreadsheet evolution more reliably.
Original PR description
Currently, when duplicating a spreadsheet along with its revisions, each duplicated revision is assigned the `create_date` of the new record, resulting in all revision timestamps showing the exact same datetime. This prevents users from being able to trace the history of changes and makes it difficult to identify when a specific revision was originally made. To address this issue, a new field of `datetime` type `revision_date` is introduced to stores the actual datetime when the original revision occurred. The version history side panel now displays this `revision_date` field instead of relying on `create_date`, enabling users to accurately track the evolution of spreadsheet changes over time. NOTE: For the 'original data' revision and in order to avoid adding a new field on the spreadsheet model, the timestamp will be hidden. Task-[4854898](https://www.odoo.com/odoo/project/2328/tasks/4854898)
When a salary offer is created, the company car is now selected automatically from the linked contract template when available. If the template has no car, the system uses the employee version’s car instead, reducing manual entry and avoiding missing car assignments.
Original PR description
In this PR, we fixed the assignation of the car in the contract when the contract template for the version has a company car. When creating an offer, automatically set the transportation car based on the linked contract template. If the contract template has no car, fall back to the car defined on the employee version. If neither has a car, leave the field empty. Related task: 4926053.
Payroll menus for versions and offers are now hidden unless debug mode is enabled, reducing clutter for everyday users. Payslip generation has also been improved to avoid creating duplicate payslips for the same person over the same dates, helping payroll teams produce cleaner and more reliable pay runs.
Original PR description
Reference task: https://www.odoo.com/odoo/project/1251/tasks/4988589 - Restricted visibility of "Versions" and "Offers" menu items to debug mode only. - Payslip generation logic filters out employee versions when same start/end date and state Task - 4988589
Bank reconciliation screens have been simplified by removing less-used dropdown navigation, hiding a mostly redundant status, and keeping account assignment easier to access. Attachments that are already inherited from statements are also no longer shown as extra paperclip indicators, reducing visual clutter for accounting users.
Original PR description
- Removing the action of going to the entry of statement line from the dropdown, new the only possibility will be from the list view - Hide the status of the statement line since it's mostly posted - Adding the set account button everytime next to the set partner task-4985155 Forward-Port-Of: odoo/enterprise#91423
Users are now discouraged from directly changing standard spreadsheet dashboards because those changes can be lost during upgrades. This helps business users make more informed edits and reduces the risk of unexpected dashboard changes after an update.
Resolved issues and error corrections
Australian payroll withholding amounts are now included in tax return closing entries, helping businesses produce more complete tax accounting records. The payroll accounting module will also install more reliably when Australian localization is set up, avoiding a setup issue for new Australian companies.
Original PR description
This PR is divided in 2 commits: A first commit is an implementation AU specific and will create the lines related to tax on salary in the tax return closing entry. Before this commit, these lines…
This PR is divided in 2 commits: A first commit is an implementation AU specific and will create the lines related to tax on salary in the tax return closing entry. Before this commit, these lines weren't taken into account in the closing entry. The condition to select the account.move.line are the following: - The journal item has a "W2", "W3" or "W4" (Withholding Tax) tax grid whose journal entry is linked to an hr.payslip. - The journal item does not have an originating tax record (i.e., tax_line_id is empty). - The journal item is posted to a tax provision account (i.e., a balance sheet one) as defined on the salary rule. A second commit fixes a bug: the manifest of the l10n_au_hr_payroll_account module was having a 'countries': ['au'] dependency, that was adding a condition to the dependencies to auto install the module: we expect an existing AU company in DB. But for example if the user installs l10n_au, the condition is evaluated at the moment he clicks on install, and no AU company exists at that time. Task-4921992 Forward-Port-Of: odoo/enterprise#91913 Forward-Port-Of: odoo/enterprise#90422
Fixed an issue in the Belgian point-of-sale fiscal integration where printing a bill again for an already-synced order could fail silently. Businesses can now reprint or issue multiple bills for the same order consistently, even when no new order changes need syncing.
Original PR description
Before this commit an issue was appearing when we try to make multiple bill on the same order. If the order was already synced and didn't get any changes, clicking `Print bill` with `pos_blackbox_be` wouldn't do anything. Now we print the bill after syncing the order, even if the order don't have any new changes to sync. task-id: 4901299 community PR: https://github.com/odoo/odoo/pull/222424 Forward-Port-Of: odoo/enterprise#92070
Spanish Model 349 reports now calculate rectified amounts using linked credit notes only, instead of being affected by payments or other unrelated transactions. This ensures rectification figures and official BOE exports reflect the correct tax position for prior-period supplier bills.
Original PR description
# How to reproduce the issue With l10n_es fiscal position: - Create a bill in a previous period (e.g., amount 1000). Partially credit note this bill for 500. - Register a partial payment of 250 on…
# How to reproduce the issue With l10n_es fiscal position: - Create a bill in a previous period (e.g., amount 1000). Partially credit note this bill for 500. - Register a partial payment of 250 on this bill. - In the tax report, go to model 349. Under the Rectificationes section, the new rectified value will be 250. This is incorrect, as the rectifications in this report should only reflect the value of the original move from a past period after applying the credit note. Payments or other transactions should not impact this report. This commit adjusts the computation of the report (and the BOE export) to ensure that, instead of using `amount_residual` (which includes payments and other transactions), the report uses the sum of the credit notes linked to the move included in the rectification report. Also changed the test test_mod349_credit_note. The rectification section is supposed to show the adjusted amount after rectification. In the test a bill of 400 is fully refunded. Instead of 400, the report should show 0. (https://www.boe.es/buscar/doc.php?id=BOE-A-2010-5098 in TIPO DE REGISTRO 2: REGISTRO DE RECTIFICACIONES. in 153-165 Numérico Base Imponible Rectificada section) opw-4895636 Forward-Port-Of: odoo/enterprise#91350 Forward-Port-Of: odoo/enterprise#89431
UPS Commercial Invoices now use the currency from the related sale order instead of the company’s default currency. This prevents incorrect customs paperwork when shipments are based on orders in foreign currencies.
Original PR description
The automatically generated UPS Commercial Invoice is using the company's currency instead of the currency of the invoiced order. ### How to reproduce: * Setup UPS Delivery Method. * Create a sale order with a currency different from the company's. * Assign a customer in a different country. * Validate the delivery. * Check the UPS Commercial Invoice — it shows the company's currency. opw-4973217 Forward-Port-Of: odoo/enterprise#92065 Forward-Port-Of: odoo/enterprise#91883
This change fixes an error that could appear after a user successfully signed a document with Aadhaar and returned to Odoo. It ensures the signing request is referenced correctly, allowing the completed signing flow to continue without interruption.
Original PR description
Before this commit, after successfully signing with Aadhaar and returning to Odoo, `sign_request = request_item_sudo.sign_request_id UnboundLocalError: local variable 'request_item_sudo' referenced before assignment` This happened because request_item_sudo was not defined. This commit fixes the issue by correcting the variable name so it’s properly defined before use.
Rental orders now show the correct remaining stock even when the Rental Transfer setting is turned off. This prevents available rental products from being incorrectly marked as unavailable after another rental has been picked up.
Original PR description
Steps to reproduce: - Do not enable “Rental Transfer” in settings - Create a storable product “P1”: - Enable “Can be rented” - update available quantity to 10 units - Create a first rental order for…
Steps to reproduce:
- Do not enable “Rental Transfer” in settings
- Create a storable product “P1”:
- Enable “Can be rented”
- update available quantity to 10 units
- Create a first rental order for 24h:
- 9 units of P1
- Confirm the order
- Create a second rental order for the same 24h period:
- 1 unit of P1
-> Expected: The availability widget is green and indicates 1 unit available (correct).
Problem:
After picking up the first order, the widget on the second order turns red and incorrectly shows no availability.
The current logic checks virtual_available (1 unit) and subtracts rented_qty_during_period (9 units), resulting in -8. It then takes max(0, -8) → 0. However, the actual picked quantity should be taken into account, regardless of whether “Rental Transfer” is enabled, since disabling it merely omits the creation of a picking—not the move itself.
opw-4901017
opw-4906162
Forward-Port-Of: odoo/enterprise#92056
Forward-Port-Of: odoo/enterprise#91155The Spanish VAT books export now avoids a crash when the company's IAE Group or Heading is missing. Instead, users are redirected to the company settings to complete the required setup, making the issue easier to resolve.
Original PR description
**Steps to reproduce:** 1. Install the `l10n_es_reports` module. 2. Remove the value from the `IAE Group or Heading` field in company settings. 3. Navigate to `Accounting -> Reporting -> Tax Report -> Generic Tax Report`. 4. Click the down arrow and select `VAT Record Books (XLSX)`. **Observed behavior:** * A traceback error occurs when attempting to export the VAT books. **Root cause:** * The system attempts to traverse the `IAE Group or Heading` field, which is empty, causing the traceback. **ref**: https://github.com/odoo/enterprise/blob/d8539dff5f3dcecfeb99fd7fc22a6915aaa02c4b/l10n_es_reports/models/libros_export.py#L126-L138 **Solution:** * If field `IAE Group or Heading` not configured, a RedirectWarning is raised to guide the user to the company form view for proper setup. opw-4981531 Forward-Port-Of: odoo/enterprise#92122 Forward-Port-Of: odoo/enterprise#91607