Wednesday, September 3, 2025
15 changes · 18.0
New functionality added to Odoo
This adds the ability to generate rendered reports through an API, making it easier to connect Odoo reports with external services. Businesses can automate sharing documents such as invoices through different customer communication platforms.
Original PR description
Desired behavior after PR is merged: Allow users to get a render report by API to integrate different services. Ex: Get an invoice report to send to different customer by any platform --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
When a POS user searches for a customer and finds no match, the Create form now carries over the search text automatically. This reduces duplicate typing and helps staff add new customers more quickly by placing names or phone numbers in the right field.
Original PR description
If a user searches for a partner and no match is found, clicking "Create" will now automatically transfer the search term into the appropriate field (name or phone) in the creation form. The matched input is also auto-focused. Task-4991076 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
Enhancements to existing features
Odoo can now send message reactions made by users through WhatsApp, so customers see those reactions in their WhatsApp conversations. This keeps conversations more consistent across Odoo and WhatsApp and avoids missing customer-facing context.
Original PR description
Add support for sending reaction type messages via the WhatsApp API by introducing the `reaction` message type in the WhatsAppApi. This resolves the issue where reactions made by Odoo users are not reflected in the customer's WhatsApp conversation. API Documentation: https://developers.facebook.com/docs/whatsapp/cloud-api/messages/reaction-messages Task-4828394 Forward-Port-Of: odoo/enterprise#88520
Resolved issues and error corrections
The time off module now calculates mandatory leave days correctly when one or multiple leave requests involve one or multiple employees. This helps HR teams get accurate leave balances and avoid incorrect mandatory day counts.
Original PR description
- Fixed the calculation of leave mandatory leaves to account for one or multiple leaves for one or multiple employees Task-4804618 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#223349
This fixes a crash that could occur when employees had overlapping time off dates with different public holiday settings. HR teams can now update public holidays without disrupting approved leave records in these cases.
Original PR description
When two timeoff (one with Ignore Public Holidays and the other without) have the same dates, if you modify a public holidays that happend during that time, it will trigger a traceback. Steps to…
When two timeoff (one with Ignore Public Holidays and the other without) have the same dates, if you modify a public holidays that happend during that time, it will trigger a traceback. Steps to reproduce: ------------------- * Marc demo and Abigail Peterson using the same calendar * Create a "Paid time off" leave for marc demo: June 19 - June 20 * Create a "Extra time off" for abigail: same date * Update Time off type "Extra Time Off" to "Ignore Public Holidays" * Approve both leave request previously created * Create public holidays on June 19 --> traceback Observation: When both time off have the same dates it will overide the value in the dictonary https://github.com/odoo/odoo/commit/0d846ecd1ec7ff5149d580d3494b1a4bab1e68d2#diff-38469def2f870bb866f971f57797dd7c21b6a95d52a8eae72f832f0eea2434f9R464 and when it will try to call the employe_id it will trigger the traceback https://github.com/odoo/odoo/commit/f72ac3a14d76d4fb53ec3a092d08afafe4c35888#diff-38469def2f870bb866f971f57797dd7c21b6a95d52a8eae72f832f0eea2434f9R561 Why the fix: ------------ Added a new key on work_days_data to avoid the collision of two similar timeoffs. opw-4933820
This fixes a problem where some IoT boxes could be rejected when connecting to older database versions after an automatic version alignment. The system now sends both possible device identifiers, allowing existing boxes to be recognized and updated instead of being treated as a different device.
Original PR description
We are currently experiencing a bug with the image 25_07 build on saas-18.4 In this version the "identifier" used in iot app is the iot box's serial number In versions < 18.4 the identifier used is the iot box's mac address When connecting to a database in version 18.3 or less, the iot box: 1) Calls send_all_devices --> create a new iot box in the database with identifier = serial number 2) Runs git checkout to align itself to the database version 3) Calls send_all_devices again, this time with identifier = mac address 4) The database ignores the request because it considers it a new iot box with a different token This PR fixes the issue by sending both mac address and serial number to the database If the database has an iot box with the corresponding serial number as an identifier, it updates it. Enterprise PR: https://github.com/odoo/enterprise/pull/93657 Forward-Port-Of: odoo/odoo#225043
Reducing a subcontracted receipt to zero no longer cancels every related manufacturing order. This keeps the subcontracting process recoverable, so users can adjust the receipt again without breaking the purchasing and production flow.
Original PR description
Steps to reproduce:
- Unarchive subcontracting operation type
- Create a storable product P1 with a BoM:
- BoM type: Subcontracting
- Subcontractor: Azure Interior
- Component C1 (route: Resupply Subcontractor on Order)
- Create a purchase order:
- Vendor: Azure Interior
- 10 units of P1
- Confirm the PO → 2 pickings are created:
- Resupply of 10 units of C1
- Receipt of 10 units of P1
- Confirm and validate the resupply of C1
- Components are reserved in the subcontracting MO
- Validate the consumption of 10 units in the receipt
- The MO is updated to 10
- Update the quantity of P1 to 0 in the receipt
Issue:
The manufacturing order is cancelled. As a result, subsequent updates on the receipt cannot recreate MOs.
Fix:
When reducing the receipt quantity, cancel only the extra MOs, but always keep at least one open MO if a subcontracting move is still ongoing.
opw-4792379
Forward-Port-Of: odoo/odoo#223858This change restores support for customized website editing permissions used on odoo.com, especially cases where users can edit only certain pages. It temporarily backs out a previous logic change while keeping the related test disabled until a more complete solution is found.
Original PR description
*: test_website This reverts commit [1]. Indeed, while it fixed the bug as intended while keeping the `_check_user_can_modify` feature, it apparently did not keep that one working in all cases: having partial view edition rights for some website.page (see uses in our Odoo.com customizations). While searching for a solution allowing to keep the fix of [1] and the whole purpose of `_check_user_can_modify`, the logic part of [1] is reverted, keeping the test but disabled. [1]: https://github.com/odoo/odoo/commit/8c41c147a4c6a415e7c5bfdde9297edbf40b4239 Forward-Port-Of: odoo/odoo#225160
Installing Accounting with German localization and demo data could fail because cleanup of demo records was incorrectly stopped by audit trail protections. The fix allows the expected chart template unload process to proceed, so new demo databases can install Accounting successfully.
Original PR description
When installing the Accounting app on a new database created with Germany as country and with demo data loaded, the demo loader invokes in `account/demo/account_demo.xml` the `<function name="try_loading">` call which does a wholesale `records.with_context({MODULE_UNINSTALL_FLAG: True}).unlink()`. This cascades into deleting mail.message records, but the audit‑trail hook in only bypasses its check when the `bypass_audit` token is present not when `MODULE_UNINSTALL_FLAG is set causing a “You cannot remove parts of the audit trail” UserError.
Steps to reproduce:
- Created new database, with Germany as country
- Install l10n_de
- Download demo data
- Attempt to install Accounting application ! Receive error message
OPW- 4712364
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prSelf-order kiosk table numbers are now preserved when an order is reopened and edited in the Point of Sale. This prevents preparation displays from replacing the customer-entered table number with a generic “IN” label, helping staff route orders correctly.
Original PR description
**Problem:** When making a purchase in the self order and put a table_stand_number, which is the table number you have to fill at the end of the order, it is displayed in the…
**Problem:** When making a purchase in the self order and put a table_stand_number, which is the table number you have to fill at the end of the order, it is displayed in the *pos_preparation_display*. But when loading this said order in the PoS, changing the order (like adding a note) and ordering it again, the table number is replaced by *IN*. **Steps to reproduce:** - Make a purchase in the kiosk - Put a table number at the end of the order - Go to the pos_preparation_display, it is displayed - Go to the PoS session of the Kiosk and load the order - Change the order by adding a note to it and order it again - The table number is replaced by IN in the pos_preparation_display **Why the fix:** The field *table_stand_number* was not given to PoS in any case, which means that when reloading the order and saving it again, it saved it without the *table_stand_number*, as it was never loaded. As it was never loaded, it went back to the fallback, which is writting *IN* if the table_stand_number was undefined. It is now loaded if the pos_self_order is installed, so that we can keep on showing the table number as it should be. opw-4943404 Forward-Port-Of: odoo/odoo#220869
This fixes an issue where changing the scheduled date for one product line on a receipt could unintentionally change the dates for other product lines. The change helps warehouse teams keep individual receipt schedules accurate when delivery features are installed.
Original PR description
### Steps to reproduce: - Install stock_delivery - Create and confirm a receipt for 2 products: - 1 x P1 - 1 x P2 - Modify the scheduled date of P1 to the day before - Save the picking #### Expected…
### Steps to reproduce:
- Install stock_delivery
- Create and confirm a receipt for 2 products:
- 1 x P1
- 1 x P2
- Modify the scheduled date of P1 to the day before
- Save the picking
#### Expected behavior:
The scheduled date of the picking is updated but not the one of the other move.
#### Current behavior:
The the move scheduled date is also updated.
### Cause of the issue:
Modifying the scheduled date of the move will trigger a call of the onchange on the picking because the `stock_move_ids` field has changed via a `Command.update` on its scheduled date:
https://github.com/odoo/odoo/blob/697278b2e86e5e4ccf53e0d8ead172e3e2a01eea/addons/web/static/src/model/relational_model/record.js#L1214-L1219 However, this onchange will trigger a call of the
`_compute_scheduled_date` on the new records to determine if its value has changed and set the scheduled date of the picking to one day before: https://github.com/odoo/odoo/blob/697278b2e86e5e4ccf53e0d8ead172e3e2a01eea/addons/stock/models/stock_picking.py#L846-L851 This is problematic because since each of these changes happen before the save of the real record, the inverse method of the scheduled date will be called and set the scheduled date of the other moves at save: https://github.com/odoo/odoo/blob/697278b2e86e5e4ccf53e0d8ead172e3e2a01eea/addons/stock/models/stock_picking.py#L897-L901
### Note:
This is not reproducible without `stock_delivery`, changing the scheduled of a `move_ids_without_package` will only trigger the onchange of the `stock.picking` model (and hence the compute on the new records) in case the `move_ids_without_package` is flagged as `onchange=1` by the `get_view`:
https://github.com/odoo/odoo/blob/c9e8a802315be27a076ae677b9191c075e4c239d/odoo/addons/base/models/ir_ui_view.py#L1218-L1225 But, since `move_ids_without_package` do not have `_onchange_methods` they will only be flagged as such if they are in the dependencies of a field present in the view:
https://github.com/odoo/odoo/blob/c9e8a802315be27a076ae677b9191c075e4c239d/odoo/models.py#L7363-L7370 This is the case as soon as `stock_delivery` is installed because of the `is_return_picking` field:
https://github.com/odoo/odoo/blob/c9e8a802315be27a076ae677b9191c075e4c239d/addons/stock_delivery/models/stock_picking.py#L37-L38
opw-5017423
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#224986Imported vendor bills created from consolidated inter-company invoices now correctly connect to the related purchase orders. This helps users see the right purchase order links on bills when multiple orders are combined into one invoice.
Original PR description
## Issue: In a multi-company setup with Inter-Company Transactions set to Sales Orders and Purchase Orders, after creating two Sales Orders from one company to the other, then generate a Consolidated…
## Issue: In a multi-company setup with Inter-Company Transactions set to Sales Orders and Purchase Orders, after creating two Sales Orders from one company to the other, then generate a Consolidated Invoice for both SO, and import it as Vendor Bill in the client Company, the bill isn't linked to the matching Purchase Order ## Cause: The `invoice_origin` is used to get the references, but it doesn't split causing the purchase's name to search in `_match_purchase_orders()` to be ["P00001, P00002"] instead of ["P00001", "P00002"] https://github.com/odoo/odoo/blob/2718aaa7397e38be0fcd64fe6b5ef5c0be66cfe2/addons/purchase/models/account_invoice.py#L373-L374 ## Steps to reproduce: - Enable Inter-Company Transactions for Sales Orders and Purchase Orders in two Companies - Create and Confirm two Sales Orders from one company to the other one - Create a Consolidated Bill for both S0 - Send the Invoice (Download) - Switch to the second Company - In Purchase, Confirm both RFQ - In Accounting > Vendor > Bills, Upload the downloaded bill - The Smart Button isn't linked to the PO Ticket [link](https://www.odoo.com/odoo/project/967/tasks/4690707) opw-4690707 Forward-Port-Of: odoo/odoo#223398
Users can now cancel a deletion confirmation and click delete again on the same item without the dialog getting stuck. This restores expected behavior for deleting items such as project subtasks and product attribute values, reducing confusion and failed deletion attempts.
Original PR description
### Description of the issue/feature this PR addresses: Behavior in <= v17.4: The onclick method for the delete button in the one2many list calls the `onDeleteRecord` method. This is inherited by the…
### Description of the issue/feature this PR addresses: Behavior in <= v17.4: The onclick method for the delete button in the one2many list calls the `onDeleteRecord` method. This is inherited by the model-specific list renderer components to insert the deletion confirmation dialog before calling super which sets the clicked data attribute to be true. In this case, we display the dialog before setting the button as clicked. Behavior in v18: The onclick method for the delete button in the one2many list calls the `onRemoveCellClicked`. This method sets the clicked as True and then calls the `onDeleteRecord` method that is inherited by the various model-specific list renderer components to insert the Confirmation Dialog. In these cases, the dialog is called after we set the 'clicked' data-attribute on the delete button to be True. Hence now we are unable to click on the same button again due to it being in the clicked state. ### Current behavior before PR: [Deletion Dialog does not reopen](https://github.com/user-attachments/assets/29b6c2c7-553b-4745-a20b-26a470952a01) 1. Try to delete a record of Project Subtask or Product Attribute Value 2. This would open the Deletion Confirmation Dialog box 3. Click on cancel 4. Try to delete the same record again Result: Nothing happens and the confirmation dialog does not show up again for the second time ### Desired behavior after PR is merged: If user attempts to delete any record that opens the confirmation dialog and then cancels it, the user is able to delete it as the confirmation dialog box is no longer disabled after spawning once. opw-4731375 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Danish Intrastat and EC Sales List reports now round values to whole units where required for official reporting. Users can still view decimals in the interface when needed, while government export files are consistently rounded for compliance.
Original PR description
This commit will change the options of the reports so that we have a rounding in units since the intrastat and ec sales list report must be rounded. This solution still allows people to have the report with decimals if needed task-4948271 Forward-Port-Of: odoo/enterprise#91268
This update prevents IoT boxes from being treated as new devices when they connect to older database versions after a software image update. By matching both the serial number and MAC address, existing IoT boxes keep their connection and avoid duplicate or ignored registrations.
Original PR description
We are currently experiencing a bug with the image 25_07 build on saas-18.4 In this version the "identifier" used in iot app is the iot box's serial number In versions < 18.4 the identifier used is the iot box's mac address When connecting to a database in version 18.3 or less, the iot box: 1) Calls send_all_devices --> create a new iot box in the database with identifier = serial number 2) Runs git checkout to align itself to the database version 3) Calls send_all_devices again, this time with identifier = mac address 4) The database ignores the request because it considers it a new iot box with a different token This PR fixes the issue by sending both mac address and serial number to the database If the database has an iot box with the corresponding serial number as an identifier, it updates it. community PR: https://github.com/odoo/odoo/pull/225043 Forward-Port-Of: odoo/enterprise#93657