Monday, May 5, 2025
25 changes · saas-18.1
Enhancements to existing features
This update adds automated checks for setting and removing preset times and time slots on Point of Sale orders. It helps ensure restaurant and sales workflows handle scheduled order timing reliably, reducing the risk of timing-related issues reaching users.
Original PR description
- Add tour to set/unset preset and slot hours on a PoS order. task-id: 4684840 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
Payment confirmation emails for eCommerce orders now use the assigned salesperson instead of OdooBot. This ensures customers see the right sender and the salesperson is notified when a payment remains pending.
Original PR description
Versions -------- - saas-18.1+ Steps ----- 1. Ensure admin gets auto-assigned as salesperson to eCommerce orders; 2. open an eCommerce cart and go to checkout; 3. using Demo payment provider, create a "pending" payment. Issue ----- Payment confirmation mail is sent from OdooBot instead of admin. Cause ----- Commit 27bf2e55810b automatically adds admin as salesperson to eCommerce orders, but only on order confirmation. This means that salesperson does not get notified about pending payments, and the client receives an email from OdooBot instead of a salesperson. Solution -------- Set the order's `user_id` before sending the payment confirmation mail. opw-4765346
Miscellaneous changes
Versions -------- - 17.0+ Steps ----- 1. Create a sales order with a deliverable product; 2. set sales team to a team you're not a member of; 3. validate the delivery; 4. create & confirm an invoice for the order; 5. via the delivery form, create & validate a return delivery; 6. create a new invoice for the order. Issue ----- The sales team on the initial invoice is the same one as on the order. The sales team on the second invoice is changed to a default value. Cause -----
Original PR description
Versions -------- - 17.0+ Steps ----- 1. Create a sales order with a deliverable product; 2. set sales team to a team you're not a member of; 3. validate the delivery; 4. create & confirm an invoice…
Versions -------- - 17.0+ Steps ----- 1. Create a sales order with a deliverable product; 2. set sales team to a team you're not a member of; 3. validate the delivery; 4. create & confirm an invoice for the order; 5. via the delivery form, create & validate a return delivery; 6. create a new invoice for the order. Issue ----- The sales team on the initial invoice is the same one as on the order. The sales team on the second invoice is changed to a default value. Cause ----- The `team_id` gets recomputed on a `move_type` change. The reason the `move_type` changed after creation, is because the `_create_invoices` method first wants to have the final total of the invoice before deciding whether it should be an `out_invoice` or an `out_refund`: https://github.com/odoo/odoo/blob/d7af5c443b03c18e364a74571560b3583969c1d7/addons/sale/models/sale_order.py#L1401-L1407 Solution -------- Knowing that the `action_switch_move_type` method could recompute the `team_id`, protect the field when calling it in `_create_invoices`. opw-4563006 Forward-Port-Of: odoo/odoo#206707 Forward-Port-Of: odoo/odoo#205167
Updating presets across several Point of Sale setups at once no longer triggers an error. The system now handles each setup separately, helping administrators make bulk configuration changes more reliably.
Original PR description
Issue: = - Updating presets on multiple POS setups at once caused a singleton error. Fix: = - Now processes each POS configuration individually to prevent the error. Related PR: https://github.com/odoo/odoo/pull/196800 Task: 4523232
We predict the account to use in an invoice/purchase entries based on product configuration and frequent account used for partner but we do not verify if those accounts are allowed on the specified journal. This can be problematic if the entry is generated from a external file (ex: using Peppol), Odoo should retrieve an account allowed in the journal. Steps to reproduce: 1. Have two purchase journal A and B on the same company 2. Set an expense account that is allowed on one of those journa
Original PR description
We predict the account to use in an invoice/purchase entries based on product configuration and frequent account used for partner but we do not verify if those accounts are allowed on the specified journal. This can be problematic if the entry is generated from a external file (ex: using Peppol), Odoo should retrieve an account allowed in the journal. Steps to reproduce: 1. Have two purchase journal A and B on the same company 2. Set an expense account that is allowed on one of those journal (A) and not the other (B) 3. Create multiple bills with this account on the journal A for partner X 4. Upload a XML bill of partner X in journal B -> The expense account is used based on the bills in journal A -> Error because journal B is not allowed for this account opw-4607733 Forward-Port-Of: odoo/odoo#206104 Forward-Port-Of: odoo/odoo#203664
**Problem:** When adding a product that has the landed cost setting activated to a Vendor Bill, the landed cost checkbox was not checked, thus the product was not registered with a landed cost in the Vendor Bill. Adding the product straight from the vendor bill worked fine. **Steps to reproduce:** - Make a product with a landed cost. - Make a new vendor bill and go to the catalog from the Invoice Lines tab. - Search for your product and add it to the Vendor Bill. - Return to the Vendo
Original PR description
**Problem:** When adding a product that has the landed cost setting activated to a Vendor Bill, the landed cost checkbox was not checked, thus the product was not registered with a landed cost in the…
**Problem:** When adding a product that has the landed cost setting activated to a Vendor Bill, the landed cost checkbox was not checked, thus the product was not registered with a landed cost in the Vendor Bill. Adding the product straight from the vendor bill worked fine. **Steps to reproduce:** - Make a product with a landed cost. - Make a new vendor bill and go to the catalog from the Invoice Lines tab. - Search for your product and add it to the Vendor Bill. - Return to the Vendor Bill and see that the landed cost is not checked. **Cause of the issue:** The field is_landed_costs_line is set in an onchange function, thus when adding a product from the catalog the said function is not triggered and the is_landed_costs_line is not applied. https://github.com/odoo/odoo/blob/01058b94d860ab508bc2c013af5fe887e08247d9/addons/stock_landed_costs/models/account_move.py#L61-L66 **Fix:** An override of the create function was added to add the correct landed cost even when the onchange function is not called. With the onchange function and the create function, this ensures that the is_landed_costs_line will be set correctly regardless of where it is created from. opw-4521391 Forward-Port-Of: odoo/odoo#201622
Previously, record synchronization was based on the pos.order model, so if the write_date of the order was more recent on the server, it was re-downloaded with its sub-records. The problem was that by changing an orderline, the order object was not necessarily updated, so its write_date remained the same. Now all records and their write_dates are compared, so that records can be re-downloaded independently of their order. Trusted config commands are also re-downloaded. The records compared
Original PR description
Previously, record synchronization was based on the pos.order model, so if the write_date of the order was more recent on the server, it was re-downloaded with its sub-records. The problem was that by changing an orderline, the order object was not necessarily updated, so its write_date remained the same. Now all records and their write_dates are compared, so that records can be re-downloaded independently of their order. Trusted config commands are also re-downloaded. The records compared are only those that can be created from the PoS frontend. Forward-Port-Of: odoo/odoo#208283
Description of the issue/feature this PR addresses: Wrong address/zip/city in Swiss QR bill template. Current behavior before PR: The template for Swiss QR bills uses the company address, zip code and city. Desired behavior after PR is merged: The template for Swiss QR bills uses the address/zip/city of the creditor's bank account, if available. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#207640
Original PR description
Description of the issue/feature this PR addresses: Wrong address/zip/city in Swiss QR bill template. Current behavior before PR: The template for Swiss QR bills uses the company address, zip code and city. Desired behavior after PR is merged: The template for Swiss QR bills uses the address/zip/city of the creditor's bank account, if available. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#207640
**Problem:** Newly created users on the portal can click the 'verify email' button multiple times quickly, leading to the generation of multiple verification emails without refreshing the page. **Steps to Reproduce:** 1. Create a new user on the website. 2. Sign in as the new user and navigate to the 'Forum' page. 3. Click the 'verify email' button multiple times quickly. 4. Check Mailhog / Network requests for multiple verification emails. opw-4122195 Forward-Port-Of: odoo/odoo#2081
Original PR description
**Problem:** Newly created users on the portal can click the 'verify email' button multiple times quickly, leading to the generation of multiple verification emails without refreshing the page. **Steps to Reproduce:** 1. Create a new user on the website. 2. Sign in as the new user and navigate to the 'Forum' page. 3. Click the 'verify email' button multiple times quickly. 4. Check Mailhog / Network requests for multiple verification emails. opw-4122195 Forward-Port-Of: odoo/odoo#208108 Forward-Port-Of: odoo/odoo#181628
Fix drag and drop in CRM tour because the tour bubble disappear if the record has not been dropped in the correct column. Now the tour bubble will stay visible until the opportunity is dropped in the correct stage. Still taking the last record of first column first, then last of second column, etc ... Task-4624497 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#207045
Original PR description
Fix drag and drop in CRM tour because the tour bubble disappear if the record has not been dropped in the correct column. Now the tour bubble will stay visible until the opportunity is dropped in the correct stage. Still taking the last record of first column first, then last of second column, etc ... Task-4624497 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#207045
When working with trusted config loading an order from another config lead to an unknown session in the order. So no payment method can be used to pay the order. Now when loading an order from another config, the session is replaced by the current session. Forward-Port-Of: odoo/odoo#208267
Original PR description
When working with trusted config loading an order from another config lead to an unknown session in the order. So no payment method can be used to pay the order. Now when loading an order from another config, the session is replaced by the current session. Forward-Port-Of: odoo/odoo#208267
**Steps to reproduce:** - Create a service with "Create on Order" = `Project & Task` and "Invoicing Policy" = `Based on Delivered Quantity (Manual)`. - Create a quotation using this service as a product. - Create a new line in Timesheet with the Project of the service. - The Sales Order Item field updates automatically. - If manually modified, the item no longer appears in the lists of `name_search` or `web_search_read`. **Issue:** Inconsistent behavior on the domain used for the Sale O
Original PR description
**Steps to reproduce:** - Create a service with "Create on Order" = `Project & Task` and "Invoicing Policy" = `Based on Delivered Quantity (Manual)`. - Create a quotation using this service as a product. - Create a new line in Timesheet with the Project of the service. - The Sales Order Item field updates automatically. - If manually modified, the item no longer appears in the lists of `name_search` or `web_search_read`. **Issue:** Inconsistent behavior on the domain used for the Sale Order Item showed in the Timesheet app. **Fix:** Removed `qty_delivered_method` domain filtering to allow sale order line with any `qty_delivered_method` to be used in the Timesheet app. opw-4710840 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#207681
Before this commit, in Odoo, it was not possible to change an all-day event to a timed event and have it synchronized in Google correctly. This is because were sending to Google both 'date' and 'datetime' info for a single event (since Google stores the previous date and dateTime), which lead to "ERROR 400 Invalid start time." After this commit, the user can successfuly update a timed event to all-day event and vice versa and get it successfully updated in Google, since we now send 'date' as
Original PR description
Before this commit, in Odoo, it was not possible to change an all-day event to a timed event and have it synchronized in Google correctly. This is because were sending to Google both 'date' and 'datetime' info for a single event (since Google stores the previous date and dateTime), which lead to "ERROR 400 Invalid start time." After this commit, the user can successfuly update a timed event to all-day event and vice versa and get it successfully updated in Google, since we now send 'date' as null when the event is timed and 'dateTime' as null when it is an all-day event. task-3965107 Forward-Port-Of: odoo/odoo#205563 Forward-Port-Of: odoo/odoo#177549
Steps to reproduce the bug: - install Inventory app - remove any access rights from the logged in user to the inventory app - copy any product Traceback is thrown that the user doesn't have any access on the field create_repair on the product.template model. The user still can create a product normally, but he can't copy it anymore. The field has group scope to stock.group_stock_user so the user can't set the field on creating a product, but with default copy=True on the field, the copy op
Original PR description
Steps to reproduce the bug: - install Inventory app - remove any access rights from the logged in user to the inventory app - copy any product Traceback is thrown that the user doesn't have any access on the field create_repair on the product.template model. The user still can create a product normally, but he can't copy it anymore. The field has group scope to stock.group_stock_user so the user can't set the field on creating a product, but with default copy=True on the field, the copy operation fails. opw-4563733 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#208344 Forward-Port-Of: odoo/odoo#200685
Problem: When viewing the project update of a project that timesheets on a service product with standard valuation, the 'cost_of_goods_sold' section is displayed when it should not be. Purpose: The COGS section should only be displayed in the project updates if COGS lines exists in relation to the project. The behavior should stay consistent with v17.0 as with this commit: #203936 Steps to reproduce the issue: 1. Install Purchase, Sales, Project,sale_project, Inventory, Timesheets 2. Cre
Original PR description
Problem: When viewing the project update of a project that timesheets on a service product with standard valuation, the 'cost_of_goods_sold' section is displayed when it should not be. Purpose: The…
Problem: When viewing the project update of a project that timesheets on a service product with standard valuation, the 'cost_of_goods_sold' section is displayed when it should not be. Purpose: The COGS section should only be displayed in the project updates if COGS lines exists in relation to the project. The behavior should stay consistent with v17.0 as with this commit: #203936 Steps to reproduce the issue: 1. Install Purchase, Sales, Project,sale_project, Inventory, Timesheets 2. Create a service product with standard valuation and creates project & task on order 3. Create a sales order with the service product 4. Invoice the sales order and confirm 5. Create another invoice not linked to the sales order but contains project's analytic account 6. Load the project update or dashboard of the project and notice there's a COGS section displayed despite no related COGS invoice line opw-4684445 -- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#208019
This fix solves a specific corner case where the analytic distribution could False by defaulting to an empty list. To reproduce the issue: - Enable analytic accounting. - Create an expense paid by the company with a linked SO. - Disable Analytic Accounting (also ensure the analytic distribution in the journal entry is False at this point) - Try to reset the Expense or its journal entry back to draft. This issue happens because the code assumes that the analytic distribution is always
Original PR description
This fix solves a specific corner case where the analytic distribution could False by defaulting to an empty list. To reproduce the issue: - Enable analytic accounting. - Create an expense paid by the company with a linked SO. - Disable Analytic Accounting (also ensure the analytic distribution in the journal entry is False at this point) - Try to reset the Expense or its journal entry back to draft. This issue happens because the code assumes that the analytic distribution is always a list, which might not since analytic accounting is disabled. opw-4710518 Forward-Port-Of: odoo/odoo#207221
Issue: Server error raised when selecting a project in a new task field added to a contact form Steps to reproduce: - Go to Contacts > select a contact - Click on toggle studio - Add the 'task' field in the contact form - Go back to the contact - In the task field, add a line - Select a project an error is raised This fix is to properly handles NewId objects in the domain construction. opw-4575975 Forward-Port-Of: odoo/odoo#202756
Original PR description
Issue: Server error raised when selecting a project in a new task field added to a contact form Steps to reproduce: - Go to Contacts > select a contact - Click on toggle studio - Add the 'task' field in the contact form - Go back to the contact - In the task field, add a line - Select a project an error is raised This fix is to properly handles NewId objects in the domain construction. opw-4575975 Forward-Port-Of: odoo/odoo#202756
Following this commit : - getRenderedReceipt method is optimised to pass dynamic values. - o-employee-name class has been added for applying xpath. Enterprise PR: https://github.com/odoo/enterprise/pull/81559 task-4633156 Forward-Port-Of: odoo/odoo#202003
Original PR description
Following this commit : - getRenderedReceipt method is optimised to pass dynamic values. - o-employee-name class has been added for applying xpath. Enterprise PR: https://github.com/odoo/enterprise/pull/81559 task-4633156 Forward-Port-Of: odoo/odoo#202003
**Problem:** When having multiple quants for a product with the same lot but different packages in the same location. Not all quants are visible in the barcode app inventory. **Steps to reproduce:** - In settings activate the following settings : Packages, Storage Locations, Count Entire Locations - Open Inventory/Products - Create a new product - Check the "track inventory" field and select "By Lot" - Go to Inventory/Operations/Physical Inventory and create a new line for your product
Original PR description
**Problem:** When having multiple quants for a product with the same lot but different packages in the same location. Not all quants are visible in the barcode app inventory. **Steps to reproduce:**…
**Problem:** When having multiple quants for a product with the same lot but different packages in the same location. Not all quants are visible in the barcode app inventory. **Steps to reproduce:** - In settings activate the following settings : Packages, Storage Locations, Count Entire Locations - Open Inventory/Products - Create a new product - Check the "track inventory" field and select "By Lot" - Go to Inventory/Operations/Physical Inventory and create a new line for your product - As Location put WH/Stock/Shelf 1 - Write Lot1 for the Lot and Pack1 for the Package - Set a quantity of 5 - Save and Apply - Do the same for another line put but Pack2 for the Package - Open the barcode app and select inventory adjustments - Click on the barcode icon on the top right of the screen - Write SHELF1 and click on apply **Current behavior:** Only 5 unit of your product are displayed (those for Pack1) **Expected behavior:** 10 units should be displayed. The 5 from Pack1 and the 5 from Pack2 **Cause of the issue:** When checking if the line already exists, the package is not taken into account https://github.com/odoo/enterprise/blob/7a132639d6c05ef96d43a48ea34ff11711539fc7/stock_barcode/static/src/models/barcode_quant_model.js#L563-L564 so if a line already exists for the same lot "!currentLine" will be false and the code inside the if statement will not be run https://github.com/odoo/enterprise/blob/7a132639d6c05ef96d43a48ea34ff11711539fc7/stock_barcode/static/src/models/barcode_quant_model.js#L565 resulting in the new line not being added in the barcode app opw-4640303 Forward-Port-Of: odoo/enterprise#83680 Forward-Port-Of: odoo/enterprise#83384
How to reproduce: - Select a Belgian company - Create an invoice for a EU country - Add a line with no product - Display the intrastat report for the invoice period - Export the xml The default sql query allows the selection of account move lines with no product to be able to trigger a warning. Those lines are then filtered out when displayed in the web interface. Those lines were not filtered out when getting data for file exports. An error would trigger rendering the xml as the weight
Original PR description
How to reproduce: - Select a Belgian company - Create an invoice for a EU country - Add a line with no product - Display the intrastat report for the invoice period - Export the xml The default sql query allows the selection of account move lines with no product to be able to trigger a warning. Those lines are then filtered out when displayed in the web interface. Those lines were not filtered out when getting data for file exports. An error would trigger rendering the xml as the weight would be None where an integer is required. This commit adapts the product_type_condition to exclude lines without products when a file is exported. Task 4763185 See opw-4671512, opw-4735439, opw-4642781 Forward-Port-Of: odoo/enterprise#84517
Before This **PR**: If a company attempted to generate a GST token using a GST number already assigned to another company with a valid token, the system returned an ambiguous error: {'message': 'API access is not available or user expiry duration is less than or equal to auth token expiry duration', 'error_cd': 'AUTH4037'}. This caused confusion for users, as the message did not clearly indicate the issue. After This **PR**: A new function has been introduced to check whether another compa
Original PR description
Before This **PR**:
If a company attempted to generate a GST token using a GST number already assigned to another company with a valid token, the system returned an ambiguous error: {'message': 'API access is not available or user expiry duration is less than or equal to auth token expiry duration', 'error_cd': 'AUTH4037'}. This caused confusion for users, as the message did not clearly indicate the issue.
After This **PR**:
A new function has been introduced to check whether another company has the same GST number and a valid token before sending the request. If such a case is detected, the system now displays a warning, recommending the use of a Tax Unit.
**task**-4636041
Forward-Port-Of: odoo/enterprise#84528
Forward-Port-Of: odoo/enterprise#81218Steps to reproduce the bug: - install sales - install subscription - remove any access right to sale from the logged in user - copy a product Traceback is thrown because the product_subscription_pricings have a problem in the access rules as they require sales app access. The user with no sales app can still create a product but not copy it. This is a bug because the user when creating can't set the pricings, so he can create without them but even without them being set he can't copy.
Original PR description
Steps to reproduce the bug: - install sales - install subscription - remove any access right to sale from the logged in user - copy a product Traceback is thrown because the product_subscription_pricings have a problem in the access rules as they require sales app access. The user with no sales app can still create a product but not copy it. This is a bug because the user when creating can't set the pricings, so he can create without them but even without them being set he can't copy. opw-4563733 Forward-Port-Of: odoo/enterprise#84640 Forward-Port-Of: odoo/enterprise#80938
- Add a button to the navbar to allow users to clock in and out (as it's done in latest version). - Fix issue where the printed clock in/out order was empty. Now we remove the clock in/out order after printing it. task-id: 4757307 Forward-Port-Of: odoo/enterprise#84593
Original PR description
- Add a button to the navbar to allow users to clock in and out (as it's done in latest version). - Fix issue where the printed clock in/out order was empty. Now we remove the clock in/out order after printing it. task-id: 4757307 Forward-Port-Of: odoo/enterprise#84593
Forward-Port-Of: odoo/enterprise#84045 Forward-Port-Of: odoo/enterprise#84014
Original PR description
Forward-Port-Of: odoo/enterprise#84045 Forward-Port-Of: odoo/enterprise#84014
Following this commit : - Aggregator name is displayed on KOT i.e Ubereats,Zomato etc. - Since it is an online order, instead of Dine In/ Take out , Delivery/Online should be displayed. - Preparation time is also displayed. Community PR: https://github.com/odoo/odoo/pull/202003 task-4633156 Forward-Port-Of: odoo/enterprise#81559
Original PR description
Following this commit : - Aggregator name is displayed on KOT i.e Ubereats,Zomato etc. - Since it is an online order, instead of Dine In/ Take out , Delivery/Online should be displayed. - Preparation time is also displayed. Community PR: https://github.com/odoo/odoo/pull/202003 task-4633156 Forward-Port-Of: odoo/enterprise#81559