Daily updates from Odoo
Tuesday, July 15, 2025
18 changes · 18.0
Enhancements to existing features
Point of Sale now loads only the product attribute information it actually needs instead of loading all attributes and related values. This reduces unnecessary data loading and helps keep PoS responsive in databases with many product attributes.
Original PR description
Before this commit, all product attributes were loaded, which in turn loaded all corresponding product template attribute values (PTAVs), regardless of whether they were actually needed. This behavior led to significant performance issues, particularly in databases with a large number of attributes and PTAVs, causing the PoS to become slow and unresponsive. opw-4895204 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
This fix prevents the Point of Sale from crashing when an employee logs in and the page is reloaded without an internet connection. It ensures employee login data is prepared earlier, improving reliability for stores operating with unstable connectivity.
Original PR description
Steps to reproduce: =================== - Enable Login with Employee in POS settings - Open POS and log in with employee - Turn off the internet connection - Reload the POS page Issue: ====== - POS crashes with the following error: `TypeError: Cannot read properties of undefined (reading 'push')` - At that point, employeeBuffer is still undefined Cause: ====== - The method `set_cashier()` is triggered during the parent `setup()` - `employeeBuffer` was only initialized after `super.setup()` - In offline mode, this sequence still executes, leading to an exception when trying to .push() into an undefined buffer Fix: ==== - Moved the initialization of `employeeBuffer` to the beginning of the setup() method Task: 4850543 Runbot Error: 227777
Point of Sale now calculates available lot quantities only from the configured source location and its internal child locations, instead of counting stock from all locations. This prevents staff from seeing or selling quantities that are not actually available for that PoS location.
Original PR description
The get_existing_lots function previously returned product_qty based on stock.lot's computed field, which sums quantities from all locations. This led to incorrect available quantities in the PoS, as it should only consider stock in the configured PoS source location and its child internal locations. opw-4865777 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes a Google Calendar sync issue where an invited attendee could incorrectly become the organizer of an event when starting or resuming synchronization before the original owner. Events now wait for the actual organizer to sync first, keeping ownership consistent between Odoo and Google Calendar.
Original PR description
Before this commit, when an user A is invited by an event of user B and none of these users are synchronized with Google, when the synchronization of user A starts or resumes, the event will be synchronized with the user A as organizer in Google. In the meanwhile, in Odoo, the event ownership will be shown as user B, mismatching the organizer field between the two ends. This is problematic because the ownership of the event will be forever wrong in Google. After this commit, when user A starts or resumes its synchronization with Outlook, previous Odoo events which user A is attendee but not organizer won't be synchronized until the organizer synchronizes its calendar. This will keep the ownership of the event intact in Odoo, and when the organizer synchronizes its calendar with Google, it will be correctly synchronized in Google as well. Recently, we had to revert this PR due to an emergency at odoo/odoo#215449. The issue got solved, so we're adding this fix back. task-4269432
This fixes an issue where Point of Sale orders could receive references containing an incorrect `000` segment when the same session was used on multiple devices. The change keeps order references and other session-based actions consistent by using a reliable login number source.
Original PR description
Before this commit, it was possible for the session to assign `0` as a login number. This resulted in order references containing `000` in the middle, leading to various issues. Additionally, other…
Before this commit, it was possible for the session to assign `0` as a login number. This resulted in order references containing `000` in the middle, leading to various issues. Additionally, other parts of the code that relied on the session's login number were also using an incorrect value. This problem occurred because the `session.login_number` is not stable; it gets updated whenever the PoS session record itself is modified, potentially overriding a valid login number with `0`. The fix involves changing the code to use `odoo.login_number` instead, which provides a reliable and consistent login number. To reproduce the issue: 1. Open one PoS session on two different devices. 2. Log in with an employee on the first device. 3. Log in with a different employee on the second device. 4. Create a new order on the first device. You would observe that the login number in the order reference is `0`. opw-4861456 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Odoo now avoids sending invitation or update emails for calendar events that have already ended. For events synced with Google or Microsoft calendars, reminders are left to the external calendar provider, preventing duplicate or unnecessary notifications.
Original PR description
Prevent sending unnecessary invitation or update emails for events that have already ended by introducing a method to check if an event is over. When an event is synced with an external calendar (Google/ Microsoft), the external calendar is responsible for sending reminders, and Odoo should not send any additional reminders. Recently, we had to revert the two original PRs due to an emergency at odoo/odoo#215449. The issue got solved, so we're adding this fix back. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr task-4684432, 4316693
Regular users can now filter email templates by category without seeing an access error. This fixes a problem in the email sending flow, such as choosing templates for sales or purchase emails, making template selection more reliable.
Original PR description
Since commit 42be7cebc84ac4af36104b6d2eba9d3e5d115005, filtering mail templates on their category triggers a search on `ir.model.data` to avoid a memory error on a database having a lot of mail…
Since commit 42be7cebc84ac4af36104b6d2eba9d3e5d115005, filtering mail templates on their category triggers a search on `ir.model.data` to avoid a memory error on a database having a lot of mail templates. However, regular users don't have a read access to this model, so when a user tries to filter on the template category, they get an `AccessError`. With this commit, we add a `sudo()` on the search on `ir.model.data`, so that this error doesn't occur any more. To reproduce the issue on a runbot, follow these steps: - connect as *demo* on a 18.0 database - open a *Sale Order* or a *Purchase Order*, and click on *Send by email* - in the modal dialog, click on the vertical three dots to select a template - if *Search More...* is not available, save the template several times with different new names until *Search More...* appears on the list - click on *Search More...* - in the *Search...* field, click on one of the *Base Templates* or *Custom Templates* filters - boom! `Access Error, You are not allowed to access 'Model Data' (ir.model.data) records.`
This update fixes several color selection problems in the HTML editor. The color picker now hides correctly when the toolbar scrolls out of view, works reliably with gradient-colored text, and replaces only the relevant gradient when applying a new text or background color.
Original PR description
**Current behavior before PR:** **Issue 1:** - Have a long text content in editable, making the container scrollable. - Select first line of the text, in toolbar open color selector. - Scroll down…
**Current behavior before PR:** **Issue 1:** - Have a long text content in editable, making the container scrollable. - Select first line of the text, in toolbar open color selector. - Scroll down until the toolbar overflows and becomes hidden. - Notice that the toolbar disappears when it overflows its container while color picker remains open, floating at the top of container. **Issue 2:** - Select a text having gradient text color. - Open text color selector, switch to custom color picker. - Notice that hex and rgba fields are empty and user is not able to apply color through it. In colorpicker.js, the convertCSSColorToRgba method fails when attempting to convert a gradient color to RGBA. As a result, colorComponents does not receive valid values and colorpicker doesn't work as expected. **Issue 3:** After merging commit [1], text color can be applied without removing or affecting the existing gradient color. In result, if gradient is fully selected then applying text color creates a new font tag inside gradient instead of replacing the gradient. **Desired behavior after PR:** **Issue 1:** Now, when the toolbar overflows and gets hidden, the color selector becomes hidden along with toolbar. **Issue 2:** Now, if `convertCSSColorToRgba` fails to convert selected color to rgba color then default color `#FF0000`is assigned to color components. This ensures that the colorpicker functions correctly. **Issue 3:** Now, if gradient is fully selected then, - Applying text color removes existing text gradient. - Applying background color removes existing background gradient. - Applying text color doen't remove the existing background gradient. - Applying background color doesn't remove the existing text gradient. [1]: https://github.com/odoo/odoo/commit/938995744b15f345958a2d78a6c844dd5bf1ae6c Enterprise PR: https://github.com/odoo/enterprise/pull/84579 task-4581884 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Invoices automatically created after an online payment now use the invoice email template configured in Sales settings. This ensures customers receive the intended message and keeps automated payment follow-up consistent with company preferences.
Original PR description
When a sales order with online payment is paid, the automatically generated invoice was not consistently using the email template defined by the 'sale.default_invoice_email_template' system…
When a sales order with online payment is paid, the automatically generated invoice was not consistently using the email template defined by the 'sale.default_invoice_email_template' system parameter. This was due to the `_send_invoice` method in `payment_transaction` calling `_generate_and_send_invoices` without passing the configured template. This commit modifies the `_send_invoice` method to retrieve the 'sale.default_invoice_email_template' system parameter. If found and valid, the corresponding mail template record is passed in the context to `_generate_and_send_invoices`, ensuring the correct email template is used for auto-sent invoices after online payments. Added unit tests for the different scenarios. ## Reproduction Steps: 1. **Enable Auto-invoicing:** Go to Sales > Configuration > Settings. Under "Invoicing," enable "Automatic Invoicing." Set a specific email template in "Invoice Email Template" (e.g., "Customer Invoice"). Save. 2. **Configure Payment Acquirer:** Go to Invoicing > Configuration > Payment Acquirers. Activate and configure any payment acquirer (e.g., Bank Transfer). Ensure it's published. 3. **Create Sales Order:** Go to Sales > Orders > Quotations. Create a new SO, add a product, and Confirm it. 4. **Simulate Online Payment:** As a customer, navigate to the SO's public portal link. Click "Pay Now," select the configured acquirer, and complete payment. 5. **Observe the Issue:** Check the communication history on the generated invoice. The email will have been sent using Odoo's default invoice template, ignoring the configured setting. opw-4865475 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an issue where returning an intercompany dropship order could incorrectly increase the delivered quantity on the original sales order instead of reducing it. Businesses will see more accurate sales fulfillment and return tracking for dropship workflows, especially when companies sell to each other internally.
Original PR description
**Current behavior:** Returning an intercompany dropship (product vendor is another `res.company`) increases the original sale order line's delivered qty. **Expected behavior:** The delivered qty…
**Current behavior:** Returning an intercompany dropship (product vendor is another `res.company`) increases the original sale order line's delivered qty. **Expected behavior:** The delivered qty should decrease once the return is completed. **Steps to reproduce:** 1. Create two companies, enable all the inter-company synchronization rules 2. Create a product with the dropship route and set the other company as the vendor 3. Create a sale order for the dropship product, confirm 4. Confirm the corresponding purchase order -> validate the dropship picking 5. Return the dropship picking 6. See the sale order line's delievered qty is wrong **Cause of the issue:** The dropship return move(s) are incorrectly flagged as outgoing. **Fix:** Use the `_is_dropshipped_returned()` method to filter these moves from being considered outgoing. Also added on to an existing dropshipping test so that there is now coverage for this use-case when the vendor is not another company, as this was previously not covered. opw-4526750
This draft fix explores a more reliable way to keep loyalty coupons in sync between different Point of Sale and restaurant sessions. It aims to prevent mismatched or missing coupon information when staff work from multiple POS devices or sessions.
Original PR description
this commit is still in draft form, and is used to try and find a way to fix the synchronization of coupons between different sessions in a stable way. If it's accepted, tests and a clearer message will be made.
Quote PDFs now correctly reflect changes made to quotation templates. If a document is removed from a template after being selected on a quote, it will no longer appear in the generated PDF, preventing outdated or unintended content from being sent to customers.
Original PR description
## Version 18.0+ ## Issue On a quotation setup with a template, when a document is selected in the quote builder and then deleted from the template, it still appears when rendering the quote PDF. ## Steps to reproduce - Create a new quotation template with a header document - Create a new quote using the quotation template: - Under the 'Quote Builder' tab, select the header document - On the quotation template, delete the header document - Come back to the quote - *(Optional: check the 'Quote Builder' tab - it should be empty)* - Print the PDF: - The header appears on the document opw-4712958
This fix updates Turkish Nilvera e-invoice XML so subscription invoice periods are placed at the document level, matching the required UBL TR 1.2.1 format. It also warns users and blocks sending when subscription lines in the same invoice have different date ranges, helping prevent rejected e-invoices.
Original PR description
The UBL TR 1.2.1 format does not support \<InvoicePeriod\> element in invoice lines in the XML generated for e-invoice. This commit moves the \<InvoicePeriod\> element from invoice lines to document level. It also validates that the start and end dates of all subscription invoice lines in one invoice should be same, or else it shows warning and disables the `Send & Print` wizard button TaskId:4885865 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#215819
Invoice summaries now show “Reversed on ...” when an invoice is settled through a credit note rather than an actual payment. This prevents users from mistaking reversals or credit notes for cash or bank payments.
Original PR description
Before this PR: -------------------------------------------------- In the invoice summary, the label `Paid on ...` was always shown whenever the invoice was reconciled, regardless of whether the reconciliation was made through an actual payment (bank/cash) or through a credit note or journal entry. This led to misleading information: - Credit note reconciliation (partial or full) showed `Paid on ...` - Even though no real payment occurred - Full reversals correctly showed status 'Reversed', but the label still said `Paid on ...` After this PR: -------------------------------------------------- - The label is now shown as `Reversed on ...` when the reconciliation is done with credit note. - This avoids confusion and better reflects the actual accounting status of the invoice This change ensures users are not misled by incorrect payment indications when only a reversal or credit note is involved. task-4920349
This fix prevents an error message from appearing when users validate deliveries that print carrier labels through an IoT-connected printer. Shipping labels and related documents can now be sent to the correct printers without confusing on-screen warnings.
Original PR description
When trying to print shipping labels using the iot an error appears on the screen. Although it still allows to print.
Steps to reproduce:
-------------------
* Install fedex
* In operation types, select Delivery Orders then hardware
* In print on validation, enable Carrier Labels and Export Documents
* In the shipping methods, select fedex international
* Change Label format to ZPL11
* Connect the database to an iot box
* Set up the shipping labels to be send on zebra printer
* Create a sale order, using fedex international as shipping
* Confirm the SO
* Select the delivery
* Validate the delivery
> An error is shown, Undefined
Why the fix:
------------
When looking in the console we see a bit more detail about the error.
> send_to_controller(self.connection_type, {'print_id': data['print_id'], 'device_identifier': self.device_identifier})
The module `delivery_iot` was not sending any information related to print_id.
opw-4788871Facebook removed an activity metric that Odoo previously used, causing errors and making other statistics appear as zero. This update stops using that unavailable metric, so Facebook social dashboard statistics remain reliable, though the removed “stories” statistic is no longer shown.
Original PR description
Bug === `page_content_activity` has been deprecated, so the API return an error and the other statistics are set to zero. https://developers.facebook.com/docs/pages-api/changelog Now, the only equivalent is `post_activity_by_action_type`, but it needs to be called on all posts, and it does not support periods (so even if we call it for each post, we won't be able to compute the trend). So we simply removed the `stories` statistics for Facebook. Task-4914555 Forward-Port-Of: odoo/enterprise#89524 Forward-Port-Of: odoo/enterprise#89230
Fixed an issue where shops using an Urban Piper payment method could complete a sale but then be unable to close the point-of-sale session. The closing process now avoids duplicate payment method entries, preventing the session closing screen from freezing or failing.
Original PR description
Currently if setting a urban piper payment method on a shop and using it at checkout will not allow you to close the session. Steps to reproduce: ------------------- * Go in the setting and set up…
Currently if setting a urban piper payment method on a shop and using it at checkout will not allow you to close the session. Steps to reproduce: ------------------- * Go in the setting and set up urban piper (no need for credentials) testing with random keys will do * Go into the payment methods and take one of the urban piper one and assign it to a shop * Open that shop * Place an order and use the urban piper payment method * Validate * Try closing the session > Observation: Nothing happen, we're now unable to select the menu. If doing the same steps but in debug mode, a traceback is shown indicating a duplicate key in a t-foreach Why the fix: ------------ The duplicate key is happening when rendering the closing popup because the function `get_closing_control_data()` was returning twice the information related to the urban piper payment method. Even though urban piper wasn't build with the use case in mind we want to keep it possible. We avoid sending twice the urban piper methods if they were already computed in the super method. opw-4874699
This fix corrects how accident insurance-related days are calculated in Swiss payroll. It helps ensure payroll results and related reporting use the right day counts, reducing the risk of inaccurate employee payroll processing.
Original PR description
Forward-Port-Of: odoo/enterprise#90153