Daily updates from Odoo
Navigate
Branch
Monday, March 17, 2025
35 changes
23 changes
Enhancements to existing features
This update aligns the enterprise e-invoicing integration with a shared approach for fetching electronic invoices and notifying users when new invoices arrive. It helps prepare Odoo for consistent e-invoice workflows across Peppol and future localizations such as Nemhandel.
Original PR description
We start accumulating buttons for fetching electronic invoices and their statuses with different localisations. In addition to peppol, there l10n_tk and soon l10n_dk (with Nemhandel: https://github.com/odoo/odoo/pull/190474) which also needs such a button In addition to these buttons, we also need a standard way of notifying users when receiving einvoices for these different modules This commit just adapts enterprise function signature for the changes made in community related prs: - odoo/upgrade#7205 - odoo/odoo#197233 task-4457146
The IoT system now keeps its websocket connection open by default instead of only opening it for report printing. This simplifies future IoT features while keeping server load low because one shared connection is used per company.
Original PR description
We used to open the websocket channel between iot box and db only when a report was set, to opening a useless connection. In order to simplify the code and reduce complexity when using ws for anything else than printing a report, we removed this logic. Note that we only use one ws channel for all iot boxes on the same company, making the load very small. Upgrade: odoo/upgrade#7383 Task: 4648490
IoT device pages now offer a clearer interface and a direct way to test printer status from the database. IoT Box pages also include a status button that opens the box homepage, helping users check devices faster and reduce troubleshooting time.
Original PR description
Improved IoT Device UI and added a button to test printers (print status) directly from the IoT Device form, in order to ease quick testing from the db. Also added a status button on the IoT Box form view to redirect to the IoT Box Homepage. Community PR: [https://github.com/odoo/odoo/pull/201231](https://github.com/odoo/odoo/pull/201231) Task: 4640921
Features or functions removed from Odoo
Rental orders no longer include a dedicated Sign Documents button because the same signature request workflow is now available from the standard cog menu when the Sign app is installed. This removes a redundant integration module while keeping signature capabilities accessible through the shared Sign feature.
Original PR description
**Before this commit:** - Rental orders had a dedicated 'Sign Documents' button in the form view after confirming the Rental Order, allowing users to either sign the document on the spot or send it via email for signature **After this commit:** - Since the 'Request Signature' option is available in the cog menu across all apps after installing the Sign module, a separate renting-sign bridge module is no longer needed. Additionally, the demo data from the renting-sign bridge has been moved to the Sign module's demo data. Affected versions: _master_ Task-[4555707](https://www.odoo.com/odoo/project/4106/tasks/4555707)
Code cleanup and technical improvements
The spreadsheet global filters editor was reorganized to manage its screen state in a central store. This is an internal cleanup that should make the editor easier to maintain and prepare it for future improvements, without changing the expected user workflow.
Original PR description
This commit simplifies the global filters editors by using a store to manage the state of the editor. Task: 4589753
This update cleans up parts of Odoo's messaging system ahead of a major release. It removes duplicate mobile notification logic so muted chat channels are handled consistently and users are less likely to receive unwanted notifications.
This update reorganizes internal WhatsApp messaging logic so it sits in the modules where it is most relevant. It also centralizes timezone handling, reducing duplicate code and making future maintenance safer without changing the user experience.
Miscellaneous changes
Steps to reproduce: - Ensure the Colombian localization is installed and set up - Make an invoice with taxes "19%" and "15% RteVAT 19%" - Try to sign the invoice - Get the error Occurs after the global rounding refactor d5da2b62263f85fbce0f2548085c066cbbf10371 By mistake, the operation is using now the tax percent instead of the tax amount opw-4446123 Forward-Port-Of: odoo/enterprise#81288
Original PR description
Steps to reproduce: - Ensure the Colombian localization is installed and set up - Make an invoice with taxes "19%" and "15% RteVAT 19%" - Try to sign the invoice - Get the error Occurs after the global rounding refactor d5da2b62263f85fbce0f2548085c066cbbf10371 By mistake, the operation is using now the tax percent instead of the tax amount opw-4446123 Forward-Port-Of: odoo/enterprise#81288
LATAM Task 1300 - ADHOC Task 47476 Forward-Port-Of: odoo/enterprise#81489 Forward-Port-Of: odoo/enterprise#79635
Original PR description
LATAM Task 1300 - ADHOC Task 47476 Forward-Port-Of: odoo/enterprise#81489 Forward-Port-Of: odoo/enterprise#79635
We're adding support for recaptcha in appointment forms to prevent bots from easily filling up slots. In 17.0 cloudflare turnstile is added as an alternative and/or fallback for recaptcha. We adapt the js code to call the cloudflare client API which gives us support of this feature "for free" as all of the logic is already implemented for the check. task-4335141 Forward-Port-Of: odoo/enterprise#81247 Forward-Port-Of: odoo/enterprise#76672
Original PR description
We're adding support for recaptcha in appointment forms to prevent bots from easily filling up slots. In 17.0 cloudflare turnstile is added as an alternative and/or fallback for recaptcha. We adapt the js code to call the cloudflare client API which gives us support of this feature "for free" as all of the logic is already implemented for the check. task-4335141 Forward-Port-Of: odoo/enterprise#81247 Forward-Port-Of: odoo/enterprise#76672
Add a step that ensures a name_search has been fired. The hypothesis is that the dropdown item is already present before editing the m2o's value (that triggers a name_search) The tour advances, captures a trigger but right there the rpc returns, modifies the DOM and the captured element is not there anymore, crashing as a consequence. runbot-error-67580 Forward-Port-Of: odoo/enterprise#80918 Forward-Port-Of: odoo/enterprise#80598
Original PR description
Add a step that ensures a name_search has been fired. The hypothesis is that the dropdown item is already present before editing the m2o's value (that triggers a name_search) The tour advances, captures a trigger but right there the rpc returns, modifies the DOM and the captured element is not there anymore, crashing as a consequence. runbot-error-67580 Forward-Port-Of: odoo/enterprise#80918 Forward-Port-Of: odoo/enterprise#80598
PR #75203 removed the mobile field, and so updated search domains that used it in VoIP, but the corresponding ORs weren't correctly cleaned up, breaking the search. This commit gets rid of the obsolete ORs. Forward-Port-Of: odoo/enterprise#81353
Original PR description
PR #75203 removed the mobile field, and so updated search domains that used it in VoIP, but the corresponding ORs weren't correctly cleaned up, breaking the search. This commit gets rid of the obsolete ORs. Forward-Port-Of: odoo/enterprise#81353
**Issue:** An error is raised when trying to discard a timesheet entry. **Steps to reproduce:** - Open Timesheets. - Open an existing entry by clicking on the magnifying glass. - Start a timesheet entry by clicking "Start". - Click on "Discard". opw-4614472 Forward-Port-Of: odoo/enterprise#81385 Forward-Port-Of: odoo/enterprise#81186
Original PR description
**Issue:** An error is raised when trying to discard a timesheet entry. **Steps to reproduce:** - Open Timesheets. - Open an existing entry by clicking on the magnifying glass. - Start a timesheet entry by clicking "Start". - Click on "Discard". opw-4614472 Forward-Port-Of: odoo/enterprise#81385 Forward-Port-Of: odoo/enterprise#81186
Before this commit, when a commission plan was based on achivements of team, the plan user would not be distinguished. As a reusult, the last salesperson would get the totality of the commission. opw-ticket: 4534131 Forward-Port-Of: odoo/enterprise#81425 Forward-Port-Of: odoo/enterprise#81226
Original PR description
Before this commit, when a commission plan was based on achivements of team, the plan user would not be distinguished. As a reusult, the last salesperson would get the totality of the commission. opw-ticket: 4534131 Forward-Port-Of: odoo/enterprise#81425 Forward-Port-Of: odoo/enterprise#81226
Steps to reproduce: - Create an invoice with the following lines: 1. Price Unit 3163.79 | Qty 1 | Discount 25% | Tax 16% 2. Price Unit 2992.41 | Qty 1 | Discount 25% | Tax 16% 3. Price Unit 3025.86 | Qty 1 | Discount 25% | Tax 16% - Confirm, Send to validation Issue: Validation will fail with error ``` Message : Error de validaciones adicionales [Error #CFDI40111] El TipoDeComprobante no es I,E o N, y un concepto incluye el campo descuento. Folio: 1. Serie: INV/2025/. El valo
Original PR description
Steps to reproduce: - Create an invoice with the following lines: 1. Price Unit 3163.79 | Qty 1 | Discount 25% | Tax 16% 2. Price Unit 2992.41 | Qty 1 | Discount 25% | Tax 16% 3. Price Unit 3025.86 | Qty 1 | Discount 25% | Tax 16% - Confirm, Send to validation Issue: Validation will fail with error ``` Message : Error de validaciones adicionales [Error #CFDI40111] El TipoDeComprobante no es I,E o N, y un concepto incluye el campo descuento. Folio: 1. Serie: INV/2025/. El valor del atributo Descuento (2295.51) no coincide con la suma de los importes (790.947500 + 748.090000 + 756.465000 = 2295.50) ``` This occurs because when correcting the discount rounding we round the biggest discount amount so the amounts might not add up correctly anymore opw-4596741 Forward-Port-Of: odoo/enterprise#80695
…sepa Steps to reproduce: - have EU loca (l10n_be) - activate sepa - activate a mandate for a customer - create two invoices for this customer - in invoice list view, select the two invoices > click on pay > select sepa and group payment > create payments Issue: Two separate payments are being created, which significantly increases transaction fees. Cause: A write operation on line_ids triggers a chain of computations that deactivates group_payment. Solution: To minimize unne
Original PR description
…sepa Steps to reproduce: - have EU loca (l10n_be) - activate sepa - activate a mandate for a customer - create two invoices for this customer - in invoice list view, select the two invoices > click on pay > select sepa and group payment > create payments Issue: Two separate payments are being created, which significantly increases transaction fees. Cause: A write operation on line_ids triggers a chain of computations that deactivates group_payment. Solution: To minimize unnecessary writes, we prevent modifications when wizard.line_ids.partner_id consists of partners with valid mandates. Additionally, we explicitly include the current group_payment state in the write operation. This ensures that if multiple partners are selected—some with valid mandates and some without—the group payment setting remains correctly applied. opw-4551825 Forward-Port-Of: odoo/enterprise#81391
Issue ===== When logged in a branch company, it is not possible, in the Barcode app inventory adjustment, to select a product with its `company_id` set on the parent company. How to reproduce ================ 1. Create a branch company; 2. Create a product and set its company field on parent company; 3. Select the branch company as the current user company; 4. Go to Barcode > Inventory Count > Add Product; 5. In the product field, search the parent company's product -> Nothing found.
Original PR description
Issue ===== When logged in a branch company, it is not possible, in the Barcode app inventory adjustment, to select a product with its `company_id` set on the parent company. How to reproduce ================ 1. Create a branch company; 2. Create a product and set its company field on parent company; 3. Select the branch company as the current user company; 4. Go to Barcode > Inventory Count > Add Product; 5. In the product field, search the parent company's product -> Nothing found. Cause of the issue ================== There was a domain on the `product_id` field who restrain products only to the current company (both for quants and stock move line.) [OPW-4603831](https://www.odoo.com/odoo/project/49/tasks/4603831) Forward-Port-Of: odoo/enterprise#81453
__Current behavior before commit:__ When clicking on the share button of a knowledge article, the `/knowledge/get_article_permission_panel_data` call is made twice. This is because the call to `loadPanel` is made inside the `onWillStart` as well as in the `useEffect`. The call made in the `onWillStart` was already removed in [this PR][1]. However it was added back in the [saas-17.1 forward-port][2] probably by mistake. __Description of the fix:__ Removed the call to `loadPanel` in the
Original PR description
__Current behavior before commit:__ When clicking on the share button of a knowledge article, the `/knowledge/get_article_permission_panel_data` call is made twice. This is because the call to `loadPanel` is made inside the `onWillStart` as well as in the `useEffect`. The call made in the `onWillStart` was already removed in [this PR][1]. However it was added back in the [saas-17.1 forward-port][2] probably by mistake. __Description of the fix:__ Removed the call to `loadPanel` in the `onWillStart`. opw-4603551 [1]: https://github.com/odoo/enterprise/pull/58825 [2]: https://github.com/odoo/enterprise/pull/59561 Forward-Port-Of: odoo/enterprise#81355
Before this commit: When a (SO) with subcontracted service product is confirmed, a (PO) is created. However, if a second SO is created with referrer for the same vendor, a new PO is generated, even if an RFQ already exists for that vendor. After this commit: When confirming an SO with a referrer and a subcontracted service product , and if an RFQ already exists for the same vendor, the PO lines are added to the existing RFQ instead of creating a new PO. task-4578812 Forward-Port-Of: odo
Original PR description
Before this commit: When a (SO) with subcontracted service product is confirmed, a (PO) is created. However, if a second SO is created with referrer for the same vendor, a new PO is generated, even if an RFQ already exists for that vendor. After this commit: When confirming an SO with a referrer and a subcontracted service product , and if an RFQ already exists for the same vendor, the PO lines are added to the existing RFQ instead of creating a new PO. task-4578812 Forward-Port-Of: odoo/enterprise#80847
Related to odoo/odoo#201029 Now that Can publish is based on access rights, some extra queries are needed when website is installed. Note that the appointment-only counts are unchanged. task-3175890 Forward-Port-Of: odoo/enterprise#81322 Forward-Port-Of: odoo/enterprise#81164
Original PR description
Related to odoo/odoo#201029 Now that Can publish is based on access rights, some extra queries are needed when website is installed. Note that the appointment-only counts are unchanged. task-3175890 Forward-Port-Of: odoo/enterprise#81322 Forward-Port-Of: odoo/enterprise#81164
**Issue** The project's Gantt view doesn't work if the "Project Stages" setting is not enabled. **Steps to reproduce** - Install `project_enterprise` and Studio. - Have project stages disabled. - Open Projects app. - Click on Studio button > Views > Try to activate Gantt view. -> `AccessError for read on stage_id` **Cause** The `stage_id` field used on the project gantt view is only readable if the project stages feature is enabled. https://github.com/odoo/enterprise/blob/b911ed1
Original PR description
**Issue** The project's Gantt view doesn't work if the "Project Stages" setting is not enabled. **Steps to reproduce** - Install `project_enterprise` and Studio. - Have project stages disabled. -…
**Issue** The project's Gantt view doesn't work if the "Project Stages" setting is not enabled. **Steps to reproduce** - Install `project_enterprise` and Studio. - Have project stages disabled. - Open Projects app. - Click on Studio button > Views > Try to activate Gantt view. -> `AccessError for read on stage_id` **Cause** The `stage_id` field used on the project gantt view is only readable if the project stages feature is enabled. https://github.com/odoo/enterprise/blob/b911ed1e857e1534c86495cd4934c1adb8ae9597/project_enterprise/views/project_views.xml#L12 **Solution** A hack is to add in the model metadata the `colorField` key used by the gantt renderer to color the pills: https://github.com/odoo/enterprise/blob/28f2fba988b1b225c97d15729020962ed4dee73b/web_gantt/static/src/gantt_renderer.js#L778 It is normally set when parsing the view here: https://github.com/odoo/enterprise/blob/dfe2795b820527a8226d8cf1afa5bf7ac8fcb53d/web_gantt/static/src/gantt_arch_parser.js#L194 This avoids trying to read the field if the user doesn't have the necessary `project.group_project_stages` group. Note: some missing views are also added in this commit, they were missing when the project stage feature wasn't enabled. opw-4592110 Forward-Port-Of: odoo/enterprise#81388 Forward-Port-Of: odoo/enterprise#79968
The unfold all options wasn't working correctly in the colombian reports since we added the line, and we only checked if the line was unfolded manually. Now we also check if the unfold all options is activated opw-4621274 Forward-Port-Of: odoo/enterprise#81377
Original PR description
The unfold all options wasn't working correctly in the colombian reports since we added the line, and we only checked if the line was unfolded manually. Now we also check if the unfold all options is activated opw-4621274 Forward-Port-Of: odoo/enterprise#81377
In this commit, we fix the following error that can occurs in tour hr_contract_salary_tour_hr_sign. ``` AssertionError: The test code "odoo.startTour('hr_contract_salary_tour_ hr_sign', {"stepDelay": 0, "keepWatchBrowser": false, "debug": false, "startUrl": "/", "delayToCheckUndeterminisms": 0})" failed UncaughtTypeError: Cannot read properties of null (reading 'querySelector') ``` Forward-Port-Of: odoo/enterprise#81460 Forward-Port-Of: odoo/enterprise#81366
Original PR description
In this commit, we fix the following error that can occurs in tour hr_contract_salary_tour_hr_sign.
```
AssertionError: The test code "odoo.startTour('hr_contract_salary_tour_
hr_sign', {"stepDelay": 0, "keepWatchBrowser": false, "debug": false,
"startUrl": "/", "delayToCheckUndeterminisms": 0})" failed
UncaughtTypeError: Cannot read properties of null
(reading 'querySelector')
```
Forward-Port-Of: odoo/enterprise#81460
Forward-Port-Of: odoo/enterprise#8136612 changes
Enhancements to existing features
Dutch tax reporting settings now allow businesses to define custom start dates for tax closings. This gives companies more flexibility to align VAT or tax closing periods with their specific reporting needs.
Original PR description
opw-4592126
Custom financial report engines now handle grouping by related account fields in the same way as standard reports. This makes consolidation report setup more flexible, especially when multiple source-company accounts share the same code, and adds automated coverage to catch similar issues earlier.
Original PR description
Since odoo/enterprise@a94227b, it is possible in standard report engines to group by non-stored related fields. Thanks to this, it is now possible to greatly improve the configuration of…
Since odoo/enterprise@a94227b, it is possible in standard report engines to group by non-stored related fields. Thanks to this, it is now possible to greatly improve the configuration of consolidation reports, by grouping the move lines by account_id.code, then account_id.name, provided that non-stored related fields are added on account.move.line for those values. This way, it becomes possible to configure multiple accounts mapped to the same code, without having to ensure a 1 to 1 relationship between the accounts of the source and consolidating company. This, however, was only implemented for standard engines. Custom engines were not modified, and none of them did the proper call to _fields_to_sql, to ensure the join condition of the query is adapted to run this grouping. This commit adds it, together with a test ensuring the custom engines are all evaluated on runbot with a non-stored custom groupby, so that errors are spotted directly and the developers just don't have to remember this "by heart". task-4596355
Resolved issues and error corrections
Invoice follow-up SMS reminders are now prepared in the customer’s preferred language instead of the sender’s language. This helps businesses communicate payment reminders more clearly and consistently with customers in multilingual environments.
Original PR description
Steps to reproduce: * Customer record has language different than user's language. * Customer form view -> Accounting Tab -> Invoice follow-ups -> Send * Check sms checkbox * sms template in user's language, it should be in customer's languange. opw-4599660
This fix adds a short wait so the Gantt schedule view finishes loading during the restaurant appointment test. It prevents random test failures, helping keep release validation more stable without changing user-facing behavior.
Original PR description
In this commit, we add a delay to ensure Gantt view will correclty be loaded after clicking on Gantt view button. This allow to fix an indeterministic behavior that can occurs in restaurant_appointment_tour tour.
The timesheet grid now shows the correct weekly overtime value for employees with flexible working hours. This prevents misleading overtime information when managers or employees review recorded time.
Original PR description
Issue:
- Hovering over the overtime column in the timesheet grid shows the wrong value.
when the employee has flexible hours.
Steps To Reproduce:
- Go to the timesheet grid.
- Record time for an employee with flexible hours.
- Hover over the weekly overtime column.
Solution:
- Add the full-time required hours to the overtime calculation when the employee has flexible hours.
opw-[4528395](https://www.odoo.com/web#id=4528395&view_type=form&model=project.task)Corrects a Colombian e-invoicing calculation so invoices with withheld VAT use the tax amount instead of the tax rate in the XML. This prevents signing errors for affected invoices after the rounding refactor and helps businesses issue compliant electronic invoices.
Original PR description
Steps to reproduce: - Ensure the Colombian localization is installed and set up - Make an invoice with taxes "19%" and "15% RteVAT 19%" - Try to sign the invoice - Get the error Occurs after the global rounding refactor d5da2b62263f85fbce0f2548085c066cbbf10371 By mistake, the operation is using now the tax percent instead of the tax amount opw-4446123
The Mexican electronic invoicing POS flow now refreshes order totals before checking whether payment can proceed. This prevents an incorrect payment-blocking error after a discount line is removed, helping cashiers settle affected orders normally.
Original PR description
When a quotation is loaded into the POS, a down payment is made, and then the order is settled, if the order has a discount that causes the total amount to become negative, the system prevents payment and raises an error. However, if the discount line is removed, the payment attempt also raises the same error. This happens because, even though the `pos.order.line` was removed, the values of the `pos.order` were not updated. Since it is required to validate the amount to be paid in the inherited `pay` method, the error occurs. This commit fixes the issue by recomputing the amounts before the validations that require them.
Recruitment application attachments now inherit the visibility rules set on their parent recruitment folder. This ensures internal users can see applicant documents when the folder is configured to allow it, avoiding unnecessary access issues in hiring workflows.
Original PR description
Steps to reproduce: 1. In the Documents settings, activate the Recruitment option 2. Configure the "share" settings of the folder so internal users can view documents 3. In the recruitment app, add some attachments to the applications 4. Check these attachments' visibility -> They are not visible to internal users Technical Reason: The previous implementation ignored the recruitment folder’s access settings and set default access to 'none'. After this commit: documents inherit access settings from the recruitment folder Task-4529233
The expected test data for Ecuador delivery guide documents was updated to match a recent XML change. This helps keep automated checks reliable and reduces false failures during release validation.
Original PR description
Commit 147c9ba6942 added a new node to the Ecuador delivery guide XML. However the node was not added to the TestECDeliveryGuide.test_send_delivery_guide_flow test (which had an active runbot exception at the time). We now add the node to the test's expected XML. runbot-160903
Miscellaneous changes
Before this commit, the `test_smart_schedule_with_allocated_hours_and_deadlines` test fails when only `project_enterprise` module is installed because the allocated_hours on the tasks are recomputed. However, when timesheet_grid module is installed, the project inside the test has the timesheets feature enabled by default and so the allocated_hours are not recomputed because we suppose the allocated_hours on tasks inside that project can only be altered by the user when the tasks are already cre
Original PR description
Before this commit, the `test_smart_schedule_with_allocated_hours_and_deadlines` test fails when only `project_enterprise` module is installed because the allocated_hours on the tasks are recomputed. However, when timesheet_grid module is installed, the project inside the test has the timesheets feature enabled by default and so the allocated_hours are not recomputed because we suppose the allocated_hours on tasks inside that project can only be altered by the user when the tasks are already created. This commit checks in the test is timesheet_grid module is installed to give the right expected allocated_hours on tasks. runbot-108336 Forward-Port-Of: odoo/enterprise#79947
__Current behavior before commit:__ When clicking on the share button of a knowledge article, the `/knowledge/get_article_permission_panel_data` call is made twice. This is because the call to `loadPanel` is made inside the `onWillStart` as well as in the `useEffect`. The call made in the `onWillStart` was already removed in [this PR][1]. However it was added back in the [saas-17.1 forward-port][2] probably by mistake. __Description of the fix:__ Removed the call to `loadPanel` in the
Original PR description
__Current behavior before commit:__ When clicking on the share button of a knowledge article, the `/knowledge/get_article_permission_panel_data` call is made twice. This is because the call to `loadPanel` is made inside the `onWillStart` as well as in the `useEffect`. The call made in the `onWillStart` was already removed in [this PR][1]. However it was added back in the [saas-17.1 forward-port][2] probably by mistake. __Description of the fix:__ Removed the call to `loadPanel` in the `onWillStart`. opw-4603551 [1]: https://github.com/odoo/enterprise/pull/58825 [2]: https://github.com/odoo/enterprise/pull/59561 Forward-Port-Of: odoo/enterprise#81355
LATAM Task 1300 - ADHOC Task 47476 Forward-Port-Of: odoo/enterprise#81284 Forward-Port-Of: odoo/enterprise#79635
Original PR description
LATAM Task 1300 - ADHOC Task 47476 Forward-Port-Of: odoo/enterprise#81284 Forward-Port-Of: odoo/enterprise#79635