Friday, August 29, 2025
59 changes
21 changes
Resolved issues and error corrections
This fix prevents open dialog windows from getting out of sync when one dialog is closed more than once. Users can now continue and close remaining dialogs normally, avoiding stuck windows and potential crashes during employee holiday attest workflows.
Original PR description
Have two dialogs opened, call twice `close` on one of them. From that point, the `stack` in dialog_service is empty (because the second time, the dialog can't be found in `stack`, so its index is -1,…
Have two dialogs opened, call twice `close` on one of them. From that point, the `stack` in dialog_service is empty (because the second time, the dialog can't be found in `stack`, so its index is -1, and calling `splice` with -1 removes from the end of the array), even though one of the 2 dialogs is still displayed. From that point, calling closeAll does not close the remaining dialog. In practice, this can be reproduced in Employees > Laurie Poiret (must be in BE company). In the cog menu, click on "Departure: Holiday Attest". In the dialog, click on the external button of the many2one. Close the second dialog by clicking on the X. At this point, `close` has been called twice for that dialog (once by the click on the cross, and once by an override of `dialogData.dismiss` in FormViewDialog), and `stack` is thus empty. Clicking on an action button in the first dialog (e.g. "Validate & Compute holiday attests") then no longer closes the remaining dialog as it should (as `closeAll` is called by the action service). Then, a crash can occur when manually trying to close that dialog, as the view in the background no longer exists, and closing the dialog calls its `onClose` callback, which tries to reload the view, thus leading to the "Component is destroyed" error. Issue introduced by https://github.com/odoo/odoo/pull/203169 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#224792
Fixes color selector issues in the HTML editor so floating color menus close properly when the toolbar is hidden. It also makes color changes more reliable for text using gradients, preventing confusing or broken color picker behavior.
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 Forward-Port-Of: odoo/odoo#221381 Forward-Port-Of: odoo/odoo#202889
Google Merchant Center shipping price calculations now avoid overusing external carrier quote requests. This helps prevent hitting daily carrier rate limits, such as DHL limits, while keeping product shipping information available for online sales channels.
Original PR description
### Issue: The `Google Merchant Center` calls the method `_prepare_gmc_shipping_info` in order to compute the best shipping price for each published product in each possible country: https://github.com/odoo/odoo/blob/1ac89eb71aab48fa8d50fbae01d96bec23d88418/addons/website_sale/models/product_product.py#L352-L361 To achieve this, the method will request the shipping rate for each possible carrier, product, country. However, for external carriers, each such combination will require a request to the external api via the `rate_shipment`: https://github.com/odoo/odoo/blob/1ac89eb71aab48fa8d50fbae01d96bec23d88418/addons/website_sale/models/delivery_carrier.py#L44-L53 This is problematic as external carriers have a standard rate limit (maximal amount of rate requests allowed per day). For instance DHL standard rate limit is 250 requests per day. opw-5048969 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#224649
This fixes exchange returns so serial-tracked products are treated as new incoming items instead of reusing existing serial numbers. It also corrects stock quantity calculations after exchanges and only shows the exchange return option where it is relevant.
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 Forward-Port-Of: odoo/odoo#224696 Forward-Port-Of: odoo/odoo#216111
The payroll leave handling now avoids changing work entries that have already been validated. This prevents installation or payroll setup failures when overlapping leave entries are processed, helping keep approved payroll-related records stable.
Original PR description
This logic of solving the overlapping between leave work entries has been adjusted to prevent editing the entries marked as validated. This error appears in the installation in task #4921300. You can refer to the error here: https://runbot.odoo.com/runbot/build/87127472 To reproduce: -Fake time a date in the future, for example :"2025-09-05 UTC". -Install the needed modules with demo data: -i "hr_payroll,project_timesheet_holidays" --with-demo.
This fixes an issue where a customer’s selected pricelist could change incorrectly when an individual contact was linked to a company. Sales quotations now keep pricing consistent between the individual and their company, reducing pricing mistakes and manual corrections.
Original PR description
Versions -------- - 18.0+ Steps ----- 1. Create an individual partner; 2. assign them a pricelist A; 3. create a new company partner for them; 4. create a new pricelist A & sort it on top; 5. open a…
Versions
--------
- 18.0+
Steps
-----
1. Create an individual partner;
2. assign them a pricelist A;
3. create a new company partner for them;
4. create a new pricelist A & sort it on top;
5. open a new quotation;
6. set new company as customer;
7. change customer to the individual partner.
Issue
-----
The quotation's pricelist changed from B to A. The pricelist used for the individual should be identical to the one used for their company.
Cause
-----
Commit de302c2d36305 added the `specific_property_product_pricelist` field to `res.partner`, as the way company-dependent fields are managed was changed on the database-level.
Commit 67cf577cd0a0 added the `_company_dependent_commercial_fields` method to enable syncing company-dependent commercial fields. The base method fetches all fields retrieved via `_commercial_fields`, and selects those whose `company_dependent` attribute is `True`.
In previous versions, the `_company_dependent_commercial_fields` override in `product` adds `property_product_pricelist`, as this field does not have the `company_dependent` attribute set, but it behaves as a company-dependent field. Starting from 18.0, the override adds `specific_property_product_pricelist` instead, which does have the `company_dependent` property set.
As a consequence, when `_company_dependent_commercial_sync` gets called, it does not sync the `specific_property_product_pricelist` as it's not included in the `_commercial_fields` override, nor does it sync when retrieving it from `_company_dependent_commercial_fields`, as it skips the current company, assuming the field was already handled by `_commercial_sync_from_company`: https://github.com/odoo/odoo/blob/c40760244d128cb57e11a233e89a93dd92b8fb56/odoo/addons/base/models/res_partner.py#L667-L668
Solution
--------
- Move `specific_property_product_pricelist` to `_commercial_fields`
- This enables it to sync in `_commercial_sync_from_company`
- Remove the `_company_dependent_commercial_fields` override
- `property_product_pricelist` shouldn't get synced by itself
- `specific_property_product_pricelist` is already included by the base method
opw-4988736
Forward-Port-Of: odoo/odoo#224133
Forward-Port-Of: odoo/odoo#222223This fixes an issue where archiving a loyalty program that was still applied to a Point of Sale order could cause errors when the POS interface was reloaded. Businesses can now archive old loyalty programs without interrupting checkout operations or affecting existing active orders.
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 Forward-Port-Of: odoo/odoo#218814
Early payment discounts are now applied based on the discount deadline saved on the posted invoice, not on later changes to the payment terms. This ensures customers keep the discount eligibility that was communicated to them when the invoice was issued, improving consistency in payment registration and reconciliation.
Original PR description
When a payment term with early payment discount is used on invoice the discount date is set on the payment term line based on the actual configuration of the payment term. When the invoice is posted,…
When a payment term with early payment discount is used on invoice the discount date is set on the payment term line based on the actual configuration of the payment term. When the invoice is posted, this date must not change anymore as it usually is what is communicated to the partner in order to apply EPD. However, if the payment term's delay for discount is modified, the discount date from the move line was not taken into account by the payment register wizard or by the reconciliation widget, as it was instead recalculating a discount limit date, based on the configuration of the payment term at the time the payment is registered on Odoo. Make sure it is the discount date that is stored on payment terms' account move line that is used to define if an early payment discount has to be applied. OPW-4895365 Description of the issue/feature this PR addresses: On runbot, create a new payment term with an early payment discount (eg 10% at 15 days, balance at 30 days). Create a customer invoice with a invoice line (eg 100 USD) for any customer with this payment term and set the date to 10 days before today. Post the invoice, you can see on the payment term line that the discount is valid until 5 days after today. Modify the payment term to set 10% at 5 days. If you go back to the invoice, you'll notice the discount date is still 5 days after today which is fine since this is what was communicated to the customer Current behavior before PR: Register a payment on this invoice and you'll notice the EPD is not applied because it gets the date from the actual configuration of the payment term instead of the date stored on the invoice's payment term line. Desired behavior after PR is merged: Register a payment on this invoice must apply the EPD as it is still valid based on the invoice's payment term line. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#224044 Forward-Port-Of: odoo/odoo#215615
This fix prevents draft point-of-sale orders from being synchronized when a cashier validates another order after selecting a customer. It helps avoid unwanted draft orders appearing in the system and keeps sales data cleaner.
Original PR description
Before this commit, in a non-restaurant PoS, when selecting a partner in a draft order, validating an order would also sync the draft order. opw-5037759 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#224041
This fixes an issue in Email Marketing where templates saved from a mailing were not shown as choices when creating a new mailing. Users can now reuse saved email content as expected, reducing duplicate work and confusion.
Original PR description
Step to reproduce: - install email marketing and open it - create a new record, add name and add something in email body - click on "Add to Templates" - click on new Observation: - The newly created template is not shown as option for new record. Cause: - https://github.com/odoo/odoo/pull/205486 convert arrays value to object, [exact change](https://github.com/odoo/odoo/commit/f79b2edb614fd08b19b18beeb16be38743f637b2#diff-0b4e81825324dc36e89543232f3f8f8704acddc4ec21031c6ccea78ee93b00eeR368-R379) but in this case, we actually return values_list, i.e. a tuple for m2o fields https://github.com/odoo/odoo/blob/ea1767e3a016f501d5bc4012cc5e964fc05955a3/addons/mass_mailing/models/mailing.py#L816-L834 - Hence, using a key evaluates to `undefined` - so, the values return by `action_fetch_favorites` are not rendered Fix: - use index instead of keys opw-4960103 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Point of Sale now shows a clear Access Denied popup when a user lacks permission to load sample POS category data, instead of failing with a technical error. This helps store administrators understand the permission issue and avoid confusing crashes when opening a POS session.
Original PR description
Currently, an error occurs when a new user with the Member role and Administrator rights for the Point of Sale app attempts to open POS Category. Steps to reproduce: --- - Install the `point_of_sale`…
Currently, an error occurs when a new user with the Member role and Administrator rights for the Point of Sale app attempts to open POS Category.
Steps to reproduce:
---
- Install the `point_of_sale` module (without demo data).
- Create a new User and give Administrator rights for POS & Accounting
- Now log in with a new user in a different browser
- Open the pos session(Clothes or bar)
Traceback:
---
```py
AccessError: You are not allowed to modify 'Product Category' (product.category) records.
This operation is allowed for the following groups:
- Products/Admin en Products / Create
Contact your administrator to request access if necessary.
ParseError:while parsing /home/odoo/src/odoo/saas-18.3/addons/point_of_sale/data/scenarios/clothes_category_data.xml:5, somewhere inside <record id="product_category_clothes" model="product.category">
<field name="name">Clothes</field>
</record>
```
This commit prevents the error by displaying an "Access Denied" pop-up when a user with the "Member" role and Administrator rights attempts to open the POS Category.
sentry-6683335275, 6679363278, 6823710988
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#215429This fixes an issue where changes to a company’s Peppol email address were not being sent to the external Peppol service. Businesses can now rely on email updates made in the configuration wizard being properly applied, helping keep electronic invoicing contact details accurate.
Original PR description
Due to the config wizard email address field being a related field, and the control flow triggering actual API update only on gets hit when the wizard's email is different from company's email, this control flow never triggered. The email field in peppol config wizard is a related field to companies peppol email, so the API update ran only if the wizard's email differed from the company's email. Since both were always the same by definition, the update never triggered. Depends on https://github.com/odoo/iap-apps/pull/1167 no-task Forward-Port-Of: odoo/odoo#224615
Stopping a timesheet timer now matches the entry to the user's local calendar date instead of the UTC date. This prevents time from being added to the previous or next day for users working across time zones, improving accuracy in timesheet records.
Original PR description
Before this commit, if you were to log time on a timesheet using the timer start and stop buttons, you could potentially log time for the previous day's or the upcoming day's timesheet entry. This is because we were searching for previously-created timesheet entries based on the UTC Date of the timer's "stop" time. This fix uses the client's local time to get the Date of the timer stop. With this, we'll only find timesheet entries with the `date` field matching the client's local Date. opw-4967487 Forward-Port-Of: odoo/enterprise#93356 Forward-Port-Of: odoo/enterprise#92569
Swiss payroll sheet calculations no longer unnecessarily recalculate wage-related values after the occupation period is recomputed. This prevents manual payroll adjustments from being overwritten, helping payroll teams keep intentional corrections intact.
Original PR description
Following changes in 18.4, compute sheet introduces a recomputation of occupation period which introduces a recomputation of wages, this recomputation is not necessary as it overrides all introduced manual change.
Subscription invoices created after portal payments now trigger the required electronic document signing process. This restores expected government-compliant invoicing for customers using localized EDI flows, such as Mexican invoice signing.
Original PR description
## Steps to reproduce: - Make sure the Mexican localization is installed and properly set up for signing invoices - Make sure the payment providers are set up (it can be demo, the customer uses…
## Steps to reproduce: - Make sure the Mexican localization is installed and properly set up for signing invoices - Make sure the payment providers are set up (it can be demo, the customer uses Stripe but it can be reproduced with any - Make sure the online payment setting is active - Go to subscription module - Do a new order - In other info, add the online payment checkmark - Confirm the order - Generate the payment link or go into the preview - Make the payment ## Issue: The invoice is generated, but is not signed by the government (no edi is generated), as it used to. ## Cause: The flow works in 17.0 but for the wrong reason. Before this [commit](https://github.com/odoo/enterprise/pull/70562), two mails were sent. And during the chain of triggers of the second email, edi document was generated with `orders._send_success_mail(tx.invoice_ids, tx)`. https://github.com/odoo/enterprise/pull/70562/files#diff-8778c8dce7ca1c24de19f26f11ac0c5410c6c2a4d121c3815682a2323cbb09c2L177 After the removal of the method, it should still work since we still have `payment.transaction._send_invoice` which calls `_generate_and_send_invoices` and should trigger the sub calls necessary for generating the edi stuff. But in `_create_or_link_to_invoice`, we check that the transaction has no invoice_ids linked (make sense with the name of the method). However, at this stage, we already created the invoice in https://github.com/odoo/enterprise/blob/2f3698b250092ad376344e959d46bdc0eebf1a81/sale_subscription/controllers/portal.py#L419-L424 And unfortunately, it will be effectively possible to "let the post process of transaction create" the invoices only in Master (the code is not ready yet). For now it would be too risky for a stable version to make such change. ## Solution: We ensure EDI documents are generated whenever a `subscription_action` is set. To achieve this, modify the `_post_subscription_action` hook to call `_subscription_post_success_payment` for any `subscription_action`, including `assign_token`. From `_subscription_post_success_payment`, we can call `_generate_and_send_invoices` on any invoice that has an EDI associated with it, which sends & signs the required EDI documents. opw-4648189 Forward-Port-Of: odoo/enterprise#93130 Forward-Port-Of: odoo/enterprise#84815
Vendor bills with no taxes are now excluded from GSTR2B reconciliation. This prevents bills that were likely not filed by the vendor from appearing in the matching process, improving the accuracy of Indian GST reporting.
Original PR description
Before this commit- We included the Vendor bills without taxes for GSTR2B reconciliation After this commit- We exclude the Vendor bills without taxes for GSTR2B Because if no tax is there on the bill it means wasn't filed by the Vendor as well task-5023013 Forward-Port-Of: odoo/enterprise#93373 Forward-Port-Of: odoo/enterprise#92866
Fixed an Accounting issue that could block users from deleting a generated bank statement line when a journal entry involved multiple reconciliation models. This helps accounting users correct bank statement entries without encountering an unexpected error.
Original PR description
Currently, an error occurs when trying to remove a move line from a bank statement line if the journal entry contains lines with different reconciliation models. **Steps to Reproduce:** 1. Install…
Currently, an error occurs when trying to remove a move line from a bank statement line if the journal entry contains lines with different reconciliation models. **Steps to Reproduce:** 1. Install the Accounting module. 2. Duplicate the "Internal Transfer" reconciliation model. 3. Accounting dashboard > click on Bank > create new record. 4. Add the invoice, apply "Internal Transfer" reconciliation model. 5. Edit the balance of the line to lower, apply duplicated model(Internal Transfers (copy)). 6. Try deleting the generated Liquidity Transfer line. (Refer [this video](https://drive.google.com/file/d/1cz80Q5325x3rqYUlGahVzFIXH2iqrbRF/view?usp=drive_link) for steps to reproduce.) **Error:** ValueError - Expected singleton: account.reconcile.model(8, 6) **Cause:** In the method `delete_reconciled_line` at [1], the `reco_model_id` is fetched from `self.move_id.line_ids.reconcile_model_id`. If the move contains lines linked to multiple reconcile models, this causes a singleton error during subsequent processing. **Fix:** This commit uses the already computed `move_lines_to_remove` to retrieve `reconcile_model_id` instead of accessing it from `self.move_id.line_ids`, which may result in a multi-recordset. [1] - https://github.com/odoo/enterprise/blob/89aa58029a79928788277489414f8192aa5353e4/account_accountant/models/account_bank_statement.py#L1041-L1049 sentry-6781788260 Forward-Port-Of: odoo/enterprise#91619
Recurring subscriptions based on timesheets were sometimes treated as free when the sales order total or recurring revenue was zero, even though work had already been delivered. This fix ensures delivered timesheet-based services still generate invoices, helping businesses bill correctly for completed work.
Original PR description
### Steps to reproduce: - Install Helpdesk, Sale Subscription apps - Create a service recurring product and set its invoicing policy as 'Based on Timesheets' - Create a SO with the created product…
### Steps to reproduce: - Install Helpdesk, Sale Subscription apps - Create a service recurring product and set its invoicing policy as 'Based on Timesheets' - Create a SO with the created product and set the qty to 0 - Create a Helpdesk ticket and link it to the SO - Record some timesheets in this SO - Run the cron for generating recurring invoices - Notice no invoice will be created for the SO and it will be considered as free renewal ### Cause: When trying to create a recurring invoice we check if the invoice that will get generated is free by checking the MRR and the total amount of the SO and if one of them are 0 we will flag this invoice as free so we won't generate it ### Fix: We check if the order lines to be invoiced is invoiced based on delivery and they have delivered quantity already and if so we create the invoice even if the MRR and the total amount is equal 0 opw-4990478 Forward-Port-Of: odoo/enterprise#93245 Forward-Port-Of: odoo/enterprise#93115
Portal users receiving published planning shift emails now get a link that opens the correct planning view instead of sending them to the portal dashboard. This helps external users access their schedules directly and avoids confusion after clicking the email button.
Original PR description
### Steps to reproduce: - Install Planning app - Create a portal user and an employee for this user - Create a shift for this user and Publish it - Go to the email that has been sent and click on…
### Steps to reproduce: - Install Planning app - Create a portal user and an employee for this user - Create a shift for this user and Publish it - Go to the email that has been sent and click on View Your planning - Notice you are redirected to the portal dashboard home ### Cause: Since this commit diff we removed the check if the user is having planning group https://github.com/odoo-dev/enterprise/commit/72afe1e14703f0a3eafd0cfaec10c67462db73ce#diff-293bc9f44292d19793981abbafbe2a55642d170bda5e3bf17d7654f7bffcbedaL62-L64 When getting the planning url that will be share in the email we don't check if the user is portal or not so we set the url with /odoo path and if a portal user is accessing a /odoo path it will redirect him to /my https://github.com/odoo/odoo/blob/1acf4b2ce2bdad27e7d32d1227698968148a5935/addons/portal/controllers/web.py#L25-L26 ### Fix: We check if the user is portal we set the url with /planning path which will redirect the portal user to the correct planning view opw-5045746 Forward-Port-Of: odoo/enterprise#93359 Forward-Port-Of: odoo/enterprise#93333
The GSTR document summary now ignores 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 Forward-Port-Of: odoo/enterprise#93039
The POS IoT integration now selects the printer configured for receipts instead of accidentally using another connected printer, such as a kitchen preparation printer. This prevents receipts from being sent to the wrong device in setups with multiple printers.
Original PR description
Steps to reproduce: 1. Configure a POS with a receipt printer and a preparation printer. 2. Ensure that the preparation printer has a higher ID than the receipt printer (you can force this by deleting it and letting the IoT redetect it.) 3. Try to print a receipt. EXPECTED: The receipt is printed on the configured receipt printer. ACTUAL: The receipt is printed on the prepation printer. This was caused by the hardware proxy code assuming that there will only be 1 printer `iot.device` model loaded, and that it will correspond to the receipt printer. The fix is to ensure the hardware proxy only chooses the printer that is configured as the receipt printer. Forward-Port-Of: odoo/enterprise#93225
16 changes
Resolved issues and error corrections
Users can now enter an ampersand character in filter values without causing an error. This prevents crashes when creating or applying custom filters and keeps search workflows reliable.
Original PR description
Example of steps: - Open any domain selector with an archive checkbox (via custom filter for example) - Try to add char `&` in value input - focus out or try to apply the filter - Traceback ``` UncaughtPromiseError > OwlError Uncaught Promise > The following error occurred in onWillUpdateProps: "Cannot read properties of undefined (reading 'filter')" ``` The problem comes from the fact that we expect to have multiple nodes in our domain if we have an `&` as a value. However, there is a difference between using `&` in a text search for example (type `condition`), and using `&` as an AND between two nodes (type `connector`). The solution is to restrict the condition so that it not only checks that the value is equal to `&`, but also checks that the tree type is indeed a connector and not a condition. opw-5015281 Forward-Port-Of: odoo/odoo#224664 Forward-Port-Of: odoo/odoo#224567
16 changes
Resolved issues and error corrections
Fixed an issue where starting two IoT WebRTC connections almost at the same time could cause the connection to fail. The update prevents duplicate connection attempts while one is already opening and adds test coverage to reduce the risk of this happening again.
Original PR description
If two calls are made to open a WebRTC connection within a short space of time, they will both try to open a new connection causing a failure. This commit fixes the issue by checking to see if a connection is currently opening before continuing. It also adds a unit test for this scenario.
6 changes
Resolved issues and error corrections
This fix ensures mail records that are already marked for deletion are no longer treated as active records by internal business logic. This reduces the risk of crashes and incorrect data handling during record deletion and recomputation.
Original PR description
Before this commit, business code could leak records that are soft deleted, i.e. the representation of the record is still in the store but conceptually this record is deleted. These soft-deleted…
Installing the Manufacturing app on very large databases is now less likely to run out of memory or time out. The update optimizes how existing stock movement data is prepared during installation, improving reliability for customers with high transaction volumes.
Original PR description
Description ----------- On large databases with millions of already existing `stock.move`, the post-install computation of compute stored fields can be time-consuming and memory intensive. This commit extends the pre_init_hook that was done in `mrp` to: - Speed up computation of `stock.move.is_done` - Implement SQL query to initialize `stock.move.manual_consumption`. Reference --------- opw-4980036 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222299
This fix prevents remaining pop-up dialogs from getting stuck or causing crashes when another dialog is closed twice. It helps users complete actions such as employee holiday attestations without needing to refresh or encountering errors.
Original PR description
Have two dialogs opened, call twice `close` on one of them. From that point, the `stack` in dialog_service is empty (because the second time, the dialog can't be found in `stack`, so its index is -1,…
Have two dialogs opened, call twice `close` on one of them. From that point, the `stack` in dialog_service is empty (because the second time, the dialog can't be found in `stack`, so its index is -1, and calling `splice` with -1 removes from the end of the array), even though one of the 2 dialogs is still displayed. From that point, calling closeAll does not close the remaining dialog. In practice, this can be reproduced in Employees > Laurie Poiret (must be in BE company). In the cog menu, click on "Departure: Holiday Attest". In the dialog, click on the external button of the many2one. Close the second dialog by clicking on the X. At this point, `close` has been called twice for that dialog (once by the click on the cross, and once by an override of `dialogData.dismiss` in FormViewDialog), and `stack` is thus empty. Clicking on an action button in the first dialog (e.g. "Validate & Compute holiday attests") then no longer closes the remaining dialog as it should (as `closeAll` is called by the action service). Then, a crash can occur when manually trying to close that dialog, as the view in the background no longer exists, and closing the dialog calls its `onClose` callback, which tries to reload the view, thus leading to the "Component is destroyed" error. Issue introduced by https://github.com/odoo/odoo/pull/203169 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
This fixes an issue where refunds for lot-valued products sold through Point of Sale could leave the related inventory transfer unvalidated after closing the session. The correction helps ensure stock and valuation records are completed automatically, reducing manual follow-up for store and inventory teams.
Original PR description
When refunding a product that was lot valuated, the picking would not be validated automatically. Steps to reproduce: ------------------- * Create a product tracked by lot, and valuated by lot * Open…
When refunding a product that was lot valuated, the picking would not be validated automatically. Steps to reproduce: ------------------- * Create a product tracked by lot, and valuated by lot * Open PoS and create an order with this product * Validate the order and create a refund for it * Validate the refund * Close the session, and go to the picking of the session > Observation: The picking is not validated automatically. Why the fix: ------------ It was happening because the line that was put to 0 here (https://github.com/odoo/odoo/blob/eab97bed9c55a9057c7af7450ae1a09c6383a7b5/addons/point_of_sale/models/stock_picking.py#L249) has no lot assigned and should be deleted instead of just put to 0 quanity. It would then raise an error here (https://github.com/odoo/odoo/blob/2d933b83613ad52d76ab457201adecac6fcf184b/addons/stock_account/models/stock_move_line.py#L94) and cancel the validation of the picking. opw-4769042 Forward-Port-Of: odoo/odoo#224251 Forward-Port-Of: odoo/odoo#223888
This fixes an issue where POS loyalty points could be counted more than once if coupon confirmation was retried, such as after an internet interruption. The change helps keep customer coupon and loyalty balances accurate and avoids incorrect rewards being granted.
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 Forward-Port-Of: odoo/odoo#222372
Point of Sale now applies product pricelist rules in the correct quantity order instead of relying on internal record IDs. This prevents incorrect prices from being selected when multiple pricing rules exist for the same product.
Original PR description
Before this commit, the product pricelist items stored in IndexedDB were sorted by their `id`, which led to incorrect rule application in the PoS. When retrieving rules for a product, the order of rules matters. opw-4997926 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222230
Point of Sale receipts now show tracking numbers only for restaurant or preparation-display workflows, avoiding unnecessary numbers in other checkout setups. Self-order and kiosk orders keep their S or K prefixes so staff can still identify order sources correctly.
Original PR description
- Fix issue where `tracking_number` was displayed for all config. We want to display this number only for `pos_restaurant` configurations. We also want to display it for POS config which have a preparation display configured (see enterprise linked PR). - Ensure Kiosk & Self orders correctly contains a prefix (S or K) inside their `tracking_number` to avoid regression. task-id: 4922308 enterprise PR: https://github.com/odoo/enterprise/pull/91833 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222094
Google Merchant Center shipping price generation now avoids excessive live carrier rate requests that could hit daily limits from providers like DHL. This helps keep product feed updates reliable while reducing the risk of blocked or throttled shipping quote requests.
Original PR description
### Issue: The `Google Merchant Center` calls the method `_prepare_gmc_shipping_info` in order to compute the best shipping price for each published product in each possible country: https://github.com/odoo/odoo/blob/1ac89eb71aab48fa8d50fbae01d96bec23d88418/addons/website_sale/models/product_product.py#L352-L361 To achieve this, the method will request the shipping rate for each possible carrier, product, country. However, for external carriers, each such combination will require a request to the external api via the `rate_shipment`: https://github.com/odoo/odoo/blob/1ac89eb71aab48fa8d50fbae01d96bec23d88418/addons/website_sale/models/delivery_carrier.py#L44-L53 This is problematic as external carriers have a standard rate limit (maximal amount of rate requests allowed per day). For instance DHL standard rate limit is 250 requests per day. opw-5048969 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Fixed an issue where validating an order in a non-restaurant Point of Sale session could also sync a separate draft order after a customer was selected. This helps avoid unintended draft order updates and keeps checkout data cleaner and more reliable.
Original PR description
Before this commit, in a non-restaurant PoS, when selecting a partner in a draft order, validating an order would also sync the draft order. opw-5037759 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#224041
Point of Sale now handles loyalty programs that are archived while already applied to an order. This prevents reload errors and helps keep checkout operations running smoothly when backend program settings change.
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 Forward-Port-Of: odoo/odoo#218814
This update fixes Turkish Nilvera e-invoicing issues so generated invoices better follow local compliance rules. It blocks invalid negative invoice lines, corrects discount reporting, removes an unnecessary product identifier from invoice XML, and resolves an access issue for users without the accounting add-on.
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#224028 Forward-Port-Of: odoo/odoo#223136
Barcode users will no longer see quality checks for products that have not been picked on a receipt. This prevents unnecessary or confusing checks and keeps barcode quality control aligned with the regular inventory workflow.
Original PR description
_______________________________________ ## Short functional explanation of the error On barcode, when an item isn't picked, when clicking on quality checks, the quality check for the unpicked item…
_______________________________________ ## Short functional explanation of the error On barcode, when an item isn't picked, when clicking on quality checks, the quality check for the unpicked item will still show. ## Reproduction Steps 1. Go to Quality and create a Quality point by clicking on Quality Control. Click on new, set a title and put 2 products in the field Product. In operation, select Receipt. 2. Go to Inventory and click Receipts. 3. Click New. Fill the Receive From field, and add 2 products. Set the demand field to 2 for example. 4. Click on Mark as Todo. 6. Go to Barcode. Click on Operations, the Receipts, and click on the latest Receipt you created. 7. For one product, click on the +2 button. For the other one, leave it at 0. Then, click on Quality Check. ### Expected behavior Only the quality check for the item that has been picked should show. ### Unexpected behavior Both quality checks show. ## Origin of the issue The behavior of the code is different when we perform the operations in backend compared to when we perform them in barcode. Thus, we have to change this behavior and take into account the environment. __ opw-5010764
Fixed an issue where stopping a timesheet timer could attach the recorded time to the previous or next day for users in certain time zones. The timer now uses the user's local date, helping ensure timesheet entries are placed on the day the work was actually performed.
Original PR description
Before this commit, if you were to log time on a timesheet using the timer start and stop buttons, you could potentially log time for the previous day's or the upcoming day's timesheet entry. This is because we were searching for previously-created timesheet entries based on the UTC Date of the timer's "stop" time. This fix uses the client's local time to get the Date of the timer stop. With this, we'll only find timesheet entries with the `date` field matching the client's local Date. opw-4967487 Forward-Port-Of: odoo/enterprise#93356 Forward-Port-Of: odoo/enterprise#92569
Published planning emails now send portal users to the correct planning page instead of the general portal dashboard. This prevents confusion for external users who need to view their assigned shifts from email notifications.
Original PR description
### Steps to reproduce: - Install Planning app - Create a portal user and an employee for this user - Create a shift for this user and Publish it - Go to the email that has been sent and click on…
### Steps to reproduce: - Install Planning app - Create a portal user and an employee for this user - Create a shift for this user and Publish it - Go to the email that has been sent and click on View Your planning - Notice you are redirected to the portal dashboard home ### Cause: Since this commit diff we removed the check if the user is having planning group https://github.com/odoo-dev/enterprise/commit/72afe1e14703f0a3eafd0cfaec10c67462db73ce#diff-293bc9f44292d19793981abbafbe2a55642d170bda5e3bf17d7654f7bffcbedaL62-L64 When getting the planning url that will be share in the email we don't check if the user is portal or not so we set the url with /odoo path and if a portal user is accessing a /odoo path it will redirect him to /my https://github.com/odoo/odoo/blob/1acf4b2ce2bdad27e7d32d1227698968148a5935/addons/portal/controllers/web.py#L25-L26 ### Fix: We check if the user is portal we set the url with /planning path which will redirect the portal user to the correct planning view opw-5045746 Forward-Port-Of: odoo/enterprise#93359 Forward-Port-Of: odoo/enterprise#93333
Subscriptions with service products billed from delivered timesheets are no longer incorrectly treated as free renewals when the original order quantity or amount is zero. This ensures customers are invoiced for delivered work and helps prevent missed recurring revenue.
Original PR description
### Steps to reproduce: - Install Helpdesk, Sale Subscription apps - Create a service recurring product and set its invoicing policy as 'Based on Timesheets' - Create a SO with the created product…
### Steps to reproduce: - Install Helpdesk, Sale Subscription apps - Create a service recurring product and set its invoicing policy as 'Based on Timesheets' - Create a SO with the created product and set the qty to 0 - Create a Helpdesk ticket and link it to the SO - Record some timesheets in this SO - Run the cron for generating recurring invoices - Notice no invoice will be created for the SO and it will be considered as free renewal ### Cause: When trying to create a recurring invoice we check if the invoice that will get generated is free by checking the MRR and the total amount of the SO and if one of them are 0 we will flag this invoice as free so we won't generate it ### Fix: We check if the order lines to be invoiced is invoiced based on delivery and they have delivered quantity already and if so we create the invoice even if the MRR and the total amount is equal 0 opw-4990478 Forward-Port-Of: odoo/enterprise#93245 Forward-Port-Of: odoo/enterprise#93115
GSTR document summaries now ignore invoices that no longer have a valid invoice number. This prevents report generation errors and ensures only properly numbered invoices are included in compliance summaries.
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 Forward-Port-Of: odoo/enterprise#93039
UK tax report submissions to HMRC now include the correct obligation ID. This prevents submissions from failing or being sent with missing reference information, improving reliability for UK tax filing workflows.
Original PR description
Issue: Prior to this commit, when sending a tax report to HMRC, the obligation ID was undefined Fix: sending the appropriate obligation ID opw-4965620 Forward-Port-Of: odoo/enterprise#91735
The Spanish SME balance sheet now avoids counting certain current financial investment accounts twice. This ensures reported investment amounts match the underlying accounting entries, improving confidence in financial statements.
Original PR description
**Issue**: * Amounts were exactly doubled in 'Current financial investments' (line 12500) in the Spanish Balance Sheet - SMEs report as account codes 551 and 5525 were incorrectly included in…
**Issue**: * Amounts were exactly doubled in 'Current financial investments' (line 12500) in the Spanish Balance Sheet - SMEs report as account codes 551 and 5525 were incorrectly included in balance_pymes_line_12500_sub_balances formula **Root Cause**: * Account codes 551 and 5525 were included in BOTH: 1. Line 12500 sub_balances (unfiltered account_codes expression) 2. Line 12500 sub_debits (domain expression with sum_if_pos filter) * This double-counting within the same line caused financial investment amounts to appear twice in the balance sheet **How to Reproduce**: 1. Create Spanish company with 'es_pymes' chart of accounts 2. Post journal entries to accounts 551 or 5525 (current financial investments) 3. Generate 'Balance Sheet - SMEs (ES)' report 4. Observe amounts in line 'V. Current financial investments' are exactly doubled compared to account balances 5. Click on the doubled amount - shows underlying transactions sum to half the amount **Fix**: * Removed account codes 551 and 5525 from balance_pymes_line_12500_sub_balances * These accounts are properly handled by the sub_debits expression * Each account is now counted only once within the line opw-4983300 Forward-Port-Of: odoo/enterprise#93052
Quality checks on manufacturing orders can now proceed without users first entering the producing quantity. This removes an obsolete validation that is no longer needed because invalid manufacturing quality point setups are already prevented elsewhere.
Original PR description
This commit reverts the change from: [PR](https://github.com/odoo/enterprise/commit/51a9b38), which had introduced a `UserError` that occurs when creating a quality point with operation type `Manufacturing` having control per `quantity`. Revert is done since this [PR](https://github.com/odoo/enterprise/pull/67780) now prevents creating quality points with operation type `Manufacturing + control per quantity`, which makes the original bugfix PR unnecessary and has become dead code. After this commit, quality checks on manufacturing orders no longer require setting the producing quantity first. Task ID: [4915067](https://www.odoo.com/odoo/project/966/tasks/4915067)
Spreadsheet list headers are now stored consistently so pivots keep working when users open the same spreadsheet in different languages. This prevents dashboards and custom spreadsheets from breaking for multilingual teams and also standardizes dashboard file formatting for easier maintenance.
Spreadsheet list headers now stay consistent regardless of each user's language settings. This prevents pivots and dashboards based on list columns from breaking when opened by colleagues using a different language.
Original PR description
Current issue: Alice's language is in English and Bob is in French. Alice inserts a list in a spreadsheet, and create a pivot with the dataset being the list. Alice chooses the pivot dimensions based…
Current issue: Alice's language is in English and Bob is in French. Alice inserts a list in a spreadsheet, and create a pivot with the dataset being the list. Alice chooses the pivot dimensions based on the columns headers, which are the translated(!) field display names. Now Bob opens the spreadsheet. => the pivot doesn't work because the dimension are specified using the field names in English, but they cannot be found because they are in French in the spreadsheet. The issue is that `ODOO.LIST.HEADER` returns the translated field string. One solution would be drop `ODOO.LIST.HEADER` completely and just hard-code the string values when the list is inserted. But users use it to add fields after, and then auto-fill it. Also, being easily able to know which cells are list headers is helpful to display "widget" like the sorting widget (task 4543812) Other thing to consider: currently, when users are creating their own spreadsheet/dashboard, there's a mix of languages: what they manually type in cells, in their language (untranslated obviously) and the result of ODOO.LIST.HEADER, which is translated. Task: 4805206
Point of Sale badge printing now loads the needed badge format information again. This restores badge printer functionality for event check-ins and reduces manual work for staff using PoS at events.
Original PR description
Due to an oversight in odoo/enterprise#83021, printing badges using the badge printer from POS was not working. This commit fixes the issue by restoring the `badge_format` field to the list of fields loaded in the POS. Forward-Port-Of: odoo/enterprise#93365
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.
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 Forward-Port-Of: odoo/enterprise#93039
This fixes an issue in Barcode receipts where removing scanned serial-number lines could remove the wrong item. Users can now decrement and re-enter serial numbers without false duplicate warnings, reducing receiving errors for tracked products.
Original PR description
Steps to reproduce: - Install Purchase, Stock and Barcode apps - Create a product tracked by serial number - Create a PO of this product and confirm it (demand 3) - Open Barcode application for the PO's receipt - Start entering serial numbers for the 3 products - For each line, use the decrement button and remove all 3 lines - Make sure the last removed line is not the first scanned serial - Re-enter the serial number of the last removed line Issue: The parent line of the 3 sublines has the lot_name fixed on the first scanned serial_number. So when decrementing the last_line, it will always use the virtual_id of the first serial_number scanned, leading to decrementing the wrong serial number. It starts showing that the next scanned number is already used, because it wasn't properly removed in the first place. opw-4646765 Forward-Port-Of: odoo/enterprise#89987 Forward-Port-Of: odoo/enterprise#88130
Portal users receiving published planning shift emails are now sent to the correct planning page instead of the portal dashboard. This helps external or limited-access users view their schedules directly from email without confusion or extra navigation.
Original PR description
### Steps to reproduce: - Install Planning app - Create a portal user and an employee for this user - Create a shift for this user and Publish it - Go to the email that has been sent and click on…
### Steps to reproduce: - Install Planning app - Create a portal user and an employee for this user - Create a shift for this user and Publish it - Go to the email that has been sent and click on View Your planning - Notice you are redirected to the portal dashboard home ### Cause: Since this commit diff we removed the check if the user is having planning group https://github.com/odoo-dev/enterprise/commit/72afe1e14703f0a3eafd0cfaec10c67462db73ce#diff-293bc9f44292d19793981abbafbe2a55642d170bda5e3bf17d7654f7bffcbedaL62-L64 When getting the planning url that will be share in the email we don't check if the user is portal or not so we set the url with /odoo path and if a portal user is accessing a /odoo path it will redirect him to /my https://github.com/odoo/odoo/blob/1acf4b2ce2bdad27e7d32d1227698968148a5935/addons/portal/controllers/web.py#L25-L26 ### Fix: We check if the user is portal we set the url with /planning path which will redirect the portal user to the correct planning view opw-5045746 Forward-Port-Of: odoo/enterprise#93359 Forward-Port-Of: odoo/enterprise#93333
Recurring subscription orders with timesheet-based services are no longer incorrectly treated as free when work has already been delivered. This ensures invoices are generated for delivered service work even when the original order quantity or recurring amount is zero, helping prevent missed revenue.
Original PR description
### Steps to reproduce: - Install Helpdesk, Sale Subscription apps - Create a service recurring product and set its invoicing policy as 'Based on Timesheets' - Create a SO with the created product…
### Steps to reproduce: - Install Helpdesk, Sale Subscription apps - Create a service recurring product and set its invoicing policy as 'Based on Timesheets' - Create a SO with the created product and set the qty to 0 - Create a Helpdesk ticket and link it to the SO - Record some timesheets in this SO - Run the cron for generating recurring invoices - Notice no invoice will be created for the SO and it will be considered as free renewal ### Cause: When trying to create a recurring invoice we check if the invoice that will get generated is free by checking the MRR and the total amount of the SO and if one of them are 0 we will flag this invoice as free so we won't generate it ### Fix: We check if the order lines to be invoiced is invoiced based on delivery and they have delivered quantity already and if so we create the invoice even if the MRR and the total amount is equal 0 opw-4990478 Forward-Port-Of: odoo/enterprise#93245 Forward-Port-Of: odoo/enterprise#93115
Managers can now access VoIP call records for employees across their full reporting line, not just direct reports. This fixes incomplete visibility for teams with multiple management levels and helps managers review relevant call activity more reliably.
Original PR description
This commit fixes the record rules that specifies the users that can read phone calls made through VoIP. Currently, managers can only access call records of their direct subordinates. They should have access also to calls made by employees that are managed by their direct subordinates. This commit fixes that. Task-5033984
The fix ensures that signing request email buttons direct recipients to the website of the company that sent the request, rather than defaulting to another company’s website. This reduces confusion for signers and helps avoid business or legal issues caused by documents appearing under the wrong company.
Original PR description
According to a ticket, when you have 2 companies and send a sign request from the second one, the button in the email received from the signer redirects to the website of the first company. This may cause confusion and may have legal implications. This PR aims to fix the problem by correctly targeting the right website. Task & ticket: 4976533
The work entry split action in the Gantt view now opens a confirmation form instead of trying to split immediately. This helps HR users review the split details first and prevents incorrect or failed split actions.
Original PR description
This commit fixes how the split button behaves in the Gantt view of the work entry. Instead of calling the ORM function upon clicking the split button, the split button now opens a `FormViewDialog`. The save button in the dialog is modified so that, instead of saving the record data, it calls the `action_split` function that handles the splitting logic. The context is used to open the dialog with a custom form view that has read-only fields, and the form is populated with the existing work entry data, except for the duration, which is set as half of the existing work entry duration. task-5043857
GSTR2B reconciliation now skips vendor bills that do not include any taxes. This prevents bills that vendors likely did not file from appearing in the reconciliation process, making Indian GST reporting more accurate.
Original PR description
Before this commit- We included the Vendor bills without taxes for GSTR2B reconciliation After this commit- We exclude the Vendor bills without taxes for GSTR2B Because if no tax is there on the bill it means wasn't filed by the Vendor as well task-5023013 Forward-Port-Of: odoo/enterprise#93373 Forward-Port-Of: odoo/enterprise#92866
The subscription invoicing process now skips subscriptions linked to archived companies. This prevents hidden or inactive company records from continuing to generate recurring invoices unexpectedly.
Original PR description
Currently, when a company which has recurring orders (subscriptions) active is archived, the cron still periodically invoices them as usual but the user is not able to see it because they don't show up in the views. To avoid having to unarchive the comany and check every subscription one by one, this PR aims at making the cron ignore any subscription tied to an archived company, as intended. The only modified cron is the one that creates invoices since the other one of interest (the one that sends reminders) operates only on invoiced orders, which we avoid having with this change. Also added a test to ensure that if the company related to a subscription sale order is archived, the cron won't invoice it. Task: 4947107
Before this commit, business code could leak records that are soft deleted, i.e. the representation of the record is still in the store but conceptually this record is deleted. These soft-deleted records are present in the code for a very short time, just enough time to warn business code in the onDelete() hooks. The problem for Model.records and Model.get() to return these records, is that the business code thinks these records are not deleted, which can lead to misuses and crashes. For example: if a computed field returns this soft-deleted record, then the field value has this soft-deleted record. When the record is hard-deleted, this field will be recomputed, but when diffing with its old this will crash because it will still have a trace of the record in the internal code. This commit fixes the issue by removing the record from Model.records when soft-deleted, so that Model.records and Model.get() doesn't return this record. The onDelete() hooks will returned the soft-deleted like before because the deleted records are stored in the data queue of the hooks. This solution also solves another problem: if a record is deleted and there's an immediate side-effect computed field to insert this record, the previous implementation would hard-delete the record at the end which is wrong: the record should be deleted but the insert part should apply, thus the resulting record is a fresh one with same identity but only partial data from the insert. All other field values must be lost from the deletion. The changes in this commit also fixes this issue. Commit also fixes issue for `.exists()` that should be `false` for soft-deleted records. Task-4860196
Fixed an issue where public holidays spanning multiple days could appear as only one blocked day in calendar views for employees or companies using flexible working schedules. This makes holiday calendars clearer and consistent with the existing time-off validation that already prevented requests across the full holiday period.
Original PR description
**Issue**: Multi-day public holidays only display as single days in calendar views when using flexible working schedules. A 3-day holiday appears as only 1 day blocked, though time-off requests are still correctly prevented for all 3 days. **Cause:** In `_get_unusual_days()`, the implementation for flexible schedules only captures the start date of each leave interval https://github.com/odoo/odoo/blob/132938929d46c8248a9e3a7e2972174ae38eacfa/addons/resource/models/resource_calendar.py#L683-L685 **Steps to reproduce:** 1. Configure a flexible working schedule for an employee or company 2. Go to Time Off > Public Holidays 3. Create a 3 day public holiday 4. Check Time Off calendar view Only 1 day appears blocked instead of all 3 days opw-4997757
When the same POS order is open on multiple devices, other devices now detect when it has already been finalized. This prevents staff from trying to edit a completed order and redirects them to the appropriate next screen or a new draft order.
Original PR description
Before this commit, if two devices were working on the same order and one of them finalized the order, the other device would not be aware of this change. This was leading to error, since a finalized order is not editable anymore. This commit adds a hook to track the finalized order on the product, payment and split bill screens. When the finalized order is detected, the user is redirected to another screen or a new draft order is created, depending on the screen. taskId: 4788430
Installing the Manufacturing app on very large databases is now less likely to run out of memory or time out. The change improves how existing stock movement records are prepared during installation, reducing disruption for customers with high data volumes.
Original PR description
Description ----------- On large databases with millions of already existing `stock.move`, the post-install computation of compute stored fields can be time-consuming and memory intensive. This commit extends the pre_init_hook that was done in `mrp` to: - Speed up computation of `stock.move.is_done` - Implement SQL query to initialize `stock.move.manual_consumption`. Reference --------- opw-4980036 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes kiosk online payments so paid orders are properly sent onward for preparation instead of only showing a confirmation screen. It also limits kiosk payment choices to the online methods configured for that kiosk and makes single online-payment setups show the QR payment flow correctly.
Original PR description
Currently, you are able to see online payment methods in the kiosk if you have at least a terminal method registered. Since you're able to see them you can also select it. Once paid you are…
Currently, you are able to see online payment methods in the kiosk if you have at least a terminal method registered. Since you're able to see them you can also select it. Once paid you are redirected to the confirmation screen saying that the order is being prepared but the order is not sent to the preparation display, although the order is paid in the backend. Steps to reproduce: ------------------- * Create a payent method using terminal, for easier setup use stripe, you'll only need to setup serial number on the payment method but you do not need to do the whole stripe setup * Create an online payment method (use demo for example) * Change the kiosk settings to use those two payment methods * Change the settings of the preparation display to use the kiosk * Open preparation display * Open kiosk, make on order, and select the online payment method * Scan QR code and pay > You are redirected to the confirmation page saying that the order is being prepared while not sent to the preparation display Why the fix: ------------ The fix to send the order to the backend is in the other part of this fix. Here we decide to only allow to use the online payment methods that have been set on the config. Previously if two were existing but only one setup you were able to select any of them. We also make a change to the `filterPaymentMethods` method. This method is called when pressing the pay button and is indirectly responsible for the fact that if there's only one payment method then we directly start the payment process. Prior to this fix if we only had a terminal method setup and clicked to pay an order we directly had the screen telling us to follow the instructions on the terminal. However if we only had a online payment method, when clicking on pay, we would directly have the screen prompting us to pay at the register, we could never select the payment method. With the fix, when there's only one payment method and it's online, clicking on pay will show the qr code. opw-5001998 Enterprise: https://github.com/odoo/enterprise/pull/92825
Kiosk orders paid with an online payment method are now correctly sent to the preparation display after payment. This prevents staff from missing paid self-order kiosk orders that customers already see as being prepared.
Original PR description
Currently, you are able to see online payment methods in the kiosk if you have at least a terminal method registered. Since you're able to see them you can also select it. Once paid you are…
Currently, you are able to see online payment methods in the kiosk if you have at least a terminal method registered. Since you're able to see them you can also select it. Once paid you are redirected to the confirmation screen saying that the order is being prepared but the order is not sent to the preparation display, although the order is paid in the backend. Steps to reproduce: ------------------- * Create a payent method using terminal, for easier setup use stripe, you'll only need to setup serial number on the payment method but you do not need to do the whole stripe setup * Create an online payment method (use demo for example) * Change the kiosk settings to use those two payment methods * Change the settings of the preparation display to use the kiosk * Open preparation display * Open kiosk, make on order, and select the online payment method * Scan QR code and pay > You are redirected to the confirmation page saying that the order is being prepared while not sent to the preparation display Why the fix: ------------ We bring back the code from the previous version which allowed orders to be sent to the preparation display: https://github.com/odoo/enterprise/blob/c4da0b5136f44a1437300844f6a06f44c5d79631/pos_self_order_preparation_display/models/pos_order.py#L12-L19 We also precise the sending condition in order to avoid to recompute the function which is already called in other setup. opw-5001998 Community: https://github.com/odoo/odoo/pull/223689