Daily updates from Odoo
Thursday, August 28, 2025
22 changes · 18.0
New functionality added to Odoo
Adds a new Report PDF Options module that lets users choose PDF report settings before printing. This gives businesses more control over report output and can reduce manual rework when producing customer or internal documents.
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
Enhancements to existing features
Point of Sale now groups rapid local data updates before syncing them to the browser database. This reduces repeated background work and can make synchronization smoother when many records change quickly.
Original PR description
Before this commit, each change to `records` triggered a call to `syncDataWithIndexedDB`, which could result in multiple calls to IndexedDB sync. After this commit, the synchronization function is wrapped with a debouncing mechanism, ensuring that rapid updates are grouped together. opw-5025589 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Odoo now treats ZATCA's duplicate submission response for B2C invoices as confirmation that the invoice was already received. This reduces uncertainty after timeout issues and helps prevent invoices from being incorrectly left as unsent.
Original PR description
ZATCA introduced a new response code (409) to handle duplicate invoice submissions for B2C. This is helpful because when the submission timesout, we are left unsure whether ZATCA successfuly received the invoice or not. The next time Odoo tries to send the same invoice, Zatca will respond with a 409 error if it was received earlier. In which case, we mark the invoice as successfully sent. A similar flow applies for B2B, with a response code of 208 for duplicate invoices. However, for B2B, ZATCA accepts the duplicate with a warning instead of an error, So the invoice gets marked as sent in Odoo, and no changes need to be done there. task-id: 4745275 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#223913 Forward-Port-Of: odoo/odoo#223754
Resolved issues and error corrections
Point of Sale now handles loyalty programs that are archived after being applied to an order. This prevents reload errors and helps cashiers continue working smoothly when loyalty settings change in the backend.
Original PR description
Before this commit, archiving a loyalty program while it was actively applied to an order could lead to errors. Specifically, if a PoS order had an active loyalty program applied, and that program was subsequently archived from the backend, reloading the PoS interface would cause issues or prevent proper functionality due to the program's sudden unavailability. opw-4941044 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Vendor bills created from foreign-currency purchase orders now calculate line balances correctly when taxes are included in the price. This prevents accounting discrepancies that could make amounts appear converted at the wrong exchange rate.
Original PR description
**Steps to reproduce** - Setup a foreign currency [CUR] with rate - Create a purchase order - Add [CUR] as currency - Add an order line with price included tax - Confirm and receive - Create Bill - Check generated lines values **Issue** Balance of the move lines will be off, as if it was computed using the wrong conversion rate **Investigation** It occurs because when preparing the move values, the system add the balance calculated from the product price. This does not work for price included taxes, as the balance of the invoice line need to have the tax amount deducted opw-4954649 Forward-Port-Of: odoo/odoo#221952
Returning a regular, non-rental product from a rental order now correctly reduces the delivered quantity on the related sale order. This prevents sales teams from seeing overstated delivery progress after returns in mixed rental orders.
Original PR description
**Issue**: Returning a non-rental product in a rental order does not correctly update the delivered quantity. **Steps to reproduce**: - Enable rental transfers via Settings > Rental. - Create a…
**Issue**: Returning a non-rental product in a rental order does not correctly update the delivered quantity. **Steps to reproduce**: - Enable rental transfers via Settings > Rental. - Create a rental order with (in that order!): - A rental product - A non-rental product - Confirm the rental order. - Open the related sale order. - Go to the delivery and validate it. - Return the delivery and validate the return. - Observe that the delivered quantity in the sale order is incorrect. **Cause**: The [_get_outgoing_incoming_moves](https://github.com/odoo/odoo/blob/ea6776f095d556e3429d2b847a66f78f2e866380/addons/sale_stock/models/sale_order_line.py#L200C17-L200C85) method fails to detect incoming moves when the destination location has `usage='internal'` (as in rental flows), instead of `customer` (see [_is_outgoing()](https://github.com/odoo/odoo/blob/ea6776f095d556e3429d2b847a66f78f2e866380/addons/stock/models/stock_location.py#L464)). This causes the delivery quantity not to be decremented on return. **Solution**: Relax `_is_incoming()` logic to consider moves as incoming if they come from a rental and go to an internal location. opw-4894358
This fixes a point of sale issue where an item removed on screen could still be included in the final order if the page was refreshed before the change reached the server. After a reload, the POS now reloads the server version so staff see the accurate order contents before validation.
Original PR description
Before this commit, it was possible for a removed line to still appear in the validated order on the backend. This happened when a line was removed in the UI but not yet synced with the server, and the page was refreshed. With this commit, the POS ensures that server data is reloaded when the page is refreshed, so that lines not removed on the server are restored in the UI after reloading. opw-4998948 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix makes icon editing more reliable by ensuring spin effects can be undone and toolbar indicators correctly reflect the selected icon’s state. It also fixes color application when text and icons are selected together, so formatting behaves consistently for users.
Original PR description
**Current behavior before PR:** - Applying a spin effect to an icon doesn't not create a history step, which causes the undo functionality to fail. - The spin icon in the toolbar was not highlighted after applying the effect. - When some text is selected along with icon, trying to apply color only affects the icon, the text remains uncolored. **Desired behavior after PR:** Now, - History step is created after adding spin effect to an icon, allowing undo to work properly. - The spin icon in the toolbar is properly highlighted to reflect the applied effect. - This PR removes `color_apply_overrides` from icon_plugin to let color_plugin handle coloring the icons ensuring that the selected text is also colored along with icon. - This PR also makes sure that default 60% opacity is applied when applying solid background color on icons or table cells. task-4794673 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change restores the previous restaurant point-of-sale behavior for tips added after payment when an invoice is selected. It prevents the system from trying to update a protected invoiced payment line, avoiding a broken checkout flow for restaurant staff.
Original PR description
Revert e3c95b9e34388bd059bbe41665ba3d62de0acab5 since it's breaking the flow of tipping after when "Invoice" is checked. Why it's breaking the flow? Because we are trying to update the payment line of an invoiced order, which is prevented by https://github.com/odoo/odoo/blob/3e05005e56bd5c69251ddf13ec6085ce922d8bd4/addons/point_of_sale/models/pos_payment.py#L62
Point of Sale loyalty promotions now correctly handle orders that use multiple free product rewards at the same time. This prevents customers from receiving the wrong free product quantities and helps cashiers apply promotions reliably.
Original PR description
Before this commit, when there were multiple reward lines for free products, adding a combination of those products would result in incorrect claimed free product quantities. opw-4975059 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Exchange returns for products tracked by serial number now create clean replacement receipt lines instead of reusing the original serial numbers. This also corrects stock and forecast quantities after exchanges and limits the exchange return option to relevant incoming or outgoing transfers.
Original PR description
When returning tracked-by-serial products from an incoming picking for an exchange, the exchange move will have selected existing serial numbers for the new incoming picking. This happens because…
When returning tracked-by-serial products from an incoming picking for an exchange, the exchange move will have selected existing serial numbers for the new incoming picking. This happens because `move_orig_ids` is set on the exchange move(s), then `_action_assign()` happens. If there's a `move_orig_ids`, it will use the available move lines from the move_orig_ids and so assign the corresponding serial number. Additionally, the buttons to generate/import serials/lots are invisible because `origin_returned_move_id` is set on the same exchange move(s). Again, the exchange move(s) should be considered 'new' move thus having no origin. task 4893860: Additionally (again), it fixes an issue where on-hand quantities and forecasted quantities of the exchanged product were incorrect after validating the exchange. task 4778066: Finally, this PR also hides the 'Return for Exchange' button for pickings that are neither `incoming` nor `outgoing`. tasks 4748294 (& 4778066 & 4893860) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an issue where loyalty coupon points could be counted more than once if coupon confirmation was retried, such as after an internet interruption. The change helps ensure customers receive the correct loyalty balance and avoids incorrect reward accounting.
Original PR description
Before this commit, if the `confirm_coupon_programs` method was called twice (e.g., due to an internet issue), the loyalty points were calculated incorrectly. This commit fixes the issue by checking the existing loyalty history to prevent duplicate point calculations. To enable this, the creation of oyalty history records has been moved into the `confirm_coupon_programs` function. opw-4877599 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Expense users will no longer lose the analytic distribution they selected when using Save & Close on an expense line. This ensures reporting and cost allocation details are retained consistently, reducing manual rework and data accuracy issues.
Original PR description
**Issue** When creating an expense line, if the user selects an analytic distribution and clicks "Save & Close", the selected distribution is not saved. However, closing the popup with the "X" icon…
**Issue** When creating an expense line, if the user selects an analytic distribution and clicks "Save & Close", the selected distribution is not saved. However, closing the popup with the "X" icon does trigger the save. **Steps to Reproduce** 1. Go to Expenses > Expense Reports 2. Select an employee (e.g., Ronnie Hart) 3. Add a new expense line 4. Set an Analytic Distribution 5. Click Save & Close 6. Observe that the analytic distribution is not retained **Root Cause** The save behavior is triggered by a window click event, but clicks inside modals (like the analytic distribution popup) do not propagate as expected. Because everything within the popup is modal, the click does not satisfy the criteria to trigger saving the data. **Fix** Refine the modal detection logic in the `onWindowClick` handler. Specifically, allow modals that contain `this.widgetRef.el` to trigger the closing (and thus saving) behavior, ensuring that selections made in such modals are not lost when clicking Save & Close. Opw-4765799 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#213996
This update improves Turkish Nilvera e-invoicing compliance by blocking negative invoice lines and correcting how discounts and product identifiers appear in invoice data. It also fixes an access issue so customer checks work for users with standard accounting permissions, reducing errors during invoice processing.
Original PR description
Description of the issue/feature this PR addresses: This PR aims to fix certain compliance issues apparent in the UBL structure of Nilvera. an access right issue was also occurring when account is…
Description of the issue/feature this PR addresses: This PR aims to fix certain compliance issues apparent in the UBL structure of Nilvera. an access right issue was also occurring when account is installed but not account_accountant when doing check_nilvera_customer. Current behavior before PR: - access right error when doing check_nilvera_customer with account_accountant uninstalled. - negative lines were allowed in nilvera invoices and were reflected in the xml document. - StandardItemIdentification displays the products barcode under the invoice line. - multiplierfactor was not reflecting the discount % of the invoice line Desired behavior after PR is merged: - added read access to account module specific groups. - raise a blocking error if there are discount lines in the invoice. - remove the StandardItemIdentification node from the xml document - show discount % in the multiplierfactor task-4907751 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#223136
Point of Sale now rounds combo child item prices using the company currency precision instead of product price precision. This prevents small rounding differences, such as totals showing 31.01 instead of 31.00, and keeps POS totals aligned with Sales.
Original PR description
Currently, when you have a difference in precision between currency and product price, there can be a discrepency in the computation of the line prices, leading to a difference in the price total…
Currently, when you have a difference in precision between currency and product price, there can be a discrepency in the computation of the line prices, leading to a difference in the price total between the sale and pos app. Steps to reproduce: ------------------- * Modify the product precision to have 4 digits * Modify the burger menu combo product * Sale price 26.5 * Burger choice: Cheese burger, remove taxes, change price to 10 * Drinks choice: Coca cola, remove taxes, change price to 10, extra price set to 4.5 * Add another combo choice with 1 product only, no tax, price 10 * Open pos session * Add the combo, select the product that were modified > Total is 31.01 when it should be 31.00 Why the fix: ------------ Point of sale was using the decimal precision set on the product price to compute the price unit of the child lines. We can notice that the sale app was using the currency precision. We will use the same approach as sales. The decision was driven by the fact that 1) both scenarios could make sense, 2) total should be as set, 3) child line prices are not as important as the total and don't have a big influence. opw-4769227
Unbuilding manufactured products now uses the current inventory valuation instead of forcing a match with the original manufacturing cost. When costs changed between build and unbuild, Odoo records a corrective journal entry, helping keep product costs and accounting valuations aligned.
Original PR description
**Current behavior:** Since https://github.com/odoo/odoo/commit/84dda968146d2f3743ab7fc516300e50780725e3, we valuate an unbuild operation by attempting to match the ensuing OUT layer with the IN…
**Current behavior:** Since https://github.com/odoo/odoo/commit/84dda968146d2f3743ab7fc516300e50780725e3, we valuate an unbuild operation by attempting to match the ensuing OUT layer with the IN layer from the original MO. The point being to eliminate a potential valuation imbalance for the manufactured product (might affect cost, etc.). **New behavior** Don't attempt to match an unbuild valuation layer with the original MO valuation layer. If there is some cost difference between build time and unbuild time, make a corrective journal entry for it. **Issue with current behavior** The following sequence: 1. Create Product A with average costing, real-time valuation 2. Create 2 components, avg costing, real-time val 3. Create a BoM for Product A with the components 4. Manufacture 3 units of Product A with different component quantities (can set flexible consumption on BoM) 5. Unbuild the first manufactured unit Results in Product A's cost not matching the expected average cost according to the valuation layers. **Cause of the issue:** Unbuilding the first MO created an out move at the original "build time" cost, but since we've built 2 additional qty, that original cost is not the current average cost- thus the "theoretically current" standard price of the product (sum of layers value divided by remaining qty) is no longer the value we see on the product form. **Fix:** Don't try and match the valuation layers. Aside from issues such as the one described above, it might not actually make functional sense to do so (e.g., FIFO isn't actually adhering to first-in-first-out if we're preferring the original IN layer for an unbuild valuation). Instead we make a journal entry with any excess cost of production (it was actually a solution proposed in the discussion on https://github.com/odoo/odoo/commit/84dda968146d2f3743ab7fc516300e50780725e3 in the first place). Additionally, now that we aren't doing this mapping, we can revert the non-test difference of https://github.com/odoo/odoo/commit/3a69456a291da593748475c86e7efc6234019e47, as this commit was fixing an issue introduced by the change which added the mapping. opw-[4877597](https://www.odoo.com/web#id=4877597&view_type=form&model=project.task) Forward-Port-Of: odoo/odoo#221718
Creating a discussion channel with guest members no longer fails during save. This prevents an error that blocked users from setting up channels that include guests, improving reliability in the Mail app.
Original PR description
Currently, an error occurs when creating a channel that includes guest members. Steps to Reproduce: - Install the `mail` module. - Go to `Channels > New`. - Fill in the `channel name` and `Under…
Currently, an error occurs when creating a channel that includes guest members. Steps to Reproduce: - Install the `mail` module. - Go to `Channels > New`. - Fill in the `channel name` and `Under Members`, add a member with a `guest`, and `save`. `KeyError: 'partner_id'` This error occurs when a user creates a channel and adds a guest in the Members section. This error occurs after [this commit]( https://github.com/odoo/odoo/commit/ad612321bcafe6dfdaabf3aa37f26af364185a69), where the partner_id and guest_id fields dynamically become readonly [1], so that if only the guest is entered, the partner becomes readonly, and when the record is created, the partner_id key does not exist, and raises the error [2]. This commit ensures that the partner_id is accessed only if it is present in the record. [1]- https://github.com/odoo/odoo/blob/5bddf9bfb634d09d3264e4fe4734d75f1083775a/addons/mail/views/discuss_channel_views.xml#L87-L88 [2]- https://github.com/odoo/odoo/blob/5bddf9bfb634d09d3264e4fe4734d75f1083775a/addons/mail/models/discuss/discuss_channel.py#L235 sentry-6791956423 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222211
Website editors can now resize columns and use grid layouts correctly on right-to-left language sites such as Arabic. This reduces layout issues while editing emails or web pages for RTL audiences.
Original PR description
**[FIX] web_editor, mass_mailing: fix resizing columns in rtl mode** This commit fixes issues in edit mode when resizing columns or using grid mode on websites displayed in a right-to-left (RTL) language like Arabic. task-4815296 Forward-Port-Of: odoo/odoo#217338
This fix prevents an error that could occur when a cashier removes an order line and then splits the order while devices are synchronizing. It helps keep point of sale sessions running smoothly across multiple devices without unexpected tracebacks.
Original PR description
In certain case when adding a pos.order.lien then removing it and spliting the order the syncronazation try to delete on the other device already deleted pos.order.line resulting in a traceback Description of the issue/feature this PR addresses: Fix a traceback when spliting an order Current behavior before PR: Traceback Desired behavior after PR is merged: No more traceback Ticket : #4562134
Returning a non-rental item from a rental order now correctly reduces the delivered quantity on the related sale order. This helps keep rental order records accurate after returns and prevents misleading delivery status information.
Original PR description
**Issue**: Returning a non-rental product in a rental order does not correctly update the delivered quantity. **Steps to reproduce**: - Enable rental transfers via Settings > Rental. - Create a…
**Issue**: Returning a non-rental product in a rental order does not correctly update the delivered quantity. **Steps to reproduce**: - Enable rental transfers via Settings > Rental. - Create a rental order with (in that order!): - A rental product - A non-rental product - Confirm the rental order. - Open the related sale order. - Go to the delivery and validate it. - Return the delivery and validate the return. - Observe that the delivered quantity in the sale order is incorrect. **Cause**: The [_get_outgoing_incoming_moves](https://github.com/odoo/odoo/blob/ea6776f095d556e3429d2b847a66f78f2e866380/addons/sale_stock/models/sale_order_line.py#L200C17-L200C85) method fails to detect incoming moves when the destination location has `usage='internal'` (as in rental flows), instead of `customer` (see [_is_outgoing()](https://github.com/odoo/odoo/blob/ea6776f095d556e3429d2b847a66f78f2e866380/addons/stock/models/stock_location.py#L464)). This causes the delivery quantity not to be decremented on return. **Solution**: Relax `_is_incoming()` logic to consider moves as incoming if they come from a rental and go to an internal location. opw-4894358
GSTR document summaries now ignore invoices that no longer have a valid sequence number. This prevents report generation errors and ensures only properly numbered invoices are included in the summary.
Original PR description
_* = l10n_in_reports_gstr_document_summary Issue: - The GSTR document summary included all invoices that were posted or cancelled with posted_before = True. - If a user manually cleared the invoice sequence (set it to null), such invoices were still picked up. - This caused errors during summary generation since those invoices no longer had valid sequence numbers. Fix: - Adjusted the document summary logic to only include invoices with a valid sequence number. - Ensures that entries without a sequence are ignored, even if they were once posted. Impact: - Prevents errors when generating GSTR document summaries. - Guarantees that only valid, numbered invoices are included in reports. opw-5005048
The Luxembourg annual VAT declaration now includes custom tax rates even when they are 0%, preventing rejected ECDF submissions. Employee average fields are also handled as decimal values, improving accuracy in the annual report.
Original PR description
**PROBLEM** 1. In Annexes D and E you can declare custom tax rate. If the custom rate is 0%, this percentage will not be exported into the xml. When submitting the xml to the ECDF, the submission…
**PROBLEM** 1. In Annexes D and E you can declare custom tax rate. If the custom rate is 0%, this percentage will not be exported into the xml. When submitting the xml to the ECDF, the submission will be rejected because the xml doesn't state how much % is the custom tax rate. 2. In Section V, code 110, 108 and 109 should be decimal since they are averages. **STEP TO REPRODUCE** 1. install the l10n_lu module and select the demo lu company. 2. In accouting app, goes to the annual tax report (Accounting/Reporting/Tax Report, select Annual VAT Declaration). 3. Goes to Appendix D or E, and fill code 128, 136, 144, and 162, and leave the custom rate(%) above each of them at 0%. 4. Export to xml (using the little cog thingy). 5. Notice the code 396, 394 149, and 153 doesn't appear in the xml. **CAUSE** 1. Field containing zero are filtered out the xml by default, which is the case of the custom rate (%) fields. 2. Average number of employee during the year is declared in the report data file to be of the integer type. **FIX** 1. Adding custom rate fields to the mandatory fields. 2. Changing type of average employee fields to float. opw-4978365 Forward-Port-Of: odoo/enterprise#91938