Daily updates from Odoo
Navigate
Branch
Friday, October 31, 2025
191 changes
10 changes
New functionality added to Odoo
Adds a new Turkish Nilvera e-invoicing extension to support legally required invoice scenarios such as withholding VAT, tax exemptions, export invoices, and public sector invoices. It also adds tax office information to e-invoice data, helping businesses meet Turkish compliance requirements for domestic and international sales.
Original PR description
[ADD] l10n_tr_nilvera_einvoice_extended: Adding Nilvera E-Invoice Extension [ADD] l10n_tr_nilvera_einvoice_extended: Adding Tax Offices --- ### Description of the issue/feature this PR addresses: We…
[ADD] l10n_tr_nilvera_einvoice_extended: Adding Nilvera E-Invoice Extension [ADD] l10n_tr_nilvera_einvoice_extended: Adding Tax Offices --- ### Description of the issue/feature this PR addresses: We do not support Withholding VAT (KDV Tevkifatı), Exemption Invoices, and Export Invoices (İhracat Faturaları) with our current e-invoicing solution in Türkiye. Those invoice types are legally important and required for both domestic and international sales for businesses. In addition, the inclusion of the Tax office in our current XML we send to Nilvera, both for `<cac:AccountingSupplierParty>` and `<cac:AccountingCustomerParty>`, is required by law. This PR adds an extension module for Nilvera E-Invoicing. The purpose of this module is to extend the existing E-Invoicing functionality to support additional invoice types and scenarios to be compliant with the TR legal requirements. --- ### Invoice Scenario: **Basic** Invoice Type: - Sales - Withholding - Tax Exempt - Registered for Export **Export** Invoice Type: - Tax Exempt **Public** Invoice Type: - Sales - Withholding - Tax Exempt - Registered for Export --- ### Current behavior before PR: We don't support a scenario-based system to comply with TR legal requirements. --- ### Desired behavior after PR is merged: We support a scenario-based system to comply with TR legal requirements. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#229205 Forward-Port-Of: odoo/odoo#213766
Resolved issues and error corrections
This fixes an issue where live chat operators with standard live chat permissions could not pin a customer's message after a chatbot handed the conversation over to them. The change prevents an unnecessary permission check during message pinning, helping operators manage live chat conversations without errors.
Original PR description
To reproduce (on runbot): - S1: Connect as "admin", leave the "YourWebsite.com" then logout - S1: Connect as "demo" user - S2: As public user, go to /contactus and start a chat session - S2: On the chatbot interaction, choose "I have a pricing question" (this will forward to the operator) - S2: enter a message - S1: On the livechat session, try to pin the last user message Since 1ecddc3d79dd an `AccessError` is raised, as the "demo" user (which is only `LiveChat / User`) don't have access to the chatbot step anymore. As we're not in the interacting with the chatbot when pinning a message, simplify skip that part if there is no "chatbotx answner" context to prevent the `AccessError`. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233617
This fix stops Odoo from forcing a default employee structure onto an admin employee record that may not exist in some customer setups. It prevents upgrade or employee creation failures for companies that use their own HR administration workflow.
Original PR description
After this commit: https://github.com/odoo/odoo/commit/6247dc36f703ee2ec45913802ad175cb79873845 and this one: https://github.com/odoo-dev/odoo/commit/5686072b8e7b827269573e8ab1f5b84b61b9315c when we…
After this commit:
https://github.com/odoo/odoo/commit/6247dc36f703ee2ec45913802ad175cb79873845 and this one:
https://github.com/odoo-dev/odoo/commit/5686072b8e7b827269573e8ab1f5b84b61b9315c
when we set default Structure to employee admin
but Later when clients set up their work flow
they set up their own admin employee.
This record is not present, so when employee admin record is not there , no need to set default structure too so need to set no forcecreate on that employee admin too.
When we try to set default structure and if admin record does not exit,
we got error when we try to create employee as no name found and we try to pop name from val here :
https://github.com/odoo/odoo/blob/7e0cc5ec686a52b8c1f8270213acac54575ed469/addons/hr/models/hr_employee.py#L1275
Generated during upgrade
```
File "/home/odoo/src/odoo/19.0/addons/resource/models/resource_mixin.py", line 37, in create
self._prepare_resource_values(
File "/home/odoo/src/odoo/19.0/addons/hr/models/hr_employee.py", line 1275, in _prepare_resource_values
vals.pop('name') # Already considered by super call but no popped
KeyError: 'name'
```
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-prCorrects discount rounding for Mexican electronic global invoices so valid invoices are not rejected by CFDI validation. This prevents errors when confirming invoices with percentage discounts and helps ensure compliant invoice generation.
Original PR description
Steps to reproduce: ------------------- * Create an invoice with the following line: * Unit price: 47.25, Qty: 1, Taxes: 16%, Discount 50% * Confirm, create a global invoice > Observation: Error ```…
Steps to reproduce: ------------------- * Create an invoice with the following line: * Unit price: 47.25, Qty: 1, Taxes: 16%, Discount 50% * Confirm, create a global invoice > Observation: Error ``` Code : CFDI40108 Message : El TipoDeComprobante es I,E o N, el importe registrado en el campo no es igual al redondeo de la suma de los importes de los conceptos registrados. ``` Why the fix: ------------ The issue occurs because the `descuento` value, originally 23.625, is now being corrected to 23.615 which leads to `importe` having a value of 23.635 which round up to 23.64 and not 23.63. https://github.com/odoo/enterprise/blob/08564f3312c255f2f3ab95cef5a9bfc57727bd1f/l10n_mx_edi/models/l10n_mx_edi_document.py#L1111 https://github.com/odoo/enterprise/blob/08564f3312c255f2f3ab95cef5a9bfc57727bd1f/l10n_mx_edi/models/l10n_mx_edi_document.py#L1336 Before this commit https://github.com/odoo/enterprise/commit/39759babddc732a312ec5cd6a60a2f1819abc62c the discount value was being rounded when corrected. It would end up being evaluated to 23.62. To not bring back the issue the fixed by the mentioned commit we round the discount when generating the global invoice cfdi values. Now `importe` will have a value of 23.63 as `descuento` is rounded to 23.62. opw-5023597 Forward-Port-Of: odoo/enterprise#95982 Forward-Port-Of: odoo/enterprise#94438
This update makes an automated test for Discuss sub-channel search more stable under heavy system load. It helps ensure thread loading during search continues to be verified reliably, reducing false test failures without changing user-facing behavior.
Original PR description
The `test_discuss_sub_channel_search` tour ensures that lazy loading of threads works correctly with the search feature. Technically, the component uses the `useVisible` hook which waits for a trigger to be visible before loading more threads. However, under high CPU load, the `IntersectionObserver` might not detect the change. For example, clearing the search input will make the element disappear, but scrolling afterward may make it reappear. As a result, the component might not detect that it should load more threads. In practice, this should never happen. The test now waits for the state to update before scrolling. fixes runbot-181951 Forward-Port-Of: odoo/odoo#233419
This fix removes an outdated action in the self-ordering flow that could trigger errors after a related function had already been removed. It helps keep restaurant self-ordering sessions stable for customers and staff.
Original PR description
Before this commit, there was still a call to the resetTableIdentifier, even though the function had been removed, which could cause errors. opw-5166737 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232521
This fixes an issue in Point of Sale where a lot number could still be applied to a sale order line even after the user canceled the lot selection. The change helps prevent incorrect product tracking information from being added during order loading.
Original PR description
Before this commit, when loading a sale order containing an order line tracked by lot, the system prompted the user to select a lot. However, even if the user canceled the selection, the lot was still added to the order line. After this commit, the lot will no longer be set if the user cancels the selection. opw-5162487 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233281
Odoo now blocks deletion of a unit of measure if it is still referenced by a purchase order line. This prevents purchase order confirmations from failing after a unit was removed, improving reliability for purchasing workflows.
Original PR description
When a user deletes the UoM used in a purchase order line and then tries to confirm the purchase order. Steps to reproduce: --- - Install `purchase_stock` module(without demo) - Create a New PO > Add a product in Line (with UoM=Units) - Remove UoM in order line and select `Dozen` in it > Save - Settings > Units of Measure Categories > Open `Units` > Remove `Dozen` - Orders > Requests for Quotation > Open PO > `Confirm Order` Traceback: --- `ValueError: Expected singleton: uom.uom()` `AssertionError: precision_rounding must be positive, got 0.0` This error occurs because, after the UoM is deleted, the `product_uom` field becomes empty, which leads to an error. Solution: --- This commit resolves the error by restricting the deletion of a UoM when it is still in use. sentry-6746792383 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233783 Forward-Port-Of: odoo/odoo#231478
The printed approval request report now has cleaner spacing and more consistent text sizing. This makes approval details easier to read and better aligned when users print or review their requests.
Original PR description
Steps to Reproduce: - Install approvals module. - Navigate to Approvals → My Approvals → My Requests → Print report. Issue: - The formatting of the report is not proper. Solution: - Fixed the report's QWeb template (approvals.report_aprroval_request_document). - changed col-2 to col-3 to give the labels more space and improve alignment with the field values - changed h5 to h6 for more consistent and appropriate font size throughout the document **before :** <img width="777" height="818" alt="image" src="https://github.com/user-attachments/assets/86cbaf50-191a-412b-9b8e-149442256819" /> **after :** <img width="829" height="623" alt="image" src="https://github.com/user-attachments/assets/da237a87-7a7b-45db-8347-d64e1e987469" /> Forward-Port-Of: odoo/enterprise#95609
This fixes an error that could prevent HR users from archiving an employee when they entered a detailed departure reason. The change keeps the departure reason recorded through the existing employee activity log without triggering an unsupported system action.
Original PR description
When archiving an employee with a Detailed Reason, a traceback occurs. Steps to reproduce the error: - Open any employee record > Archive - Set ``Detailed Reason`` > Apply Traceback: ```py…
When archiving an employee with a Detailed Reason, a traceback occurs. Steps to reproduce the error: - Open any employee record > Archive - Set ``Detailed Reason`` > Apply Traceback: ```py NotImplementedError: Unsupported tracking on field departure_description (type html ``` https://github.com/odoo/odoo/blob/8002b82d5783744b88b75c1199c4c1f222a0f7d0/addons/hr/models/hr_version.py#L130 here, ``tracking=True`` was added for the ``departure_description`` html field by the commit [1]. but tracking is not supported for the html field. So, it will lead to the above traceback. Tracking for ``departure_description`` field is already handled via a chatter message in the write method by the commit [2]. https://github.com/odoo/odoo/blob/8002b82d5783744b88b75c1199c4c1f222a0f7d0/addons/hr/models/hr_employee.py#L1187-L1191 [1]: https://github.com/odoo/odoo/commit/aa4d13b89b4497d2e5b33faa49ad86e0788782a2 [2]: https://github.com/odoo/odoo/commit/9b723e2591224f2b563924d3b3dfe27ab909b7d0 sentry-6973440621 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
6 changes
Resolved issues and error corrections
The mail app’s automated test for searching discussion sub-channels now waits for the page state to settle before scrolling. This reduces false test failures under heavy system load and helps keep releases stable without changing end-user behavior.
Original PR description
The `test_discuss_sub_channel_search` tour ensures that lazy loading of threads works correctly with the search feature. Technically, the component uses the `useVisible` hook which waits for a trigger to be visible before loading more threads. However, under high CPU load, the `IntersectionObserver` might not detect the change. For example, clearing the search input will make the element disappear, but scrolling afterward may make it reappear. As a result, the component might not detect that it should load more threads. In practice, this should never happen. The test now waits for the state to update before scrolling. fixes runbot-181951 Forward-Port-Of: odoo/odoo#233419
The time off request form now only shows the document attachment field when supporting documents are enabled for that time off type. This prevents employees from seeing or using an irrelevant upload option and keeps the request process aligned with company configuration.
Original PR description
issue: - Field to attach documents is always visible when applying for time off regardless of whether we have allowed supporting documents in "time off types" or not <img width="641" height="505" alt="image" src="https://github.com/user-attachments/assets/0ec26822-5284-474f-b791-4b2b8e5eb9cc" /> <img width="511" height="265" alt="image" src="https://github.com/user-attachments/assets/ea546067-ac62-4e25-9a70-bbd86c053109" /> cause: - In commit [1], there was a change, which resulted to this issue [1] https://github.com/odoo/odoo/commit/944c11e61abead4f5157a7a7cb7b1f536bc14411 fix: - `supported_attachment_ids` now also depends on whether uploading files in a time off is supported or not opw-5144399 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Point of Sale invoices linked to orders can no longer be reset to draft, avoiding a situation where an unposted invoice prevents the cash register session from closing. Users are guided to use a refund or credit note instead, keeping end-of-day operations smoother and more reliable.
Original PR description
Before this commit, it was possible to set the invoice of a PoS order to draft, which could prevent closing the session since unposted invoices block the session closing. This commit prevents that by raising a user error suggesting to refund the order or create a credit note instead. opw-5079889 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232566 Forward-Port-Of: odoo/odoo#232464
When a cashier loads a sales order in Point of Sale and cancels the lot selection prompt, the system now leaves the order line unchanged. This prevents incorrect lot information from being added accidentally, improving order accuracy for tracked products.
Original PR description
Before this commit, when loading a sale order containing an order line tracked by lot, the system prompted the user to select a lot. However, even if the user canceled the selection, the lot was still added to the order line. After this commit, the lot will no longer be set if the user cancels the selection. opw-5162487 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233281
Purchase orders now prevent deletion of a unit of measure that is still referenced by a purchase order line. This avoids confirmation failures and keeps purchasing workflows stable when units are being managed.
Original PR description
When a user deletes the UoM used in a purchase order line and then tries to confirm the purchase order. Steps to reproduce: --- - Install `purchase_stock` module(without demo) - Create a New PO > Add a product in Line (with UoM=Units) - Remove UoM in order line and select `Dozen` in it > Save - Settings > Units of Measure Categories > Open `Units` > Remove `Dozen` - Orders > Requests for Quotation > Open PO > `Confirm Order` Traceback: --- `ValueError: Expected singleton: uom.uom()` `AssertionError: precision_rounding must be positive, got 0.0` This error occurs because, after the UoM is deleted, the `product_uom` field becomes empty, which leads to an error. Solution: --- This commit resolves the error by restricting the deletion of a UoM when it is still in use. sentry-6746792383 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233783 Forward-Port-Of: odoo/odoo#231478
The printed approval request report now displays labels and field values with better spacing and more consistent text sizing. This makes approval request documents easier to read and more professional when printed or shared.
Original PR description
Steps to Reproduce: - Install approvals module. - Navigate to Approvals → My Approvals → My Requests → Print report. Issue: - The formatting of the report is not proper. Solution: - Fixed the report's QWeb template (approvals.report_aprroval_request_document). - changed col-2 to col-3 to give the labels more space and improve alignment with the field values - changed h5 to h6 for more consistent and appropriate font size throughout the document **before :** <img width="777" height="818" alt="image" src="https://github.com/user-attachments/assets/86cbaf50-191a-412b-9b8e-149442256819" /> **after :** <img width="829" height="623" alt="image" src="https://github.com/user-attachments/assets/da237a87-7a7b-45db-8347-d64e1e987469" /> Forward-Port-Of: odoo/enterprise#95609
2 changes
Resolved issues and error corrections
This fix updates website appointment and rental snippets to use the current asset-loading method. It helps keep these website features compatible with the platform and reduces the risk of display or behavior issues after upgrades.
Original PR description
See https://github.com/odoo/odoo/pull/104836 task-2963840 Forward-Port-Of: odoo/enterprise#98108 Forward-Port-Of: odoo/enterprise#35153
The approval request print report has been adjusted so labels and field values line up more clearly. This makes printed approval documents easier to read and more professional for users reviewing or sharing requests.
Original PR description
Steps to Reproduce: - Install approvals module. - Navigate to Approvals → My Approvals → My Requests → Print report. Issue: - The formatting of the report is not proper. Solution: - Fixed the report's QWeb template (approvals.report_aprroval_request_document). - changed col-2 to col-3 to give the labels more space and improve alignment with the field values - changed h5 to h6 for more consistent and appropriate font size throughout the document **before :** <img width="777" height="818" alt="image" src="https://github.com/user-attachments/assets/86cbaf50-191a-412b-9b8e-149442256819" /> **after :** <img width="829" height="623" alt="image" src="https://github.com/user-attachments/assets/da237a87-7a7b-45db-8347-d64e1e987469" /> Forward-Port-Of: odoo/enterprise#95609
43 changes
New functionality added to Odoo
Adds late attendance management to Saudi payroll so companies can track employee lateness and reflect it in payroll calculations. This helps HR teams apply attendance policies more consistently and reduces manual payroll adjustments.
Original PR description
IN this PR we interduce late attendance management for SA payroll loca Task: 4598879
Adds a new US Direct Deposit module that lets businesses initiate vendor batch payments through Wise instead of relying on Europe-focused payment initiation options. This helps US companies manage supplier payouts with payment choices such as account balance, ACH, Fedwire, or direct deposit via the Wise portal.
Original PR description
Direct Deposit is a common requirement in the US. Payment Initiation via Ponto is not a good solution as that is only usable for Europe, so other solutions have to be developed. Unlike Ponto via account_online_payment, Wise is implemented directly in enterprise instead of odoofin as customers can open an account themselves and handle all of the data without Odoo being responsible for anything. This module works by overriding the validation steps for batch payments to utilize Wise's API to create a batch group on their side, before redirecting to their final step where the customer can pay however they choose. For the United States this can be from their account balance, ACH transfer, fedwire transfer, or via direct deposit if they set that up in their portal. task-5080414 Forward-Port-Of: odoo/enterprise#96588
Enhancements to existing features
The asset list view has been adjusted to show additional useful information while keeping some fields hidden by default. This gives users more flexibility to see relevant asset details without cluttering the standard view.
Original PR description
This PR adds some new fields to the assets list view and makes some fields `optional='hide'`. Task [link](https://www.odoo.com/odoo/project.task/5163529) task-5163529
VoIP users can now close error screens when the issue does not block their work. This makes it clearer that minor errors can be dismissed and helps reduce confusion during calls or softphone use.
Original PR description
When the error is non-blocking, a close button is now added to the error screen in order to indicate that the error can be removed. Task ID: [4891947](https://www.odoo.com/odoo/project/5778/tasks/4891947)
Users can now upload files or attach documents directly in conversations with AI agents, so the agent can use that content when answering. This makes AI chats more useful for document-based questions and keeps each file linked to the correct message in the conversation history.
Original PR description
Purpose: -------- When chatting with an agent one can now upload files (or attach documents if documents is installed) that will be processed by the LLM to generate the answers Technical Changes:…
Purpose:
--------
When chatting with an agent one can now upload files (or attach documents
if documents is installed) that will be processed by the LLM to generate
the answers
Technical Changes:
------------------
To support this feature, files needs to be inside their related messages.
Previously they were simply appended to the list of inputs that were sent
to the LLMs, but that does not work inside a chatter because one sends the
history of messages. So if a user uploads a file in its first message, then
another one in the second message, one can't append them both to the list
of inputs otherwise the LLM would consider the first one as a new upload,
instead of an attachment from the previous message.
The `request_llm` method of the llm api service has been refactored to be
able to achieve this, and simplify the addition of attachment in any
message.
Instead of having 3 parameters "user_prompts", "inputs" and "files", there
is now only one parameter "messages".
Messages should always be either a string (considered as user prompt),
either a dict containing the role and the message parts:
```py
{'role': 'user', 'parts': [
{'type': 'text', 'content': 'hello'},,
{'type': 'image/png', 'content': 'aW1hZ2UgY29udGVudA=='},
{'type': 'application/pdf', 'content': 'cGRmIGNvbnRlbnQ='},
]}
```
These messages will be converted to the format expected by the different
providers before the loop calling the llm so that the llm answers can be
appended to this message list.
The tools are now also converted before the loop (there is no real need
to convert them in every loop iteration.
Task-5031785The Shop Floor registration flow no longer changes production quantity, component reservations, or manufacturing order status just because a lot or serial number is generated. This helps prevent unintended manufacturing order updates and gives users clearer control when registering production, especially for serial-numbered items.
Original PR description
In the Shop Floor app, opening the 'Register Production' step no longer pre-fills the 'Quantity Producing' field, and the field is now editable for serial numbers. Additionally, generating a lot or serial number for a manufacturing order no longer updates the 'Quantity Producing' field. Component reservations and the MO status also remain unchanged when a lot or serial number is generated. These changes ensure that generating lot or serial numbers does not introduce unintended side effects in the manufacturing order flow. Task ID: [4688059](https://www.odoo.com/odoo/project/966/tasks/4688059)
Malta reporting now includes return deadlines and guided submission wizards for EC Sales List, tax returns, and Intrastat goods reports. This helps businesses track compliance timing and prepare required submissions more consistently within Odoo.
Original PR description
- add ec_sales_list return deadline and wizard - add tax_return wizard - add intrastat return deadline and wizard task - 4781287
Payroll salary rules can now specify whether they appear on payslips always, never, or only when the result is not zero. This improves payslip clarity across multiple country payroll localizations and ensures items like Australia's Medicare Adjustment appear only when relevant.
Original PR description
- Modify the 'Appear on Payslip' field from a boolean to a selection field with the following options:
- Always
- Never
- If result is not zero
- update the data for 'appear on payslip' field in several localization.
- In the Australia localization, update the 'Medicare Adjustment' appear_on_payslip field to "If Result is Not Zero". This adjustment is necessary since the payslip template utilizes this configuration.
task-4979423This update removes outdated invisible fields from several Odoo views across website, accounting, helpdesk, WhatsApp, and related modules. The change simplifies internal screen definitions and reduces maintenance overhead without changing day-to-day functionality for users.
Original PR description
Invisible field from views are useless since: see: https://github.com/odoo/odoo/commit/5639ed865c5a3b82bab25b0ecac28c68c02e93065639ed8 see: https://github.com/odoo/odoo/pull/137031
Mexican payroll payslips now show clear issues when required information is missing for CFDI generation. This helps payroll teams identify and correct missing data earlier, reducing failed electronic payslip processing.
Original PR description
We now have a "issues" system on the payslips. Let's use it to signal what is missing for the correct generation of the CFDI. Task: 5068311 Forward-Port-Of: odoo/enterprise#94748
This update improves the bank reconciliation widget with more consistent styling and clearer transaction details. It also prevents users from choosing certain bank-related accounts that would create ineffective reconciliation rules, and keeps payable and receivable actions more consistently available.
Original PR description
[IMP] account_accountant: css backport To have a consistent css across all version of the new bank rec widget, we decided to backport few changes. backport of:…
[IMP] account_accountant: css backport To have a consistent css across all version of the new bank rec widget, we decided to backport few changes. backport of: https://github.com/odoo/enterprise/commit/524a7a46a0c2888b591de7ad1a0a6d744e345f5a https://github.com/odoo/enterprise/commit/2a83c85cb2c9a7a5da3d4a8483120eeda6b2e6cb https://github.com/odoo/enterprise/commit/e3cb3ab3ec8c64297d8e97d941e0d2eea3e64667 https://github.com/odoo/enterprise/commit/fdbb93abbf831cfa2fdc75e79aa76c094d6e522a https://github.com/odoo/enterprise/commit/f9725d7b01cbd1235f022821a6861adb2955e49e [FIX] account_accountant: restrict some account in the set_account Before this commit, we could select the liquidity account or bank suspense account which could create a reco model for it that would do nothing. [FIX] account_accountant: partner_name Before this commit, when a transaction had no partner_name and some lines with the same partner. When unfolded, we had the info of the partner on the statement line and on the line itself which was a duplicate of information. This commit will change when the line is unfolded so that the partner is visible on the statement line only when there is a partner_name [FIX] account_accountant: payable and receivable button Before this commit, the payable and receivable buttons where on the top line only when the reconcile button was not there anymore. Now We decided to always have them present in secondary next to the reconcile button. no task-id Forward-Port-Of: odoo/enterprise#98458 Forward-Port-Of: odoo/enterprise#96852
This update simplifies how website builder options are defined and shared across related builder components. It helps developers maintain website editing features more consistently, reducing future maintenance effort without changing the business-facing behavior.
Original PR description
The commit: 1. use static property to configure a builder option 2. introduce the concept of dependencies to access the plugin's shared in builder option 3. make a plugin context the same for Plugin,…
The commit:
1. use static property to configure a builder option
2. introduce the concept of dependencies to access the plugin's shared
in builder option
3. make a plugin context the same for Plugin, BuilderOption and
BuilderAction to have the same API in each class.
Before this commit, to define an option, we had to define a javascript
object that would contain the information of the option within the
`builder_options` resource.
```js
class MyPlugin extends Plugin {
resources: {
builder_options: [
{
selector: "div.selector",
template: "my.owlTemplate",
cleanForSave() {}
// ... other option props
}
]
}
}
// For a custom component
class MyPlugin extends Plugin {
resources: {
builder_options: [
{
selector: "div.selector",
template: MyCustomComponent,
cleanForSave() {}
// ... other option props
}
]
}
}
class MyCustomComponent extends BaseOptionComponent {
// ...
}
```
When building anything for the builder, there is 3 classes that are
important: `Plugin`, `BaseOptionComponent`, `BuilderAction`.
In practice, the option object defined in builder_options feels
strange. On the other hand, making the configuration of the option as
a static property of the component somehow feels simpler as everything
related to that option is defined in the same class.
```js
class MyPlugin extends Plugin {
resources: {
builder_options: [MyCustomComponent]
}
}
class MyCustomComponent extends BaseOptionComponent {
static template = "my.owlTemplate";
static selector = "div.selector";
static cleanForSave(context) {}
// ...
}
```
To have the same mental context in the 3 important class, they all
share the same API (`dependencies`, `dispatchTo`, `getResource`, ...)
(see `Editor.getPluginContext`)
To access a plugin shared method, it's now the same for `Plugin`,
`BuliderAction` and `BaseOptionComponent`:
```js
class MyCustomComponent extends BaseOptionComponent {
static selector = "mySelector";
static dependency = "myPlugin";
myMethod() {
this.dependencies.myPlugin.pluginMethod();
}
}
```
To access a resource, dispatch, ...:
```js
class MyCustomComponent extends BaseOptionComponent {
static selector = "mySelector";
myMethod() {
const resource = this.getResource('myResource');
}
}
```
Forward-Port-Of: odoo/enterprise#96515
Forward-Port-Of: odoo/enterprise#94102The IoT restart button now uses the shared IoT communication service to restart IoT Boxes remotely. This makes remote restart handling more consistent and easier to maintain, with minimal visible change for users.
Original PR description
In order to simplify restarting IoT Boxes remotely, we adapted the restart button to use the `iot_http` service. odoo/odoo#232133 Task: 5169648 Forward-Port-Of: odoo/enterprise#97525
VoIP browser tabs now try to close their phone service registration when the tab is closed, and unused registrations expire sooner if that cleanup fails. This helps businesses avoid hitting provider limits that can prevent users from making or receiving calls.
Original PR description
Some providers like OnSIP allow for a limited number of registrations per user. This is a problem in Odoo because each tab opened creates a new registration for one hour. This commit mitigates the problems in two ways: - Sends an "unregister" request onbeforeunload to try to invalidate the registration upon closing the tab. - Reduces the TTL of registrations so that they get invalidated quicker in case the unregistration failed. Forward-Port-Of: odoo/enterprise#98413 Forward-Port-Of: odoo/enterprise#97963
Companies can now choose how negative amounts appear in financial reports, either with a minus sign or in parentheses. US companies will use the parentheses format by default, matching common local accounting practice, while other companies can set their preferred format in settings.
Original PR description
This PR allows the user to choose how to display the negative amounts in the reports, either " (negative_amount) " - common US formatting - or " - negative_amount ". If the country is US the (negative_amount) format will be selected by default. The choice is available in the settings and is company specific. task-5118741
Payroll rule parameters now keep a visible history when key values or their start dates change. This helps payroll teams audit configuration changes more easily from the rule parameter record itself.
Original PR description
This commit adds native-style tracking for the fields `date_from` and `parameter_value` of the model `hr.rule.parameter.value` inside its parent model `hr.rule.parameter` that nests parameter value lines in its form view. For this purpose, a chatter was thus added to `hr.rule.parameter` form view. TaskID: 5176977
Opening the Phone app call list is now much faster for HR officers on large databases. The access rule was adjusted to avoid slow database filtering, reducing load times from seconds to milliseconds in the benchmark.
Original PR description
Description ----------- The rule `voip_call_hr_access_rule` is added with an `OR` to `voip_call_rule_user`, but with the presence of the `One2many` `employee_ids` in the domain, the final query leads…
Description ----------- The rule `voip_call_hr_access_rule` is added with an `OR` to `voip_call_rule_user`, but with the presence of the `One2many` `employee_ids` in the domain, the final query leads to a bad plan where Postgres does a full Seq.Scan on `voip_call` to then post-filter based on `user_id`. To simplify the final query, we inline the ids that are being resolved from searching on `res.users.employee_id` (which is just a proxy for `res.users.employee_ids`). We also re-write the `ir.rule` to use this new inlining via `employee_id` and avoid using `employee_ids` which is resolved as a generic One2many from the ORM. This leads to a few more queries, but each is fast and trivial to process. Benchmark --------- On a database with over 10M `voip.call` and `res.users`, for a Hr Officer, to open the Phone's app default list view with no default filter (the default setup), took: | Before | After | Speed-up | |--------|-------|----------| | 13.3s | 80ms | 162x | Forward-Port-Of: odoo/enterprise#98098
WhatsApp users can now mark channels as favorites, making key conversations easier to find in the Discuss sidebar. This improves day-to-day navigation for teams that rely on WhatsApp channels to manage customer or operational conversations.
Original PR description
Enterprise counter-part. task-4113458 https://github.com/odoo/odoo/pull/232398
Resolved issues and error corrections
This fix prevents Swiss payroll issue checks from failing when payslip adjustments are evaluated automatically. Users will now only see the restriction when they explicitly open the adjustment wizard, keeping payroll validation flows more reliable.
Original PR description
Tests failing in l10n_ch_hr_payroll_account because since the ajustment of payslips have been moved to the issues, the action_adjust_payslip is run at the compute of the issues which raises for Switzerland. Instead, we should raise in the default_get of the wizard if we click on the button. Task: 5223242
This update corrects a small reference mistake that could trigger an error when the Indian payroll feature looked for the wrong employee group. It helps payroll-related screens and processes run reliably without unexpected access group failures.
Original PR description
Before this commit an error would trigger caused by a small typo where instead of referencing the hr_payroll module it referencd the hr module which did not define that group. The first appearance is odoo/enterprise#90795. task-5129283 Forward-Port-Of: odoo/enterprise#96000
Dimona-related employee fields are now shown only for Belgian employees instead of appearing for everyone. This keeps employee records cleaner and ensures country-specific payroll information is displayed only where relevant.
Original PR description
Before this commit, the fields about dimona were shown for all employees, now these fields will be displayed only for belgian employees. task-5148931 Forward-Port-Of: odoo/enterprise#96703
This fix prevents overlapping work order time tracking entries from being wrongly removed or changed when manufacturing orders are saved. It keeps displayed work order duration and saved time records consistent, improving reliability for production tracking.
Original PR description
#### Issue: In this bug, workorder duration inverse is causing some time_ids to be deleted. To reproduce: 1- Create a db with mrp installed, and enable work orders in Setting 2- Create a MO, and…
#### Issue:
In this bug, workorder duration inverse is causing some time_ids to be deleted.
To reproduce:
1- Create a db with mrp installed, and enable work orders in Setting
2- Create a MO, and confirm it
3- Add a new work order to the MO
4- Add two time tracking lines:
- First one 10:00 -> 12:00
- Second one 10:00 -> 11:00
5- As you see, duration reflects duration of first line as it is the interval duration
6- Save and close work center form. Then save MO form.
7- Open work orders again: As you see second line is unlinked
#### Cause:
The reason to this bug, is because in Enterprise, the `_compute_duration` override changes the logic of how duration is computed but the inverse function doesn't reflect the same logic.
To be specific this is the compute function override: https://github.com/odoo/enterprise/blob/3cbe2bbbfd989a3daaa32769a843aeaa09c7ed3e/mrp_workorder/models/mrp_workorder.py#L757-L766
In which duration is calculated using get_duration: https://github.com/odoo/enterprise/blob/3cbe2bbbfd989a3daaa32769a843aeaa09c7ed3e/mrp_workorder/models/mrp_workorder.py#L828-L837
Which doesn't sum the durations, but calculates the intervals duration counting overlaps only once.
However, there is no override of inverse method in Enterprise, meaning that the logic behind inverse will not match with this logic. In the inverse it is assumed duration is sum of all time_ids intervals: https://github.com/odoo/odoo/blob/9b286285a6c66bc2d629eacf651c3439cffb55cc/addons/mrp/models/mrp_workorder.py#L355-L400
As a result, if time_ids overlap:
new_order_duration < old_order_duration
As a result some time_ids will be unlinked and some will have duration changed.
#### Fix:
Inside the inverse function in Community we can do:
```diff
+ old_order_duration = order.get_duration()
- sum(order.time_ids.mapped('duration'))
```
As get_duration in Odoo Community is:
https://github.com/odoo/odoo/blob/9b286285a6c66bc2d629eacf651c3439cffb55cc/addons/mrp/models/mrp_workorder.py#L889-L899
The order.get_duration will be sum of duration of all time_ids in community, hence the logic will be unchanged.
In Enterprise, this is going to reflect the logic implemented in override of get_duration, as a result the duration logic will be consistent in compute and inverse function.
However, this might cause another issue:
If `order.duration` is not computed yet, and inverse method `_set_duration` is called, then `get_duration` inside `_set_duration` will be called before the `get_duration` in compute method. As a result there might be a small unexpected time difference between `old_order_duration` and `new_order_diuration`. To avoid that inside `get_working_duration` we can use cursor now instead:
```diff
+ now = self.env.cr.now()
- now = datetime.now()
```
opw-5082477
Forward-Port-Of: odoo/enterprise#96632Fixed an issue where closing a live chat window did not end the conversation when the final human agent left. This ensures customers and support teams see accurate chat status and prevents conversations from remaining open incorrectly.
Original PR description
*: ai_website_livechat, test_discuss_full_enterprise Before this commit, when the last agent from a live chat conversation leave, the live chat conversation did not end. Steps to reproduce: - install…
*: ai_website_livechat, test_discuss_full_enterprise Before this commit, when the last agent from a live chat conversation leave, the live chat conversation did not end. Steps to reproduce: - install "ai" and "im_livechat" modules - have a visitor initiate a live chat conversation with 1 available human agent - have have human agent open conversation in chat window and close chat window + confirm button => the live chat conversation does not end When live chat agent is about to close the chat window of live chat, there's a warning to tell that this will make him/her leave the conversation and thus end the conversation. When proceeding, it doesn't actually do this. This is a bug caused by overrides of `ChatWindow._onClose()`, which is a function invoked during the closing of chat window, that has an option `notifyState` that determines whether the user leaves the conversation or not. The overridden code had to ensure the param is preserved and passed to `super` calls, but they fail to do this, and thus the closing of chat window is not making the user leave the conversation. This commit fixes the issue by passing `...arguments` to super calls to make sure the params are preserved as expected by original code of the `_onClose` function. Note that we had a test for the good working of the feature, but this test run with `im_livechat` assets and not overrides on top of it such as `ai` module. The main culpit of the problem was caused by the override in `ai` module. To have test coverage for this problem, the test is not executed in both `im_livechat` test suite and the `test_discuss_full_enterprise`, which is a module whose HOOT suite runs code of discuss with all overrides such as `ai` module. Forward-Port-Of: odoo/enterprise#98481
Opening a field service task from the map view now works without triggering an error. The fix updates time formatting so it respects local settings while avoiding seconds, improving reliability for field service teams using the map.
Original PR description
Steps: -------- - Install industry_fsm - Go to FSM app > Map Issue: -------- When opening the FSM task from the map menu, a traceback occurs. Cause: ---------- The removal of `shortTimeFormat`, as shown in the this commit. https://github.com/odoo/odoo/commit/062b14097033afc19252cf3b8bb1fc541f8c868d#diff-39c1e6808cb2412961c390a24d5e6737f2fca1ef85ba2c40e501114311f596c2L67 Fix: ---- In this commit, the time object is built to be able to format the time without any seconds and take into account the time format defined in localization. task-5220054 Forward-Port-Of: odoo/enterprise#98369
Ecuadorian vendor bill imports now select purchase taxes instead of accidentally applying sales taxes with the same rate. This helps keep imported supplier bills accurate and reduces manual correction work for accounting teams.
Original PR description
### Issue:
When importing a bill, some sale taxes are added to the lines.
### Steps to reproduce:
- Install 'l10n_ec_edi' and switch to an Ecuadorian company
- Accounting > Vendor > Bill
- Import an XML fill with a tax of 15%
- The created lines use the tax "VAT 15% G" which is a sale tax
### Cause:
The search to get the tax takes the first one from the right tax group.
### Solution:
Added `('type_tax_use', '=', 'purchase')` in the search domain to only retrieve purchase taxes.
opw-5174139
Forward-Port-Of: odoo/enterprise#98188Vendor bill imports for Chilean electronic documents now recognize numeric currency codes as well as standard currency abbreviations. This prevents import failures when suppliers send valid XML files using numeric currency values, with a safe fallback to Chilean pesos if the currency cannot be matched.
Original PR description
### Steps to reproduce: - Install "l10n_cl_edi" and switch to a Chilean company - Go in Accounting > Vendor > Bills - Import an XML with the line `<Moneda>013</Moneda>` - Traceback ### Cause: `Moneda` can be the currency name code like `USD` but also a numeric code corresponding to the currency. ### Solution: Add a dictionary linking codes to the currency names and check the dictionary if `Moneda` is numeric. Also add a fallback on `CLP` in case the value of `Moneda` fails to be translated to a currency. This avoids a traceback later when reading `vals['currency_id']`. opw-5184950 Forward-Port-Of: odoo/enterprise#98067
Users who work across multiple companies can now assign themselves to planning slots for the company where their employee record exists, even when another company is set as current. This prevents silent failures and makes planning assignment behave as expected in multi-company setups.
Original PR description
_______________________________________ ## Short functional explanation of the error Let's say we have the scenario where a user has access to company_1 and company_2, but only has a corresponding…
_______________________________________ ## Short functional explanation of the error Let's say we have the scenario where a user has access to company_1 and company_2, but only has a corresponding employee in company_2. If the user selects company_1 and company_2 but keeps company_1 as his current company, and tries to assign himself a task that has been created for company_2, nothing happens. ## Reproduction Steps 1. As an admin, create a user with which you'll be able to log. Make sure that you have at least 2 companies created, and that the user has access to both. Create an employee for that user in company_2. 2. Select both companies. In planning, create a slot for company_2 and publish it. 3. Log in as the user you created. Make sure that the current company is company_1. Select company_2. 4. Go to planning and try to assign yourself to the slot you've just created as an admin ### Expected behavior Either an error message shows, or the employee is assigned to the slot for company_2 (as company_2 is selected). ### Unexpected behavior Nothing happens ## Origin of the issue When the current company isn't the one corresponding to the one the employee is in, even if another company is selected and contains the employee, self.env.user.employee_id is set at False _________________________________________ opw-4963674 --- Forward-Port-Of: odoo/enterprise#95933 Forward-Port-Of: odoo/enterprise#91616
This fix improves validation around weekly available hours when an employee is created today but their work assignment started in a previous month. It helps ensure attendance planning shows correct availability in week views for this scenario.
Original PR description
Modified the test case to check the flow for when we create employee for the date = today and set him an occupation starting in the past month. task-4985887 Forward-Port-Of: odoo/enterprise#92023
The payslip screen no longer shows an export button that led users to a missing page. This prevents confusion and avoids a dead-end error when reviewing payroll records in debug mode.
Original PR description
Steps to reproduce: ------------------------- 1. Install `hr_payroll` module 2. Enable debug mode and click on Become Superuser 3. Go to All Payslips and open any payslip record 4. Click on the…
Steps to reproduce: ------------------------- 1. Install `hr_payroll` module 2. Enable debug mode and click on Become Superuser 3. Go to All Payslips and open any payslip record 4. Click on the Export Payslip button Observation: ------------------------- A 404 (Page Not Found) error appears when clicking the Export Payslip button Issue: ------------------------- The button triggers the route `/debug/payslip/<id>`, which was removed in the following commit https://github.com/odoo/enterprise/commit/57969bcaf876a13c36794adeb47e0da938e297ad#diff-0105b1a6a9e742e7eeaf7cc727745ebd3932177378d46332d4ca854f931b3359 The route was never reintroduced afterward, but the Export Payslip button remained in the view. As a result, clicking it leads to a 404 error Solution: ------------------------- 1. Temporarily bypass the `action_export_payslip` function. 2. Remove the Export Payslip button from the XML in the master forward port branch, as doing so does not impact any existing customizations relying on that button opw-5115946 Forward-Port-Of: odoo/enterprise#97361 Forward-Port-Of: odoo/enterprise#96359
Scanned purchase receipts are now correctly recognized as purchase documents instead of sales documents. This prevents the system from applying sales taxes where purchase taxes should be used, improving accounting accuracy for OCR-processed receipts.
Original PR description
Since task [4776275](https://www.odoo.com/odoo/project/2068/tasks/4776275) (commit [a7e9575](https://github.com/odoo/enterprise/commit/a7e9575d4c7fccff06db8a3ec2b9315d8ac33805)), the OCR is able to automatically detect and change a vendor bill into a receipt. The calls to `is_purchase_document` should have been updated to reflect that, but they weren't. Because of this, purchase receipts were considered as sale receipts, causing multiple issues such as sale taxes being selected instead of purchase taxes. task-none Forward-Port-Of: odoo/enterprise#98472
The approval request print report now has cleaner formatting, with better label spacing and more consistent heading sizes. This makes printed or exported approval requests easier to read and more professional for users.
Original PR description
Steps to Reproduce: - Install approvals module. - Navigate to Approvals → My Approvals → My Requests → Print report. Issue: - The formatting of the report is not proper. Solution: - Fixed the report's QWeb template (approvals.report_aprroval_request_document). - changed col-2 to col-3 to give the labels more space and improve alignment with the field values - changed h5 to h6 for more consistent and appropriate font size throughout the document **before :** <img width="777" height="818" alt="image" src="https://github.com/user-attachments/assets/86cbaf50-191a-412b-9b8e-149442256819" /> **after :** <img width="829" height="623" alt="image" src="https://github.com/user-attachments/assets/da237a87-7a7b-45db-8347-d64e1e987469" /> Forward-Port-Of: odoo/enterprise#95609
This fixes an error that could prevent users from generating analytic budgets when using the split option. Budget creation now completes reliably in this workflow, reducing interruptions for accounting teams.
Original PR description
Currently, on creating a budget using split budget causing an error. **Steps to Reporduce:** 1) Install **account_budget module(with Demo)** 2) Navigate to **Accounting>Accounting>Analytic Budget**…
Currently, on creating a budget using split budget causing an error. **Steps to Reporduce:** 1) Install **account_budget module(with Demo)** 2) Navigate to **Accounting>Accounting>Analytic Budget** 3) Click on `Generate` set `Analytic Plan` and click on `Split` Error: `ValueError: Cannot convert budget.line.achieved_amount to SQL because it is not stored` Root Cause: since [this commit](https://github.com/odoo/odoo/pull/224667/commits/53b4670b1ad375ffc3800fc3beb97e960f229dc6), a new aggregate spec `sum_currency` was added. As a result, the code at [1] is executed for currency-aware aggregates. From the line, `self._field_to_sql(self._table, fname, query)` the ORM tries to create an SQL expression for `achieved_amount`. Because `achieved_amount` is computed `_field_to_sql` fails and error is raised. Fix: Provide a default SQL expression for computed fields on Budget Line [1]: https://github.com/odoo/odoo/blob/af668f545676f72385c52629f8498edfe22219cd/odoo/orm/models.py#L1972-L2004 Used Reference: https://github.com/odoo/odoo/blob/d42102cac8fff3967cb605a897bbb0e8690464ed/addons/crm/models/crm_lead.py#L286-L298 sentry-6917352415 Forward-Port-Of: odoo/enterprise#98215
Users can now send SMS authentication messages for signing as long as they still have purchased SMS credits available. This prevents valid signing requests from being blocked when the remaining balance is below one full credit but still enough to pay for one or more SMS messages.
Original PR description
Before this PR, when the authentication method is SMS in a sign document, the check to decide whether the authentication SMS is sent out checks that the amount of owned credits is >=1. The correct approach would be to check that they are >= sms_price but this price depends on the phone number of the recipient (or its international prefix) which we still don't know at the time of this computation. Because of this, when the function was originally written, the check was set to >=1 since 1>sms_price for every country. This, however, blocks the user from sending messages when sms_price<num_credits<1 which could even be multiple sms. By switching the 1 to a 0 we allow to send every sms the user purchased credits for and the last sms (which would bring the credits to <0) will be blocked directly by the iap server. Task: 4876220
This fixes an installation issue when the Mexican payroll module is installed by itself. The module now includes the required demo company data again, so its demo departments and related records can be created successfully.
Original PR description
In the pr #95221 the data from the demo company where no new fields were added was deleted. This decision was made to standardize the demo data in the smallest number of modules. However, the l10n_mx_hr_payroll module does not depend on any other l10n_mx module, as it does not need any of the information added by the other modules, but it does add information about departments and other items based on the company's demo data. This caused an error when installing this module alone, as it attempted to add this information to a company that did not exist. To fix this, the company information is also added as demo in this module, as it was before. I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/enterprise#98404
The barcode app now respects the delivery setting that blocks extra products when workers scan whole packages. This prevents unintended items from being added to deliveries, reducing picking errors and improving inventory control.
Original PR description
## Issue 1: "Allow Extra Products" option ignored for packages ### Steps to reproduce: - In the settings enable "Packages" - Go to Inventory > Configuration > Warehouse Management > Operation Types -…
## Issue 1: "Allow Extra Products" option ignored for packages
### Steps to reproduce:
- In the settings enable "Packages"
- Go to Inventory > Configuration > Warehouse Management > Operation Types
- Disable "Allow Extra Products" on the "Delivery" operation type
- Create two storable product P1, P2 and add on hand quantities
- 10 x P1 in a package PACK01
- 10 x P2 in a package PACK02
- Create and confirm a delivery for 10 unit of P1
- Open your delivery from the barcode app
- Scan PACK02
#### > The content of PACK02 is added to the delivery even thought it contains extra products.
### Cause of the issue:
The check for extra products is only applied when scanning individual products but is bypassed by package scan. To be more precise, the `barcode_allow_extra_product` option is checked in the public method `createNewLine`:
https://github.com/odoo/enterprise/blob/331442fd9cbd59d542432b2237299df9497ce241/stock_barcode/static/src/models/barcode_picking_model.js#L59-L80
While this method is called at new line creation when a product is scanned, scanning a package will add new lines during the `_processPackage` adn bypasses the rest of the `_processBarcode`:
https://github.com/odoo/enterprise/blob/331442fd9cbd59d542432b2237299df9497ce241/stock_barcode/static/src/models/barcode_model.js#L1261-L1267
The issue being that the `__processPackage` does not check the `barcode_allow_extra_product` option and creates its new lines via the private `_createNewLine` call:
https://github.com/odoo/enterprise/blob/331442fd9cbd59d542432b2237299df9497ce241/stock_barcode/static/src/models/barcode_picking_model.js#L1564-L1565
https://github.com/odoo/enterprise/blob/331442fd9cbd59d542432b2237299df9497ce241/stock_barcode/static/src/models/barcode_picking_model.js#L1655-L1667
https://github.com/odoo/enterprise/blob/331442fd9cbd59d542432b2237299df9497ce241/stock_barcode/static/src/models/barcode_picking_model.js#L1671
### Fix:
Since scanning a package is expected to add all its content to the picking, and since a package can not be split among two locations, it is necessary to check in advance if any product of its content is extra and avoid any update in this case.
## Issue 2: impossibility of package line removal
### State of the art:
There is currently no option to remove a package line from the barcode. In particular, once the option `show_entire_packs`(Move Entire Packages) is enabled on a picking type, you can not remove the package line once generated by a scan.
#### Steps to reproduce:
- In the settings enable "Packages"
- Go to Inventory > Configuration > Warehoue Management > Operation Types
- Enable "Move Entire Packages" on the "Delivery" operation type
- Create a storable product and add on hand quanties:
- 10 units in package PACK01
- 10 units in package PACK02
- Create and confirm a delivery for PACK01 (in the package lines)
- Open your delivery from the barcode app
- Scan PACK02
#### > The new line associated to PACK02 can not be removed by any mean
opw-4863621
opw-5080637
Forward-Port-Of: odoo/enterprise#97700
Forward-Port-Of: odoo/enterprise#96299The Australian payroll integration now uses updated IAP proxy connection URLs and a revised connection process. This helps keep payroll reporting and superannuation data exchanges working reliably while preserving existing connections.
Original PR description
Adds the new urls configured for the iap proxy. Adapts for the updated connection flow. This does not break any existing connections. Related PR: https://github.com/odoo/iap-apps/pull/1124 Forward-Port-Of: odoo/enterprise#95071
Users who are not administrators can now use the AI document sorting action when their documents are eligible for auto-sorting. This fixes missing access to the button and ensures AI can correctly identify destination folders, reducing manual re-upload work.
Original PR description
Purpose: -------- Non-admin users should be able to trigger the auto-sort of their documents (since anyways they could delete and reupload their documents, which will trigger the auto-sort). - The "Sort with AI" button was missing in the topbar for non-admin users. To fix this, a boolean `ai_has_sort_prompt` is added in the search panel values (the button was shown if `ai_sort_prompt` was set, which is only accessible by users with group_system) - The display name of folders is now the folder name if the env is sudo-ed even if the user has not access this folder (these folders are valid targets if they are in the `ai_sort_prompt`, but they were inserted as "Restricted Folder" so the LLM could not decide in which folder to move the document) - Add a few sudo's so that the auto-sort action can be triggered by a non admin user Task-5144695 Forward-Port-Of: odoo/enterprise#96874
This update makes an appointment test more dependable by matching how customer booking details are handled in the real booking flow. It reduces false test failures without changing the customer-facing appointment experience.
Original PR description
The test 'test_customer_event_description' was failing inconsistently due to a discrepancy in how the event description is generated. The test previously relied on the base calendar model's logic,…
The test 'test_customer_event_description' was failing inconsistently due to a discrepancy in how the event description is generated. The test previously relied on the base calendar model's logic, which automatically creates a description by selecting the first partner associated with the event (excluding the organizer) based on default record ordering. This selected partner may not always be the actual person who booked the appointment. However, when a user books through the front-end, the controller uses specific logic to build the description, correctly identifying the booker and bypassing the model's default behavior. This difference caused the test to occasionally choose the wrong partner for the description, resulting in unpredictable failures. This commit aligns the test more closely with the actual booking behavior seen by users. It now explicitly prepares the event description using the designated booker's details and prevents the base model logic from interfering. This ensures the test is reliable and accurately validates the description content. A potential future improvement would involve refactoring the controller's description logic into the model layer for better testability, as the current test mimics the controller logic, which could diverge over time. Task-5207757 Forward-Port-Of: odoo/enterprise#98221
Corrects Mexican payroll CFDI generation so the employment subsidy section is only included for the specific subsidy payment types allowed by the government. This prevents payroll submissions with other payment inputs from being rejected.
Original PR description
Bug: If we add other inputs to a payslip, in the CFDI, then sending to the government will fail. Cause: In the CFDI, the node 'SubsidioAlEmpleo' is present when it shouldn't. Fix: The node should be present only for other payments of code 002, 007 or 008, all related to subsidies. Task: 5224176 Forward-Port-Of: odoo/enterprise#98529
Requests for quotation created from approvals now use the currency configured for the selected vendor instead of defaulting to the company currency. This keeps purchasing amounts consistent with other RFQ creation flows and avoids currency mismatches when updating existing purchase orders.
Original PR description
Issue: When creating an RFQ from an approval, the created purchase order does not use the currency set on the vendor of the product. Rather, it uses the currency of the company, with the value converted based on the vendor's currency to get the price. This is not consistent with other ways we create RFQs, which all respect the vendor currency. Solution: Pass the vendor's currency into the values sent when creating the purchase order. In the case of modifying an existing purchase order, only modify purchase orders matching vendor's currency. opw-4549937 Forward-Port-Of: odoo/enterprise#98205 Forward-Port-Of: odoo/enterprise#97069
The Helpdesk website's "Browse Articles" button now sends portal users directly to the linked Knowledge article instead of an empty Knowledge home page. This prevents confusion and helps customers reach the intended self-service content faster.
Original PR description
To reproduce: ============= 1. Create a Helpdesk Team linked to a Knowledge Article 2. Access the Help page on website as a portal user 3. Click on "Browse Articles" button -> redirected to empty knowledge home portal view Problem: ======== before this commit, redirection was made through the method `redirect_to_article` which will later call `_redirect_to_portal_view` that doesn't use the `article` parameter anymore as there is a patch on the front side to handle the redirection to the articale through the router, but as the calls are server-side, the patch is not applied and the redirection fails. Solution: ========= instead of calling `redirect_to_article`, directly redirect to the article's `website_url`. opw-5114885 Forward-Port-Of: odoo/enterprise#98363
Users importing Indian e-invoice IRN JSON files can now complete the process even when they do not have access to certain company settings. This prevents an unnecessary permission error and helps invoice imports proceed smoothly for affected users.
Original PR description
When importing an IRN JSON as an invoice, users without sufficient access rights to `res.company` fields encountered an access error on `l10n_in_edi_production_env`. This commit uses `sudo()` to safely read the company’s EDI environment configuration without requiring extra permissions. Before this PR: Import failed with error: `You do not have enough rights to access the field 'l10n_in_edi_production_env' on Companies (res.company)` After this PR: Import proceeds successfully for users without `res.company` read rights. Forward-Port-Of: odoo/enterprise#98528
Features or functions removed from Odoo
The employee overtime setting based on attendance has been removed because payroll and work entry rules now determine when extra hours apply. This simplifies configuration and reduces the chance of conflicting overtime settings across HR processes.
Original PR description
The overtime_from_attendance field is no longer needed, since the ruleset already provides the necessary information to determine whether extra hours should be applied. This change removes the redundant field. task-5082639
23 changes
Enhancements to existing features
The Phone app now opens much faster for HR officers by improving how access checks are handled behind the scenes. This reduces waiting time dramatically on large databases while keeping the same access behavior for users.
Original PR description
Description ----------- The rule `voip_call_hr_access_rule` is added with an `OR` to `voip_call_rule_user`, but with the presence of the `One2many` `employee_ids` in the domain, the final query leads to a bad plan where Postgres does a full Seq.Scan on `voip_call` to then post-filter based on `user_id`. To simplify the final query, we inline the ids that are being resolved from searching on `res.users.employee_id` (which is just a proxy for `res.users.employee_ids`). We also re-write the `ir.rule` to use this new inlining via `employee_id` and avoid using `employee_ids` which is resolved as a generic One2many from the ORM. This leads to a few more queries, but each is fast and trivial to process. Benchmark --------- On a database with over 10M `voip.call` and `res.users`, for a Hr Officer, to open the Phone's app default list view with no default filter (the default setup), took: | Before | After | Speed-up | |--------|-------|----------| | 13.3s | 80ms | 162x |
HR users can open the Phone app much faster on large databases. The access check was optimized to avoid slow database scanning, reducing load times from seconds to milliseconds in the benchmark.
Original PR description
Description ----------- The rule `voip_call_hr_access_rule` is added with an `OR` to `voip_call_rule_user`, but with the presence of the `One2many` `employee_ids` in the domain, the final query leads…
Description ----------- The rule `voip_call_hr_access_rule` is added with an `OR` to `voip_call_rule_user`, but with the presence of the `One2many` `employee_ids` in the domain, the final query leads to a bad plan where Postgres does a full Seq.Scan on `voip_call` to then post-filter based on `user_id`. To simplify the final query, we inline the ids that are being resolved from searching on `res.users.employee_id` (which is just a proxy for `res.users.employee_ids`). We also re-write the `ir.rule` to use this new inlining via `employee_id` and avoid using `employee_ids` which is resolved as a generic One2many from the ORM. This leads to a few more queries, but each is fast and trivial to process. Benchmark --------- On a database with over 10M `voip.call` and `res.users`, for a Hr Officer, to open the Phone's app default list view with no default filter (the default setup), took: | Before | After | Speed-up | |--------|-------|----------| | 13.3s | 80ms | 162x | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
Fixes an error that could occur when users opened a Field Service task from the map view. The task time is now displayed using the user’s local time format without seconds, improving reliability for Field Service teams.
Original PR description
Steps: -------- - Install industry_fsm - Go to FSM app > Map Issue: -------- When opening the FSM task from the map menu, a traceback occurs. Cause: ---------- The removal of `shortTimeFormat`, as shown in the this commit. https://github.com/odoo/odoo/commit/062b14097033afc19252cf3b8bb1fc541f8c868d#diff-39c1e6808cb2412961c390a24d5e6737f2fca1ef85ba2c40e501114311f596c2L67 Fix: ---- In this commit, the time object is built to be able to format the time without any seconds and take into account the time format defined in localization. task-5220054
When importing Ecuadorian vendor bills, the system now selects the matching purchase tax instead of accidentally applying a sales tax. This helps keep supplier bills, tax reporting, and accounting entries accurate without manual correction.
Original PR description
### Issue:
When importing a bill, some sale taxes are added to the lines.
### Steps to reproduce:
- Install 'l10n_ec_edi' and switch to an Ecuadorian company
- Accounting > Vendor > Bill
- Import an XML fill with a tax of 15%
- The created lines use the tax "VAT 15% G" which is a sale tax
### Cause:
The search to get the tax takes the first one from the right tax group.
### Solution:
Added `('type_tax_use', '=', 'purchase')` in the search domain to only retrieve purchase taxes.
opw-5174139
Forward-Port-Of: odoo/enterprise#98188This fixes an issue where live chat operators with standard live chat permissions could not pin customer messages after a chatbot handed the conversation to them. Operators can now manage important chat messages without being blocked by unnecessary chatbot-related access checks.
Original PR description
To reproduce (on runbot): - S1: Connect as "admin", leave the "YourWebsite.com" then logout - S1: Connect as "demo" user - S2: As public user, go to /contactus and start a chat session - S2: On the chatbot interaction, choose "I have a pricing question" (this will forward to the operator) - S2: enter a message - S1: On the livechat session, try to pin the last user message Since 1ecddc3d79dd an `AccessError` is raised, as the "demo" user (which is only `LiveChat / User`) don't have access to the chatbot step anymore. As we're not in the interacting with the chatbot when pinning a message, simplify skip that part if there is no "chatbotx answner" context to prevent the `AccessError`. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233617
Removing a decorative image shape in the website editor now restores the image’s original proportions when no manual crop was applied. This prevents images from staying accidentally cropped or distorted, making page editing more reliable for content teams.
Original PR description
Steps to reproduce: - Enter website edit mode. - Drag and drop a snippet containing an image onto the page. - Click the image. - Apply a shape that enforces a 1/1 ratio with stretch disabled (e.g the first one). - Remove the shape with the close button. Before this commit, removing the shape kept data-aspect-ratio at 1/1, so the picture stayed cropped or distorted. After this commit, removing the shape clears the crop dataset when no manual crop values exist, restoring the original proportions. task-5170195 Forward-Port-Of: odoo/odoo#231865
Corrects a rounding issue in Mexican electronic invoicing that could block global invoices with discounted lines from being validated. This helps businesses avoid rejected invoices caused by small discount calculation differences.
Original PR description
Steps to reproduce: ------------------- * Create an invoice with the following line: * Unit price: 47.25, Qty: 1, Taxes: 16%, Discount 50% * Confirm, create a global invoice > Observation: Error ```…
Steps to reproduce: ------------------- * Create an invoice with the following line: * Unit price: 47.25, Qty: 1, Taxes: 16%, Discount 50% * Confirm, create a global invoice > Observation: Error ``` Code : CFDI40108 Message : El TipoDeComprobante es I,E o N, el importe registrado en el campo no es igual al redondeo de la suma de los importes de los conceptos registrados. ``` Why the fix: ------------ The issue occurs because the `descuento` value, originally 23.625, is now being corrected to 23.615 which leads to `importe` having a value of 23.635 which round up to 23.64 and not 23.63. https://github.com/odoo/enterprise/blob/08564f3312c255f2f3ab95cef5a9bfc57727bd1f/l10n_mx_edi/models/l10n_mx_edi_document.py#L1111 https://github.com/odoo/enterprise/blob/08564f3312c255f2f3ab95cef5a9bfc57727bd1f/l10n_mx_edi/models/l10n_mx_edi_document.py#L1336 Before this commit https://github.com/odoo/enterprise/commit/39759babddc732a312ec5cd6a60a2f1819abc62c the discount value was being rounded when corrected. It would end up being evaluated to 23.62. To not bring back the issue the fixed by the mentioned commit we round the discount when generating the global invoice cfdi values. Now `importe` will have a value of 23.63 as `descuento` is rounded to 23.62. opw-5023597 Forward-Port-Of: odoo/enterprise#95982 Forward-Port-Of: odoo/enterprise#94438
This fix makes an automated Discuss test more reliable when checking that channel lists continue loading correctly after using search. It helps prevent false test failures under heavy system load, supporting smoother quality checks without changing end-user behavior.
Original PR description
The `test_discuss_sub_channel_search` tour ensures that lazy loading of threads works correctly with the search feature. Technically, the component uses the `useVisible` hook which waits for a trigger to be visible before loading more threads. However, under high CPU load, the `IntersectionObserver` might not detect the change. For example, clearing the search input will make the element disappear, but scrolling afterward may make it reappear. As a result, the component might not detect that it should load more threads. In practice, this should never happen. The test now waits for the state to update before scrolling. fixes runbot-181951 Forward-Port-Of: odoo/odoo#233419
Chilean electronic invoice imports no longer fail when a supplier uses a numeric currency code instead of a currency abbreviation. The system now recognizes those codes and falls back to Chilean pesos when needed, helping users import vendor bills without interruptions.
Original PR description
### Steps to reproduce: - Install "l10n_cl_edi" and switch to a Chilean company - Go in Accounting > Vendor > Bills - Import an XML with the line `<Moneda>013</Moneda>` - Traceback ### Cause: `Moneda` can be the currency name code like `USD` but also a numeric code corresponding to the currency. ### Solution: Add a dictionary linking codes to the currency names and check the dictionary if `Moneda` is numeric. Also add a fallback on `CLP` in case the value of `Moneda` fails to be translated to a currency. This avoids a traceback later when reading `vals['currency_id']`. opw-5184950 Forward-Port-Of: odoo/enterprise#98067
This fixes an issue in Point of Sale sales order loading where a lot number could still be assigned even after the user canceled the lot selection prompt. It helps prevent unintended product tracking details from being added to order lines, reducing correction work and improving order accuracy.
Original PR description
Before this commit, when loading a sale order containing an order line tracked by lot, the system prompted the user to select a lot. However, even if the user canceled the selection, the lot was still added to the order line. After this commit, the lot will no longer be set if the user cancels the selection. opw-5162487 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233281
This fixes an outdated internal call in the self-ordering point of sale flow that could trigger errors. The change helps keep the customer ordering experience stable by removing a reference to functionality that no longer exists.
Original PR description
Before this commit, there was still a call to the resetTableIdentifier, even though the function had been removed, which could cause errors. opw-5166737 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232521
This update makes the bank reconciliation screen more consistent across versions and reduces confusing duplicate partner information. It also prevents users from selecting certain bank-related accounts in reconciliation models when that selection would not produce a useful result, and keeps key payment action buttons easier to access.
Original PR description
[IMP] account_accountant: css backport To have a consistent css across all version of the new bank rec widget, we decided to backport few changes. backport of:…
[IMP] account_accountant: css backport To have a consistent css across all version of the new bank rec widget, we decided to backport few changes. backport of: https://github.com/odoo/enterprise/commit/524a7a46a0c2888b591de7ad1a0a6d744e345f5a https://github.com/odoo/enterprise/commit/2a83c85cb2c9a7a5da3d4a8483120eeda6b2e6cb https://github.com/odoo/enterprise/commit/e3cb3ab3ec8c64297d8e97d941e0d2eea3e64667 https://github.com/odoo/enterprise/commit/fdbb93abbf831cfa2fdc75e79aa76c094d6e522a https://github.com/odoo/enterprise/commit/f9725d7b01cbd1235f022821a6861adb2955e49e [FIX] account_accountant: restrict some account in the set_account Before this commit, we could select the liquidity account or bank suspense account which could create a reco model for it that would do nothing. [FIX] account_accountant: partner_name Before this commit, when a transaction had no partner_name and some lines with the same partner. When unfolded, we had the info of the partner on the statement line and on the line itself which was a duplicate of information. This commit will change when the line is unfolded so that the partner is visible on the statement line only when there is a partner_name [FIX] account_accountant: payable and receivable button Before this commit, the payable and receivable buttons where on the top line only when the reconcile button was not there anymore. Now We decided to always have them present in secondary next to the reconcile button. no task-id Forward-Port-Of: odoo/enterprise#98325 Forward-Port-Of: odoo/enterprise#96852
Point of Sale receipts now exclude combo product pricing from the total discount calculation when a discounted pricelist is used. This prevents free items in combo offers from being counted as discounts, giving customers and cashiers clearer, more accurate receipts.
Original PR description
Before this commit, if a pricelist with a discount was assigned to a PoS order, combo products that included free items would display an incorrect total discount on the receipt. The discount amount wrongly included the prices of the free products. Since combo price calculations follow a different logic, this commit ensures that pricelist discounts are excluded from the total discount computation for combo products to avoid confusion. opw-5046691 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233588
This fixes an issue where website background color selection options were accidentally changed during a previous update. Restoring the correct choices helps users keep the intended look and branding when editing website pages.
Original PR description
During the FW-port PR (https://github.com/odoo/odoo/pull/230283/files), the background color selectors were mistakenly modified. This commit restores their correct values. 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 update prevents upgrade failures when the default administrator employee record was previously deleted. It keeps HR data loading safely while preserving the payroll-related setup where it is actually needed.
Original PR description
The data file adds `structure_type_id` field to `employee_admin` [because](https://github.com/odoo/odoo/pull/217855) it is required in module `hr_payroll`. The original record for `employee_admin` became `forcecreate=0` but the override (in the same file) still will try to create it with no data if the users have removed the record. This fix moves the override to the module where it is needed, with forcecreate=0. Issue encountered during upgrades --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#231234
OCR-processed purchase receipts are now correctly treated as purchase documents instead of sales receipts. This prevents the system from selecting sales taxes on supplier receipts, improving accounting accuracy and reducing manual corrections.
Original PR description
Since task [4776275](https://www.odoo.com/odoo/project/2068/tasks/4776275) (commit [a7e9575](https://github.com/odoo/enterprise/commit/a7e9575d4c7fccff06db8a3ec2b9315d8ac33805)), the OCR is able to automatically detect and change a vendor bill into a receipt. The calls to `is_purchase_document` should have been updated to reflect that, but they weren't. Because of this, purchase receipts were considered as sale receipts, causing multiple issues such as sale taxes being selected instead of purchase taxes. task-none
Scanning a package in the barcode app now follows the same “Allow Extra Products” setting as scanning individual items. This prevents warehouse staff from accidentally adding the wrong packaged products to deliveries when extra products are not permitted.
Original PR description
## Issue 1: "Allow Extra Products" option ignored for packages ### Steps to reproduce: - In the settings enable "Packages" - Go to Inventory > Configuration > Warehouse Management > Operation Types -…
## Issue 1: "Allow Extra Products" option ignored for packages
### Steps to reproduce:
- In the settings enable "Packages"
- Go to Inventory > Configuration > Warehouse Management > Operation Types
- Disable "Allow Extra Products" on the "Delivery" operation type
- Create two storable product P1, P2 and add on hand quantities
- 10 x P1 in a package PACK01
- 10 x P2 in a package PACK02
- Create and confirm a delivery for 10 unit of P1
- Open your delivery from the barcode app
- Scan PACK02
#### > The content of PACK02 is added to the delivery even thought it contains extra products.
### Cause of the issue:
The check for extra products is only applied when scanning individual products but is bypassed by package scan. To be more precise, the `barcode_allow_extra_product` option is checked in the public method `createNewLine`:
https://github.com/odoo/enterprise/blob/331442fd9cbd59d542432b2237299df9497ce241/stock_barcode/static/src/models/barcode_picking_model.js#L59-L80
While this method is called at new line creation when a product is scanned, scanning a package will add new lines during the `_processPackage` adn bypasses the rest of the `_processBarcode`:
https://github.com/odoo/enterprise/blob/331442fd9cbd59d542432b2237299df9497ce241/stock_barcode/static/src/models/barcode_model.js#L1261-L1267
The issue being that the `__processPackage` does not check the `barcode_allow_extra_product` option and creates its new lines via the private `_createNewLine` call:
https://github.com/odoo/enterprise/blob/331442fd9cbd59d542432b2237299df9497ce241/stock_barcode/static/src/models/barcode_picking_model.js#L1564-L1565
https://github.com/odoo/enterprise/blob/331442fd9cbd59d542432b2237299df9497ce241/stock_barcode/static/src/models/barcode_picking_model.js#L1655-L1667
https://github.com/odoo/enterprise/blob/331442fd9cbd59d542432b2237299df9497ce241/stock_barcode/static/src/models/barcode_picking_model.js#L1671
### Fix:
Since scanning a package is expected to add all its content to the picking, and since a package can not be split among two locations, it is necessary to check in advance if any product of its content is extra and avoid any update in this case.
## Issue 2: impossibility of package line removal
-> Resolved in 19.0 see https://github.com/odoo/enterprise/commit/060f4c3e24e7add05273cfad5853884546937d0e#diff-3c84b414a086808e446ae3f90b3b803edf964c28237c153af19edda3ed05cc6bL21
### State of the art:
There is currently no option to remove a package line from the barcode. In particular, once the option `show_entire_packs`(Move Entire Packages) is enabled on a picking type, you can not remove the package line once generated by a scan.
#### Steps to reproduce:
- In the settings enable "Packages"
- Go to Inventory > Configuration > Warehoue Management > Operation Types
- Enable "Move Entire Packages" on the "Delivery" operation type
- Create a storable product and add on hand quanties:
- 10 units in package PACK01
- 10 units in package PACK02
- Create and confirm a delivery for PACK01 (in the package lines)
- Open your delivery from the barcode app
- Scan PACK02
#### > The new line associated to PACK02 can not be removed by any mean
opw-4863621
opw-5080637
Forward-Port-Of: odoo/enterprise#97497
Forward-Port-Of: odoo/enterprise#96299Users without administrator rights can now use the AI document sorting option when it is configured for their workspace. This removes an unnecessary permission barrier and helps documents be routed to the right folders more reliably.
Original PR description
Purpose: -------- Non-admin users should be able to trigger the auto-sort of their documents (since anyways they could delete and reupload their documents, which will trigger the auto-sort). - The "Sort with AI" button was missing in the topbar for non-admin users. To fix this, a boolean `ai_has_sort_prompt` is added in the search panel values (the button was shown if `ai_sort_prompt` was set, which is only accessible by users with group_system) - The display name of folders is now the folder name if the env is sudo-ed even if the user has not access this folder (these folders are valid targets if they are in the `ai_sort_prompt`, but they were inserted as "Restricted Folder" so the LLM could not decide in which folder to move the document) - Add a few sudo's so that the auto-sort action can be triggered by a non admin user Task-5144695
Salary rule forms now require the percentage base field only when it is actually needed. This prevents incorrect validation errors when payroll users change salary rule conditions or percentage settings, making the form easier to save correctly.
Original PR description
**Steps to reproduce:** - Install the hr_payroll module. - Open a salary rule form view. - Change amount_select to Percentage and try to save → validation error occurs because amount_percentage_base is required. - Keep amount_select the same and change condition_select to Salary Input → the same validation error occurs. **Issue:** The amount_percentage_base field is incorrectly made required even when condition_select changes. The requirement should depend solely on amount_select, not condition_select. **Cause:** The field amount_percentage_base remains mandatory when condition_select is updated, leading to validation errors. **Fix:** This PR adjusts the logic so that the amount_percentage_base field is required only when appropriate, based on both condition_select and amount_select. task-5090125
The date and time picker now provides clearer hover and focus feedback, making it easier for users to see what they are selecting. Dark mode styling was also corrected so the calendar and time fields remain readable and visually consistent.
Original PR description
The `DateTimePicker` lacks hover and focus states. In darkmode the calendar doesn't have the proper elevation background color and the input border on `TimePicker` is not visible. task-4900904 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Budget generation no longer fails when users split a budget by analytic plan. This helps accounting teams create split budgets reliably without encountering an error during the process.
Original PR description
Currently, on creating a budget using split budget causing an error. **Steps to Reporduce:** 1) Install **account_budget module(with Demo)** 2) Navigate to **Accounting>Accounting>Analytic Budget**…
Currently, on creating a budget using split budget causing an error. **Steps to Reporduce:** 1) Install **account_budget module(with Demo)** 2) Navigate to **Accounting>Accounting>Analytic Budget** 3) Click on `Generate` set `Analytic Plan` and click on `Split` Error: `ValueError: Cannot convert budget.line.achieved_amount to SQL because it is not stored` Root Cause: since [this commit](https://github.com/odoo/odoo/pull/224667/commits/53b4670b1ad375ffc3800fc3beb97e960f229dc6), a new aggregate spec `sum_currency` was added. As a result, the code at [1] is executed for currency-aware aggregates. From the line, `self._field_to_sql(self._table, fname, query)` the ORM tries to create an SQL expression for `achieved_amount`. Because `achieved_amount` is computed `_field_to_sql` fails and error is raised. Fix: Provide a default SQL expression for computed fields on Budget Line [1]: https://github.com/odoo/odoo/blob/af668f545676f72385c52629f8498edfe22219cd/odoo/orm/models.py#L1972-L2004 Used Reference: https://github.com/odoo/odoo/blob/d42102cac8fff3967cb605a897bbb0e8690464ed/addons/crm/models/crm_lead.py#L286-L298 sentry-6917352415
This update fixes an unreliable automated test for appointment bookings by making it match how customer details are handled during real online bookings. It helps reduce false test failures and supports more stable appointment-related releases without changing user-facing behavior.
Original PR description
The test 'test_customer_event_description' was failing inconsistently due to a discrepancy in how the event description is generated. The test previously relied on the base calendar model's logic,…
The test 'test_customer_event_description' was failing inconsistently due to a discrepancy in how the event description is generated. The test previously relied on the base calendar model's logic, which automatically creates a description by selecting the first partner associated with the event (excluding the organizer) based on default record ordering. This selected partner may not always be the actual person who booked the appointment. However, when a user books through the front-end, the controller uses specific logic to build the description, correctly identifying the booker and bypassing the model's default behavior. This difference caused the test to occasionally choose the wrong partner for the description, resulting in unpredictable failures. This commit aligns the test more closely with the actual booking behavior seen by users. It now explicitly prepares the event description using the designated booker's details and prevents the base model logic from interfering. This ensures the test is reliable and accurately validates the description content. A potential future improvement would involve refactoring the controller's description logic into the model layer for better testability, as the current test mimics the controller logic, which could diverge over time. Task-5207757
Documentation and clarification updates
This pull request records that contributor Vitor29Narciso has signed the Contributor License Agreement. This is an administrative legal requirement that helps Odoo accept contributions safely, with no direct change to product features or user workflows.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
8 changes
Resolved issues and error corrections
The update prevents company chart setup from failing when newly introduced Indian tax records are not yet present for an existing company. This helps businesses continue using or configuring Indian localization without unexpected errors after stable legal tax updates.
Original PR description
If new taxes are introduced in stable (for legal reasons), and for Indian localisation we create new fiscals position for branch In such that case the new taxes will be not updated for the current company in such that case it will be lead to traceback with External ID not found for taxes. In this commit we add a new context `raise_if_not_found_ref`, through which if the tax doesn't exists the error is not raised --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update reverts a narrow mobile POS autofocus adjustment because the underlying issue is now handled by a broader fix across all views. This helps keep the POS behavior consistent while avoiding duplicate or unnecessary view-specific changes.
Original PR description
Task: [#5016943](https://www.odoo.com/odoo/project/1737/tasks/5016943) Revert PR: - [odoo/231045](https://github.com/odoo/odoo/pull/231045) - [enterprise/96873](https://github.com/odoo/enterprise/pull/96873) --- The purpose of this task was to remove the autofocus for certain views concerning the POS on mobile devices. However, this is no longer needed, since the root of the issue was global and had to be fixed across all views. While this task addressed the issue on a few specific views, [PR #232054](https://github.com/odoo/odoo/pull/232054) provides a global fix.
This change reverts a temporary adjustment that disabled automatic focus in specific restaurant appointment POS views on mobile devices. The issue is now handled by a broader platform-wide fix, keeping behavior consistent across all views instead of maintaining a narrow workaround.
Original PR description
Task: [#5016943](https://www.odoo.com/odoo/project/1737/tasks/5016943) Revert PR: - [odoo/231045](https://github.com/odoo/odoo/pull/231045) - [enterprise/96873](https://github.com/odoo/enterprise/pull/96873) --- The purpose of this task was to remove the autofocus for certain views concerning the POS on mobile devices. However, this is no longer needed, since the root of the issue was global and had to be fixed across all views. While this task addressed the issue on a few specific views, [PR #232054](https://github.com/odoo/odoo/pull/232054) provides a global fix.
Portal users clicking "Browse Articles" from a Helpdesk help page are now taken directly to the linked Knowledge article instead of an empty knowledge home page. This fixes a navigation issue and helps customers find the intended self-service content faster.
Original PR description
To reproduce: ============= 1. Create a Helpdesk Team linked to a Knowledge Article 2. Access the Help page on website as a portal user 3. Click on "Browse Articles" button -> redirected to empty knowledge home portal view Problem: ======== before this commit, redirection was made through the method `redirect_to_article` which will later call `_redirect_to_portal_view` that doesn't use the `article` parameter anymore as there is a patch on the front side to handle the redirection to the articale through the router, but as the calls are server-side, the patch is not applied and the redirection fails. Solution: ========= instead of calling `redirect_to_article`, directly redirect to the article's `website_url`. opw-5114885
Fixes an issue where updating multiple combo products in an unsaved sales order could cause their related items to appear under the wrong combo. This keeps sales order lines clear and accurate while users adjust quantities before saving.
Original PR description
Steps to Reproduce: - Create a Sale Order containing two combo products placed consecutively. - Change the quantity of the first combo → corresponding combo items update correctly. - Without saving,…
Steps to Reproduce: - Create a Sale Order containing two combo products placed consecutively. - Change the quantity of the first combo → corresponding combo items update correctly. - Without saving, change the quantity of the second combo. - Observe that the combo items now appear misplaced — items from the second combo are inserted before those of the first combo. Issue: - The order of combo items becomes incorrect when multiple combo products are updated consecutively in the same unsaved Sale Order. Cause: - During `onchange`, the `self.order_line` recordset reflects the *in-memory order of applied commands* rather than the database `sequence` field because they are not saved in the DB during the edition. - Each `onchange` rebuilds `order_line` using concatenated command lists (`delete + create + update`), So when multiple combos are modified without save, newly created combo items are appended according to command evaluation order — not by logical grouping. - This causes combo items to shift relative to their parent combo lines. Solution: - Restrict the recomputation of order lines to non-combo lines by filtering out combo item lines during the rebuild. As combo items will always be in their desired sequence. - This ensures that combo items always stay under their respective parent combos and their sequence is preserved, regardless of the order in which combos are updated. opw-5148770 Affected Version:18.0 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Document downloads now handle file names containing slashes more safely by replacing them with underscores. This prevents downloaded ZIP files from unexpectedly creating extra folders when extracted, making document exports clearer and easier to use.
Original PR description
Bug === If you download a folder that has documents in it, with `/` in their names, then after extracting the zip, it will create folders for the part on the left of `/`. To solve that issue, we replace the `/` with `_`. Task-5109681
This fixes Stripe payments in Point of Sale so tips added after payment are handled correctly. Payments are now properly captured and adjusted, preventing failed or blocked future tipping for restaurant and POS customers.
Original PR description
Since [^1], tip after payment has been broken for stripe as `_update_payment_line_for_tip` is no longer called anywhere. This means that all payments were put in as uncaptured and no future tipping would work. This PR fixes it by using the "new" send_payment_adjust method like ayden to guarantee the payments are properly handled. Note that this is solved by wrapping `capturePayment` into a new method `capturePaymentStripe` to keep the stable policy. A followup PR will move the data back to `capturePayment` in master with the new parameters. opw-5121568 [^1]: 9c37f42ef4e23372f5e2bdbb956b625b3a47d8e1
Features or functions removed from Odoo
The media dialog no longer offers Dailymotion or Youku embed options where they can create broken video content due to platform changes. Users will see a more accurate list of supported video platforms, reducing the chance of adding videos that do not work properly on websites.
Original PR description
Specification: Improve `VideoSelector` Component. After this PR: - Dailymotion has deprecated its legacy embed endpoint starting September 23, 2024. Removed support for embedding Dailymotion videos in the media dialog. - Embedding Youku videos via iframe has become unreliable and no longer functions properly in the media dialog. Removed support for Youku embeds to prevent broken video content. - The supported platforms string now correctly lists YouTube, Vimeo, and Dailymotion, Instagram as supported platforms. task-4855038 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#214296
8 changes
Enhancements to existing features
Stock availability calculations now avoid unnecessary repeated checks when many incoming and outgoing stock moves are linked. This can make large picking reports much faster, reducing wait times for users reviewing product availability.
Original PR description
Before this commit, computing `product_availability` and `product_availability_state` required calling the `get_report_lines` method from the `stock.forecasted_product_product` model. In pickings…
Before this commit, computing `product_availability` and `product_availability_state` required calling the `get_report_lines` method from the `stock.forecasted_product_product` model. In pickings containing moves linked to many incoming and outgoing moves, the `reconcile_out_with_ins` function caused performance issues. The reconciliation logic worked as follows: 1. For each `out_move`, attempt to match it with an `in_move` if the `in_move` references the `out_move` in its `move_dests`. 2. If the demand of the `out_move` is not fully satisfied, add it to `unreconciled_outs`. 3. Loop over `unreconciled_outs` (after attempting to reconcile them using the initial prodcedure) to reconcile against the remaining `in_moves`. The performance bottleneck was that even when an `in_move` directly referenced an `out_move`, the code would unnecessarily loop over **all** `in_moves` to filter out the `in_moves` that has the `out_move` in its `move_dest`. --- To improve performance, an **inverse mapping** from `out_move` IDs to their corresponding `in_moves` is introduced. - Reconciliation now starts by iterating only over the relevant `in_moves`. - If the demand is still unmet, the algorithm attempts reconciliation against the remaining `in_moves`. - This reduces the time complexity to **O(N + M)**, since `in_moves` with zero quantities are removed and never revisited. **Implementation details:** - An `OrderedSet` is used for the inverse mapping to preserve the original query order. - Benefits of `OrderedSet`: - **O(1)** removal (assuming no collisions) - Maintains insertion order, ensuring the same order as the query result. --- | Metric | Before PR | After PR | |---------------|-----------|----------| | Execution Time| ~90 sec | ~10 sec | The benchmark above is done on a `stock.picking` record that queried in the `_get_report_lines` method **5331** `out_moves` and **8922** `in_moves`. opw-4951469
Resolved issues and error corrections
This fixes cases where a renamed document still showed its old file name in the preview window. Users will now see the correct document name immediately and consistently when previewing files, reducing confusion when managing documents.
Original PR description
# Issues There are a total of 3 different flows by which we observe the common issue (name not updating in the fileviewer) ----------------------------- ### 1st flow 1. click on any image to preview…
# Issues There are a total of 3 different flows by which we observe the common issue (name not updating in the fileviewer) ----------------------------- ### 1st flow 1. click on any image to preview it. 2. close the preview. 3. now just select the same document. 4. change it's name from the inspector and hit ENTER. 5. now keeping it selected, preview it again. 6. you will notice the file name has not been updated in the file viewer. issue: - the existing IF condition which is present only checks for the datapoint ID (which changes only when we replace the existing document with a new document). reason: - but in our case, since the document is same the ID remains the same. - as a result, the code inside the IF block does not get executed and the document store is not updated. but we still need to update the document store with the newly updated document. fix: - we remove the IF condition so that we ensure that the document store is updated everytime we PREVIEW any document. ---------------------------------------------------- ### 2nd flow 1. click on any image to preview it. (do not select it) 2. change it's name from the inspector and hit ENTER. 3. close the PREVIEW. 4. PREVIEW the same document again. 4. you will notice the file name has not been updated in the file viewer. issue: - for some reason the existing `record.save()` fails to save/update the root records. fix: - we find that record from the root and save it from the root. ---------------------------------------------------------- ### 3rd flow 1. click on any image to preview it. 2. change it's name from the inspector and hit ENTER. 3. you will notice the file name has not been updated in the file viewer. issue: - the `previewStore` object is formed/updated only when we preview any document. it is this `previewStore` object which contains the list of documents to preview. - but when we update the file name from the inspector, the code to update the `previewStore` is absent. fix: - on updating the values from the inspector, we now update the `previewStore` as well. which then goes on to update the name in the FILEVIEWER. Task-4605750
This fix updates Odoo's email server handling and related tests so they work reliably on newer Debian Trixie environments. It prevents compatibility warnings and connection issues that could affect email-related setup or automated checks during deployments.
Adding contacts to a mailing list through the bulk wizard now records the subscription date correctly. This keeps contact history consistent regardless of whether users add contacts one by one or in bulk.
Original PR description
Steps to reproduce: ------------------------- 1. Install Email Marketing Module 2. Create a new Mail List 3. Go to Mailing List Contacts 4. Select multiple contacts from list and click on Add to List…
Steps to reproduce: ------------------------- 1. Install Email Marketing Module 2. Create a new Mail List 3. Go to Mailing List Contacts 4. Select multiple contacts from list and click on Add to List button 5. From wizard select the newly created list and click on Add button 6. Open one of the contact added in step 4 Observation: ------------------------- In the Mailing Lists tab of the contact, the newly added list does not show a Subscription Date. However, if we add the same through Add a line, the subscription date is shown correctly. Issue: ------------------------- When adding contacts to a mailing list through the wizard, the code https://github.com/odoo/odoo/blob/1e6ba783fcd898875dadb47924147688685707cf/addons/mass_mailing/wizard/mailing_contact_to_list.py#L34-L39 adds the contact using a direct database operation. This bypasses the ORM record creation for `mailing.subscription`, so the `create_date` (subscription date) is never set. Solution: ------------------------- Use `Command.create` on the `subscription_ids` field to properly create the `mailing.subscription` records and ensure the Subscription Date is set. opw-5055372
Planning analysis reports no longer count hours from a shift that falls outside an employee's working schedule just because it crosses into a new month. This prevents planned hours from being overstated in the wrong reporting period, improving accuracy for capacity and timesheet planning.
Original PR description
### Steps to reproduce: - Create an employee with fixed working schedule from 8 to 5 - Create a Planning shift for this employee that starts in a month and ends in the first day of the next month outside of working hours (e.g. Sept30th 8AM -> Oct1st 2AM) - Navigate to Timesheets / Planning analysis reports - Notice October has been taken into consideration in the report's planned hours ### Cause: The query we are using for the timesheets/planning report doesn't take working hours into consideration it only cares about the date. So if the shift ends in October 1st we are taking it into account whether it is inside working hours or not. ### Fix: Add a condition to the where clause to check the working hours and if the record lays in this period or not. opw-5089052
Company logo lookup now uses Odoo's enrichment service instead of fetching logos directly in the user's browser. This should make partner enrichment more reliable while removing logo display from the initial search results.
Original PR description
Before this commit- We used to rely on clearbit to fetch the logo of the company on the client side After this commit- We replace it with logo.dev and remove the fetching of logo from client side and move it to the IAP task-5126337 IAP PR- https://github.com/odoo/iap-apps/pull/1234 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Planning app now shows the recurring shift banner only after recurring shifts have actually been generated. This avoids confusing users with a banner that previously appeared before it could have any practical effect.
Original PR description
**Steps to reproduce:** --------- 1. Create a shift. 2. Save the shift. 3. Open the shift and enable the recurrence. 4. Observe that the recurrence banner is immediately displayed. **Issue:** ----- The recurrence banner is shown as soon as a shift is marked recurring, even though no recurring shifts have been generated yet. This is misleading since the banner has no effect until the actual recurrence slots exist. **Cause:** ------- The banner visibility was based on repeat and id, so it appeared too early, before any recurring shifts were actually created. **Fix:** -------- Update the banner visibility condition to check for both repeat and recurrency. Now, the recurrence banner only appears once the recurrence record exists and recurring shifts are generated: task-5163851
Dimona-related employee fields now appear only when they are relevant to Belgian employees. This reduces confusion for companies managing employees in other countries and keeps employee records cleaner.
Original PR description
Before this commit, the fields about dimona were shown for all employees, now these fields will be displayed only for belgian employees. task-5148931 Forward-Port-Of: odoo/enterprise#96496