Daily updates from Odoo
Monday, October 20, 2025
27 changes · saas-18.3
Resolved issues and error corrections
Starshipit shipping requests now include the city or suburb information required by some carriers. This prevents services such as NZ Post Domestic from failing to appear, helping businesses offer the correct delivery options to customers.
Original PR description
Current behaviour: --- When using Starshipit, city is not included in the payload sent to the API. This causes an error for some delivery services. Steps to reproduce: --- 1. Install delivery_starshipit 2. Create starshipit Shipping Method (using Starshipit API key) 3. Set up only "NZ Post Domestic" in Starshipit portal. 4. Click on "Select a service linked to your starshipit account" 5. Error: There are no shipping services available Cause of the issue: --- Some delivery services (like NZ Post Domestic) require a city/suburb field. In Australia/New Zealand suburb is used in the city field. opw-5155401 Forward-Port-Of: odoo/enterprise#97212
Bank reconciliation now correctly applies a partial payment when a bank transaction is smaller than the total invoice installments. This prevents invoices from being incorrectly marked as fully paid and avoids creating misleading suspense account balances.
Original PR description
Steps: - Have a payment term making 3 installments (33.33%, 33.33% and 33.34%) - Create and confirm an invoice for $200 with the previously created payment term - Create a bank transaction for $90…
Steps: - Have a payment term making 3 installments (33.33%, 33.33% and 33.34%) - Create and confirm an invoice for $200 with the previously created payment term - Create a bank transaction for $90 -------- Option 1 -------- - Reconcile the statement line with the three invoice lines from the reconcile button on the stmt line itself -------- Option 2 -------- - From the invoice, add the stmt line from the outstanding payments widget -> The invoice is marked as fully paid and the bank entry looks like this: | account | debit | credit | | ------- | ----- | ------ | | Bank account | 90.00 | 0.00 | | Receivable account | 0.00 | 66.66 | | Receivable account | 0.00 | 66.66 | | Receivable account | 0.00 | 66.68 | | Suspense account | 110.00 | 0.00 | It should look like this: | account | debit | credit | | ------- | ----- | ------ | | Bank account | 90.00 | 0.00 | | Receivable account | 0.00 | 66.66 | | Receivable account | 0.00 | 23.34 | This is because we're calculating the partial amount only when looping over the last move line, which result with no partial amount since the transaction amount is already exceeded, therefore we end up adding all the line and balancing it with the suspense account line, which is wrong. With this commit, we add some conditions to check wether the amount is exceeded or will be exceeded, and we calculate the partial amount accordingly. opw-5076498
The customer preview for shared projects now matches what portal users actually see when invoicing is limited to validated timesheets. This prevents customers or staff using preview from seeing draft or unvalidated timesheet entries that should not appear in the portal view.
Original PR description
### Issue: Due to this issue, in the project sharing, the customer preview doesn't reflect the actual behaviour of the portal view. It shows non-validated timesheets even if invoicing policy is…
### Issue: Due to this issue, in the project sharing, the customer preview doesn't reflect the actual behaviour of the portal view. It shows non-validated timesheets even if invoicing policy is validated timesheets only. #### To reproduce: 1- Create a db with sale_project and sale_timesheet_enterprise 2- Configure invoicing policy to validated timesheets only 3- Create a service product: - Create on Order: Project & Task - Invoicing policy: Based on Timesheets 4- Create a Quotation for the product and confirm it 5- Open project from smart button 6- Share project with a portal user with Edit access 7- Open tasks, and add two timesheets to the task 8- Open timesheet app, and validate one of the timesheets 9- From project page, click on Customer preview 10- In preview, open the task. You can see both timesheets which is a different behaviour if you view the project using portal user. Using portal user, only validated timesheets are shown. ### Cause: The timesheets are filtered here to only show validated timesheets: https://github.com/odoo/enterprise/blob/8223ed0765c6064b88280656a5ab6b13ca9a431f/sale_timesheet_enterprise/models/project_task.py#L73-L91 However, it is filtered only if user is portal. In customer preview the user is still the internal user, as a result the timesheets will not be filtered. To fix that we can check if project_sharing_id exist in context to filter timesheets. opw-5093339 Forward-Port-Of: odoo/enterprise#97470
Payment QR codes now use the payment reference in the free communication field instead of the customer reference. This helps ensure payment details match the intended invoice reference and reduces confusion during payment reconciliation.
Original PR description
The aim of this commit is replacing the usage of customer reference for the free communication in EPC SEPA QR Code for the payment reference. task-5122875 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#231401
This fix restores a missing dependency needed for NACHA payment processing. Users creating NACHA payments will once again see the bank account selection field, preventing payment setup confusion or blockage.
Original PR description
Accidentally removed in a061a2b82a967ca2 which caused the bank account selection field to not show when doing a NACHA payment. (Found when working on task 5052996) Forward-Port-Of: odoo/enterprise#97319
Marketing cards will no longer be treated as successfully updated when image generation fails, preventing empty cards from being marked as synced. Campaign changes also now correctly require all related cards, including previews, to sync again so mailings use the latest card content.
Original PR description
If wkhtmltoimage fails for any reason we currently keep going as if an image was actually rendered. Instead if the result of the image render is `None`, raise a generic error. This avoids issues with cards being marked "synced" even though they are actually empty. Additionally, when the campaign gets reused: - preview two records - update cards on a mailing - preview a record again - modify one of the fields on the card - update the cards on a mailing again - the card that was previewed is not updated ALL cards must require sync after a change to the campaign not just active ones. Otherwise they will keep their "synced" status and not be synced when they're selected for update later on. task-5048534 Forward-Port-Of: odoo/odoo#232005 Forward-Port-Of: odoo/odoo#224629
This fixes an issue where names containing non-breaking spaces could cause generated signature images to fail or show incorrect initials. Users can now create valid signatures reliably even when their names include this type of spacing.
Original PR description
Before this commit: Names containing a non-breaking space would break the generated svg file. This is because the inserted ' ' is not valid XML. This also broke the initials signature generation. After this commit: The getCleanedName method actually returns the cleaned name and the signature svg files is correct. Related ticket: opw-4927425 Forward-Port-Of: odoo/odoo#231517
Fixed an issue that could cause an error when refreshing appointment availability based on a selected staff member. This helps customers and staff continue booking appointments smoothly without interruption.
Original PR description
This commit fixes an issue where the refresh with appointment based on staff user was raising a traceback as it also tried to compute the max capacity possible. Related commit 3cca7e47ab58f8a7d4e9196dbf60f7068348216b task-5118860 Forward-Port-Of: odoo/enterprise#95862
Companies using the Turkey and Jordan local accounting setups will again receive a default cash journal when initialized. This restores a compliance-related accounting setup that had been removed during earlier cleanup work, helping affected businesses meet local requirements.
Original PR description
This commits adds back default cash journal for companies intializing with l10n_tr and l10n_jr. In our efforts to cleaning the UX/UI of accounting (PR #192031 task-4430969) We removed the default cash journal, however, some locatizations, such as l10n_tr and l10n_jo, require them for compliance reasons task-4991218 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#231200
Invoices with a small remaining balance will no longer be automatically marked as fully paid when a partial payment is matched from the invoice screen. This prevents unintended write-offs and keeps the remaining amount visible so users can decide how to handle it.
Original PR description
Prevents the system from creating a write-off and marking an invoice as 'Fully Paid' when a partial payment (within tolerance) is reconciled from the invoice form. The invoice status will now correctly remain 'Partially Paid', giving the user control over the remaining balance. task-5114658
Point of Sale barcode scanning now uses the quantity encoded in GS1 barcodes instead of ignoring it. This helps cashiers add the correct product quantity automatically, reducing manual adjustments and checkout errors.
Original PR description
Before this commit, the quantity encoded in a GS1 barcode was ignored when scanning. After this commit, the product will be added with the correct quantity extracted from the GS1 barcode. opw-5126522 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232010 Forward-Port-Of: odoo/odoo#229678
The Point of Sale employee access settings now describe the actual behavior more accurately. This avoids confusion for administrators when configuring which employees can use advanced POS features.
Original PR description
Before this commit, the help text of the advanced_employee_ids field was inconsistent with its behavior, as it was not possible to keep it empty. This commit updates the help to reflect the actual behavior. opw-5112862 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232004 Forward-Port-Of: odoo/odoo#228612
This fix prevents spreadsheet field synchronization from crashing when users use undo or redo actions. It improves reliability for sales management spreadsheets, especially when reviewing or reverting changes.
Original PR description
Fix an issue where field sync would crash when used with UNDO/REDO. Task: 4854879 Forward-Port-Of: odoo/enterprise#92883
Grouping records by multi-select linked fields now follows the same visibility rules as the field itself, including filters and archived-record settings. This prevents users from seeing group headings for records that are not available in the related field widget, making reporting and list views more consistent.
Original PR description
Previously, grouping by a Many2many field did not consider either the field's domain or the field's context (that often contains `'active_test': False`). This caused inconsistent behavior in the web client: users would see groups related to archived Many2many records, even though these records weren't visible in the Many2many widget itself. This commit resolves the inconsistency by ensuring that both the field's domain and the field's context are respected when grouping by Many2many fields. backport of b0f3850aab0578791535e8a802e0ffd7790f3b45 task-4808679 Forward-Port-Of: odoo/odoo#230930 Forward-Port-Of: odoo/odoo#230582
The Planning / Timesheet Analysis report now calculates planned and remaining hours using each employee's actual working schedule instead of assuming a standard Monday-to-Friday week. This gives managers more accurate reporting for employees with part-time or custom calendars.
Original PR description
To reproduce: ============= - set the company calendar to 40h/week (Mon to Fri) - create an employee with a 32h/week working schedule (doesn't work on Fri) - on planning app, create a shift for this employee for ex from 01/09 to 15/09 with 2h allocated - go to Planning / Timesheet Analysis report and check report for this employee on september -> planned hours and remaining hours are wrong Problem: ======== when querying the data for the desired period, we divide the allocated hours by the number of weekdays (Mon to Fri) in the period, but we should divide by the number of working days according to the employee's working schedule Solution: ========= we compute the number of working days based on the resource calendar of the employee and use this number to compute the planned hours and remaining hours opw-5008066
Fixed an issue where shipping labels and related delivery documents could fail to print automatically after validating a delivery. The validation process now includes these print actions directly, making document printing more reliable for warehouse and shipping teams.
Original PR description
The `button_validate` method called clicking "Validate" returns a list of client actions to call. After these clients actions are executed, the page reloads. This reload makes our broadcasted action not to be caught by the client if there is only one connected. Anyway, this flow was overcomplicated and has been simplified overriding the method returning the client actions, adding the "shipping labels" and "shipping documents" to it. Forward-Port-Of: odoo/enterprise#97573 Forward-Port-Of: odoo/enterprise#97462
Point of Sale now applies minimum-quantity pricelist rules correctly when the same lot-tracked product is split across multiple lots. This ensures customers receive the intended price when their combined purchase quantity meets the discount threshold, improving pricing accuracy at checkout.
Original PR description
**PROBLEM** Pricelist rules based on a minimum quantity does not work well with lot tracked product, when the quantity is splitted between multiples lots. For example, if you take 2 product from lot…
**PROBLEM** Pricelist rules based on a minimum quantity does not work well with lot tracked product, when the quantity is splitted between multiples lots. For example, if you take 2 product from lot A, and 3 product from lot B, a rule defining the price for a minimum quantity of 5 will not trigger (it should). **STEP TO REPRODUCE** 1. install pos 2. create a lot tracked product 3. create a pricelist rule for the product, with a price based on min qty 4. from the pos, order the min qty but split it accross multiple lots 5. price will not takethe rule into account **CAUSE** Order line of lot tracked products are never merged. The quantity used to compute if a pricelist trigger is the quantity of each line individually. **FIX** For lot tracked product, to determine the price of a line, we parse find all corresponding lines and add their quantities together. Then we update all of their prices. To know if we should take into account a line, we verify if they would have been merged, if their product wasn't lot tracked. **REMARK** Ideally, their would be a way to merged order line of lot tracked product, while being able to edit the quantity taken from each lot directly from the pos. From now, order line doesn't work well with multiple lots, and it would require unstable change on the db. opw-4751920 Forward-Port-Of: odoo/odoo#230836 Forward-Port-Of: odoo/odoo#219110
The Swedish localization demo data now uses a properly formatted IBAN for the sample bank journal. This prevents confusion or validation issues when users test Swedish accounting workflows with demo data.
Original PR description
This commit replace the wrong `SE0826566594158439377422` IBAN by `SE5850000000014938684140` The actual IBAN of the sweden bank journal demo data is not following the official format, which is: - Country code: 'SE' -> **OK** - Valid checksum digit: '58' -> **OK** - Valid bank code: '5000' -> **KO**, '2656' is not a valid SE bank code - n zeros to fill the IBAN: '0000' -> **KO**, it's missing the zeros - Account number: '14938684140' -> **OK** Linked:https://github.com/odoo/enterprise/pull/95463 task-5107240 Forward-Port-Of: odoo/odoo#232190 Forward-Port-Of: odoo/odoo#230104
This update lets Odoo prepare files before upload, including resizing images so they take up less space. This helps reduce database growth when users upload icons or images through web components such as Studio.
Original PR description
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#231899 Forward-Port-Of: odoo/odoo#226611
App icons created in Studio are now automatically resized before being saved. This prevents oversized images from unnecessarily increasing storage, cache size, and request payloads, helping keep the system lighter and more efficient.
Original PR description
Before this commit, the IconCreator images were sent as is in their full size. Downstream it was problematic because apps' icons were bigger than necessary, bloating the different caches, the database, and the request. After this commit, icon are resized to a max of 64x64 pixels. Forward-Port-Of: odoo/enterprise#97369 Forward-Port-Of: odoo/enterprise#94480
This fix prevents the search bar from automatically focusing on tablet devices, so users are not unexpectedly interrupted by the on-screen keyboard. Autofocus remains limited to phones, and a test was added to help prevent the issue from returning.
Original PR description
This commit fixes the usage of the 'mobile' param in the useAutofocus hook, which incorrectly focused the input on tablets, instead of only enabling it on mobile devices. A test has been added as well to cover this use case. task-5169698 Forward-Port-Of: odoo/odoo#232191 Forward-Port-Of: odoo/odoo#232054
Mobile self-order now shows the correct order after a customer places a new order, avoiding confusion with a previously paid order. Receipts downloaded after refreshing the page also keep their payment details, so customers see accurate proof of payment.
Original PR description
This PR contains 2 small fixes for mobile self order: - **[FIX] pos_self_order: wrong order on confirmation screen** Steps to reproduce: 1. Configure a Self Order POS to use QR menu + ordering 2. In…
This PR contains 2 small fixes for mobile self order:
- **[FIX] pos_self_order: wrong order on confirmation screen**
Steps to reproduce:
1. Configure a Self Order POS to use QR menu + ordering
2. In the mobile menu, make an order and confirm
3. The confirmation screen shows order S001, pay at the counter
4. In the POS, pay and validate the order
5. In the mobile menu, make another order and confirm
Expected behaviour:
- The confirmation screen shows order S002, pay at the counter
Actual behaviour:
- The confirmation screen shows order S001, already paid
The cause of this is that `selectedOrderUuid` is cleared whenever the
`getUserDataFromServer` method is called, even if the server doesn't
return an order to replace it with. The self order service then tries
to find the current order and takes the previously paid order instead of
the new order.
To fix this, we simply don't clear `selectedOrderUuid`. It will still be
overwritten if the server does return new order data.
- **[FIX] pos_self_order: incorrect receipt after refresh**
Steps to reproduce:
1. Configure a Self Order POS to use QR menu + ordering
2. Make an order in the mobile menu
3. Pay and validate the order in the POS using the 'Card' payment method
4. Go to 'My Orders' in the mobile menu, and download the receipt
5. Observe the correct 'Card' payment line is shown on the receipt
6. Refresh the page
7. Download the receipt again
Expected behaviour:
- The downloaded receipt is the same as the first one, with the 'Card'
payment line.
Actual behaviour:
- The downloaded receipt has no payment lines, so it just shows a
negative 'Change' line at the end.
The cause of this issue is that the payment lines and payment methods
used to render the receipt were not being persisted in the indexed DB.
The fix is simply to add these models to the data service options so
that they also get saved locally.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#231910This update makes IoT payment terminal logs more consistent and complete. Businesses and support teams can more easily trace each step of a transaction, helping diagnose payment issues faster.
Original PR description
This PR improves the logging of terminals used with iot box. We will now get a log for every step of a transaction along with some information identifying the transaction Forward-Port-Of: odoo/enterprise#97216
Error messages for US payroll and NACHA payment bank details now use the same field label users see on the bank account form. This helps users understand whether they need to enter an ABA routing number or another clearing number, reducing confusion when fixing payment setup issues.
Original PR description
The label shown in the res.partner.bank form view depends on the show_aba_routing field. If we don't show the correct label in these error messages it's not clear to the user what field they have to fill. task-5052996 Forward-Port-Of: odoo/enterprise#97318
This fix stops password manager browser extensions, such as Bitwarden, from showing an unnecessary popup over the Odoo main menu. The hidden search input now disables browser autocomplete, keeping the menu experience cleaner without changing search behavior.
Original PR description
Bitwarden pops up small form on top of the main menu for no reason. It is because of the hidden input created to trigger search when you type. Put `autocomplete="off"` to avoid these popups, as the search feature handle its own autocompletion. Note: this commit is a backport of odoo/odoo@403d7b70ab16b8b70ea46aa692883c7b4a6e83b7 Forward-Port-Of: odoo/enterprise#97506
Activity feedback on calendar events is no longer added to the meeting description, preventing it from being synced to external calendars or sent as meeting updates. The feedback remains available internally in the chatter note, keeping attendee-facing meeting details clean.
Original PR description
When marking a calendar.event activity as done, one can submit a feedback. Currently, that feedback is logged in the chatter, and is also appended at the end of the meeting's description. As this field is synchronized with external calendars, this may lead to notification / meeting updates. However, this should serve an internal purpose instead, and should not be shared to attendees in that way. Therefore, simply remove this behavior. The feedback will still be found in the note in the chatter. Task-5143141 Forward-Port-Of: odoo/odoo#231670
Failed file uploads in the full email composer are now handled safely instead of causing an error screen. This keeps users in their workflow when an attachment upload does not complete successfully.
Original PR description
Before this commit, when a file upload in the full composer would be fail, it would result in a traceback. This happens because we would try to access the attachment resulting from the upload, which is however undefined when the upload fails. This commit fixes the issue by guarding the access of said attachment. task-4778468 Forward-Port-Of: odoo/odoo#231219