Wednesday, July 16, 2025
21 changes · saas-18.4
Enhancements to existing features
Website editors can again choose the shape style for custom buttons and links from the link popover. This restores an option that was accidentally removed during earlier website editor changes, helping users keep button designs consistent without workarounds.
Original PR description
> 55. [CHDH] When clicking the submit button in the form snippet(s_title_form), the 'shape' option is missing. This commit reintroduces the `shape` option for the custom button & link that was previously available before version 18.3. The feature was unintentionally removed during the website refactoring in which sidebar link options moved to the link popover. [1]: https://github.com/odoo/odoo/commit/9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Users can now export selected customer invoices and vendor bills as individual PDF files bundled into one ZIP file. This makes it easier to share complete invoice sets with accountants or external tools, especially when Odoo is used alongside PEPPOL workflows.
Original PR description
With PEPPOL, many clients use Odoo for invoicing while their accountant uses another tool. To easily send invoices to the accountant, it’s important to export PDFs (one invoice per PDF) for both sales and purchase. This commit adds a new printing option `Export ZIP` to invoices/bills that exports them, in .pdf format, into a zip file. task-4946367 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
When a connected IoT Box detects a blackbox device, Odoo now shows a banner if the required Belgian POS blackbox module is not installed. This helps users complete the setup faster with a direct installation link, reducing configuration friction.
Original PR description
If an IoT Box is connected and has a blackbox connected to it, but the module `pos_blackbox_be` is not yet installed, display a banner with a link to directly install the module. Task: 4942391
Resolved issues and error corrections
This fix ensures a company's currency cannot be changed once accounting entries exist, even when a user has switched to another company. It protects financial records from accidental inconsistencies across companies.
Original PR description
To_reproduce: ============== 1- switch company. 2- update any other company currency that has journal items. 3- company currency changed. Problem: ========= - When switching companies, users could update the other company's currency even when journal items existed for that company. Solution: Solution: ========= - Added .sudo() to the account.move.line search to bypass access rights and properly detect existing journal items in that company. opw-4920206 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#219063 Forward-Port-Of: odoo/odoo#217929
Point of Sale orders now correctly use the default price list and fiscal position when a preset does not define its own. This prevents orders from missing expected pricing or tax settings, reducing manual corrections and improving checkout consistency.
Original PR description
Before this commit, if the pricelist or fiscal position was not explicitly set on a preset, the order would not inherit the default values defined in the PoS config. This fix ensures that the system now correctly falls back to using the default pricelist and fiscal position from the PoS configuration when they are not specified on the preset. opw-4913400 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#217112
This fix prevents multiple Point of Sale sessions from being opened when the start request is delayed. It helps avoid duplicated cash opening records and related cash closing inconsistencies.
Original PR description
Before this commit, if request to open the PoS would take a bit of time there was possibility to have more than one session created. This issue would cause several issues, like incorrect opening and closing cash record as 2 sessions would be created with the same opening cash. To prevent this issue this commit adds a lock. opw-4890965 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#217288
This fixes an issue in Point of Sale where special products could no longer be found through search or category filtering. Staff can now locate and sell these products as expected, reducing checkout friction and product visibility problems.
Original PR description
After commit https://github.com/odoo/odoo/commit/2668181c98de4a9c6f33787372adefc01cf1d0bc, it was no longer possible to locate special products via the search function. Additionally, if these products belonged to a specific category, they would not be visible when filtering by that category. opw-4925867 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#217898
Turkish Nilvera e-invoices now place subscription billing period dates at the document level, matching the required UBL TR format. If subscription lines in the same invoice have different start or end dates, users are warned and sending/printing is blocked to prevent invalid e-invoices.
Original PR description
The UBL TR 1.2.1 format does not support \<InvoicePeriod\> element in invoice lines in the XML generated for e-invoice. This commit moves the \<InvoicePeriod\> element from invoice lines to document level. It also validates that the start and end dates of all subscription invoice lines in one invoice should be same, or else it shows warning and disables the `Send & Print` wizard button TaskId:4885865 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#218820 Forward-Port-Of: odoo/odoo#215819
The website editor's image transformation controls now work reliably again, including resizing, rotating, active-state display, and closing the transform box. This improves the editing experience for website builders and prevents errors when adjusting images.
Original PR description
Description of the issue/feature this PR addresses: Fixed the working of the "Transform Image" button in website builder. Current behavior before PR: The button was non-functional due to an undefined "trasnformImage" user command. Desired behavior after PR is merged: The button works as as expected. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents Odoo from sending unnecessary invitation, update, or reminder emails for calendar events that have already ended. For events synced with Google or Microsoft calendars, it also ensures the external calendar handles reminders so users do not receive duplicate notifications.
Original PR description
Prevent sending unnecessary invitation or update emails for events that have already ended by introducing a method to check if an event is over. When an event is synced with an external calendar (Google/ Microsoft), the external calendar is responsible for sending reminders, and Odoo should not send any additional reminders. Recently, we had to revert the two original PRs due to an emergency at odoo/odoo#215449. The issue got solved, so we're adding this fix back. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr task-4684432, 4316693 Forward-Port-Of: odoo/odoo#219157 Forward-Port-Of: odoo/odoo#219060
Fixes an issue where the project creation dialog could remain stuck open after creating a new project. Users can now complete project creation and move into the new project's task view without being blocked by an unclosable popup.
Original PR description
- Open a Project; - Create a new project; Before this commit, the dialog that allows you to create a new project would sometimes stay open and could not be closed. This occurs because, since [1] and…
- Open a Project; - Create a new project; Before this commit, the dialog that allows you to create a new project would sometimes stay open and could not be closed. This occurs because, since [1] and especially [2], we waited for the view to reload before closing the dialog. However, while the view was reloading, it was destroyed and replaced by the Kanban view of the tasks of the new project. This meant that the reload promise was never resolved. Consequently, the code that actually closes the dialog [3] was never reached, as `await onClose?.(closeParams)` was never resolved. [1] https://github.com/odoo/odoo/pull/202512 [2] [d606be7](https://github.com/odoo/odoo/pull/202512/commits/d606be75c44fccf0b1ddf5216892f1d4b7162686) [3] [d606be7#diff-552aefb62246b1f4fe6a2607ec8f0a01773e53de2d68293266b38bc99c5cb56dR318](https://github.com/odoo/odoo/pull/202512/commits/d606be75c44fccf0b1ddf5216892f1d4b7162686#diff-552aefb62246b1f4fe6a2607ec8f0a01773e53de2d68293266b38bc99c5cb56dR318) opw-4880968 Forward-Port-Of: odoo/odoo#219065 Forward-Port-Of: odoo/odoo#218988
Sales orders containing kit products with repeated components can now be canceled and confirmed again without causing an error. This helps sales and warehouse teams avoid interruptions when revising or reprocessing kit orders.
Original PR description
Bug introduced in: https://github.com/odoo/odoo/pull/207955
Steps to reproduce the bug:
- Create a kit product:
- BoM:
- Components:
- 1 unit of C1
- 1 unit of C1 (same product)
- Create a SO with one unit of kit
- Confirm the SO
- The delivery is created
- Cancel the SO → the delivery is canceled.
- Set the SO back to quotation and confirm again
Problem:
A traceback is triggered:
raise ValueError("Expected singleton: %s" % record)
ValueError: Expected singleton: mrp.bom.line(24, 25)
When a kit's BoM contains the same product multiple times, multiple bom_line_ids match a given move. Assigning them causes an error. Additionally, cancelled moves were incorrectly considered.
Solution:
Filter out cancelled stock moves before accessing the bom_line_id to ensure only active moves are considered.
opw-4919875
Forward-Port-Of: odoo/odoo#218476
Forward-Port-Of: odoo/odoo#218187When a purchase order linked to a sales delivery is cancelled, the delivery can now use stock already on hand instead of staying blocked. This helps orders continue smoothly when purchased replenishment is no longer expected but inventory is available.
Original PR description
Steps to reproduce the bug:
- Unarchive the MTO route
- Create a product P1:
- Type: Storable
- Route: MTO
- Supplier: Vendor A
- Create a sales order for 1 unit of P1
- Confirm the SO
→ A purchase order is created for Vendor A with 1 unit of P1
- Cancel the PO
- Update the quantity on hand of P1 to 1
- Go to the delivery picking of the SO
- Check availability
Problem:
The quantity on hand is not taken into account, and the picking remains
in the "Waiting Availability" state.
When the purchase order is cancelled, the stock move should switch to
MTS instead of remaining in MTO.
opw-[4876611](https://www.odoo.com/web#id=4876611&view_type=form&model=project.task)
opw-[4874199](https://www.odoo.com/web#id=4874199&view_type=form&model=project.task)
Forward-Port-Of: odoo/odoo#218365
Forward-Port-Of: odoo/odoo#214785Fixes an issue in Project reporting where clicking chart bars after grouping by tasks could fail because report-only filters were sent to the task view. The system now removes incompatible filter fields before opening the detailed task view, making report drill-downs more dependable for users.
Original PR description
Step to reproduce - Go to Project - Go to Reporting > Task Analysis - Group by Tasks (not Task) - Click on any of the blue bars Issue: since odoo/odoo@c36ad1896 we now allow user to drill down to base model from report view, this causes issue when a field which is present in report model but not in base/main model. For now we directly pass the domain created for report view to base model. FIx: we only open the view, when the such fields are not present in domain opw-4798353 related : https://github.com/odoo/enterprise/pull/88356 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#215167
Website footer updates now handle expected formatting issues without hiding serious database conflicts. This helps prevent failed update processes and allows automatic retry handling when concurrent edits happen.
Original PR description
Updating website footer views sometimes fails with "could not serialize access due to concurrent update" errors due to concurrent database writes, causing transaction aborts and breaking the update…
Updating website footer views sometimes fails with "could not serialize access due to concurrent update" errors due to concurrent database writes, causing transaction aborts and breaking the update process. Error: `InFailedSqlTransaction: current transaction is aborted, commands ignored until end of transaction block` The issue arises because the exception block at [1] catches and silently suppresses all exceptions, including critical `serialization errors`. These serialization errors cause the current database transaction to fail. However, since the exception is caught and not properly handled or propagated, execution continues within the context of the failed transaction. As a result, subsequent operations fail with an `InFailedSqlTransaction` error. This commit addresses the issue by specifically handling the `etree.XMLSyntaxError` raised by `etree.fromstring(view_id.arch_db)`. The error is safely caught and logged with an appropriate message. Additionally, it adds logging when the `configurator_footer_links` element is not found in the view and prevents further execution in that case. All other exceptions, including database-related errors, are no longer caught at this level; instead, they are allowed to propagate and are handled at the request level, where automatic retries are triggered. handled at the request level, where automatic retries are triggered. [1]:- https://github.com/odoo/odoo/blob/5cc57cc0ca8ee17060905b692727ed965e197f61/addons/website/models/website.py#L722-L725 sentry-5665538920 Forward-Port-Of: odoo/odoo#210103
Submitting the UAE VAT201 tax return no longer triggers an error caused by using the wrong report calculation. This helps businesses complete VAT filings reliably without being blocked by a system traceback.
Original PR description
When submitting a tax return for the basic AE tax report (VAT201 Form), a traceback was being thrown. The issue arose because the report was considered to be the Corporate Tax report instead of the VAT201, and was trying to apply some incompatible computation. task-4935937
This fix corrects how accident or sickness-related days are calculated in Swiss payroll reporting. It helps ensure payroll declarations use accurate day counts, reducing the risk of incorrect employee payroll data being submitted.
Original PR description
Forward-Port-Of: odoo/enterprise#90191 Forward-Port-Of: odoo/enterprise#90153
Salary configuration and offer flows now save personal details such as address and marital status on the correct contract version record. This prevents employee offer data from being stored in the wrong place after the contract version model change, improving accuracy for HR and Belgian payroll processes.
Original PR description
With the change from the contract to the version model, more adaptation was required for the salary configuration and the offer management. Before that change, the personal info were always written on the employee model. But now, some of the personal information (like the address or the marital status) need to be written on the new version. This commit fixes the issue by adding support to directly write the version fields of the salary configurator on the new version. task-4933745
Signing and counter-signing a job offer now assigns the correct current contract salary version to the newly created employee. This prevents archived versions from being selected by mistake, helping HR records remain accurate after recruitment offers are completed.
Original PR description
When signing an offer, an employee and a version are generated. Some methods of the controller are using the active_test context, but without resetting to its default value. This was causing some issue when creating or computing field of the versions. For example the current_version_id was computed to be an archive version, which is wrong. This commit fixes the issue by resetting the active_test context to its default value. The new version is also unarchived before archiving the old version to not trigger the version constraint about the active field. Steps to reproduce: - Create a job position and a candidate in recruitement. - Generate an offer for the candidate. - Sign and counter-sign. - The current version on the newly created employee is wrong. task-4926361
Deleting bank statement lines after applying a reconciliation model now keeps the model available by restoring it to the suspense line. This prevents users from losing reconciliation setup during corrections and keeps bank reconciliation workflows consistent.
Original PR description
Before this commit when applying a reco model, the reco model is on the lines of the move except the liquidity line which means that when we delete the lines the reco models is lost. Now when deleting a line, if the statement line had a reco model, we place it back on the suspense. Also correcting some demo data where they added the reconcile model on the liquidity but since the reco model will be added at the creation of the reco model, that's not needed. task: 4908501 Forward-Port-Of: odoo/enterprise#89147
Facebook removed support for the metric previously used to calculate stories activity, which caused reporting errors and could make other statistics show as zero. This update removes that unavailable Facebook stories statistic so the remaining social media metrics continue to work reliably.
Original PR description
Bug === `page_content_activity` has been deprecated, so the API return an error and the other statistics are set to zero. https://developers.facebook.com/docs/pages-api/changelog Now, the only equivalent is `post_activity_by_action_type`, but it needs to be called on all posts, and it does not support periods (so even if we call it for each post, we won't be able to compute the trend). So we simply removed the `stories` statistics for Facebook. Task-4914555 Forward-Port-Of: odoo/enterprise#89524 Forward-Port-Of: odoo/enterprise#89230