Daily updates from Odoo
Thursday, September 4, 2025
35 changes · saas-18.3
Security fixes and vulnerability patches
HR teams can once again find employee documents from the employee record, even when document settings were missing or not fully migrated. Employee folders are also kept system-owned rather than assigned to the employee, reducing unintended access to sensitive HR files.
Original PR description
Since migration of https://github.com/odoo/enterprise/pull/80399, some companies cannot retrieve easily their hr documents because their documents hr settings are not activated or not properly…
Since migration of https://github.com/odoo/enterprise/pull/80399, some companies cannot retrieve easily their hr documents because their documents hr settings are not activated or not properly configured. With the new implementation, employee form view smart button redirect to the hr employee folder of the target employee. But if this folder does not exists after the migration or if the documents we not correctly placed in the HR folder before the migration, HR officers cannot retrieve the employees documents. This fix makes the smart button redirect to employee folder if the settings are corrects and activated, but uses the old way to retrieve documents across the whole app if the setting is not active. I both cases, the smart button works as it should. Also, we force having no owner on employee folders to avoid access gain by the applicant themselves when they sign their contract, creating a new employee with the applicant user in the context (making them, by default, owner of the created folder). Task-4869292
Enhancements to existing features
Odoo eCommerce can again sync product feeds with Google Merchant Center, helping merchants improve product visibility and keep listings updated. The feed now excludes shipping details to avoid slow processing and carrier rate limits, with product limits and caching added for better reliability at scale.
Original PR description
In [^1], a new feature was introduced to allow users to synchronize their eCommerce with Google Merchant Center and increase their product visibility, keep stock status updated, and improve product listings. However, the initial implementation attempted to include shipping information in the feed, which required computing rates for every product, carrier, and country. This quickly became infeasible due to performance constraints and third-party carrier rate limits, forcing us to disable the feature [^2]. This commit reintroduces the GMC feed without shipping details, making it lightweight and reliable. To ensure scalability, we also (i) enforce a limit of 5000 products per feed, and (ii) introduce a caching mechanism to avoid recomputing expensive product data (e.g., prices) for subsequent requests. task-5049357 [^1]: https://github.com/odoo/odoo/pull/186976 [^2]: https://github.com/odoo/odoo/pull/224649
Adds support for required official company information codes when sending Turkish e-invoices through Nilvera. Invoices are now blocked if mandatory codes are missing or empty, helping businesses avoid non-compliant submissions while ensuring the codes appear in both PDF and XML outputs.
Original PR description
Description of the issue/feature this PR addresses: Nilvera requires official codes on company contacts for submission to be compliant. Current behavior before PR: Invoices may be sent to Nilvera…
Description of the issue/feature this PR addresses: Nilvera requires official codes on company contacts for submission to be compliant. Current behavior before PR: Invoices may be sent to Nilvera without the required codes, resulting in non-compliance. Currently, only the VKN and TCKN codes are sent, while other required codes are not supported. Desired behavior after PR is merged: Official codes are added as non-deletable tags (non-mandatory ones archived). An error is raised when required tags are missing or empty. Invoices cannot be sent to Nilvera without valid codes. Codes are always reflected in both PDF and XML. [IMP] l10n_tr_nilvera: support for official information codes Added codes as tags from the official list and archived non-mandatory ones. These tags cannot be deleted, and an error is shown on attempt. Invoices are blocked from being sent to Nilvera if either MERSISNO or TICARETSICILNO is missing, or if assigned but without a value. Codes are reflected in both PDF and XML. task-4992049 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#223931 Forward-Port-Of: odoo/odoo#223182
UAE payroll calculations now better support contracts based on attendance or planning schedules. This helps produce more accurate payslips for employees whose pay depends on worked time or planned shifts, with added tests to reduce regression risk.
Original PR description
Updates for the salary rules to accomodate Attendance and Planning-based contracts and test cases for said scenarios opw-[4873312](https://www.odoo.com/odoo/all-tasks/4873312) Forward-Port-Of: odoo/enterprise#93765 Forward-Port-Of: odoo/enterprise#90407
Resolved issues and error corrections
USB devices with missing or invalid product information no longer cause the hardware interface to crash. This improves reliability when connecting varied USB peripherals to Odoo IoT setups.
Original PR description
Before this commit, if a USB device did not provide a valid product string, the USB interface would crash trying to access it. After this commit, we wrap the access in a try/except to prevent the crash. task-5060062 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The point of sale now correctly asks for the customer's name when a default order preset, such as takeout, requires it. This prevents staff from creating orders without required customer details and keeps restaurant workflows consistent.
Original PR description
Steps to reproduce: - go to the setting of your pos.config - set the default preset as takeout (or any other that require the name) - open your pos - click on new order - the slot selection opens (only if set so it's ok) - but then no dialog to enter the name of the client Issue: The handleSelectNamePreset method in the POS Restaurant module attempts to access the selected preset through the order, but the preset has not yet been set on the order at that point. Fix: Make sure the preset is set on the order before calling handleSelectNamePreset. Task-5030520 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
The accounting invoice menu now triggers the correct action when users refresh outgoing e-invoice statuses. This prevents the system from accidentally starting the incoming invoice fetch flow and helps users get the expected status updates.
Original PR description
[FIX] account: add refresh_out_einvoices_status to fetch_einvoices_cog The fetch_einvoices_cog OWL component was missing the trigger for button_refresh_out_einvoices_status, as it always called button_fetch_in_einvoices. Now the function will call a getter to allow easier customization by overriding buttonAction, and it now supports the missing flow for button_refresh_out_einvoices_status. task-4714467 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The point of sale now prevents users from moving to payment until a discount has fully applied. This avoids incorrect payment amounts being sent to payment terminals when discount processing is delayed.
Original PR description
pos*: point_of_sale, pos_restaurant Before this commit, if a discount was applied with the blackbox, it was applied after communication with blackbox which could be slow. If the user was clicking payment before this disound was applied and had only one payment method, a payment line with the old amount was added which could lead to confusion and errors when this payment line was sent to a terminal. This is fixed by waiting for the discount to be applied before being able to click on payment. Enterprise PR: https://github.com/odoo/enterprise/pull/91256 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221020
Public-facing pages could appear blank when a standard page wrapper was missing during loading. The update uses the page body as a backup so views such as meeting room booking and kiosk setup pages load correctly.
Original PR description
**Before this PR:** The screen appears blank in places like meeting room booking view, install kiosk app page (events, attendance, rooms, frontdesk), etc. **Version:** Although this issue exists in future versions, it is fixed in the version where public interactions are introduced. **Technical reason:** The issue was introduced by this commit: https://github.com/odoo/odoo/commit/dd13994674d4ef4683f5a4d46a1f604650cfb92b Happens while loading frontend assets. Here, if `#wrapwrap` is absent in dom then interaction service is not started and returned as a null. Now we keep `body` as a fallback of `#wrapwrap`. **After this PR:** The screen will load correctly and will no longer be blank. Task-4915155 Forward-Port-Of: odoo/odoo#222033
The self-order kiosk now respects the specific product variants configured for combo items, so customers only see the intended choices. This prevents unintended variant options and extra charges from appearing during combo ordering, while keeping normal variant selection unchanged where appropriate.
Original PR description
**Problem:** When we have a combo product that has a variant product, if we order it from the Kiosk, all the variants for that product will be displayed. The extra price will also be added, even…
**Problem:** When we have a combo product that has a variant product, if we order it from the Kiosk, all the variants for that product will be displayed. The extra price will also be added, even though it is not specified on the combo definition. **Steps to reproduce:** - Create a combo that has a variant product (like aluminium chair) - Go to the Kiosk and order said combo - In the combo page, click on the variant, all the possible variants are displayed **Why the fix:** When creating a combo, we should specify which product variant we want, so that only those are displayed on the combo selection page. The way it is done right now, every variant is displayed whether we want them or not, without a way to refrain them from being displayed. After this commit, if the variants are specified on the combo, only those are displayed in the Kiosk once we click on the combo. If we specify a product that has variants in the combo, all variants will still be displayed when clicking the product in the Kiosk, as it was before. opw-4924019
Test preparation now skips an expensive tag lookup unless it is actually needed. This should make large test runs faster and avoid failures in environments where source files are unavailable.
Original PR description
`get_method_additional_tags` can be slow when there are a lot of test to load while the feature is only needed in rare cases. This commit removes the check if the corresponding tag is not in the config test-tags. This should also solve an issue when the sources are not available. Forward-Port-Of: odoo/odoo#225109 Forward-Port-Of: odoo/odoo#225061
This fixes a checkout issue where customers could see a server error when the cart page was accessed through a configured URL redirect. The checkout progress display now correctly recognizes redirected cart URLs, improving reliability for websites using custom or rewritten shop links.
Original PR description
Steps: - create a 308 rewrite from /shop/cart to /test/cart - go to /shop/cart Result: An error 500 is shown with this traceback in server log: odoo.addons.base.models.ir_qweb.QWebException: Error while render the template KeyError: 'current_step' Template: website.step_wizard Path: /t/div/div[1]/div/div/a/span Node: <span t-field="current_step.name"/> Cause: The code of website()._get_checkout_step_values doesn't take into account possible URL rewrite, so we get an error when showing website.step_wizard template that expect to have found a current_step. Fix: use url_rewrite to match the current URL to the current step and use the step_href of the step as current_website_checkout_step_href to have it not rewritten. Note: without the fix, the added test fail with the error shown above. opw-5037289
Empty chatbot messages are now kept from creating unwanted blank lines in live chat conversation history. This keeps chat records cleaner and easier for support teams to read.
Original PR description
When a chatbot conversation contains messages with empty body, this empty body would be converted into a newline which is not desired. This commit ensures that empty messages are not converted into newlines in the channel history. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225001
This fix makes the Discuss welcome screen rely on a shared application setting instead of temporary screen state. This prevents the welcome page from appearing or disappearing unpredictably, improving reliability for users opening Discuss.
Original PR description
Before this commit, whether to display the welcome view was based on a component state, so it was dependent on the lifecycle of components This commit changes the condition so that it relies on the store which should prevent inconsistent state. https://runbot.odoo.com/odoo/error/111051 Forward-Port-Of: odoo/odoo#225453 Forward-Port-Of: odoo/odoo#225325
This fix restores the expected handling of extra details sent with custom website analytics goals in Plausible. Businesses relying on custom conversion tracking, such as cart-related goals, will again receive structured information instead of unusable text values.
Original PR description
Since commit b9b3a60, conversion to owl, the props are sent as string instead of object.
This commit restores old behaviour of using a JSON object for props.
Before commit b9b3a60:
> $($0).data('event-params')
{Type1: 'cart'}
After commit b9b3a60:
> $0.dataset.eventParams
'{"Type1": "cart"}'
After this commit:
> JSON.parse($0.dataset.eventParams)
{Type1: 'cart'}
opw-oxpslide-stbu
Forward-Port-Of: odoo/odoo#225324The accounting Secure Entries wizard was optimized so it can handle very large backlogs of entries waiting to be secured. This prevents memory failures and greatly reduces loading time for companies that have accumulated many pending accounting entries.
Original PR description
Description ----------- On a database where the user doesn't Secure their accounting entries regularly, it's possible over a long period to accumulate a lot of pending invoices that needs to be…
Description
-----------
On a database where the user doesn't Secure their accounting entries regularly, it's possible over a long period to accumulate a lot of pending invoices that needs to be hashed.
This can lead to the processing of a large number of moves when opening the Secure Entries wizard, more specifically:
```
-> `_compute_warnings`
-> `_compute_hash_date`
-> `_compute_max_hash_date`
-> `_get_chains_to_hash`
```
While manipulating this large recordset, the ORM prefetcher will read *all* fields on the model upon the first cache miss, which usually are a lot, and some of them are quite large (label type fields).
This commit refactors the code to avoid any cache miss by fetching only what is necessary. This is achieved by:
- Use of a `_read_group` instead of 2 subsequent `groupby`
- Delegate `max` and `min` lookup to the database
- Explicitly fetch the fields that are going to be read
- Avoid the linear search into the associated statement lines for unreconciled moves
- Introduce a context key `chain_info_warnings` to skip the warnings computation of `_get_chain_info`, as it's unused for the context of `_compute_max_hash_date`.
Benchmark
---------
On a database with over 1.3M `account.move` that are pending hashing, opening the wizard for the Secure Entries took:
| | Before* | After | Improvement |
|--------------|---------|---------|-------------|
| Memory | 6.8 GiB | 700 MiB | 9.9x |
| Query Count | 26.7k | 18.5k | 1.4x |
| Timing SQL | 41.2s | 18s | 2.3x |
| Timing PY | 7.29min | 14s | 31.2x |
| Timing Total | 7.98min | 32s | 15x |
\* - benchmark was taken with unlimited memory, the request takes more than 2 GiB -> OOM killed and never completes
Reference
---------
opw-5014345
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#225247
Forward-Port-Of: odoo/odoo#224105Automated guided tours now wait until a screen update is complete before moving to the next step. This prevents tours from jumping backward or failing when a menu action changes the page while the next step is being checked.
Original PR description
Step to reproduce: - Create a tour - Add a step that click on a menuitem on the systray with a view already opened - Then add a step that click on the search bar of the view Before this commit, if the step of a tour was triggering an action (e.g.: a menuitem) and that the next step's trigger was finding an element on the view before the action has finished to update the view, then the tour was backwarding because the found element diseppeared when the new action loaded the new view. Now, the tour interactive wait that the action manager finish to update the view to be sure the get the right element for the step trigger. ISSUE: https://github.com/odoo/odoo/issues/214652 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220319
Installing Accounting with German localization and demo data could fail because cleanup of demo accounting records was blocked by the audit trail protection. This update allows that expected cleanup during chart template unloading, so setup can complete without compromising normal audit trail safeguards.
Original PR description
When installing the Accounting app on a new database created with Germany as country and with demo data loaded, the demo loader invokes in `account/demo/account_demo.xml` the `<function name="try_loading">` call which does a wholesale `records.with_context({MODULE_UNINSTALL_FLAG: True}).unlink()`. This cascades into deleting mail.message records, but the audit‑trail hook in only bypasses its check when the `bypass_audit` token is present not when `MODULE_UNINSTALL_FLAG is set causing a “You cannot remove parts of the audit trail” UserError.
Steps to reproduce:
- Created new database, with Germany as country
- Install l10n_de
- Download demo data
- Attempt to install Accounting application ! Receive error message
OPW- 4712364
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#221260Swiss companies can now see the expected domestic taxes when setting up tax replacement rules. This fixes a localization issue where Switzerland's domestic fiscal position was not recognized because it was defined by country group rather than country.
Original PR description
#### Issue: No taxes appear in the replace field when creating a new tax in a company based in Switzerland. #### Step to reproduce: - In a company based in Switzerland (l10n_ch) - Create a new tax -…
#### Issue: No taxes appear in the replace field when creating a new tax in a company based in Switzerland. #### Step to reproduce: - In a company based in Switzerland (l10n_ch) - Create a new tax - Add a Fiscal position other than "Switzerland national (+ Liechtenstein)" - Click on the "Replace" field #### Current behavior: - No records are found #### Expected behavior: - Taxes from the "Switzerland national (+Liechtenstein)" fiscal position should appear #### Cause of the issue The Replace field display domestic taxes. Domestic taxes are part of the same fiscal position which is computed as domestic. In the l10n_ch module no fiscal position is computed as `domestic_fiscal_position_id`. Indeed in `account.fiscal.position-ch.csv` the fiscal position we want to be domestic is linked to a `country_group_id`, but no `country_id`. However the domestic fiscal position is computed from `country_id` only. Therefore Switzerland has no `domestic_fiscal_position_id`. #### Solution: This issue already happened [once](https://github.com/odoo/odoo/pull/208810) for an other localization. To avoid the situation to happen again in the future this commit adapts the `_compute_domestic_fiscal_position_id` to include fiscal position with no `country_id` but a `country_group_id`. opw-5011527 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The e-waybill screen now shows errors and warnings with the correct visual colors, making it easier for users to distinguish critical issues from cautions. It also improves handling of access-related errors so users receive the right feedback instead of confusing behavior.
Original PR description
Before: --- Error and warning colors were mismatched in the e-waybill view. In this commit: --- Fixed the e-waybill view to correctly display error messages - Errors now display in red (alert-danger) :red_square: - Warnings now display in yellow (alert-warning) :yellow_square: AccessError now handled correctly. --- task-5050937 Forward-Port-Of: odoo/odoo#225288 Forward-Port-Of: odoo/odoo#225078
This fix prevents automated test runs from crashing when no test tags are configured. It improves reliability for CI setups that use pytest integrations to produce test reports.
Original PR description
Description of the issue/feature this PR addresses: The issue arises when using pytest (to get junit xml for CI) with [pytest-odoo==1.0.1](https://github.com/camptocamp/pytest-odoo) ``` run_tests def get_method_additional_tags(self, test_method): run_tests """Guess if the test_methods is a query_count and adds an `is_query_count` tag on the test run_tests """ run_tests additional_tags = [] run_tests > if 'is_query_count' in odoo.tools.config['test_tags']: run_tests E TypeError: argument of type 'NoneType' is not iterable run_tests run_tests ../custom/src/odoo/odoo/tests/common.py:778: TypeError ``` Info @wt-io-it --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225496
Importing a contact after removing its company from an exported file no longer silently overwrites an existing linked contact in a way that breaks parent-child relationships. This protects contact data consistency and helps avoid downstream errors in other business processes that rely on correct company/contact links.
Original PR description
_______________________________________ ## Short functional explanation of the error Let's say that you have a contact of type Company and a child contact of type Individual. Both share the same…
_______________________________________ ## Short functional explanation of the error Let's say that you have a contact of type Company and a child contact of type Individual. Both share the same company_id. But when exporting the individual, deleting its company in the downloaded .xlsx file and importing it again, it overrides the already existing individual, resulting in a single individual contact without company_id nor parent company. However, the contact of type company will still have the individual as its child, creating an inconsistency. This leads to errors in other modules as the rules aren't respected by these records anymore. ## Reproduction Steps 1. Go to the contact application and create a contact of type Company. Set an email and click on the Sales and Purchase tab and set a Company. 2. Go back to the Contacts tab and click on add contact. Click the radio button Contact, set an email and hit Save and Close. 3. Go back to the Contacts app. You should see 2 more contacts: one corresponding to the company and one corresponding to the individual. 4. Select the Individual contact and click Actions > export. Check 'I want to update data (import-compatible export)' and on the left panel, click on the + button next to Company. Then, click export. 5. Click on the file it generates and remove the company, then save. 6. Click on the cog next to Contacts on the top left and click Import Records. Then, click on Upload Data file and select the file you just exported. You should see that the field company_id has no value. Click Test then Import. ### Expected behavior Either an error message should show up or the link between the Company contact and its child should be removed. ### Unexpected behavior The individual contact containing the link to its parent Company contact is overridden by the contact we just imported, which doesn't have a link to the parent company contact. However, the company contact conserves a link to the child individual contact. This means that one way of the 2-ways link has been deleted, creating an inconsistency. ## Origin of the issue We can override res.partners using the names and email addresses, which are primary keys, but the code doesn't check the consistency of parent/ children links. _________________________________________ opw-4976400 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Public visitors can now open Outlook calendar reminder links for published event tracks that include a location. This fixes an access issue that previously blocked recipients from viewing the reminder when they were not logged in.
Original PR description
In this bug, it is not possible to access outlook calender reminder, because of lack of access to event location. To reproduce: 1- Create an event and publish it 2- Create a track and publish it 3- Add a location to this track 4- Send the track using reminder template 5- Copy the calender link and paste it into incontio mode 6- As you see the access is denied To fix the issue, the location can be accessed using sudo. opw-4975617 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Sign app guided tour has been corrected so it works consistently when users learn how to prepare and sign a document. The fix handles document drag-and-drop, prefilled signatures, and repeated tour use, reducing interruptions during onboarding or testing.
Original PR description
Fix `sign_tour`. How to reproduce: 1. Go to tours in Odoo 2. Look up sign_tour 3. Click testing ( If testing stops at Sign App, change search filters or archive sign all .request records so that the…
Fix `sign_tour`.
How to reproduce:
1. Go to tours in Odoo
2. Look up sign_tour
3. Click testing ( If testing stops at Sign App, change search filters or archive sign all .request records so that the following screen displays )
<img width="780" height="591" alt="image" src="https://github.com/user-attachments/assets/b164c224-0e3e-4dce-97e6-89848263e59e" />
4. tour fails!
---
First commit
The `sign_tour` was failing after the conversion of the `sign.Template` client action to OWL. The standard `drag_and_drop` tour helper can no longer be used for automatic tour testing because the drop target is inside an iframe whose content is managed by PDF.js.
This commit fixes the tour by utilizing the custom helper function, `dragAndDropSignItemAtHeight`, to programmatically simulate the drag and drop action.
---
Second commit
The step "footer.modal-footer button.btn-primary:enabled" assumes that the Signature Dialog opened from its previous step ("Sign It" navigation button).
However, the "Sign It" navigation button does not always open the dialog.
If signing user (res.users) already has "sign_signature" data, the data will be automatically filled in to the Signature input.
Otherwise, the navigation button will open the Signature Dialog.
Luckily, we can see whether user has "sign_signature" data or not by checking if the <input data-item_type='signature'/> node has "data-auto_value" attribute or not.
We now skip the step if data-auto_value is set for signature.
---
Third commit
If `sign.template_sign_tour` has sign request, it means that the template might have a sign item because the `sign_tour` tour adds the Signature sign item to the template. (If user followed the tour)
When we're copying the sign template to trigger the template tour, we should not copy the sign item. User will be guided to add the sign item during the tour.
---
Note:
ci/security needs to be overriden as it was done for https://github.com/odoo/odoo/pull/134793#issuecomment-1711440188
---
opw-4752794
Forward-Port-Of: odoo/enterprise#92908
Forward-Port-Of: odoo/enterprise#91565The point of sale now waits until a blackbox discount is fully applied before allowing the cashier to proceed to payment. This prevents payment lines from being created with an outdated amount, reducing cashier confusion and potential terminal payment errors.
Original PR description
Before this commit, if a discount was applied with the blackbox, it was applied after communication with blackbox which could be slow. If the user was clicking payment before this disound was applied and had only one payment method, a payment line with the old amount was added which could lead to confusion and errors when this payment line was sent to a terminal. This is fixed by waiting for the discount to be applied before being able to click on payment. Community PR: https://github.com/odoo/odoo/pull/221020 Forward-Port-Of: odoo/enterprise#91256
The project budget dashboard now shows the correct warning color when an expense budget is exceeded. This helps users quickly spot overspending instead of seeing a misleading green status.
Original PR description
**Step to reproduce:** - install "project_account_budget" - go to accounting > accounting > Analytic Budget - create a budget of type expense,say test budget - select analytic account `Asustek - Wood…
**Step to reproduce:**
- install "project_account_budget"
- go to accounting > accounting > Analytic Budget
- create a budget of type expense,say test budget
- select analytic account `Asustek - Wood Corner`
- set budget amount => 500. open the budget
- create a new project 'test project"> open setting > Analytic Page
- add `Asustek - Wood Corner` analytic account in project field
- create a PO with amount > 500
- in analytic distribution column, add `Asustek - Wood Corner` in project column
- confirm PO and create Bill
- Go to `test project` settings > Dashboard smart button
**Observation:**
- For exceeding expense budget, we have green color in budget section
- It should be red
**Cause:**
The conditional class for budget progress was incorrectly evaluated due to missing parentheses around the `and` condition.
In expressions like:
`(true and (1 == 1 ? 'a' : 'c')) or (1 == 1 ? 'b' : 'd') → 'a'` ✅
`true and 1 == 1 ? 'a' : 'c' or 1 == 1 ? 'b' : 'd' → 'b'` ❌
Without parenthesis, the `or` clause is evaluated unexpectedly, even when the `and` branch is intended to take precedence.
This commit wraps the `and` condition in parentheses to ensure the correct evaluation order and consistent class assignment.
Budget:
<img width="1203" height="291" alt="budget 4968162" src="https://github.com/user-attachments/assets/2d8223d5-0344-4ad0-b33c-2598ea167f2d" />
Before fix:
<img width="623" height="195" alt="before fix 4968162" src="https://github.com/user-attachments/assets/4ac749bf-fa93-4835-963a-5dfbdd05559d" />
After fix:
<img width="643" height="225" alt="after fix 4968162 " src="https://github.com/user-attachments/assets/4fd228f9-e32f-48d9-b6ef-55251b21d601" />
opw-4968162
Forward-Port-Of: odoo/enterprise#91617This update fixes an automated Planning test so it uses today's actual date instead of a date-generating function. This helps prevent false build failures and keeps validation of the Planning app more reliable.
Original PR description
Now the tour use edit with the date of today and not a function runbot build error: 164213 Forward-Port-Of: odoo/enterprise#93816
Fixes an issue where Chilean companies could see the Point of Sale crash when validating an order if a receipt field was not configured. Receipts now skip that optional field when it is missing, allowing sales to complete normally.
Original PR description
Currently, when having a CL Company an dusing the POS, it is possible to have the POS crash when validating orders. Steps to reproduce: ------------------- * Install l10n_cl_edi_pos * Create a new…
Currently, when having a CL Company an dusing the POS, it is possible to have the POS crash when validating orders. Steps to reproduce: ------------------- * Install l10n_cl_edi_pos * Create a new company * Put Chile as country * Switch to that company * Create a shop and open it * Make a sale, validate order > Observation: POS Crashes Why the fix: ------------ The crash is happening upon trying to render the receipt because `l10n_cl_dte_resolution_date` is undefined. `l10n_cl_dte_resolution_date`is a field that can be found on the company settings only if the field `l10n_cl_dte_service_provider` is set and is required when the later has either `SII` or `SIITEST` as value. For companies in Chile, there is therefore two setups that leads to having `l10n_cl_dte_resolution_date` undefined. Either the service provider is set to demo, which case clients don't need to fill in the resolution date, either the provider is left empty (since not required upon company creation). Since the field can be undefined, we don't render it when it is. opw-5034091
Danish Intrastat and EC Sales List reports now round required figures to whole units for official submissions, helping meet government reporting expectations. Users can still view decimal values in the interface when needed, while exported files are consistently rounded.
Original PR description
This commit will change the options of the reports so that we have a rounding in units since the intrastat and ec sales list report must be rounded. This solution still allows people to have the report with decimals if needed task-4948271 Forward-Port-Of: odoo/enterprise#93783 Forward-Port-Of: odoo/enterprise#91268
Users no longer encounter an error when trying to link a document to a vehicle if no vehicles have been created yet. The system now avoids opening the linking flow when there is no available record to link to, preventing a confusing crash and improving reliability in the Documents and Fleet integration.
Original PR description
*= documents_fleet Currently, when user tries to link a document with a vehicle and if there is no vehicle exists an error is raised. **Steps to Reproduce:** 1) Install `documents_fleet`…
*= documents_fleet Currently, when user tries to link a document with a vehicle and if there is no vehicle exists an error is raised. **Steps to Reproduce:** 1) Install `documents_fleet` module(without Demo Data). 2) Open Documents App. 3) Upload a file in `Fleet` folder. 4) Select the uploaded file and click on `'Link to a vehicle'` button. Error: `ValueError: invalid literal for int() with base 10: 'False'` Root Cause: The `link_to_record` method attempts to find the first record of the target model to use as a default value when opening the linking wizard. If no records exist, the search returns an empty recordset, and accessing `.id` at [1], on it results in the value `False`. The code then incorrectly constructs a default reference string like `fleet.vehicle,False`. The wizard crashes when it tries to parse this string and convert the `False` part to an integer. Solution: This commit prevents error by ensuring that the user cannot link a document to a model without existing records. [1]- https://github.com/odoo/enterprise/blob/83640d21b2c31ed9d572c48e02a9aeea9eb1607b/documents/models/documents_workflow_rule.py#L113 sentry-6792079496 Forward-Port-Of: odoo/enterprise#93738 Forward-Port-Of: odoo/enterprise#91888
This fix ensures a quality control test works reliably when the module is installed on its own without demo data. It prevents test-only failures linked to missing stock permissions, improving maintenance confidence without changing day-to-day user behavior.
Original PR description
## Issue:
The test `test_receipt_validation_triggers_serial_number_label_print` fails when running `quality_control` alone without demo data
## Cause:
The user is missing the group `stock.group_production_lot`, that enable serial number printing
As a result, the condition `self.env.user.has_group('stock.group_production_lot')` in `stock.picking` `_get_autoprint_report_actions()` is not satisfied
The `button_validate()` in `stock.picking` will have an empty report_actions and will not print anything
The Demo data that allow the test to work is in `stock`
https://github.com/odoo/odoo/blob/9b08449f25cd16dc15117d305726380298c313d8/addons/stock/data/stock_demo.xml#L176-L182
## Steps to reproduce:
- Install only `quality_control` (no demo data)
- Run the test `test_receipt_validation_triggers_serial_number_label_print`
related-to: https://github.com/odoo/enterprise/pull/90134
opw-4790427
Forward-Port-Of: odoo/enterprise#93799
Forward-Port-Of: odoo/enterprise#93296This fix prevents portal users from becoming owners of Documents spreadsheets because they cannot receive edit access to spreadsheets. It keeps ownership aligned with valid internal users, reducing access and workflow issues around shared spreadsheets.
Original PR description
Following the discussion I had with @flch-odoo regarding https://github.com/odoo/enterprise/pull/92134 , Since Spreadsheets can not be shared in edit mode to non-internal users, we prevent them from becoming owners. opw-4753670 Forward-Port-Of: odoo/enterprise#93800 Forward-Port-Of: odoo/enterprise#92409
Closing an AI chat before the assistant finishes responding no longer creates a new chat with the delayed reply. This prevents unexpected conversations from appearing and keeps the chat experience consistent for users.
Original PR description
If a user sends a message to an ai agent and then closes the chat channel before receving the response, a new ai chat channel gets created and the response is posted to that channel. Cause of the Issue : When the channel is deleted, a serialization error occurs because one transaction is trying to delete the channel while the other is trying to post the ai response to the channel. The delete transaction finishes execution and the response generation transaction is retried. When generate_response is retried, _get_or_create_ai_chat is called and given that the old channel has already been deleted, a new one is created and the response is posted to that channel. task-5063221
Miscellaneous changes
After the switch to Weblate, we now only use the `.weblate.json` file instead of the previous `.tx/config` file. Meanwhile added a new entry that was still added to the `.tx/config`. Forward-Port-Of: odoo/odoo#225265 Forward-Port-Of: odoo/odoo#225179
Original PR description
After the switch to Weblate, we now only use the `.weblate.json` file instead of the previous `.tx/config` file. Meanwhile added a new entry that was still added to the `.tx/config`. Forward-Port-Of: odoo/odoo#225265 Forward-Port-Of: odoo/odoo#225179
After the switch to Weblate, we now only use the `.weblate.json` file instead of the previous `.tx/config` file. Forward-Port-Of: odoo/enterprise#93766 Forward-Port-Of: odoo/enterprise#93730
Original PR description
After the switch to Weblate, we now only use the `.weblate.json` file instead of the previous `.tx/config` file. Forward-Port-Of: odoo/enterprise#93766 Forward-Port-Of: odoo/enterprise#93730