Wednesday, August 20, 2025
42 changes · saas-18.4
New functionality added to Odoo
The Adam Equipment scale driver has been moved into its own installable module so IoT boxes no longer mistake unidentified serial devices for Adam scales. Businesses using an Adam scale may need to install or enable this module manually after an IoT box restart, while other customers should see fewer setup issues with unrelated devices.
Original PR description
Community PR: https://github.com/odoo/odoo/pull/223516 Backport of #91410, note that in stable the new module WILL NOT be installed automatically, meaning if someone is using an Adam scale it will break if their IoT box restarts. It was chosen to proceed anyways as it is unlikely anyone is using this setup in 18.4, and if they are it can be fixed by installing the module manually. Before this commit, the Adam Equipment serial scale driver was included by default on the IoT box. However, this causes issues as there is no way to detect the presence of one of these scales automatically. This caused any unidentified serial device to be registered as an Adam scale, leading to much confusion with customers, especially regarding setting up an FDM. After this commit, the Adam driver is moved into its own module. This way, only customers who actually need the driver will get it, and everyone else can benefit from not having it wrongly detect devices. task-4954021
Enhancements to existing features
Avatars linked to partner records can now open the same profile popover as user avatars. This makes contact-related many-to-many fields easier to browse and use, especially in kanban and HR-related views.
Original PR description
With this commit, the AvatarCardPopover supports having an id of a `res.partner` record in the props. This allows components like KanbanMany2ManyTagsAvatarUserField (that use AvatarCardPopover) to be used with a Many2Many field related to `res.partner`. In such cases, the avatars will now be clickable and will display the avatar card popover. fixes: task-4640810 Forward-Port-Of: odoo/odoo#208846
Resolved issues and error corrections
The point of sale checkout flow now respects auto-validation when a cashier uses Force Done on a terminal payment. This prevents staff from being stuck on the payment screen and sends them to the receipt as expected, making checkout smoother.
Original PR description
When doing a force done on a terminal payment, if the auto validation was turned on, it would not be triggered after clicking on the force done button. Steps to reproduce: ------------------- * Turn on the auto validation for terminal payments * Create a new order and add a product * Select a terminal payment method (You can fake the force done state as I did in the tour) * Click on the "Force Done" button > Observation: You are not redirected to the receipt screen. opw-4954406 Forward-Port-Of: odoo/odoo#223485 Forward-Port-Of: odoo/odoo#222867
Features or functions removed from Odoo
The IoT box will no longer include the Adam scale driver by default because it was incorrectly identifying many serial devices as Adam scales. Businesses using an Adam scale may need to install the separate module manually after an IoT box restart to keep that scale working.
Original PR description
Enterprise PR: https://github.com/odoo/enterprise/pull/92719 Backport of #221326, note that in stable the new module WILL NOT be installed automatically, meaning if someone is using an Adam scale it will break if their IoT box restarts. It was chosen to proceed anyways as it is unlikely anyone is using this setup in 18.4, and if they are it can be fixed by installing the module manually. The Adam scale driver causes many issues due to it detecting any serial device as an Adam scale, as there is no way to identify them automatically. This causes much confusion for clients, as their devices are wrongly appearing as an Adam scale. This commit removes the driver from the IoT box by default. It is being moved into a separate module in the associated Enterprise PR. task-4954021 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Italian public administration invoices can now be signed through Namirial before being sent, helping businesses meet required XADES signature rules. The update adds the related configuration and processing flow, improves handling of signing errors, and ensures the signed XML replaces the original before attachment.
Original PR description
Invoices for the Italian Public Administration businesses must be signed with XADES before sending. We use Namirial's third-party signing services. - This upgrade adds configuration, a signing process, and new returns to handle this case. Old versions should be able to ignore this, as the invoice will stay blocked in the requires_user_signature state in Odoo, now deprecated, without being sent to the EDI. - Handle more error types, with dedicated server exceptions with an error code map. Old versions should be able to just handle them as before, generically. - When the Proxy Server signs an invoice, the XML will replace the one on the Odoo instance before it's actually attached. Needs: odoo/odoo#210572 Also see: odoo/iap-apps#978 Task [link](https://www.odoo.com/odoo/project/967/tasks/4477745) task-4477745 Forward-Port-Of: odoo/odoo#223245 Forward-Port-Of: odoo/odoo#196054
Romanian localization now includes the new 11% and 21% VAT taxes introduced by recent legislation. Tax groups were also updated to keep tax reporting and configuration consistent for businesses operating in Romania.
Original PR description
This PR adds new taxes and tax groups for 11% and 21% after new VAT law was introduced in Romania. It also fixes tax groups of some taxes and make it more consistent. TaskID:4979168 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222642 Forward-Port-Of: odoo/odoo#221238
Sales orders with many lines now load available product documents much faster. This improves responsiveness for users preparing PDF quotes, especially on larger orders.
Original PR description
Replace search in for loop with `_read_group` and a precomputed dictionary of available product documents Description of the issue/feature this PR addresses: Performance issue when opening SO with multiple lines (more than 100). See Speedscope before [speedscope_before.json](https://github.com/user-attachments/files/21251034/speedscope_before.json) <img width="1920" height="659" alt="image" src="https://github.com/user-attachments/assets/e77bec12-e8cf-4cc9-b3d2-90ad59db6fa3" /> And after: [speedscope_after.json](https://github.com/user-attachments/files/21251096/speedscope_after.json) <img width="1911" height="404" alt="image" src="https://github.com/user-attachments/assets/e1663ec3-2918-451d-ae25-6103d8a75eff" /> We went from 252ms for the query only to 12.63ms. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220613 Forward-Port-Of: odoo/odoo#219229
Online shop product searches now retrieve product attributes more efficiently, especially for large catalogs. This can significantly reduce waiting times when customers browse or filter products, improving the shopping experience.
Original PR description
### Description: The default query to fetch attributes for searched products needs to join on the `product_tmpl_ids` Many2Many field. This can be slow, as it requires a join on an intermediate table. This change avoids that by directly querying the attribute lines and grouping by `attribute_id` to remove duplicates. ### Benchmark (in 18.0): | N° of products | Before | After | |----------------|--------|-------| | 3708 | 400ms | 200ms | | 128539 | 4 min | 800ms | | 484798 | 6 min | 3s | ### Reference: opw-4937361 Forward-Port-Of: odoo/odoo#222249 Forward-Port-Of: odoo/odoo#222064
Romanian SAF-T reporting now includes the correct tax type and code mappings for newly introduced taxes under recent law changes. This helps businesses keep statutory SAF-T reports aligned with updated Romanian tax requirements and avoids reporting inconsistencies.
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
Subscriptions that were marked as churned now return to active status when their invoice is paid, including manual payments such as bank transfers. This prevents paid customers from remaining incorrectly inactive, while still respecting the configured automatic closing limit.
Original PR description
Before: - A subscription is reopened only when a customer pays through the portal. - Manual payments do not reopen the subscription. - invoice is paid but subscription remains churned. After: - Subscriptions now reopen when invoice paid through bank transfer. - Additionally, reopening is the subscription will only reopen if the next_invoice_date is within the allowed automatic closing limit (next_invoice_date >= today - automatic closing limit). Impact: - Paid invoices now always bring the subscription back to active status task-4277444 Forward-Port-Of: odoo/enterprise#92367 Forward-Port-Of: odoo/enterprise#73136
Imported accounting entries with analytic distribution now avoid creating duplicate analytic items. This keeps reporting cleaner by ensuring the analytic item is created only when the accounting move is posted, while preserving the imported distribution data.
Original PR description
When importing an account move with analytic distribution, two analytic items are created, one at the creation of the move, and another when the move is posted. This happens because, when creating the move from an import, the line values passed include Commands to create analytic_line_ids, and not analytic distributions. Desired behavior: Only one analytic item should be created, and only when the move is posted. When the move is created, its lines' analytic distribution should be correctly filled based on the data imported. Solution: This commit unlinks the Analytic Lines created at move imports (removing the analytic_line_ids from moves at create/write), after the analytic distribution is set on the corresponding move line. task-4987799 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#223300 Forward-Port-Of: odoo/odoo#222196
Fixed an issue where pages with multiple image galleries would only update the first gallery when visitors used carousel controls. Each gallery now has its own identifier, so all galleries work correctly and independently on website pages.
Original PR description
After the website refactor [1], the image gallery snippet (carousel) no longer had unique IDs. As a result, when multiple image galleries were present on the page, navigating any carousel other than the first would incorrectly update only the first one. This commit ensures that each image gallery snippet is assigned a unique ID, allowing all carousels to function independently and correctly. [1]: https://github.com/odoo/odoo/commit/9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 Related to task-4367641
Invoices or vendor bills marked as blocked will no longer be automatically unblocked when payment status is recalculated during related accounting or inventory actions. This preserves user decisions and helps prevent blocked documents from moving forward unexpectedly.
Original PR description
Problem: When the `payment_state` field on `account.move` is automatically computed, the logic will prioritize whether the move has been posted over whether it has been blocked. The effect is that if…
Problem: When the `payment_state` field on `account.move` is automatically computed, the logic will prioritize whether the move has been posted over whether it has been blocked. The effect is that if an invoice has been marked as blocked, it might be automatically unblocked during reconciliation. Solution: The `_compute_payment_state` method will now prioritize a move's `payment_state` being blocked over whether it has been posted. This prevents a blocked move from being unblocked unexpectedly. Steps to Replicate (Runbot 18) - Create a product - Track inventory - Cost > 0 - Control policy = On ordered quantities - Product category is valuated in real-time (Inventory Valuation - Automated) (requires 'Stock Accounting Automatic' group) 1. Create a PO for the product 2. Create a bill, validate it 3. Block the bill using the contextual action 4. Receive the product If you navigate back to the Vendor Bill, you will see that it has been unblocked. opw-4981799 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#223351 Forward-Port-Of: odoo/odoo#222906
The Point of Sale now ignores payment attempts that were canceled on a payment terminal when matching incoming terminal confirmations. This prevents a previous canceled payment from blocking payment validation on a new order, helping cashiers complete sales reliably.
Original PR description
If you made an order and tried to pay with a payment terminal (like Adyen) then canceled the payment on the terminal. Then leave the order and create a new order, add different products, and try to…
If you made an order and tried to pay with a payment terminal (like Adyen) then canceled the payment on the terminal. Then leave the order and create a new order, add different products, and try to pay again, pay on the terminal, the payment will not be transmitted to the PoS and the order would still be waiting for payment. Steps to reproduce: ------------------ * Create a pos payment method using adyen * Open a PoS session * Create an order with a product * Pay with the adyen payment method * Cancel the payment on the terminal * Leave the order * Create a new order with different products * Try to pay with the adyen payment method * Validate the payment on the terminal > Observation: The payment will not be transmitted to the PoS and the order will still be waiting for payment. Why the fix: ---------------- The issue occurs because the canceled payment line is still considered as a pending payment line. And when the payment will be receiven on the pos it would take the canceled payment line as the pending one. opw-4805704 Forward-Port-Of: odoo/odoo#222325 Forward-Port-Of: odoo/odoo#219054
The email showcase snippet now keeps its intended side-by-side layout when viewed on large screens. This prevents marketing emails from appearing misaligned after they are sent, helping recipients see the design as it appeared in the editor.
Original PR description
Problem: On large screens, the `s_showcase` template shows blocks stacked vertically instead of side-by-side as in the editor. Cause: After commit 10008b32334152ada1a847b091189d1d9d5aa3d3,…
Problem: On large screens, the `s_showcase` template shows blocks stacked vertically instead of side-by-side as in the editor. Cause: After commit 10008b32334152ada1a847b091189d1d9d5aa3d3, `s_showcase` was refactored to fix selection/formatting issues. Mixing relative widths (`col-sm`) with fixed widths (`col-1`) breaks in `convert_inline`, exceeding the 12-column grid. Solution: - Use `Math.floor` when calculating the `colSize` to prevent overflow Before: <img width="1862" height="948" alt="image" src="https://github.com/user-attachments/assets/35d82103-1f84-4754-862d-50ef3481bcb3" /> After: <img width="1847" height="955" alt="image" src="https://github.com/user-attachments/assets/20e1b454-dfc4-4ad0-9e6a-3b38c230d0fd" /> Steps to reproduce: 1. Open a new email marketing. 2. Drop the `s_showcase` snippet. 3. Send a test email. 4. Observe the received template is misaligned compared to the editor. opw-4946126 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222801
This fixes an issue where renaming a custom many-to-many field could make it disappear from the system configuration. The change keeps the internal field registry consistent, reducing the risk of broken customizations after field changes.
Original PR description
Since 6b9df655bb4424302b78cdeec8ed65b7d4106396, when renaming a custom many2many field, the field disappears from its model's `_fields` dict. The field is silently discarded after its setup has crashed, because another field using the same relation is found in `registry.many2many_relations`. This "other" field is actually the renamed field under its old name! The fix thus consists in partially invalidating `registry.many2many_relations` before setting up fields. Co-authored-by: abz-odoo opw-4937841
This fixes an issue where the Website theme settings tab could appear blank for some themes, including Real Estate. Users can now open and adjust theme options without being blocked by hidden rendering errors.
Original PR description
Since website refactor [1],a silent error would occur while rendering the theme tab, leading to nothing being displayed depending of the theme. This was caused by a duplicate key in the `$o-selected-color-palettes-names` scss variable, added by some theme, which would crash the `t-foreach` template loop. Steps to reproduce: - Create a website using theme_real_estate, through the wizard - Enter edit mode - Click on theme tab - Nothing is rendered [1]: https://github.com/odoo/odoo/commit/9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2
Paymob payment processing now handles date formats that vary by country, including dates with timezone details. It also avoids reusing outdated access tokens after credentials change, reducing the risk of payment connection issues.
Original PR description
Previously, we assumed that the format of created_date provided by paymob was the same for all countries. However it seems like for countries other than Egypt a timezone field is added to the date. Therefore we switched to using 'fromisoformat' instead of 'strptime' to avoid specifying the date format if its not consistent throughout the different countries. Also, if an access token is fetched, then it won't be invalidated when new credentials are given and it might result in faulty behavior. Since the expiry of the access token is about 60 mins, then there is no value to storing the access token on the payment provider and can be fetched when needed. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix keeps rating feedback popups and chatter messages in sync across portal and website areas. Users see consistent message content and actions when rating or responding, reducing confusion in customer-facing conversations.
Original PR description
portal, portal_rating, rating, website_slides task-4743757 Forward-Port-Of: odoo/odoo#223243 Forward-Port-Of: odoo/odoo#221050
The IoT printing flow now continues even when the system cannot check an Epson printer's status. This helps avoid failed or blocked print jobs caused by a status-check issue, improving reliability for businesses using IoT-connected printers.
Original PR description
If for some reason, the IoT Box can't query the epson printer status, we should still try to print: an escpos lib issue shouldn't prevent cups from sending its job.
Creating an application from a recruitment talent pool now sets the correct initial stage when a job is assigned. This ensures the expected acknowledgment email is sent consistently, avoiding missed candidate communications.
Original PR description
### Steps to reproduce: - Create a talent pool - Check the application created under this pool - Set a job position in this application - Notice the email that got sent - Naviagte to the talent pool - Create a new application - Notice the acknowledgment email won't be sent ### Cause: When creating a new application from the talent pool we don't set a stage_id so it will get computed after creating the application so when checking in _track_template it won't exist in changes. https://github.com/odoo/odoo/blob/9ec4e0d3c5f1aaff0b36dc5def1e69b8285c3be1/addons/hr_recruitment/models/hr_applicant.py#L535-L544 ### Fix: When adding a new application through pool we check the stage related to the job we are assigning to the applicant and we set it so it will exist in changes when checking the email template that should be sent. opw-4925221 Forward-Port-Of: odoo/odoo#223287 Forward-Port-Of: odoo/odoo#220367
Outgoing emails now include links for attachments that are stored in cloud storage, not only for files that exceed the email size limit. This prevents customers or vendors from missing important documents when cloud-backed attachments are added to messages.
Original PR description
Before this commit, when sending emails with attachments stored in the cloud, the attachments's links were not included in the email body, as we only included the links for attachments exceeding the max email size. With this commit, we ensure that all attachments stored in the cloud are converted to links in the email body and included in the the email. opw-4717083 Forward-Port-Of: odoo/odoo#208424
This fixes several property field issues so users no longer see unsupported or confusing property separators in field selection, grouping, and server action screens. It also improves property icon alignment and ensures email templates render relational property values correctly.
Original PR description
Bug === When inserting properties in a domain, or in the server action form view, the property separator should not be visible. Improve the alignment of the pencil / drag property icon. Task-4896271 Forward-Port-Of: odoo/odoo#215767
French companies using Point of Sale can now display the self-service invoice QR code on customer receipts as intended. This helps customers request invoices more easily while keeping the backported change limited and stable for this release.
Original PR description
This commit backports parts of https://github.com/odoo/odoo/commit/4fd28add5c22614a4e5a386a440617edefed6d67, which originally was only merged into master, since it's unstable. Here however, we only backport the bare minimum to make the invoice QR code visible on the receipt, while keeping the changes stable. We also backport the test. opw-4981573 Forward-Port-Of: odoo/odoo#221414
Repair orders now keep kit components when they are added after the order has been confirmed. This prevents parts from disappearing after saving and ensures the repair order remains accurate for technicians and operations teams.
Original PR description
Steps to reproduce the bug: - Create a repair order with any component. - Confirm the order. - Try to add a kit as a component. Problem: After saving, the kit disappears. When a kit is added to a confirmed repair order, its move should be confirmed and therefore exploded. However, the moves created from this kit move are just copies of the original move. Fields with copy=False are not copied, including the repair_id field. In this case, repair_id must be added to link the move to the repair order, so it needs to be set manually. opw-4937817 Forward-Port-Of: odoo/odoo#222998
Users can now validate and send completed signed documents even if an uploaded signing certificate is invalid. This prevents a crash caused by bad certificate data and keeps the signing workflow moving after the existing warning is shown.
Original PR description
Currently, an error occurs when a user sign the document and tries to validate and send the completed document. **Steps to reproduce:** - Install the `sign` module. - Go to: `Sign Settings >…
Currently, an error occurs when a user sign the document and tries to validate and send the completed document. **Steps to reproduce:** - Install the `sign` module. - Go to: `Sign Settings > Cryptographic Signature` > Create a 'Signing certificate' and upload any random PDF (Observe: A warning appears `'This certificate could not be loaded. Either the content or the password is erroneous.'`). - In the Sign app, upload any document, drag and drop a `Signature` field, and sign the document. - Click `Validate & Send Completed Document`. **Note:** - [1] Make sure your system has cryptography version `41.0.7 or above`. - Refer to [2] for steps to reproduce. **Error:** `TypeError: expected bytes-like object, not bool` **Root Cause:** At [3], when the certificate is not correctly created, `certificate.pem_certificate` is `False`, which leads to an error. This commit allows validating and sending a signed document, when the certificate is invalid. [1]: https://github.com/odoo/odoo/blob/d730518fa6a1fba3b3edba6f3b65bcc88ed992fe/odoo/tools/pdf/signature.py#L16 [2]: https://drive.google.com/file/d/19fd82TdGzVPRUVW3PDMGEhyaQLTwL41h/view?usp=sharing [3]: https://github.com/odoo/odoo/blob/a6fa3784b20f75490e405e3728d5a335f2104fa0/odoo/tools/pdf/signature.py#L85 sentry-6796501254 Forward-Port-Of: odoo/odoo#222417
This fixes how Slovenian domestic customers without VAT numbers are classified for accounting. Their sales are now kept under domestic accounts instead of being treated as EU sales, helping revenue reporting stay accurate.
Original PR description
Before this PR: - Domestic customers without VAT were incorrectly mapped to EU fiscal position, causing domestic revenue accounts (760000) to be mapped to EU accounts (761000). After this PR: - Added new domestic fiscal position for non-VAT customers to ensure proper account mapping for domestic transactions. Task-4918960 Forward-Port-Of: odoo/odoo#223328 Forward-Port-Of: odoo/odoo#217311
The website events list now uses the visitor's local day when applying the "Today" filter, instead of relying on UTC. This prevents events from appearing on the wrong day or being missed for users in different time zones.
Original PR description
The filters use today in UTC to fetch events in db. The commit fixes this by located today first and then converts it in UTC. related odoo/odoo@bfd55de7c846a0d523e4de4b17020341d8fcfd23 task-4796181 Forward-Port-Of: odoo/odoo#213205
Vehicle imports in the Fleet app no longer fail when the model year is provided as a number in CSV or XLSX files. This prevents import errors and helps users bring vehicle data into Odoo without manual formatting workarounds.
Original PR description
Currently, when users import a CSV or XLSX file into the Fleet app containing the `model_year` field as an integer, an error is raised. **Steps to Reproduce:** 1) Install **Fleet** app(with Demo…
Currently, when users import a CSV or XLSX file into the Fleet app containing the `model_year` field as an integer, an error is raised. **Steps to Reproduce:** 1) Install **Fleet** app(with Demo Data). 2) Open Fleet App and Import [this file](https://docs.google.com/spreadsheets/d/1KJgVTM7KeAVcHR-TQg86gO4in53G7NyR/edit?usp=sharing&ouid=101212513075316114369&rtpof=true&sd=true). 3) Click on Test or Import. **Error:** `UndefinedFunction: operator does not exist: text = integer` **Root Cause:** Since PR https://github.com/odoo/odoo/pull/197440, the `model_year` field was changed from a `char` to a `selection`. The selection values are generated by the `_get_year_selection` method at [1], which returns a list of integers. However, when these integer value is compared at [2], a type mismatch occurs because the expected type is `text`, not `integer`. **Solution:** This fix ensures that `_get_year_selection` returns a list of **strings** instead of `integers`, so that the values match the expected type at [2] [1]- https://github.com/odoo/odoo/blob/4806b08dcfc965cdbd463269be078f8da9f48863/addons/fleet/models/fleet_vehicle.py#L34-L36 [2]- https://github.com/odoo/odoo/blob/4806b08dcfc965cdbd463269be078f8da9f48863/odoo/addons/base/models/ir_fields.py#L451 sentry-**6663249660** Forward-Port-Of: odoo/odoo#221861
Point of Sale orders that include the same product on multiple separate lines now report delivered quantities accurately. This prevents overstated delivery figures in sales reporting when customers use ship-later fulfillment.
Original PR description
If you made a sale with multiple lines having the same product, the qty_delivered was not correctly computed on the different lines. Steps to reproduce: ------------------- * Activate the ship later…
If you made a sale with multiple lines having the same product, the qty_delivered was not correctly computed on the different lines. Steps to reproduce: ------------------- * Activate the ship later option in the PoS settings * Open PoS * Add any product with a quantity of 5 * Apply a discount of 20% to the line * Click on the same product so that they are added as a second line * Change the quantity of the second line to 3 * Validate the order and use the ship later option * Validate the picking * Go to the sale report and check the qty_delivered for the product > Observation: The qty_delivered is doubled, 16 instead of 8. Why the fix: ------------ The qty_delivered was computed by summing the quantities of all moves for the product, but it did not take into account that the same product could be present in multiple lines of the same order. We now make sure to dispatch the delivered quantity correctly across the different lines of the order, ensuring that the qty_delivered is accurate. opw-4826487 Forward-Port-Of: odoo/odoo#221373
Point of Sale now calculates taxes on negative order lines the same way as the backend. This prevents discrepancies that could create unbalanced accounting entries and improves reliability for refunds or negative sales lines.
Original PR description
Before this commit, when an order contained a negative line, the backend treated it as a refund line while the POS UI did not. This mismatch caused inconsistent tax calculations between the UI and the backend, which could result in unbalanced journal entries. With this commit, the tax calculation logic is aligned between the UI and the backend, ensuring consistency and preventing unbalanced moves. opw-4972314 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222918 Forward-Port-Of: odoo/odoo#222632
Enabling the Newsletter option in Website Settings now also activates the related customized checkout view. This ensures guest shoppers see the newsletter subscription checkbox during checkout, even after the checkout page has been edited.
Original PR description
Reproduction Steps: --------------------------------------------------- To reproduce the issue first we need to create cowed view, follow the steps below: - Ensure that the website and…
Reproduction Steps: --------------------------------------------------- To reproduce the issue first we need to create cowed view, follow the steps below: - Ensure that the website and website_sale_mass_mailing modules are installed. - Navigate to Website > Shop. - Select any product and add it to the cart. - click on Proceed to checkout then checkout. - On the checkout page, you will see the address form. - Click on "Add a new address". - Now "Edit" the website page (e.g., make the City label bold). This will create a cowed view for the address page. Now, follow the final steps to reproduce the actual issue: - Enable the "Newsletter" option from Website Settings. - Log out of the database. - Go to the website shop, add a product to the cart, and proceed to checkout. - On the address page, the subscription checkbox is not visible for a "Guest" user. Root Cause: -------------------------------------------- The subscription checkbox does not appear because the cowed view of the newsletter is not activated. Solution: --------------------------------------- As of SaaS 17.3, a new module `website_sale_mass_mailing` was introduced, which adds the "Newsletter" option in Website Settings. When this option is enabled, the newsletter view is automatically activated. However, the corresponding cowed views are not automatically activated, causing the subscription checkbox to be missing during guest checkout. To fix this, we ensure that the corresponding cowed view is also activated when the "Newsletter" option is enabled. Related Link: https://github.com/odoo/odoo/pull/154604/files OPW-4860002 UPG-2978748 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#223255 Forward-Port-Of: odoo/odoo#214989
Fixes an issue where visitors could hit an access error after using livechat across guest and logged-in sessions. The change ensures related livechat conversations are safely linked to the newly created website visitor, improving reliability for website users and support teams.
Original PR description
When a new website.visitor is created while a guest is set in the context, livechat channels of the related guest need to be updated to link the newly created visitor. Before this PR, the update caused an access error because the public user does not have permission to update channel records. Steps to reproduce: - Go to a tracked page (e.g., /contactus) and start a livechat as a guest, then end it. - Log in as a user, go to a tracked page, start a livechat, then end it. - Log out and go to a tracked page -> an access error occurs. This PR uses sudo to allow updating channels, as guests can access their own channels. task-[4891195](https://www.odoo.com/odoo/project/1519/tasks/4891195) Forward-Port-Of: odoo/odoo#218550
Swedish accounting imports now handle SIE4 files that do not include previous-year information instead of crashing when opening balances are imported. The import also retries with an alternate character encoding when needed, helping customers process more supplier or legacy files successfully.
Original PR description
**Issue**: Importing a SIE4 file without previous year information causes a traceback. **Steps to reproduce**: - Go to Accounting > Settings > Import - Import SIE 4 file - Check the box "Import account opening balances" - Select the right xml and observe the traceback **Cause**: The method `_prepare_sie4_opening_balance_move` tries to directly access the previous year: https://github.com/odoo-dev/enterprise/blob/6d4919658650a006c73d4aaf1f500d67723dda0d/l10n_se_sie4_import/wizard/import_wizard.py#L376C9-L376C58 This results in a traceback when the previous year is not present. **Solution**: Make `_prepare_sie4_opening_balance_move` more permissive by falling back to the day before the first day of the current year if the `-1` section is not there. **Additional Notes**: The client file does not support `UTF8` format, retry with the `ISO-8859-1` format in case of `UnicodeDecodeError`. opw-4894495 Forward-Port-Of: odoo/enterprise#89425
Belgian payroll exports now check required work entry codes before generating files. This prevents exports from failing unexpectedly and gives payroll teams clearer guidance to fix missing setup for supported payroll providers.
Original PR description
Before this commit no usererror was raised when the work entry type has no group s code defined which caused the export to fail. This commit adds a check at generation time for the work entry type to have a group s code defined task-4241431 Forward-Port-Of: odoo/enterprise#71454
Dutch VAT payment instructions now use the Omzetbelastingnummer when it is available, instead of always using the company VAT number. This prevents incorrect payment communication references on tax payment wizards and helps businesses submit payments with the right identifier.
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
Files added through the email wizard are now correctly included when sending Sign requests. This prevents recipients from receiving emails without the documents users intended to attach, restoring expected email behavior.
Original PR description
Issue: * When users added attachments in the mail wizard (e.g., from the Sign module), the files were saved in the backend but not included in the outgoing email. Steps to Reproduce: 1. Edit a Sign template and click the Send button. 2. In the wizard, click on the Attachments button and select a file. 3. Press Send. 4. The email is sent, but the selected attachment is missing from the Sign request mail. Fix: * Adjusted the logic to correctly include attachments added through the wizard in the final email. Impact: * Users can now successfully send attachments added via the mail wizard. * Restores expected behavior and prevents missing documents in email. task-5002652 Forward-Port-Of: odoo/enterprise#91975
Fixed an issue that caused WhatsApp marketing automation tests to crash when run more than once for the same setup. This makes campaign testing more reliable and prevents users from being blocked by an error during validation.
Original PR description
Currently an error occurs when trying to run whatsapp marketing automation test more than once. **Steps to replicate:** * Install `marketing_automation_whatsapp` * Setup whatsapp integration *…
Currently an error occurs when trying to run whatsapp marketing automation test more than once. **Steps to replicate:** * Install `marketing_automation_whatsapp` * Setup whatsapp integration * Marketing Automation > New > Start From Scratch > Add a new activity * Select Activity Type as Whatsapp Message and a Whatsapp Template * Launch a Test > Pick a contact > Launch > Run (Do this step twice) **Error:** `ValueError: Expected singleton: marketing.trace(6, 4, 3, 2, 1)` **Cause:** This error occurs because the variable `trace` contains multiple records, but the `process_event` method is being called on the entire recordset. Since `process_event` uses `self.ensure_one()`, it expects exactly one record, and therefore raises an error at [1] when multiple records are passed. **Solution:** * Handle trace records one by one using a loop. [1]: https://github.com/odoo/enterprise/blob/624b18bdb5dff0df4756c4e1d37a696631e57a05/marketing_automation_whatsapp/models/marketing_trace.py#L20 **Sentry-6772553612** Forward-Port-Of: odoo/enterprise#91207
Non-recurring products sold through subscription upsell orders are now included in the Sales Analysis Report. This gives teams more complete delivered quantity and revenue figures, reducing the risk of underreporting upsell performance.
Original PR description
Problem: The non-recurring products added through upsell Sales Orders are not included in the Sales Analysis Report. This results in missing sales data for those products, leading to inaccurate…
Problem:
The non-recurring products added through upsell Sales Orders are not included in the Sales Analysis Report. This results in missing sales data for those products, leading to inaccurate reporting.
Purpose:
To ensure that non-recurring products added through upsell Sales Orders are correctly included in the Sales Analysis Report (report_all_channels_sales_action). This fix updates the report's domain filter to include upsell orders when the product is not recurring, resolving the issue of missing sales data for such products.
Steps to reproduce the bug:
1. Create a Sales Order (SO):
Add two products to the order:
- One recurring product (e.g., a subscription-based product with a recurring billing policy).
- One non-recurring (standard) product.
2. Confirm the SO
3. Generate an Invoice for the confirmed SO.
4. Validate the Invoice and deliver the non-recurring product (process the delivery order fully).
5. Create an Upsell Sales Order:
- From the original SO, create a new upsell SO.
- Add the same non-recurring product again.
6. Navigate to the Non-Recurring Product Page:
- Open the Product form for the non-recurring item.
- Click on the "Sold" smart button (shows delivered/sold quantities in the past 365 days).
- This opens the Sales Analysis Report (report_all_channels_sales_action) filtered by this product.
Issue:
The upsell Sales Order is not included in the Sales Analysis Report for the non-recurring product. As a result, the delivered quantity or revenue from upsell SOs is missing from the report for non-recurring products.
opw-4940977
Forward-Port-Of: odoo/enterprise#92559Fixed an issue that caused an error when users grouped commission records in Sales. This keeps commission reporting usable and prevents interruptions when analyzing commission data.
Original PR description
When user tries to group by in commission, a traceback will appear. Steps to reproduce the error: - Install ``sale_commission`` module - Go to Sales > Commissions > My Commissions > Group by with any…
When user tries to group by in commission, a traceback will appear. Steps to reproduce the error: - Install ``sale_commission`` module - Go to Sales > Commissions > My Commissions > Group by with any field Traceback: ``` TypeError: strptime() argument 1 must be str, not datetime.date ``` After this [commit,](https://github.com/odoo/odoo/commit/26c37c9c070107f8bd753cb8a6d8343384fdd7bf) When grouping, the ``web_read_group`` method is invoked, which internally calls ``optimize() → _optimize() → _optimize_type_date() → _value_to_date()``. The ``_value_to_date()`` method returns a ``datetime.date`` object from below lines for default filters and group by. https://github.com/odoo/odoo/blob/b42d8ebee73fbf8a8eac0222ae9bcaee3fa33c98/odoo/orm/domains.py#L1417-L1420 https://github.com/odoo/enterprise/blob/3b2556d174cc2b5e3bfe9e72f1f02fea87310653/sale_commission/report/commission_report.py#L31-L38 So, In the domain, a ``datetime.date`` is passed, but ``strptime()`` expects a ``string`` at the above line, leading to a traceback. Sentry-6785019405
Fixed an issue where reconciling multiple batch payments for different installments of the same bill could fail after the first installment was already reconciled. The system now only uses unpaid installment lines during reconciliation, helping accountants process split vendor payments without manual workarounds.
Original PR description
**Steps to reproduce:** - Install accountant - Go to "Accounting / Configuration / Invoicing / Payment Terms" - Create a payment term having at least 2 installments (e.g. 20%-80%) - Create a bill: *…
**Steps to reproduce:** - Install accountant - Go to "Accounting / Configuration / Invoicing / Payment Terms" - Create a payment term having at least 2 installments (e.g. 20%-80%) - Create a bill: * Vendor: [any] * Payment terms: [the created payment term] * Amount: 1000 - Confirm the bill - Pay the first installment from the bill (i.e. 200) - Go to "Accounting / Vendors / Payments" - Select the payment and create a batch - Validate the batch payment - From Accounting dashboard, go to Bank journal - Create a statement: * Partner: [None] * Amount: -200 - Reconcile the statement with the batch payment - From the bill, pay the second installment (i.e. 800) - Go to "Accounting / Vendors / Payments" - Select the payment and create a batch - Validate the batch payment - From Accounting dashboard, go to Bank journal - Create a statement: * Partner: [None] * Amount: -800 - Reconcile the statement with the batch payment **Issue:** The following UserError is raised: "You are trying to reconcile some entries that are already reconciled." **Cause:** When reconciling a batch payment, all the payment term lines from the invoices/bills linked to the payment are used. However, in this case, when the first batch payment has been reconciled, the first payment term line of the bill (linked to the first installment) has been reconciled. It should not be reused when reconciling the second batch payment. **Solution:** Exclude reconciled payment term lines when reconciling a batch payment. opw-4830185 Forward-Port-Of: odoo/enterprise#92524 Forward-Port-Of: odoo/enterprise#91367
Users working with Kenyan localization can now search products by KRA item code without the product screen failing. This fixes a broken search option that previously caused backend errors and no visible result in the interface.
Original PR description
This commit odoo/enterprise@c17ebfc7cdf2b218945280e6e3bd09f2b9ee8adc added a [searchview](https://github.com/odoo/enterprise/blob/17.0/l10n_ke_edi_oscu/views/product_views.xml#L74-L84) for `l10n_ke_item_code` but it never worked. as `l10n_ke_item_code` in `product.template` is non-stored field, we generally get error in console about it. fast forward to newer version e.g. saas-18.3, searching on non-stored fields raises traceback on frontend. Step to reproduce: - install L10N_ke and sale_management - switch to kenya company - go to product in sales app - type something in search bar and select 'kra item code' from autocomplete Observation: - nothing happens on frontend - on backend we receive a error `ERROR odoo.osv.expression: Non-stored field product.template.l10n_ke_item_code cannot be searched.` Fix: - we introduce a search method for l10n_ke_item_code field opw-4985176 Forward-Port-Of: odoo/enterprise#91526