Daily updates from Odoo
Wednesday, August 20, 2025
12 changes · 18.0
Enhancements to existing features
Inventory transfers with many serialized items now validate much faster. This reduces timeouts and delays for high-volume warehouse operations by creating related records in batches instead of one by one.
Original PR description
### Description: When using serial numbers, pickings with many move lines can cause performance issues during validation. This is due to `_update_reserved_quantity` updating quantities and creating move lines individually. By moving the creation outside `_update_reserved_quantity`, we can batch create move lines per move, significantly improving performances. ### Benchmark: | N° of mls | Before | After | |-----------|---------|-------| | 500 | 1:37 | 1:34 | | 15000 | Timeout | 3:30 | | 30000 | Timeout | 4:29 | ### Reference: opw-4889581 Forward-Port-Of: odoo/odoo#219471
Vendor refunds can now be auto-completed using related purchase orders or past refunds, similar to how vendor bills already work. This reduces manual entry and makes refund creation faster and more consistent for accounting and purchasing teams.
Original PR description
Before: - Users could auto-complete bills from purchase orders and past bills. - However, the auto-complete feature was not available for refunds; users had to manually create refunds even if a related purchase document already existed. After: - Added auto-complete functionality for vendor refunds. - Now, users can auto-complete refunds from purchase orders or past refunds. Impact: - Improves the user experience for creating vendor bills and refunds. - Reduces manual work for users when generating bills and refunds. task-4975196 Due to stability issues, this feature will be implemented from the master branch instead of version 18.0. See : https://github.com/odoo/odoo/pull/223179
UAE payroll now accounts for days when an employee is outside an active contract. This helps payroll calculations better reflect unpaid gaps and improves accuracy for local payroll processing.
Original PR description
days to UAE payroll task-4700453
Resolved issues and error corrections
Purchase replenishment now reuses an existing purchase order only when its project matches the replenishment need. This prevents items for one project from being incorrectly grouped into a purchase order for another project or into a project-specific order when no project applies.
Original PR description
Steps to reproduce: - Create a storable product: - Vendor: Azure Interior - Routes: MTO + Buy - Click on the replenishment button → a purchase order is created - Open the PO and set a project - Replenish the product again Problem: The first purchase order is reused even though it has a project, while it should not. Solution: When searching for a candidate purchase order, ensure that the `project_id` matches the procurement values: - A PO with a project can only be reused for procurements with the same project. - A PO without a project can only be reused for procurements without a project. opw-4976606
Payment methods set up in a parent company are now visible when working from a child branch. This prevents missing payment details on contact records and helps branch users access the same payment information as the parent company.
Original PR description
In this bug, the payment method is not shown in the child branch. To reproduce: 1- Create a db with account and contact app installed 2- Create a company and a branch 3- Create a payment method in parent company and add it to contact form of a partner 4- Go to child branch. You can see the payment method is not shown in the contact form. opw-4920219
Selling event tickets in Point of Sale no longer loads every registration tied to that event. This avoids unnecessary background work and reduces the chance of errors when processing event sales.
Original PR description
Before this commit, selling an event in PoS would trigger the loading of all event registrations linked to the event. This was unnecessary and caused issues, as it also attempted to load the related PoS order lines, leading to potential errors. opw-4956313 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Attendance overview list now shows only employees who actually have attendance records when grouped by employee. This reduces clutter and helps managers focus on relevant attendance data without changing the Gantt view behavior.
Original PR description
To reproduce: ============= - Activate the "Attendances" app. - Go to Attendances > Overview. - Switch to list view. - Group by Employee. Issue: ====== The current domain fetches all employees…
To reproduce: ============= - Activate the "Attendances" app. - Go to Attendances > Overview. - Switch to list view. - Group by Employee. Issue: ====== The current domain fetches all employees matching the filter, regardless of whether they have attendance entries in the grouped model. https://github.com/odoo/odoo/blob/5b5f0bf795ca538e91f063f2b3185c12b1d0a992/addons/hr_attendance/models/hr_attendance.py#L677 Fix: ==== Restrict the employee list to only those linked to a resource that appears in the grouped data https://github.com/odoo/odoo/blob/5b5f0bf795ca538e91f063f2b3185c12b1d0a992/odoo/models.py#L2360-L2361 The problem is the behavior of gantt view will change it's behavior So we have to applied only to the list. there's something unique when we call it from the gantt which is `gantt_start_date` property that we will use it so we can differentiate between list and gantt view -- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Applicants could hit a 404 error when trying to review and sign an offer if the signing setup used certain custom roles. The fix finds the correct signing access using the user's email address instead, so contract review and signing works regardless of role assignment.
Original PR description
### Problem: Previously, clicking the "Review Contract & Sign" button triggered an RPC call that attempted to retrieve an access token by filtering on the employee role. If the contract did not…
### Problem: Previously, clicking the "Review Contract & Sign" button triggered an RPC call that attempted to retrieve an access token by filtering on the employee role. If the contract did not include this role, the search returned no results, causing the redirection to fail with a 404 error due to the missing token. ### Description about the solution: This commit updates the search domain to look for a record that matches the current user's email address instead. This ensures the correct access token is retrieved, regardless of role assignment. https://github.com/user-attachments/assets/6c8cd892-2d85-4da7-b756-8b3cbf987b60 ### Steps to reproduce the issue: 1) In the Sign application, create a PDF template with a new role and an HR responsible role. 2) In the Recruitment application, create a new contract template and select the PDF template created above. 3) In the contract role field, select the employee as the signatory for the line having newly created role. 4) For any job position, generate an offer for an applicant. 5) Select the contract template created in step 2. 6) Click the "Send By Email" button to send the contract. 7) Open the URL and complete the personal application form. 8) Click the "Review Contract & Sign" button. 9) The system attempts to open the sign document but ends up on a 404 error page. https://drive.google.com/file/d/1aIWJvDlFtd40T5istjKhDvnWFae9wxIM/view opw-4886526
Odoo now creates a device record for every detected IoT network device instead of reusing existing records across the database. This prevents printers from becoming unavailable when Windows IoT boxes report duplicate identifiers or when multiple IoT boxes share a network and one is offline.
Original PR description
We used to create network device records only for network devices that didn't exist in the whole database. This allowed us not to duplicate printer records for clients that had two iot boxes on the same network. We remove this logic as it over complicates the IoT flow and understanding of clients/support. On Windows IoT Boxes, we sometimes get the same identifier for two different printers on two different networks, making the second printer unusable from the db. More, if for some reason a client has two Windows IoT boxes on the same network, and one is off, he won't be able to print through the first one. Backport of odoo/enterprise#92360 Forward-Port-Of: odoo/enterprise#92528
Receipt validation now correctly triggers automatic lot or serial number label printing after a quality check is passed. This prevents warehouse users from missing required labels and also improves completion handling when receipts contain items with and without quality checks.
Original PR description
## Issue: When 'auto_print_lot_labels' is activated on Receipts Operation Type, and you received a product, the print action wasn't trigger when you validate before making the Quality Check The…
## Issue: When 'auto_print_lot_labels' is activated on Receipts Operation Type, and you received a product, the print action wasn't trigger when you validate before making the Quality Check The wizard is automatically opened but when you click on the Pass button, the wizard was closed without sending the print action ## Cause: The action wasn't return by the wizard function 'action_generate_next_window()' making the only action to be a 'act_window_close' ## Note: The state wasn't correctly set to done for all products when you validate pickings both with and without QCs in them at the same time, it should now be fix Enabling Delivery Slip for the Receipts will make the SN to not be print even after disabling the option ## Steps to reproduce: - Toggle the Lot/SN Labels option in the Hardware Tab for the Operation Type Receipts - Create a Product tracked by Unique Serial Number - Add a Quality Check for the Receipts operation - Create a New Receipt for the product - Mark as Done and Add the Serial Number - Validate the receipt and Pass the check - Before the fix, no document was downloaded opw-4790427
Odoo Studio now ignores automatically added helper fields when displaying and arranging views. This prevents invisible system-added fields from interfering with layout editing, helping users make reliable changes in Studio.
Original PR description
…lly added since commit odoo/odoo@6f06420e4a9443c52dc0cb427f8f55eb4aecabce, fields that are present in expression but not in the arch are automatically added. This caused problems in Studio, where those were considered normal nodes, while they should only be there to tell the model what to fetch. This commit aims at not rendering those nodes in a way that prevent them from parasiting the computation of xpaths. opw-4981741
This fix prevents outdated map locations from remaining visible for child contacts after a parent company address is changed. It keeps contact addresses and map markers aligned, reducing confusion when users view customers or companies on the map.
Original PR description
**Issue:** When adding contacts with incorrect address data, the Map View could display outdated or incorrect markers **Cause:** The `partner_latitude` and `partner_longitude` fields were not reset…
**Issue:** When adding contacts with incorrect address data, the Map View could display outdated or incorrect markers **Cause:** The `partner_latitude` and `partner_longitude` fields were not reset for child contacts when the parent’s address changed **Fix:** We added a `partner_latitude` and `partner_longitude` reset when changing address in write We added `partner_latitude` and `partner_longitude` in the _address_fields to update the value each time it can be required, like on address change or contact creation The extension in the _address_fields is there to detect the changes on children synchronization, because it only replace the value that where present in vals for the fields in that list In that way, it will detect more address changes and trigger the write for the children with the corresponding parent `partner_latitude` and `partner_longitude` We also make sure that those extra _address_fields will not be displayed in the formatted address by removing them from `_formatting_address_fields` **Limitations:** One issue remains during import: the parent-child address synchronization is disabled on contact creation This means children may be created with addresses different from the parent’s and have mismatch positions on Map This can be corrected by updating or re-importing the parent to trigger synchronization **Steps to reproduce:** With Form: - Add a parent contact company with a valid address - Add a child contact related to company, with a valid address - Open the Map View, both address must appear on Map - Modify the parent address to remove street (make it invalid) - Check that the child address match the parent one - Check the Map View, before the fix the child should remain with a wrong position With import: Create an import file (an example is in on the ticket) - Add a sheet for the Parent contact with an valid address - Add a sheet to add the Child contact with a parent_Id, with a valid address - Add a sheet to break the address on the parent, removing the street - Open the contacts app - Import the valid Parent and Child sheets (you need to select Related Company / External ID) - Add a filter to get your created contacts - Check the Map View (You should see both parent and child) - Import the Break parent sheet - Check that the child address match the parent one in the Form - Check the Map View, before the fix the child should remain with a wrong position A file can be found on the ticket with pre-made data **Technical notes:** The reset logic is duplicated from the `base_geolocalize` module, because this module is optional and may not be installed in all cases Since `base_geolocalize` is not always present, its `write` override will not be triggered consistently On the other hand, `web_map` is automatically installed with the Enterprise version of Odoo Therefore, it is necessary to implement this fix in at least one of the two modules to ensure the behavior is active when Enterprise is used We chose to keep the override in both `base_geolocalize` and `web_map` to cover both Community and Enterprise cases reliably An alternative approach would be to move the reset logic directly into `res.partner` in the `base` module, making it always available regardless of installed addons and avoiding the duplication opw-4842910 Forward-Port-Of: odoo/enterprise#90392