Daily updates from Odoo
Tuesday, August 19, 2025
49 changes · saas-18.3
Resolved issues and error corrections
The website events list now uses the visitor’s local day when applying the “Today” filter, instead of relying on UTC. This prevents events near midnight from appearing on the wrong day or being hidden for users in non-UTC 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
When sending an SMS from a chosen phone field, Odoo now keeps that selected field even if its number is invalid instead of silently switching to the contact's main phone number. This helps users spot and correct the specific bad number they selected, reducing the risk of messages being sent to an unintended recipient.
Original PR description
If a user picks a specific field to open the composer with and that field is invalid we currently attempt to pick the number from the partner of the record as a fall back. Instead if the user picked a specific field and it happens to be invalid for some reason, they will want to correct it in-situ rather than have it be something completely different. Some similar tests are regrouped. task-4900210 Forward-Port-Of: odoo/odoo#216242
Point of Sale now ignores payment attempts that were canceled on a payment terminal when matching incoming terminal payments. This prevents a canceled payment from a previous order from blocking payment confirmation on a new order, helping cashiers complete sales without manual recovery.
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
This fixes an issue where choosing a record from a search dialog could unexpectedly open the record form instead of selecting it. Users can now reliably select records in these dialogs, including fields configured through Studio, reducing confusion and workflow interruptions.
Original PR description
Example of steps: - install web, purchase and studio - add a many2one with studio anywhere and choose purchase.order.line - close studio - try to use this new field, select "Search more" - select a random record - It opens the form view record instead of select It This is because purchase order line has an openAction that forces the opening of a form view. However, for a select_create_dialog, we must bypass this action to allow nothing except selection. To do this, a new prop has been added, “allowOpenAction,” in the list_controller, which will be true by default, but will be false for select_create_dialog. opw-4958121 Forward-Port-Of: odoo/odoo#223253 Forward-Port-Of: odoo/odoo#222602
French companies using Point of Sale can now display the self-service invoicing QR code on customer receipts in this version. This backport keeps the change focused and stable while adding coverage to help prevent regressions.
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
Fixed an issue where applications created from a talent pool could miss the expected acknowledgment email after assigning a job position. The recruitment flow now sets the correct application stage upfront, ensuring candidates receive the proper communication consistently.
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#220367
Fixed an issue where Point of Sale orders with the same product on multiple lines could show an inflated delivered quantity in sales reporting. This ensures delivery totals are allocated correctly, improving report accuracy for ship-later POS orders.
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
Fixes an issue where guests could not see the newsletter subscription checkbox during checkout after the website checkout page had been customized. When the Newsletter option is enabled in Website Settings, the related customized checkout view is now activated too, keeping the signup option visible for shoppers.
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
This fixes inconsistencies between the rating pop-up reply box and the regular chatter, so customer feedback discussions behave the same way in both places. Users should see more reliable message actions and composer behavior when responding to ratings in portals, eLearning, and shared project pages.
Original PR description
portal, portal_rating, rating, website_slides task-4743757 Forward-Port-Of: odoo/odoo#222517 Forward-Port-Of: odoo/odoo#221050
Property fields are now handled more consistently in field selection screens, avoiding confusing separators and unsupported options. This improves usability when building domains, grouping lists, using server actions, and rendering mail templates with property values.
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
A Point of Sale automated test now archives existing products instead of deleting them. This prevents failures caused by protected products, improving test reliability without changing customer-facing behavior.
Original PR description
### Before this commit: - The `test_load_pos_demo_data` test case was deleting all products, including special ones like `Gift card`, `default_booking_product`, leading to errors due to constraints on deleting such records. ### After this commit: - The test case now archives existing products instead of deleting them, avoiding these errors. Runbot Errors: 229904 & 229903 Task: 4974081 Forward-Port-Of: odoo/odoo#221317
The accounting auto-post process now stops retrying the same journal entry after a posting failure. This prevents repeated error messages and excessive database records, helping scheduled accounting tasks remain stable.
Original PR description
**Steps to reproduce:** - For simplicity, create a new account. - Create a new journal entry, with one line on the newly created account. - Set the date to today or older. - Set auto-post to "At…
**Steps to reproduce:** - For simplicity, create a new account. - Create a new journal entry, with one line on the newly created account. - Set the date to today or older. - Set auto-post to "At date". - Make sure the journal has autocheck_on_post set to True. - Keep the journal entry in draft, and duplicate it until you have 100 copies. (Make sure auto-post is set to "At date" on all of the copies aswell) - Set the newly created account to 'Deprecated'. - Manually execute the scheduled action "Account: Post draft entries with auto_post enabled and accounting date up to today" **Issue:** The scheduled action fails and then falls into an infinte loop, and logs an error on the chatter every minute, which could lead to thousands of mail_message records beign created. **Cause:** If the autopost scheduled action fails on a certain move, it marks it as 'move.checked = False'. So that when it is calls itself again (if the number of moves to post is greater than or equal to 100), it won't fetch the same move and fail again. But having 'journal_id.autocheck_on_post = True' in the search domain allows autopost to fetch the same move it marked before (if the journal allows it), which leads to an infinite loop. **Solution:** If autopost fails on a move, set 'auto_post' to 'no' so it won't be fetched again. opw-4815790 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#214946 Forward-Port-Of: odoo/odoo#213642
This update aligns point of sale and restaurant screens with a recent internal change in how options are passed between methods. It helps prevent checkout, receipt, and restaurant workflow issues caused by mismatched method calls.
Original PR description
In a previous commit, some method signatures were changed to use an options object instead of multiple parameters. This commit updates the affected method calls to use the new options object format. Forward-Port-Of: odoo/odoo#222473
This fixes a test setup issue by only using the demo payment provider when its supporting module is installed. It prevents avoidable test failures in limited installation scenarios, improving reliability for release validation without changing customer-facing payment behavior.
Original PR description
Add module installation check before using "demo" as payment provider to generate payment token for payment register test case. Steps to reproduce: 1. Install single module (website_sale). 2. Run test case `TestAccountPaymentRegister.test_register_payment_doesnt_send_email`. You will get ValueError: Invalid field 'demo_simulated_state' on model 'payment.token' build_error-230731 Forward-Port-Of: odoo/odoo#222330
This fixes an inventory issue where subcontracted products tracked by lot or serial number could create duplicate stock records during purchasing and receipt. Businesses will see more accurate on-hand quantities and fewer misleading reservations for subcontracted items.
Original PR description
Problem: When a purchase order for a subcontracted product tracked by lots/serials is confirmed, the "Procurement: run scheduler" action creates a stock reservation in the subcontracting location.…
Problem: When a purchase order for a subcontracted product tracked by lots/serials is confirmed, the "Procurement: run scheduler" action creates a stock reservation in the subcontracting location. This reservation is created without a lot or serial number. When the finished product is later received with its lot/serial, the system tries to use the untracked reservation to define a source for the move, but will still create a new quant line because of the destination. This results in two quants, leading to incorrect inventory levels: - A positive quant for the product with the correct lot/serial. - A negative quant for the same product without a lot/serial, with a hanging reservation. Solution: The reservation mechanism in _clean_reservations() is now bypassed for stock moves that should have a lot or serial number, but do not. This ensures that when the tracked product is received, no redundant quants are created. Steps to reproduce on Runbot (tested on 18.3 and 18.0): 1. Create a new product and track by lots 2. Add a BOM for this product, setting type to Subcontracting 3. Create a PO for the product and confirm it 4. With debug enabled, go to Inventory > Operations > Procurement: run scheduler To see the issue: 5. Go to Inventory > Reporting > Locations 6. Search for the product, note the quant line at the subcontractor location with no lot number 7. Return to the PO and recieve, specifying lot number 8. Go to Inventory > Reporting > Locations 9. Search for the product again, note that there are now 2 quant lines at the subcontractor location when the quantity on hand should have zeroed out opw-4935822 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes a small issue where a renamed electronic invoicing field was not correctly refreshed when related data changed. It has minimal day-to-day impact, but prevents potential problems for customers who expose or customize this field through Odoo Studio.
Original PR description
In previous PR [1], we renamed field `ubl_xml_id` to `ubl_cii_xml_id`, but failed the compute dependencies. It has next to no impact since this field it not in views, but could lead to problems if people add it through Studio. [1]: https://github.com/odoo/odoo/pull/115627/files#diff-5f7f5f6e9c54527b31f7579db7ef63b5b910794e462cd3346e32387900c13efdR12 task-none Forward-Port-Of: odoo/odoo#223259
Edited attendance records that were originally created as absences now switch to normal manual attendance status when their check-in or check-out times are corrected. This ensures the attendance list no longer incorrectly keeps those records highlighted as absences, reducing confusion for HR users.
Original PR description
### Steps to reproduce: - Run Absence detection cron - Navigate to the attendances got created in list view - Notice all of them are in red color - Modify the check in and check out dates to correct them as normal attendance - Notice the color didn't change in the view and it is still shows as red ### Cause: This is happening because color of the record is dependant on the check out mode, so if it is technical it means it is absence so we give it red color. https://github.com/odoo/odoo/blob/a7a29ed691db4f1607c0d12929c56845681164fa/addons/hr_attendance/models/hr_attendance.py#L84-L89 Also, the check out mode cannot be changed in any way. ### Fix: When updating the check out and check in time we check if the mode is technical we change it to manual. opw-4865524 Forward-Port-Of: odoo/odoo#218177
This fix ensures Slovenian domestic customers without VAT numbers are treated as domestic rather than EU customers. It helps post revenue to the correct domestic accounts, improving accounting accuracy for local transactions.
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#223249 Forward-Port-Of: odoo/odoo#217311
This pull request appears to make a small change in Odoo's base module around partner records and related company tests. The description suggests it is mainly a test or investigation of the automated validation process, so business impact is expected to be minimal.
Original PR description
I will update the commit just want to investigate if runbot will work or not --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The employee public and private pages have been aligned so they present information in a more consistent way. This reduces confusion for users who switch between employee record views and helps keep HR screens visually coherent.
Original PR description
The aim of this PR is to make the employee public and private views look similar Task-4778704 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Users no longer see a flickering empty dropdown when selecting related records in forms where creating new records is restricted. The menu now consistently shows a "start typing" prompt, making the interface clearer and less distracting.
Original PR description
Before this commit, the m2x dropdown flickered when the option "create and edit" was disabled and there was no data. Now, we display at least the "start typing" message. task-4920761
This update stops an unnecessary warning from appearing in stock accounting by replacing use of a deprecated method. It keeps the system cleaner for users and reduces noise without changing business workflows.
Original PR description
Before this commit a deprecated method is used and create a useless warning. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222148
Fixes an issue that could block Fleet users from importing vehicle data when the model year was provided as a number in CSV or spreadsheet files. The system now handles these year values consistently, preventing import errors and reducing manual cleanup.
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**
The Attendance kiosk no longer mistakes public website users without passwords for trial database users. This keeps the kiosk limited to the configured Barcode/RFID mode instead of showing extra check-in choices, reducing confusion for employees using multi-company websites.
Original PR description
### Steps to reproduce: - Install Attendance and Website modules - Have a company 'Company A' - Create a new company 'Company B' - Set the Attendance kiosk mode to 'Barcode / RFID' for both companies…
### Steps to reproduce: - Install Attendance and Website modules - Have a company 'Company A' - Create a new company 'Company B' - Set the Attendance kiosk mode to 'Barcode / RFID' for both companies - Update all websites to be related to Company B - Go to the Kiosk mode for Company B - Notice it makes you choose between the 3 check in types while we only chose 'Barcode / RFID' ### Cause: When openning the kiosk mode it will check if the database is a trial one or if the user doesn't have a password and if so we assume that the database is a trial one. If it is a trial database we set the kiosk mode as 'settings' which shows all check in types when openning the kiosk mode. https://github.com/odoo/odoo/blob/9ec4e0d3c5f1aaff0b36dc5def1e69b8285c3be1/addons/hr_attendance/controllers/main.py#L101-L102 https://github.com/odoo/odoo/blob/9ec4e0d3c5f1aaff0b36dc5def1e69b8285c3be1/addons/hr_attendance/controllers/main.py#L185-L196 When creating a new company and set website for it we create a public user for this company and normally we don't set password for this user as no one is gonna login using it. ### Fix: We check if the user doesn't have a password and if he is not a public user. As we assume that if he is a public user he won't have a password anyways. opw-4916329 Forward-Port-Of: odoo/odoo#220355
Razorpay payment providers can no longer be enabled and published before required account credentials are configured. This helps prevent merchants from accidentally offering a payment option that cannot process transactions correctly.
Original PR description
## Version 17.0+ No OAuth in 16.0 ## Issue Razorpay can be enabled and published without being properly configured. ## Steps to reproduce - Go to `Payment Providers` and open `Razorpay`; - Set the state to `Enabled` and publish without providing any credentials. ## Fix Added constraints and revised account linking logic, similar to Stripe. Based on 1b6a7aeb245f0007675943ed7aacf5064e46fe61 suggested by ALSH. opw-4922315 Forward-Port-Of: odoo/odoo#222530 Forward-Port-Of: odoo/odoo#219943
This fix ensures an HR employee web JSON test can run correctly even when demo data is not installed. It improves reliability of automated checks for HR functionality without changing business features or user workflows.
Original PR description
Before this commit the test `test_webjson_employees` was failing in no demo builds as the json route only works in demo databases or when explicitly set. See https://github.com/odoo/odoo/pull/182196 This commit enables the system parameter, so that the test can be run as intended in no demo databases. Runbot Error: https://runbot.odoo.com/odoo/error/162907 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#205580
This fix prevents point of sale receipts from being printed or requested twice when customers pay online through self-order QR flows. It also avoids errors when the register tab was inactive during payment, helping staff complete orders smoothly without crashes or duplicate print handling.
Original PR description
`* = pos_online_payment_self_order` **Installation:** `pos_online_payment_self_order` and `payment_demo` **POS Shop Configuration:** - **Restaurant** mode. - Self-order mode: **"QR menu +…
`* = pos_online_payment_self_order` **Installation:** `pos_online_payment_self_order` and `payment_demo` **POS Shop Configuration:** - **Restaurant** mode. - Self-order mode: **"QR menu + Ordering"**. - Enable **online payment** method for self-order. - Activate **Automatic Receipt Printing**. **Steps to Reproduce:** - Open the register. - Place an order and choose **Online Payment**, and validate it (**QR** code appears). - **Deactivate** the register tab (e.g., by opening another browser tab). - **Pay** the amount by scanning the code (can use phone). - Wait for the payment to **succeed**. - Switch to the original register tab. **Error:** Frontend: `TypeError: Cannot read properties of null (reading 'cloneNode')` Backend: `ValueError - This order has already been printed automatically.` **Case 1: Register tab is active** No crash occurs, the receipt printing pop-up is triggered twice: 1. When the order is auto-validated and printed [(Ref 1)](https://github.com/odoo/odoo/blob/52badedb4edb4018bbf400af4f48f81aa597654a/addons/point_of_sale/static/src/app/screens/payment_screen/payment_screen.js#L391-L401) 2. When the `ONLINE_PAYMENT_STATUS` notification with status success is received [(Ref 2)](https://github.com/odoo/odoo/blob/52badedb4edb4018bbf400af4f48f81aa597654a/addons/pos_online_payment_self_order/static/src/overrides/services/pos_store.js#L16-L17) **Case 2: Register tab is inactive (hidden)** - The auto-print logic fails due to the DOM element (`el`) being `null`, skipping the first print and leading to a `TypeError` at [1]. - When the tab becomes visible again (`visibilitychange` event), a backend call is triggered to `get_order_to_print` at [2], which fails with a `ValueError` because the order was already flagged as printed. [1] - https://github.com/odoo/odoo/blob/52badedb4edb4018bbf400af4f48f81aa597654a/addons/point_of_sale/static/src/app/services/printer_service.js#L55-L57 [2] - https://github.com/odoo/odoo/blob/8fb3776b54a17307979733e7f155939d7d87d9d2/addons/pos_online_payment_self_order/models/pos_order.py#L19-L20 **Fix:** This commit ensures each order is printed only once: - If the tab is active and auto-print works, skip printing on visible status. - If the tab is inactive and auto-print fails, fallback printing is allowed via the visibility change event. Sentry - 6707550067
The system now ensures the main HR documents folder is assigned to HR officers when users are created or updated. This helps keep sensitive HR documents accessible to the right staff, especially when companies are set up before HR users exist.
Original PR description
related to : odoo/enterprise#87731 -> make root Hr folder HR officer only instead of employee folder : we need to do it at user write (or creation) to ensure that hr users are correctly added on the folder, as that folder is created at company creation (and no hr user exists yet). Task-4869292
Fixed an issue where some images, such as course rank badges, could appear much larger when entering edit mode. Image dimensions are now preserved correctly during editing, helping pages look consistent for editors and visitors.
Original PR description
Problem: On the Courses page, the user rank badge image becomes much larger when entering edit mode. Cause: During HTML sanitization, `img.width` is removed and its value is moved to `img.style.width`. If `img.width` is a number (e.g., `100`), it is interpreted as `100px`. However, when assigned to `img.style.width` without a unit, the style is considered invalid, and the image defaults to its original size. The same applies to `img.height`. Solution: When transferring width or height to style, ensure a unit is added. If the original attribute is a plain number without a unit, default to `px`. Steps to reproduce: - Open Website > Courses - Observe the user rank badge is appropriately sized - Enter edit mode > The badge image becomes much larger than expected opw-4993038 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221843
Grouped bill payments now keep the memo details from each individual payment instead of replacing them with internal workflow text. This helps suppliers receive complete and accurate payment references when multiple bills are paid together.
Original PR description
The payment memo of grouped bills should always consist of the concatenation of individual payments memos. This commit is a partial revert of the changes done in this PR https://github.com/odoo/odoo/pull/162762 The original task was intended to improve internal workflows and should not have impacted payment communications to suppliers. task-4936572 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#223256 Forward-Port-Of: odoo/odoo#218787
WhatsApp template previews no longer mistake underscores inside links or similar text for italic formatting. This keeps generated message previews accurate while still allowing intentional italic text when underscores are used with surrounding spaces.
Original PR description
Steps to reproduce: 1. Go to a WhatsApp template, for e.g. Sale Order. 2. Update the sample value for the Portal Link variable to include an underscore. 3. Click on Preview Issue: Due to the current…
Steps to reproduce: 1. Go to a WhatsApp template, for e.g. Sale Order. 2. Update the sample value for the Portal Link variable to include an underscore. 3. Click on Preview Issue: Due to the current regex, we will apply italic to any underscore we find which is not ideal, mostly when we work with URLs that can contain underscores like "acces_token" which we will try to apply italic to it too. Solution: Following the most common logic for italic formatting, we will only apply italic formatting when the underscore is surrounded by whitespace. This is the same way it already behaves in Whatsapp. If we write it like_this_for example, it will not apply italic formatting, but if we write it like this _this_ it will apply italic formatting. So this for example: **"If we write it like_this_for example"** Will be like - before the fix: **"If we write it like<i>this</i>for example"** Will be like - after the fix: **"If we write it like_this_for example"** opw-4720017 Forward-Port-Of: odoo/enterprise#91217
Non-recurring products sold through subscription upsell orders are now correctly included in the Sales Analysis Report. This gives teams a more accurate view of delivered quantities and revenue for standard products sold as part of upsell activity.
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#92559This fixes an error that could stop WhatsApp marketing automation tests when users ran the same test more than once. The change makes the automation handle each test result separately, improving reliability for teams validating campaigns before launch.
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
This fixes an accounting test so it no longer depends on a hard-coded year. The change helps keep automated checks stable as dates change, reducing avoidable build failures and maintenance work.
Original PR description
In `test_matching_rules_with_empty_aml_move_name`, the payment `move_id.name` was hard-coded to use the year "25" in the sequence prefix (e.g. MOVE25/00004). This caused ValidationErrors when the mocked posting date in the test environment belonged to a different year, as the sequence mixin enforces alignment between the move date and sequence year. The test now derives the year suffix dynamically from the actual `move_id.date` to ensure it always matches the posting date used in the test context. This makes the test stable regardless of the current (or mocked) date, removing the need for manual adjustments when fiscal years or test setup dates change. build_error-230659
Odoo now avoids showing a misleading activity log message when validating a batch that includes payments still in process. This helps users trust the payment history by no longer saying a payment was removed from a batch when it actually remains there.
Original PR description
When validating a batch that includes payments in process (e.g., without journal entries), Odoo incorrectly logs that the payment was removed from the batch, even though it remains. This commit fixes the chatter message by not possessing the write method of the account_payment if batch_payment_id not in vals. task-5011672 Forward-Port-Of: odoo/enterprise#92197
Setting a Pricer Sales Pricelist on a product variant no longer triggers an error. This ensures users can configure product pricing reliably, including when working with newly created product records.
Original PR description
Steps to Reproduce: ---------------------------------- - Open the product variant form - Set the Pricer Sales Pricelist field - Traceback Issue: ---------------------------------- - `TypeError: ProductPricelist._compute_price_rule() takes 3 positional arguments but 4 were given` Cause: ---------------------------------- - `_get_product_price()` was calling `_compute_price_rule()` with positional args instead of named quantity - If the product record is not yet created (`product._origin` is False), it skips price computation logic Fix: ---------------------------------- - Pass `quantity=1.0` explicitly to `_compute_price_rule()` to resolve the argument mismatch - Handle case where `product._origin` is False by falling back to `product` itself Task-4888983
The AI field selector now avoids showing unnecessary warnings for valid boolean values and hides separators when inserting properties into prompts. This makes the AI prompt setup experience clearer and less confusing for users.
Original PR description
Bug === The `False` value is a valid value for boolean type, and the warning should not be displayed for that type. When inserting properties in an AI prompt, the property separator should not be visible. Task-4896271
This update corrects internal calls in Point of Sale restaurant and Urban Piper flows after a recent technical change. It helps keep related tests and order preparation behavior working reliably without changing day-to-day user workflows.
Original PR description
In a previous commit, some method signatures were changed to use an options object instead of multiple parameters. This commit updates the affected method calls to use the new options object format. Forward-Port-Of: odoo/enterprise#92091
Users working with Kenyan companies can now search products by KRA item code without triggering an error. This fixes a broken search option in the Sales product list and helps teams find the right products more reliably.
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
Sales users can now request DHL shipping rates on quotations without running into an access error. This keeps the shipping workflow working as expected while still protecting restricted DHL account details.
Original PR description
Versions -------- - saas-18.3+ Steps ----- 1. Have DHL (legacy) as a delivery method; 2. log in as demo user; 3. create a quotation with a shippable product; 4. click "Add shipping"; 5. select DHL; 6. click "Get rate". Issue ----- > Access Error: > You do not have enough rights to access the field "dhl_account_number" on Shipping Methods (delivery.carrier). Cause ----- The error gets thrown in the `_set_dct_bkg_details` method. In previous versions, the `dhl_account_number` field would still be in cache after `srm.check_required_value` was called, as this method checks whether the `carrier.dhl_account_number` field is non-empty in sudo mode. As of saas-18.3, field access is checked even if the value is available in cache, resulting in the access error. Solution -------- Use `sudo` to retrieve the `dhl_account_number`. opw-4899776
Files added through the email wizard when sending Sign requests are now included in the outgoing email. This prevents missing documents and restores the expected sending experience for users.
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
Belgian payroll exports now check required work entry codes before generating files. This prevents failed exports and gives users clear warnings so missing setup can be fixed earlier.
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
Gantt popover cards now show standard labels such as Name, Start, and Stop in the user's selected language instead of always displaying English. This improves the experience for multilingual users and teams working with custom Studio menus and Gantt views.
Original PR description
**NOTE:** This is extremely similar to the [request](https://github.com/odoo/enterprise/pull/90605) that was created for saas-18.2. However with the changes in [2] , from saas-18.3 and on, template…
**NOTE:** This is extremely similar to the [request](https://github.com/odoo/enterprise/pull/90605) that was created for saas-18.2. However with the changes in [2] , from saas-18.3 and on, template strings can be directly extracted with ``_t`` , and so this PR is meant to provide a more forward-port friendly version for future roll outs. Steps to Reproduce: - Change the language to something other than English. - Create a new menu in the Appointment module using Studio. - Link that menu with the existing model (Resource Time of Detail). - Save the changes and add the Gantt view - Save the changes and close Studio. - View this new menu in the Gantt view Issue: - When clicking onto the kanban popover card for any record, the labels will remain as "Name" , "Start" , and "Stop" in English, and it will not translate. Reason: - [1] changed the rendering of default kanban card templates from XML to JS. This changed the default template to be static. Fix: - Add a call to the translation core tool "_t" on the three labels upon their generation in _getKanbanViewParams(). This ensures that the arch template that is generated is translated correctly into the user's set language. - Additionally, add these terms into the .pot file for web_gantt. This ensures that the proper translations are stored for transifex and the relevant translation team and that the call to _t will have a translation to reference in it's call. [1] : https://github.com/odoo-dev/enterprise/commit/23e53dab70fe3f1d418a12f7ac040acacf9e1ead [2] : https://github.com/odoo/odoo/commit/079c3b0f6078377335837defa08077b0d7d3489f opw-4861899
This fixes an issue in Odoo Studio where adding a column to a customized report table could create unwanted spacing inside the new cells. The change helps keep report tables aligned and visually consistent after editing.
Original PR description
Before this commit when adding a column into a modified qweb table (q-table node) we inserte a `p` as the cell's first child. This was problematic as a margin was always present, messing with the whole table alignment. After this commit, we put a simple DIV. task-5005441 Forward-Port-Of: odoo/enterprise#92085
Subscription payments made through the customer portal are now correctly linked to the invoice created for that subscription. This ensures users can see the payment from the invoice, improving visibility and reducing confusion during billing follow-up.
Original PR description
### Steps to reproduce: - Activate a payment method - Create a subscription and preview it in portal view - Pay this order through the order's portal view - Navigate to the invoice got generated -…
### Steps to reproduce: - Activate a payment method - Create a subscription and preview it in portal view - Pay this order through the order's portal view - Navigate to the invoice got generated - Notice there is not 'Payments' smart button ### Cause: Since https://github.com/odoo/enterprise/pull/77432/commits/02f72f94b7c996fa19c6bfc70a704d27aa677245 we stopped creating the invoice before the payment and the transaction in the controller and we let _post_process do this invoice creation. So the invoice actually gets created after the payment not before and when preparing the payment values the invoice_ids will be False https://github.com/odoo/odoo/blob/6c88e6ffd2c906b72b31d3c34ad3d6da5efba204/addons/account_payment/models/payment_transaction.py#L155-L170 Then we create the invoice for the transaction and we don't propagate it to the payment. https://github.com/odoo/enterprise/blob/20fd574367757c06f30c344056e8b8d91ba8244c/sale_subscription/models/payment_transaction.py#L72-L84 ### Fix: Link the payment to the invoice after creating the invoice and link it to the transaction. opw-4867631 Forward-Port-Of: odoo/enterprise#91690
The employee appraisal screens have been adjusted so public and private employee views look consistent. This reduces confusion for users who work across both views and creates a more uniform HR experience.
Original PR description
The aim of this PR is to make the employee public and private views look similar task-4778704
When an applicant is converted into an employee through the salary configurator, their recorded skills are now carried over correctly. This prevents recruiters and HR teams from losing important candidate information during onboarding.
Original PR description
Originally, an applicant, who became an employee through the salary configurator flow, loses his skill info. So, the migration of applicant information, through the salary configurator flow, to employee view has been adjusted. Forward-Port-Of: odoo/enterprise#87076
Egyptian payroll now applies the exempt amount before calculating income tax. This helps prevent employees from being charged too much tax and improves payroll accuracy.
Original PR description
Issue: - The income tax calculation in Egyptian payroll did not properly account for the exempt amount. - This could result in over-calculating tax for employees by not applying the exemption. Fix: - Updated the 'Taxable Amount' salary rule to correctly apply the exempt amount before tax is calculated. Task-4815156 Forward-Port-Of: odoo/enterprise#86395
This fixes an error that could block reconciliation when a vendor bill with multiple installments was paid through separate batch payments. The system now ignores installments that were already reconciled, allowing later payments to be matched normally.
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#91367