Daily updates from Odoo
Navigate
Branch
Thursday, July 31, 2025
31 changes
Security fixes and vulnerability patches
Payroll officers now have the right access to payroll reporting and related tools while configuration remains restricted. Payroll report lists for payslip lines and worked days are now read-only, helping prevent accidental changes to reported payroll data.
Original PR description
task-4901191
Enhancements to existing features
Peruvian electronic invoices now export down payments in the format required by SUNAT, avoiding negative quantities that are not accepted by the government. This helps businesses issue compliant final invoices when prepayments or down payments are involved.
Original PR description
By default, the UBL module represents prepayments / downpayments as a InvoiceLine in the final invoice with a negative quantity and amount. However, SUNAT and the Peru Government does not allow negative quantities, and instead require this information to be stored within the PrepaidPayments node and referred to via AdditionalDocumentsReference. task-4605204 Forward-Port-Of: odoo/enterprise#87692
Bank reconciliation can now create separate automatic matching rules for different statement labels even when they use the same account. This helps businesses automate recurring transactions like rent or location-related payments more accurately without one rule blocking another.
Original PR description
- Before this pr: The automatic creation of reco model is constrained only by company, account and journal. So if the reco model with config exists then new reco model will not be created. - After…
- Before this pr: The automatic creation of reco model is constrained only by company, account and journal. So if the reco model with config exists then new reco model will not be created. - After this pr: Now two more constraints are added 'match_label' and 'match_label_param' in the searching domain. So if the reco model with this config does not exists then new model will be automatically created. - Example: Suppose we have 3 statement lines with 'Rent' as a label in them, and 3 statement lines with 'Location' as a label in them. So before this pr when user sets same account on the first two lines with 'Rent' label will create a new reco model with account name as a model name and common substring from labels of both lines will be set as a match_label_param of the model. And then user next set that same account on the first two lines with 'Location' label will not create a new reco model automatically, because for this config one reco model already exists. But now after this pr when user sets same account for first two lines with 'Location' label will also create a new reco model automatically with a common substring from labels of both lines will be set as a match_label_param of the reco model. Related Community PR: https://github.com/odoo/odoo/pull/215525 Task: 4876374
The Partner Ledger report has been reworked to make its data handling and display easier to maintain and more consistent. This should support a more reliable accounting reporting experience and make future enhancements easier to deliver.
Original PR description
task-4245219
Date and time fields are now easier to read by default, while still allowing precise editing when selected. Language settings for date and time formats were simplified, making configuration more consistent across affected apps.
Original PR description
The dates became more readable. The datetime_field has been changed to show a button with a readable date and when it's focused, the button is replaced with the real input and the date inside it take the format from res.lang. The prop "condensed" has also been removed. The res.lang has also been simplified. Date/time_short_format fields have been removed. The remaining fields are now selections and not char input. TASK-ID: 4613138
This update adds country-specific EC Sales List and Intrastat reporting rules for Austria, Germany, and the Netherlands, including relevant deadlines and filing periodicities. It helps businesses in these countries stay aligned with local compliance requirements while also including several accounting report stability fixes.
Original PR description
Following the implementation of the Tax returns feature in 18.3 which was focused on the general implementation and Belgium, we want to add the specification for other country and in this case Austria, Germany, The Netherlands. Adding EC sales list, Intrastat specific deadlines and periodicities. task-4776236
Users now see a clearer popup explaining why signed documents cannot be deleted. This replaces a technical or unclear error, making the signing workflow easier to understand and reducing confusion.
Original PR description
Before: - Deletion of signed documents(`state='signed'`) was blocked with a technical or unclear error message. After: - A more user-friendly popup message is shown when attempting to delete a signed document. Impact: - Improve user experience by clearly explaining why deletion is not allowed for signed documents task-4879592
Room booking and VoIP features were updated to work with a new browser tab coordination mechanism. This helps ensure these services behave reliably when users have Odoo open in multiple tabs.
Original PR description
https://github.com/odoo/odoo/pull/218332 introduced a new master tab election mechanism. Adapt enterprise code for it. community: https://github.com/odoo/odoo/pull/218332
Payroll salary rules can now mark generated journal entry lines with the employee as the related partner. This improves payroll accounting visibility by making it easier to track salary-related balances and chart of accounts activity by employee, including for net salary rules across supported localizations.
Original PR description
Add the option on Salary rules to set the employee as the partner on the Journal Entry lines generated from the payslip. This works in both batched and non-batched move lines. Adjust all the NET salary rules data to show partner per default. This allows to track the chart of accounts through the employee's partner. task-4652900
IoT device records now show which Point of Sale they are configured with. This makes it easier for users to identify and manage devices used in PoS setups without searching through separate configuration screens.
Original PR description
In order to ease the configuration and use of IoT devices in PoS, we now display the PoS where devices are configured directly on device records. Task: 4901312 Forward-Port-Of: odoo/enterprise#88819
The Belgian POS Blackbox flow is easier to understand and use, with clearer employee identification wording, better clock-in guidance, and simpler visual status indicators. Installing the Blackbox module from IoT now refreshes the page so users can continue with the updated setup immediately.
Original PR description
- renamed "Social security identification number (INSZ or BIS)" -> "National Register Number", - added page reload after installing module "pos_blackbox_be" from iot app, - improved message "User must be clocked in" to explain why and how to do it, - replaced the clocked (In)/(Out) status by a green/red icon on the user. Task: 4978644 Forward-Port-Of: odoo/enterprise#91266
Resolved issues and error corrections
Products with GST rates other than 5% now include the required packaged-good label when synced to Swiggy and Zomato. This helps ensure product information is classified correctly on delivery platforms and reduces potential listing or compliance issues.
Original PR description
*: pos_urban_piper_swiggy, pos_urban_piper_zomato Before this commit: --- - Products with GST != 5% were not receiving the `packaged-good` tag in the sync payload for Swiggy and Zomato. After this commit: --- - Now, products with GST != 5% correctly include the `packaged-good` tag in their respective provider tag list (`swiggy` or `zomato`). task-4954571 Forward-Port-Of: odoo/enterprise#91278 Forward-Port-Of: odoo/enterprise#90595
The Italian Libro Giornale PDF report now keeps long entries in the Name column visible by wrapping the text instead of cutting it off. Column spacing has also been stabilized, making the report easier to read and more reliable for accounting review.
Original PR description
Issue: In the Libro Giornale report (PDF), long descriptions in the 'Name' column were getting cut off, and column spacing appeared inconsistent in the generated PDF. These issues reappeared due to recent layout changes from commit https://github.com/odoo/enterprise/commit/233e82cf4e6908502a580be4bcd77fadd2aada53, which unintentionally removed previous fixes made to handle such cases. Fixes Applied: - Reintroduced the `o_overflow_name` class on the 'Name' column to ensure long descriptions wrap correctly and are not truncated in the PDF export. - Applied the `o_fixed_column_width` class to the 3rd column (currently 'Account Code') to resolve inconsistent spacing between columns caused by `wkhtmltopdf`. Forward-Port-Of: odoo/enterprise#91231
The Australian payroll termination process now uses the correct calculation flow instead of an outdated contract method. This helps ensure termination payslips are generated correctly and adds test coverage for the full process to reduce future regressions.
Original PR description
Termination flow used an old method from contracts. This fixes the issue and adds a test for the full termination flow. Forward-Port-Of: odoo/enterprise#91200
Users can now clear and reselect a start date in work order time tracking without triggering an error. This prevents interruptions when updating manufacturing work order time entries and keeps the workflow reliable.
Original PR description
When the user removes the value of the start date and selects the value again in the start date, a traceback will appear Steps to reproduce the error: - Create one mo > Work orders > Add a line >…
When the user removes the value of the start date and
selects the value again in the start date,
a traceback will appear
Steps to reproduce the error:
- Create one mo > Work orders > Add a line > Click on Open work order button
- In Time Tracking > Add a line > Remove the start date >
Select the start date again > Apply
Traceback:
```
TypeError: '<' not supported between instances of 'bool' and 'datetime.datetime'
File "odoo/http.py", line 2373, in __call__
response = request._serve_db()
File "odoo/http.py", line 1903, in _serve_db
return self._transactioning(
File "odoo/http.py", line 1966, in _transactioning
return service_model.retrying(func, env=self.env)
File "odoo/service/model.py", line 134, in retrying
result = func()
File "odoo/http.py", line 1933, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
File "odoo/http.py", line 2177, in dispatch
result = self.request.registry['ir.http']._dispatch(endpoint)
File "odoo/addons/base/models/ir_http.py", line 223, in _dispatch
result = endpoint(**request.params)
File "odoo/http.py", line 754, in route_wrapper
result = endpoint(self, *args, **params_ok)
File "addons/web/controllers/dataset.py", line 35, in call_kw
return call_kw(request.env[model], method, args, kwargs)
File "odoo/api.py", line 459, in call_kw
result = getattr(recs, name)(*args, **kwargs)
File "addons/web/models/models.py", line 1007, in onchange
record._apply_onchange_methods(field_name, result)
File "odoo/models.py", line 7028, in _apply_onchange_methods
res = method(self)
File "addons/mrp/models/mrp_workcenter.py", line 448, in _date_start_changed
self._loss_type_change()
File "addons/mrp/models/mrp_workcenter.py", line 473, in _loss_type_change
if self.workorder_id.duration > self.workorder_id.duration_expected:
File "odoo/fields.py", line 1208, in __get__
self.recompute(record)
File "odoo/fields.py", line 1423, in recompute
apply_except_missing(self.compute_value, recs)
File "odoo/fields.py", line 1396, in apply_except_missing
func(records)
File "odoo/fields.py", line 1445, in compute_value
records._compute_field_value(self)
File "odoo/models.py", line 5037, in _compute_field_value
fields.determine(field.compute, self)
File "odoo/fields.py", line 101, in determine
return needle(*args)
File "home/odoo/src/enterprise/saas-17.4/mrp_workorder_hr_account/models/mrp_workorder.py", line 62, in _compute_duration
super()._compute_duration()
File "home/odoo/src/enterprise/saas-17.4/mrp_workorder/models/mrp_workorder.py", line 762, in _compute_duration
wo.duration = wo.get_duration()
File "home/odoo/src/enterprise/saas-17.4/mrp_workorder/models/mrp_workorder.py", line 838, in get_duration
duration += self._intervals_duration([(t.date_start, t.date_end or now, t) for t in times])
File "home/odoo/src/enterprise/saas-17.4/mrp_workorder/models/mrp_workorder.py", line 826, in _intervals_duration
for date_start, date_stop, timer in Intervals(intervals):
File "addons/resource/models/utils.py", line 124, in __init__
for value, flag, recs in sorted(_boundaries(intervals, 'start', 'stop')):
File "addons/resource/models/utils.py", line 51, in _boundaries
if start < stop:
```
https://github.com/odoo/enterprise/blob/1f626176d28762683dc32ddbb351d994be894a71/mrp_workorder/models/mrp_workorder.py#L787 Here when "date_start" is empty,
It leads to the above traceback.
sentry-5679416830
Forward-Port-Of: odoo/enterprise#91259
Forward-Port-Of: odoo/enterprise#68014Users can now open signature requests even if the employee or user who created them has since been deleted. This prevents an error from blocking access to existing signing documents and keeps signature workflows available.
Original PR description
## Issue: ## Before this commit, opening a sign request created by a deleted user would raise an Owl Error ## Cause: ## The `action.params` are used as a fallback in the signRequest setup But sometimes sometimes the `action.params`are undefined, causing access to `action.params.create_uid` to fail ## Fix: ## The document can be open with `create_uid` set to False So we just added a check for `action.params` to be set before accessing his properties If the create_uid isn't in the context or in the params, it will be set to False ## Steps to reproduce: - Create a user (to be deleted later) - Create a sign request with this user - Delete the user - Try to open the sign request - The error should be displayed opw-4786368 Forward-Port-Of: odoo/enterprise#91271 Forward-Port-Of: odoo/enterprise#88758
The delivery settings no longer show installation checkboxes that pointed users to older shipping connectors. Users are now guided to install their preferred USPS, FedEx, UPS, or DHL connector from the Apps menu, where the newer REST API options are described more clearly and legacy options are hidden by default.
Original PR description
We have recently introduced several new versions of the delivery connectors, based on the newer REST APIs introduced by the shipping companies (USPS, FedEx, UPS, DHL). However, in the settings we still link with installation checkboxes to the old modules. To avoid confusion for the user, we remove these checkboxes and refer the user to the Apps menu instead for manual installation of the preferred shipping connector. In the apps menu, we clarify that these new modules are only compatible with the new REST APIs, and we also hide the legacy modules by default by making them application: False. Forward-Port-Of: odoo/enterprise#90074 Forward-Port-Of: odoo/enterprise#81354
Mobile self-service orders are now sent to the preparation display as soon as customers proceed to payment. This helps kitchen or preparation teams see incoming mobile orders promptly instead of waiting until cashier payment is completed.
Original PR description
When doing a self order from a mobile device, the order was not sent to the preparation display until it was paid at the cashier. Steps to reproduce: ------------------- * Setup a PoS with self-ordering mode set to 'mobile'. * Setup a preparation display to show orders from this PoS. * Place an order from a mobile device. * Click on "Pay" > Observation: The order does not appear on the preparation display. Why the fix: ------------ Instead of just sending the order from the kiosk, we also need to send it from the mobile device. opw-4819732 Forward-Port-Of: odoo/enterprise#91148 Forward-Port-Of: odoo/enterprise#90169
Website generation now handles HTML replacements more efficiently by reusing a prepared replacement pattern instead of rebuilding larger ones repeatedly. This reduces unnecessary processing and helps generated website content load or update faster, especially when many replacements are involved.
Original PR description
Fixed issue where regex where larger than required due to growing dictionnary of replacements. Improved global replacements by creating the patern early and sharing it accross all replacement. Forward-Port-Of: odoo/enterprise#91218
Fixes an issue where users could not download signed documents from the download menu after a recent interface change. The download options now use the proper download action, so users can retrieve their documents as expected.
Original PR description
As click event on DropdownItem rendered as `<a href="">` are prevented, the recent refactoring (PR [1]) of the SignRequestDocumentsDropdown component to use OWL components instead of Bootstrap JS introduce a regression, preventing the user from downloading the documents. This commit fixes it by properly using the dedicated download action (i.e. `act_url` action with a `target="download"` attribute) when selecting one of the dropdown's items. Steps to reproduce: - Open Sign - In template, choose one and click Send - Choose your user as Customer and click Send - Go to Documents menu > My Documents > open the sent document - Open Download dropdown and click on one of the item => download should happen but doesn't [1]: https://github.com/odoo/enterprise/pull/89727
Mexican POS global invoices now use the postal code from the journal’s configured issued address when one is set, instead of defaulting to the company address. This helps ensure the generated CFDI XML reflects the correct place of issue for cash sales and reduces compliance errors.
Original PR description
Steps to reproduce: [l10n_edi_extended] - setup up a mexican company - create a journal in which you define an issued address (different from your company) - setup your pos with newly created journal - Open a pos session - add a product - pay in cash with no customer - in the backend go into the orders - select the newly created order in the list view and click on the action "create global invoice" - in the order > cfdi: download the created xml Issue: The "Lugar de expedicion" will have the zip code of the company and not from the issued address one Cause: We only check for issue adress in account_move but not from orders. Global invoice is not only for invoices but also to account for sale (orders) made with petty cash Solution: We don't want to create a bridge module only for that. We check if the field is defined on `account.journal` opw-4802389 Forward-Port-Of: odoo/enterprise#86545
This fix prevents an error when users post Italian tax closing journal entries from the Accounting Dashboard. It ensures the system uses the correct accounting entry context, allowing the posting workflow to complete normally.
Original PR description
Currently a traceback is occurring when the user tries to post a journal entry from journal dashborad. **Steps to reproduce:** 1) Install `l10n_it_xml_export` and switch to IT company 2) Create a…
Currently a traceback is occurring when the user tries to post a journal entry from journal dashborad. **Steps to reproduce:** 1) Install `l10n_it_xml_export` and switch to IT company 2) Create a closing entry for the tax report 3) Open the miscellaneous Operations from Accounting Dashboard 4) Open the above-created entry by removing the default filter 5) Post the closing entry, a wizard opens. 6) Validate the values. 7) A traceback appears **Error:** ``` account.journal' object has no attribute '_get_report_options_from_tax_closing_entry' ``` **Cause:** When the user tries to post the closing entry from the accounting dashboard, its active_model is `account.journal`, and the active_id should be the current id of the miscellaneous journal. This leads to the above traceback, as the method `_get_report_options_from_tax_closing_entry` is not available in account.journal. **Solution:** To resolve this issue, we can browse the current move from the `ctx['l10n_it_moves_to_post']`, since the value of the `l10n_it_moves_to_post` is also self.ids. Which is the current active id for that closing entry. https://github.com/odoo/enterprise/blob/3d89d9fe6be8e789278dee9bc706e091ee5a0ec5/l10n_it_xml_export/models/account_move.py#L19 opw-4783958 Forward-Port-Of: odoo/enterprise#88743 Forward-Port-Of: odoo/enterprise#86791
The referral rewards configuration now opens in the correct full form view instead of the mobile-specific layout. This makes it easier for HR teams to manage reward settings reliably from the standard configuration screen.
Original PR description
since https://github.com/odoo/enterprise/commit/6a9f8a8d69fecde388f0030a10944a6fa9da9e58, the main reward form view has been replaced by the mobile alternate view. This commit ensure that the main form view is used when accessing the reward configuration form view. Task-4953625
This fix ensures tax prediction in Accounting uses the right document context when suggesting taxes. It prevents failed or missing tax predictions, helping users get more reliable accounting automation.
Original PR description
Previously, when _predicted_field was invoked from _predict_specific_taxes, self did not have an associated move_id. As a result, _build_predictive_query was unable to construct the correct query, causing the prediction logic to fail and return False. With this fix, a new argument has been added to _predicted_field to pass the move. This ensures that the prediction logic uses the correct move_id and behaves as expected. **task**-4943015 Community PR - https://github.com/odoo/odoo/pull/219911 Forward-Port-Of: odoo/enterprise#91224
The app creator dialog now displays its selection buttons with the correct spacing again. This fixes a visual issue introduced during a recent component update, helping keep the app creation experience clear and polished.
Original PR description
This commit brings back the 'p-0' class to the SelectMenu's being used in the app creator. They were removed during the refactor of the component, but were still required to display properly those buttons in the app creator dialog.
Users can now edit bank-related fields in Odoo Studio without encountering an error. This prevents a crash when configuring certain contact and accounting screens, making customization smoother and more reliable.
Original PR description
Example of steps: - Install contacts, web_studio and accounting - Go to contacts, accounting tabs - Open web_studio and click on Banks field - Traceback The error stems from the fact that we are using a widget in an o2m field that uses a placeholder that is not defined for o2m. One solution is to add the placeholder attribute for o2m in addition to m2m and m2o. opw-4937447 Forward-Port-Of: odoo/enterprise#91346
The Belgian point of sale module now checks that a value is present before using it during processing. This prevents an avoidable error and helps keep POS operations running smoothly.
Original PR description
We increased the code robustness by ensuring the variable isn't undefined before using `.startsWith` Forward-Port-Of: odoo/enterprise#91357
The payslip PDF now respects the salary structure option to hide the basic wage. This prevents basic wage details from appearing when payroll administrators have chosen to keep them off printed payslips.
Original PR description
After this commit: odoo/enterprise@9dceed0896ce5089bccbc9cc2ce1e8c4b13f0048…
After this commit: odoo/enterprise@9dceed0896ce5089bccbc9cc2ce1e8c4b13f0048 [diff](https://github.com/odoo/enterprise/commit/9dceed0896ce5089bccbc9cc2ce1e8c4b13f0048#diff-de4a628e7837c273b67d71f93efab85b6a9ee957ea702f502066ebcc632a76cbL64) The condition that handles hiding the basic wage on the payslip was not added —possibly it was missed. That’s why the "Hide basic on PDF" feature doesn’t work, regardless of whether it’s enabled, as the necessary condition is missing in the template. Steps to reproduce (on runbot): - In a v18 runbot, open any payslip and go to the salary structure. Enable the "Hide basic on PDF" option. - Return to the payslip and print it. - You’ll see that the basic wage is still printed on the payslip. **Before Fix:** <img width="669" height="238" alt="payslipbefore" src="https://github.com/user-attachments/assets/2fce67a2-19d8-45d8-88fa-4fc6a1767e68" /> **After Fix:** <img width="683" height="289" alt="payslipafter" src="https://github.com/user-attachments/assets/adcb0104-9c4e-4a35-ba78-b3f278f6bfda" /> opw-4953831 Forward-Port-Of: odoo/enterprise#91389 Forward-Port-Of: odoo/enterprise#90798
Code cleanup and technical improvements
This update standardizes how internal messaging-related data is prepared across several Enterprise apps. It helps keep the codebase consistent and easier to maintain, with no expected change to day-to-day user workflows.
Original PR description
Enterprise counter-part. https://github.com/odoo/odoo/pull/221252
The accounting reconciliation interface was adjusted so it no longer relies on an older website editing component. This is an internal modernization step that helps reduce legacy dependencies without changing day-to-day accounting workflows.
Original PR description
This commit is part of an effort to remove the legacy web_editor module. task-4920120 https://github.com/odoo/odoo/pull/219315
Product attribute sample data has been moved into the core product area so it can be reused consistently across related apps. This keeps demo setups for manufacturing, rentals, and website rentals cleaner and easier to maintain without changing day-to-day user workflows.
Original PR description
Move product attribute data to product module for reusability Forward-Port-Of: odoo/enterprise#87938