Daily updates from Odoo
Friday, October 10, 2025
29 changes · master
New functionality added to Odoo
Adds support for Swedish companies to prepare and submit monthly VAT returns and EC sales list reports. This helps businesses meet local tax reporting requirements more efficiently within Odoo.
Original PR description
Companies in Sweden have to submit their VAT return and EC sales list report monthly. This commit adds the returns both. task-4893969 Forward-Port-Of: odoo/enterprise#92781
Enhancements to existing features
The Hong Kong payroll demo setup now includes richer sample employees, payslips, and pay runs. This makes it easier for users to evaluate payroll scenarios such as MPF and end-of-year pay without extensive manual configuration.
Original PR description
Currently, the demo data in the HK payroll modules are quite weak, and it requires a lot of configuration if a user wants to test the features (MPF, EOY pay, ...) In this PR, we are improving this by adding more payslips and payruns, updating some of the employees data and so on. task-5079595 Forward-Port-Of: odoo/enterprise#95122
This update adjusts a website helpdesk template so it continues to work correctly after related link text became translatable. It helps keep the Helpdesk, eLearning, and Forum website integration stable across languages without changing business workflows.
Original PR description
`href` cannot be used anymore as an xpath expression because it is now translatable. See PR https://github.com/odoo/odoo/pull/147698 task-3626918
The Documents folder action menu now opens immediately instead of waiting for all available actions to load. Users also get faster feedback when pinning actions, with loading indicators and fewer background refreshes to keep the experience smoother on slower connections.
Original PR description
The cogwheel which holds the folder actions was slow to open because it loads the actions at startup. To speedup it up, we backport the fix odoo/enterprise#90124 that allows the cogwheel to be open while loading the actions (instead of waiting that the actions are loaded). We also add a spinner while it is being loaded. When selecting action to embed for the folder, it was slow as well. To solve the problem, we toggle the action immediately (not waiting the answer of the server) and roll it back in case of failure. Finally, to limit the number of calls to the server, we only reload the search model if there are no pending toggle of action. So if you activate for example 5 actions in a row and the connection is slow enough, the search model will only be reloaded once instead of 5 times (when the 5 actions are toggled). Task-4828503 Forward-Port-Of: odoo/enterprise#96545 Forward-Port-Of: odoo/enterprise#94141
The bank configuration screen now uses a better background color when dark mode is enabled. This makes the setup card easier to view and provides a more polished experience for users working in dark mode.
Original PR description
This commit will change the background color of the dark mode of the configure bank cart. no task id Forward-Port-Of: odoo/enterprise#96513
Adds a test button on IoT Box records to help diagnose connection issues more quickly. The check highlights unavailable communication methods and asks the device to verify network quality, helping support teams troubleshoot client installations faster.
Original PR description
In order to ease debugging at client's, we introduce a test button on the IoT Box record that will first test communication protocols and display a notification for each non-working protocol, then request a network quality check on the IoT Box (ping to odoo.com + ping to gateway). Community PR: odoo/odoo#229655 Task: 5130809 Forward-Port-Of: odoo/enterprise#96298
The VoIP setup suggestions now include Telnyx as an available provider option. This gives businesses another recommended provider to consider when configuring internet-based calling in Odoo.
Original PR description
Task-5144121
The Salary Advice spreadsheet now presents payroll information more clearly with better alignment, company details in the header, and a more logical column order. This makes the report easier for payroll teams and banking stakeholders to read and verify.
Original PR description
Salary Advice Report: - Ensured salary amounts and totals are right-aligned - Left-aligned text and numeric fields - Added Company Name and Company Bank Account Number to header - Moved C/D column after Employee Name task-5076472
When users open planning from a payslip, it now starts on the month covered by that payslip. This makes it faster and easier for payroll teams to review the relevant schedule without manually navigating to the correct period.
Original PR description
By clicking on the planning smartbutton on a payslip, it will open by default the planning starting on the month of the date_from of the payslip. It was not the case before this commit. task-5116510
This update standardizes the internal naming of yes/no settings across several Point of Sale modules. It improves consistency and maintainability without changing expected business workflows or user-facing behavior.
Original PR description
pos_*: pos_enterprise, pos_iot, pos_blackbox_be, l10n_se_pos, l10n_in_reports_gstr_pos, pos_iot, pos_restaurant_preparation_display In this commit: ---------- - Standardized the naming of boolean fields in the pos.config model for better consistency and readability across the codebase. Related: - Community: https://github.com/odoo/odoo/pull/224423 - Upgrade: https://github.com/odoo/upgrade/pull/8300 task-5008370
This update removes a redundant internal setting used to identify chat window context. It helps keep the messaging code simpler and easier to maintain, with no expected change for users.
Original PR description
This is redundant with this.env.inChatWindow https://github.com/odoo/odoo/pull/231053
Resolved issues and error corrections
This update corrects how Swiss payroll payslip issues are recalculated, helping ensure warnings and payroll checks stay accurate after changes. It reduces the risk of outdated or incorrect payroll guidance appearing during payroll processing.
Original PR description
task-5150492 Forward-Port-Of: odoo/enterprise#96489
Manual bank account creation now assigns the new journal to the same company as the online account link. This prevents errors when users work across multiple companies and the system context points to a different company.
Original PR description
Before this commit, when a user does a manual bank account creation, we didn't pass the company id for the journal creation. It implies that we use the environment value which is problematic because it could be different from the one account online link one leading to an error. The aim of this commit is ensuring that we pass, as company_id the same value as the one we have on account online link. no task id Forward-Port-Of: odoo/enterprise#96715
Mexican electronic invoice cancellations could fail with an “invalid passphrase” error because certificate keys were sent in a format not accepted by cancellation providers. The fix restores the expected unencrypted key format for these cancellation requests, helping businesses cancel CFDI invoices reliably.
Original PR description
### Steps to reproduce 1. Install `l10n_mx_edi` with demo data 2. Switch to the ESCUELA KEMPER URGATE demo company 3. Create an invoice to the INMOBILARIA CVA demo partner 4. Send the invoice CFDI 5.…
### Steps to reproduce 1. Install `l10n_mx_edi` with demo data 2. Switch to the ESCUELA KEMPER URGATE demo company 3. Create an invoice to the INMOBILARIA CVA demo partner 4. Send the invoice CFDI 5. Request cancellation of the CFDI 6. The cancellation fails with the error 'invalid passphrase'. ### Analysis When calling `_finkok_cancel`, `_solfact_cancel`, or `_sw_cancel`, one of the API call parameters is the `pem_key` of the certificate given by the SAT. Before 19.0, the PEM key was in an unencrypted format. Since f88f8258ead, `env['certificate.key'].pem_key` is encrypted. According to Finkok's API documentation, the private key should be encrypted using DES when given as a SOAP parameter. https://wiki.finkok.com/home/webservices/ws_cancelacion/cancel However, in testing, encrypting the private key using DES seems to be rejected by Finkok. Solucion Factible and SwSapien don't indicate in their documentation whether and how the private key should be encrypted. ### Solution We send the private key unencrypted, as was already the case before 19.0. opw-5137549 Forward-Port-Of: odoo/enterprise#96562
This fix ensures receipts print with the correct order details after a fast validation payment flow. It prevents empty receipts and avoids a restaurant-mode printing error, improving checkout reliability for staff and customers.
Original PR description
pos*: pos_event_iot, l10n_it_pos Steps to reproduce: - Enable a one-click payment method. - Create and validate an order using fast validation. - On the receipt screen, print the order receipt. Issue: - The printed receipt is empty (no order details). - In restaurant mode, a traceback occurs when printing the receipt. Fix: - Use the receipt screen’s `currentOrder` reference instead of fetching the order directly from the POS instance. Task-5093060 Related: https://github.com/odoo/odoo/pull/227621 Forward-Port-Of: odoo/enterprise#96695
Payroll calculations now retrieve payslip line values through Odoo's standard data handling instead of forcing a broad system refresh. This reduces unnecessary cache invalidation, helping payroll computations run more reliably and efficiently without changing user workflows.
Original PR description
Before this commit, when a compute needed to fetch the payslip lines values, we need to flush all to be able to correctly get the values thanks to a sql query. The problem is the `flush_all` will invalidate all recordset in cache and will do more than expected. This commit converts the sql query made to fetch the payslip lines values into a read_group to be able to remove the flush_all and let the orm invalidates the recordset/fields needed to correctly get what we want. Forward-Port-Of: odoo/enterprise#96741
This fixes a timing issue that could cause a stock barcode test to fail unpredictably during automated checks. By waiting for the right screen state before validating, the change improves reliability of testing without changing business workflows.
Original PR description
Sometime, the test `test_scrap_change_source_location` could fail randomly. The issue happens in last few steps of the tour. What we do is: - We edit a move line lot in the form view; - We save it; -…
Sometime, the test `test_scrap_change_source_location` could fail randomly. The issue happens in last few steps of the tour. What we do is: - We edit a move line lot in the form view; - We save it; - We validate the operation. The validation is done by a barcode scan (`OBTVALI`) but since [1](https://github.com/odoo-dev/enterprise/commit/b3a855a870d1861515abaff8683081a39f95558f), barcodes scanned when the user is somewhere else than in the barcode lines view are skipped. With a little bit of bad luck, the tour scans `OBTVALI` while the save from the form view is not finished yet and thus, the scanned barcode is ignored. To reproduce that, run the test `test_scrap_change_source_location` locally in debug mode and add a throttling (eg.: Fast 4G) before to run the tour. To solve the issue, finetune the `validateBarcodeOperation` default trigger, so the error won't happen in this tour and other similar contexts. Runbot build error: [232331](https://runbot.odoo.com/odoo/runbot.build.error/232331) Forward-Port-Of: odoo/enterprise#96542
This fixes receipt printing for Italian fiscal printers when the point of sale is set to skip the receipt screen and print automatically. It also ensures the correct completed sale is sent to the printer, avoiding missed or incorrect fiscal receipts after checkout.
Original PR description
This PR fixes two related bugs happening when printing a receipt with the Italian Fiscal printer First, before this PR, if the option to skip the receipt screen was ticked, then the receipt would…
This PR fixes two related bugs happening when printing a receipt with the Italian Fiscal printer First, before this PR, if the option to skip the receipt screen was ticked, then the receipt would never print. This was caused by the printing logic being implemented on the receipt screen instead of on the pos itself. steps to reproduce: 1. install l10n_it_pos 2. configure one pos 3. configure the IT printer 4. select to skip the receipt screen (print automatically) 5. open the pos 6. make a sale => no ticket printed and the chrome console shows a printer error With this new verison the printing logic was moved to the pos so that printing of fiscal receipts with the italian fiscal printer works, even when receipt screen is skipped. This put to light another potential bug related to how the `order` variable was treated. Before this PR, the printReceipt logic in the module would not pass the order to be printed. This can become a problem upon context changes, where `pos.get_order()` does not return the completed order, but a newly created one. This can for example happen when skipping the receipt screen with the option to "print automatically" (iface_print_auto). After this PR, we keep order as an argument, so we always print the last completed order and not a newly created one. opw-4882480 Forward-Port-Of: odoo/enterprise#96346 Forward-Port-Of: odoo/enterprise#91412
The rental schedule once again shows product groupings correctly after they were lost when the schedule was made editable. This helps users review rental lines by product more easily and restores expected behavior without changing the broader workflow.
Original PR description
This commit restores the `group_expand` functionality for the product field in the rental schedule, which was inadvertently removed in [^1] when the schedule was made editable. [^1]: https://github.com/odoo/enterprise/pull/88689 Forward-Port-Of: odoo/enterprise#96558
Opening a reconciled statement line now shows only that line expanded, and clearing the filter restores the normal reconciliation view instead of expanding every line or hiding the summary. The statement creation button is also hidden when it is not useful, reducing confusion for accounting users.
Original PR description
When you open a statement line from a reconciled move, it opens the bank reconciliation widget with only the selected statement line, which is unfolded by default. However, there are a few issues with this behavior, which are fixed in this commit: 1 - When entering the bank reconciliation widget, the initial line is unfolded. If you remove the filter, all the other lines become unfolded as well. This should not be the case; only the original line should remain unfolded. 2 - By default, the statement summary line is hidden. When the filter is removed, the summary remains hidden. We now ensure the summary is displayed again when the filter is cleared. 3 - The Statement button on the statement line (which is meant to create a new statement) doesn't make any sense when there is only one line. It is now hidden in this case. task-5108118 Forward-Port-Of: odoo/enterprise#96670 Forward-Port-Of: odoo/enterprise#95558
Users who are allowed to print and send SEPA direct debit mandates can now generate and access the related PDF attachments without needing an extra accounting read-only permission. This prevents email sending failures and ensures users can retrieve documents they created through the mandate sending process.
Original PR description
Removing the groups restriction from the `mandate_pdf_file` field in model `sdd.mandate` because it was causing issues when using the `sdd.mandate.send` wizard. Any user who has access to the `sdd.mandate` model can use this wizard to print and send the record. During this process, the system generates a PDF and stores it in the `mandate_pdf_file` binary field, linking the resulting attachment to the record. The previous group restriction prevented users who were not part of the `account.group_account_readonly` group from sending the email with the attachment. Even if the email was somehow sent, those users still couldn’t access the attachments they themselves had generated and sent. With this change, any user who is allowed to send and print `sdd.mandate` records will also be able to generate and later access the corresponding attachments. Forward-Port-Of: odoo/enterprise#96463 Forward-Port-Of: odoo/enterprise#96119
The AI assistant now considers planned activities from the chatter alongside existing messages when preparing its response context. This helps produce more relevant answers by including upcoming tasks and follow-ups that were previously left out.
Original PR description
Append any planned activities to the chatter messages to be sent as a part of the prompt's context with the rest of the messages. task-id-5079055 Forward-Port-Of: odoo/enterprise#96668 Forward-Port-Of: odoo/enterprise#95764
Changing a quotation template on a sales order now removes the previously linked quote calculator spreadsheet. This prevents sales teams from accidentally using calculations from an old template and keeps the order aligned with the selected template.
Original PR description
Step to reproduce: - Create a new SO - Add a customer and quotation template to the order - Click on quote calculator smart button - Return to sale order (click on SO number in top left) - Change the quotation template - Result: it does not change the quote calculator that is linked to the new quotation template Cause: - Clicking on Quote Calculator creates a copy of the quotation template spreadsheet and links it to the SO. https://github.com/odoo/enterprise/blob/8bc6098335d283e6d210dc788463a8ef8c559b14/spreadsheet_sale_management/models/sale_order.py#L30-L35 - When the quotation template is later changed, the spreadsheet linked to the old template remains attached to the SO. Fix: - On changing the sale_order_template, the old spreadsheet should be unlinked from the SO. - Keeping it linked is inconsistent, as it does not matches the current template opw-4998587 Forward-Port-Of: odoo/enterprise#95861 Forward-Port-Of: odoo/enterprise#93970
Point-of-sale appointment bookings now use the right capacity values, making it possible again to add or remove resources reliably. The update also restores missing placeholder text in POS appointment fields and fixes appointment type names shown in planning popovers.
Original PR description
The waiting list capacity used to be set indirectly via the `total_capacity_reserved` field In [1] it was removed as it was not otherwise used. Meaning we should have set the default wishlist…
The waiting list capacity used to be set indirectly via the `total_capacity_reserved` field In [1] it was removed as it was not otherwise used. Meaning we should have set the default wishlist capacity instead. While doing that we also noticed a logical issue with only using the wishlist capacity, it does not allow adding or removing resources that don't correspond to the capacity that was originally set. Instead we now actually use total_capacity_reserved when the appointment type manages capacities. And let users use the wishlist capacity otherwise. Which allows them to again select resources freely in both contexts. -------------------------- Additionally we fix the missing placeholder in point-of-sale caused by the placeholder html editor plugin being missing from the minimal html editor used there. As well as an incorrect access to a record name in kanban popover. task-5103532 [1]: https://github.com/odoo/enterprise/commit/2aab4dcfbe8491968f0721741efbab894667aefe Forward-Port-Of: odoo/enterprise#95539
This fix prevents an error from appearing when users click the “Offers (new)” button for a Mexican employee without salary cost details filled in. It improves reliability during employee setup by safely handling missing wage or yearly cost information.
Original PR description
steps to reproduce:
--------------------
1. Install l10n_mx_hr_payroll and hr_contract_salary (load with demo data)
2. Switch to the Mexican company and create a new employee
3. Click on Offers(new)
issue:
-------
A traceback occurs:
`TypeError('cannot unpack non-iterable NoneType object')`
cause:
-------
https://github.com/odoo/enterprise/blob/71cc92c9526234dcd44ec756375647a67729029f/l10n_mx_hr_payroll/data/salary_rules/hr_salary_rule_regular_pay_data.xml#L531
Unpacking fails because **find_rates(gross, isr_table)** returns `None`
when the [gross amount](https://github.com/odoo/enterprise/blob/8b96c67d0555702e88127a77edb6e3b8ef5e58cc/hr_payroll/models/hr_payslip.py#L1157-L1167) is empty. This occurs if wage or yearly costs
are not defined.
solution:
----------
Check that the gross amount is exists before calling `find_rates`
and unpacking its result.
opw-5128275
Forward-Port-Of: odoo/enterprise#96525The referral app now uses the term "job opportunity" instead of "job offer" in related templates, emails, SMS messages, and wizard screens. This keeps recruitment referral wording consistent and clearer for users sharing open roles.
Features or functions removed from Odoo
The unused Dynamic Reports setting has been removed from Accounting configuration. This prevents users from accidentally disabling essential accounting reports and makes setup simpler.
Original PR description
Before PR: - The setting was available but never actively used. - Disabling it could uninstall 'account_reports', which are required for most accounting features. After PR: - The 'Dynamic reports' setting has been removed from the system. Impact: - Prevents accidental removal of essential accounting functionality. - Simplifies configuration by removing an unused option. Related community PR: https://github.com/odoo/odoo/pull/228598 Related upgrade PR: https://github.com/odoo/upgrade/pull/8501 task-5107465
Code cleanup and technical improvements
The accounting dashboard now uses one shared approach for bank synchronization actions such as connecting, reconnecting, refreshing, and extending access. This reduces inconsistencies and makes the bank connection experience easier to maintain and more reliable for users.
Original PR description
Refactor to centralize the different bank synchronization actions on the accounting dashboard (connect, reconnect, refresh, extend) into a single template. This removes redundancy and fixes inconsistencies that appeared because each action was handled separately. Task-5068208
Display orientation settings are now managed on the individual IoT device instead of the overall IoT Box. This makes it easier to apply the correct screen orientation to the intended display and makes the capability available natively in the IoT module.
Original PR description
In order to simplify the code/flow of setting display orientation, we moved it from the IoT Box record to the device one. This allows us to target the right display instead of the "default" one using the `iot_http` service. We also moved this logic from `pos_self_order_iot` to `iot` in order to make the setting native.