Daily updates from Odoo
Thursday, August 21, 2025
21 changes · master
Resolved issues and error corrections
The link to Six payment setup documentation in the POS payment provider configuration has been fixed. This helps users reach the correct instructions when configuring payments, reducing confusion during setup.
Original PR description
Before this commit: ------------------- - The Six documentation link in the POS payment provider configuration was broken, leading to a poor user experience. After this commit: ------------------ - The Six documentation link has been corrected to ensure proper access to setup instructions. Task: 4797691 Forward-Port-Of: odoo/enterprise#91974
Fixed a point of sale preparation display issue that could cause an error when a restaurant used only one preparation stage. Staff can now mark that single stage as Reset or Done without the preparation screen crashing, improving reliability for simpler kitchen workflows.
Original PR description
This error occurs when we try to mark a single stage as `Reset` or `Done` in the preparation display. Steps to reproduce: --- - Install the `pos_restaurant` module - Create a New `Preparation Display` with one stage - Open `Preparation Screen` - Now `Reset` or `Done` the stage in the other tab Traceback: --- `IndexError: tuple index out of range` At [1], an error occurs because it tries to access a `position` that doesn't exist in the tuple. This happens because at [2], the code attempts to retrieve the second-to-last (-2) stage position, but only one stage is being used. [1]- https://github.com/odoo/enterprise/blob/285cca92a52f7b79de1d020558aa9b116cd7e44a/pos_enterprise/models/pos_prep_stage.py#L21-L22 [2]- https://github.com/odoo/enterprise/blob/285cca92a52f7b79de1d020558aa9b116cd7e44a/pos_enterprise/models/pos_prep_state.py#L72 sentry-6681171781 Forward-Port-Of: odoo/enterprise#87098
Odoo Studio now handles cases where a button refers to a server action that has since been deleted. Instead of showing an error, the button editor can continue to open, reducing disruption for users customizing forms.
Original PR description
The error is triggered when a user configures a button to execute a serveraction, deletes the associated server action, and then attempts to edit the button. This causes a failure at the line `self.env.ref(str_action)` due to the missing external ID. **Steps to reproduce:** * Install `crm` and `web_studio` * crm > Form View> Studio > `Add a button`> Run a server Action > Enrich * Settings > Technical > Actions > Server Actions > `Enrich` > Delete it * crm > Form View > Studio `ValueError: External ID not found in the system: crm_iap_enrich.action_enrich_mail` **Solution:** * Return `False` when the referenced server action cannot be found or has been removed. **Sentry-6608495874** Forward-Port-Of: odoo/enterprise#92683 Forward-Port-Of: odoo/enterprise#89218
The Kitchen Display no longer crashes when an order is marked done on a preparation display that has only one stage. This keeps restaurant order workflows running smoothly for setups with simplified preparation stages.
Original PR description
Currently, an IndexError traceback occurs when changing the order state in the preparation display if it contains only one stage. **Steps to reproduce this issue:** 1) Install POS, Kitchen Display 2)…
Currently, an IndexError traceback occurs when changing the order state in the preparation display if it contains only one stage. **Steps to reproduce this issue:** 1) Install POS, Kitchen Display 2) Create a preparation display by removing all but one stage in the prep settings. 3) Open a restaurant session and create an order. 4) Open the preparation display and mark the created order as DONE. 5) A traceback will occur **Error:** ``` IndexError: tuple index out of range ``` **Cause:** When the Done button is clicked in a preparation display with only one stage, an ORM call to `change_state_status` is triggered. This then calls `_record_status_change_prep_time`, followed by `is_stage_position`. https://github.com/odoo/enterprise/blob/39810b5b7df01f381a08582ddc0c5218e99c964c/pos_enterprise/models/pos_prep_state.py#L31-L40 https://github.com/odoo/enterprise/blob/39810b5b7df01f381a08582ddc0c5218e99c964c/pos_enterprise/models/pos_prep_stage.py#L21-L22 In `is_stage_position`, static positions [0, -1, -2] are used to access items in the `stage_ids`. If only one stage exists, accessing indices -2 results in an IndexError. **Solution:** Before accessing a stage by position, check that the length of stage_ids is greater than or equal to the absolute value of the position. This prevents attempts to access out-of-range indices. opw-4985306 Forward-Port-Of: odoo/enterprise#91918
Contact map locations now stay in sync when a company's address changes, preventing outdated markers for related child contacts. This helps users trust the Map View when maintaining customer or company address data, though a known import edge case may still require re-importing or updating the parent contact.
Original PR description
**Issue:** When adding contacts with incorrect address data, the Map View could display outdated or incorrect markers **Cause:** The `partner_latitude` and `partner_longitude` fields were not reset…
**Issue:** When adding contacts with incorrect address data, the Map View could display outdated or incorrect markers **Cause:** The `partner_latitude` and `partner_longitude` fields were not reset for child contacts when the parent’s address changed **Fix:** We added a `partner_latitude` and `partner_longitude` reset when changing address in write We added `partner_latitude` and `partner_longitude` in the _address_fields to update the value each time it can be required, like on address change or contact creation The extension in the _address_fields is there to detect the changes on children synchronization, because it only replace the value that where present in vals for the fields in that list In that way, it will detect more address changes and trigger the write for the children with the corresponding parent `partner_latitude` and `partner_longitude` We also make sure that those extra _address_fields will not be displayed in the formatted address by removing them from `_formatting_address_fields` **Limitations:** One issue remains during import: the parent-child address synchronization is disabled on contact creation This means children may be created with addresses different from the parent’s and have mismatch positions on Map This can be corrected by updating or re-importing the parent to trigger synchronization **Steps to reproduce:** With Form: - Add a parent contact company with a valid address - Add a child contact related to company, with a valid address - Open the Map View, both address must appear on Map - Modify the parent address to remove street (make it invalid) - Check that the child address match the parent one - Check the Map View, before the fix the child should remain with a wrong position With import: Create an import file (an example is in on the ticket) - Add a sheet for the Parent contact with an valid address - Add a sheet to add the Child contact with a parent_Id, with a valid address - Add a sheet to break the address on the parent, removing the street - Open the contacts app - Import the valid Parent and Child sheets (you need to select Related Company / External ID) - Add a filter to get your created contacts - Check the Map View (You should see both parent and child) - Import the Break parent sheet - Check that the child address match the parent one in the Form - Check the Map View, before the fix the child should remain with a wrong position A file can be found on the ticket with pre-made data **Technical notes:** The reset logic is duplicated from the `base_geolocalize` module, because this module is optional and may not be installed in all cases Since `base_geolocalize` is not always present, its `write` override will not be triggered consistently On the other hand, `web_map` is automatically installed with the Enterprise version of Odoo Therefore, it is necessary to implement this fix in at least one of the two modules to ensure the behavior is active when Enterprise is used We chose to keep the override in both `base_geolocalize` and `web_map` to cover both Community and Enterprise cases reliably An alternative approach would be to move the reset logic directly into `res.partner` in the `base` module, making it always available regardless of installed addons and avoiding the duplication opw-4842910 Forward-Port-Of: odoo/enterprise#92658 Forward-Port-Of: odoo/enterprise#90392
The French VAT report export has been updated to use the 2025 filing version. This keeps the report aligned with the latest official version and avoids automated validation failures, while not changing the report’s export content.
Original PR description
The version for 2025 is out. As far as we can see, the changes don't concern the export of VAT report. So we just change the value to 2025. (2024 non blocking for prod is still accepted in 2025 but it fails for the server test). task-4617663 Forward-Port-Of: odoo/enterprise#92676 Forward-Port-Of: odoo/enterprise#92542
Installing Belgian payroll accounting no longer fails when a specific mobility budget salary rule is missing. This helps companies complete accounting setup even if the rule was deleted or their database was created before the rule existed.
Original PR description
Currently an issue occurs when the user tries to install `10n_be_hr_payroll_account/account` after follow steps: - Install `l10n_be_hr_payroll` and switch to `BE Company CoA` - Go to Payroll > Configuration > Salary > Rules - Delete `Mobility Budget Special Contribution` - Error occurs when trying to install accounting error: `ValueError: External ID not found in the system: l10n_be_hr_payroll.cp200_employees_salary_mobility_budget_tax` The salary rule mentioned above steps was added with commit [1], and the issue also occurs if the database was created before commit [1] with a module `l10n_be_hr_payroll` and the user tries to install the account after commit [1]. This commit fixes the issue by using `raise_if_not_found=False`, which prevents an error from being raised when the salary rule is missing. [1] - https://github.com/odoo/enterprise/commit/16c8a223beda4e4ebcf2c24f716687726f7230f3 sentry-6578747340 Forward-Port-Of: odoo/enterprise#84578
The Planning Gantt scheduling pop-up now hides date and resource columns when users choose an existing shift. This removes confusing duplicate information and keeps the scheduling workflow focused and easier to use.
Original PR description
Steps to reproduce: - 1. Go to the Planning module. 2. Open the Gantt view. 3. Click on a cell to schedule an existing shift. 4. The date and resource columns are visible in the pop-up list view. Issue: - When scheduling existing shifts from the Gantt view, the date and resource columns were still visible in the pop-up list view. Cause: - The `planning_slots_to_schedule` context flag was removed in commit c3c4f02, this was used to hide the columns. Fix: - Restore the `planning_slots_to_schedule: true` context in the Gantt renderer to ensure the columns are correctly hidden in the list view. task-4922511 Forward-Port-Of: odoo/enterprise#89641
Swedish SIE4 accounting imports now continue even when the file does not include previous-year information, avoiding an import crash. The importer also retries with an alternate text encoding when needed, helping customers process more client-provided files successfully.
Original PR description
**Issue**: Importing a SIE4 file without previous year information causes a traceback. **Steps to reproduce**: - Go to Accounting > Settings > Import - Import SIE 4 file - Check the box "Import…
**Issue**: Importing a SIE4 file without previous year information causes a traceback. **Steps to reproduce**: - Go to Accounting > Settings > Import - Import SIE 4 file - Check the box "Import account opening balances" - Select the right xml and observe the traceback **Cause**: The method `_prepare_sie4_opening_balance_move` tries to directly access the previous year: https://github.com/odoo-dev/enterprise/blob/6d4919658650a006c73d4aaf1f500d67723dda0d/l10n_se_sie4_import/wizard/import_wizard.py#L376C9-L376C58 This results in a traceback when the previous year is not present. **Solution**: Make `_prepare_sie4_opening_balance_move` more permissive by falling back to the day before the first day of the current year if the `-1` section is not there. **Additional Notes**: The client file does not support `UTF8` format, retry with the `ISO-8859-1` format in case of `UnicodeDecodeError`. opw-4894495 Forward-Port-Of: odoo/enterprise#92174 Forward-Port-Of: odoo/enterprise#89425
Files added through the email wizard when sending a Sign request are now included in the outgoing email. This prevents recipients from missing documents that users intentionally attached, restoring expected email behavior.
Original PR description
Issue: * When users added attachments in the mail wizard (e.g., from the Sign module), the files were saved in the backend but not included in the outgoing email. Steps to Reproduce: 1. Edit a Sign template and click the Send button. 2. In the wizard, click on the Attachments button and select a file. 3. Press Send. 4. The email is sent, but the selected attachment is missing from the Sign request mail. Fix: * Adjusted the logic to correctly include attachments added through the wizard in the final email. Impact: * Users can now successfully send attachments added via the mail wizard. * Restores expected behavior and prevents missing documents in email. task-5002652 Forward-Port-Of: odoo/enterprise#91975
Currently an exception is generated due to the variables translated into the `Spanish (Latin America)` language. `KeyError: 'tipo'` This commit fixes the issue by using the original variable name instead of translated terms. sentry-6046430921 Forward-Port-Of: odoo/enterprise#92716
Original PR description
Currently an exception is generated due to the variables translated into the `Spanish (Latin America)` language. `KeyError: 'tipo'` This commit fixes the issue by using the original variable name instead of translated terms. sentry-6046430921 Forward-Port-Of: odoo/enterprise#92716
The asset accounting test suite now handles missing spreadsheet support more gracefully in environments with limited dependencies. This prevents avoidable test failures when the optional package is not installed, helping teams keep validation runs stable.
Original PR description
Some environments run tests without installing all package dependencies, which causes `ModuleNotFoundError: No module named 'openpyxl'`. To align with the existing pattern in the repo, wrap the import in a try/except and skip the test suite when `openpyxl` is not available.
The salary calculator now preserves the amount entered by the user when switching budget types. This avoids unexpected recalculations and helps payroll teams compare options without losing their original salary input.
Original PR description
Prevent salary calculator (Payroll > Employee > Salary Calculator) from re-encoding value when switching budget type; preserve user input. Task ID: 5030704
This fixes a timing issue that could affect sending messages with Command + Enter in enterprise Discuss and live chat-related flows. It helps ensure message actions behave consistently during fast keyboard interactions, reducing flaky behavior and test failures.
Original PR description
\* = test_discuss_full_enterprise, website_helpdesk_livechat Enterprise counter-part. https://runbot.odoo.com/odoo/runbot.build.error/230977 https://github.com/odoo/odoo/pull/223601 Forward-Port-Of: odoo/enterprise#92772
Reopening Sign templates now works even when a signer field has no “Assign To” value selected. This prevents an error during template editing and makes the Sign template workflow smoother for users.
Original PR description
Version: - saas~18.5 Steps to reproduce: - Enable debug mode. - Create a template and add some fields for signer. - Do not set any “Assign To” value. - Reopen the template. Before: - Reopening the template caused a traceback. - The `assignTo` prop was defined as a string, but when no value was selected it received False (boolean), which led to the error. After: - Return an empty string when no “Assign To” value is defined. - This prevents the traceback as it will get string value and not boolean. Impact: - Fixes the traceback when reopening templates without an “Assign To” value. - Ensures smoother user experience in template editing.
Users without shipping method administration rights can now request DHL shipping rates without hitting an access error. This keeps the quotation flow working smoothly when adding DHL delivery costs.
Original PR description
Versions -------- - saas-18.3+ Steps ----- 1. Have DHL (legacy) as a delivery method; 2. log in as demo user; 3. create a quotation with a shippable product; 4. click "Add shipping"; 5. select DHL; 6. click "Get rate". Issue ----- > Access Error: > You do not have enough rights to access the field "dhl_account_number" on Shipping Methods (delivery.carrier). Cause ----- The error gets thrown in the `_set_dct_bkg_details` method. In previous versions, the `dhl_account_number` field would still be in cache after `srm.check_required_value` was called, as this method checks whether the `carrier.dhl_account_number` field is non-empty in sudo mode. As of saas-18.3, field access is checked even if the value is available in cache, resulting in the access error. Solution -------- Use `sudo` to retrieve the `dhl_account_number`. opw-4899776 Forward-Port-Of: odoo/enterprise#92557
The accounting payment widget now shows remaining bank statement balances correctly after partial reconciliation and applies the right currency conversion. It also prevents unrelated matched invoices from being undone when one partial payment is unreconciled, improving reliability for accounting teams.
Original PR description
[FIX] account_accountant: fix multi_currency payment_widget To reproduce: - Make a statement line for partner_a for 200 $ - Make an invoice for same partner for 100 $ - Reconcile it with the…
[FIX] account_accountant: fix multi_currency payment_widget To reproduce: - Make a statement line for partner_a for 200 $ - Make an invoice for same partner for 100 $ - Reconcile it with the statement line - Duplicate the invoice and post it => First issue, you don't see the 100$ left on the statement line It's still reconciliable To fix that, we only remove fully reconciled statement lines. Second issue: - Have a bank journal in EUR with a rate of 2 - Make a statement line for 400€ in this journal - Create an invoice for the same partner of 100$ => The widget proposes a statement line of 400$ instead of a 200$ equivalent (with the rate conversion) The issue is that we convert with a foreign_currency_id that is not present in that case. To fix both, we change the way we compute the amount to always use the residual converted from the right currency [FIX] account_accountant: partial on statement line for invoice widget To reproduce: - Make a statement line for partner_a for 200 $ - Make 2 invoice for same partner for 100 $ - Reconcile them with the statement line (via the widget) - Unreconcile first invoice via the payment widget => The second invoice is also unreconciled To solve: Only unreconcile the lines that are part of the partial that we want to unlink Forward-Port-Of: odoo/enterprise#92334 Forward-Port-Of: odoo/enterprise#92005
This fix stops automatically added helper fields from being displayed or treated as editable elements in Odoo Studio. It prevents incorrect layout calculations and editing issues, making Studio views behave more reliably for users.
Original PR description
…lly added since commit odoo/odoo@6f06420e4a9443c52dc0cb427f8f55eb4aecabce, fields that are present in expression but not in the arch are automatically added. This caused problems in Studio, where those were considered normal nodes, while they should only be there to tell the model what to fetch. This commit aims at not rendering those nodes in a way that prevent them from parasiting the computation of xpaths. opw-4981741 Forward-Port-Of: odoo/enterprise#92789 Forward-Port-Of: odoo/enterprise#92602
A test setup was corrected by removing an unnecessary timesheet approval permission that could make automated checks fail in limited app configurations. This improves reliability of quality checks without changing day-to-day product behavior.
Original PR description
on the test `test_mrp_aa_employee_without_account_rights` the user was created with the group `hr_timesheet.group_hr_timesheet_approver` which is not needed and was causing the test to fail on Single app test as this module does not depend on hr_timesheet. This commit removes this group from the user creation. runbot-231137 Forward-Port-Of: odoo/enterprise#92747
This change prevents an internal asset accounting test from failing when an optional spreadsheet library is not installed. It helps keep development and quality checks reliable without changing any customer-facing accounting features.
Original PR description
The `openpyxl` package is optional. Skip test if it's not installed.
This fixes an issue in the Belgian salary contract process to ensure salary offers are handled correctly. It helps HR teams avoid errors when preparing or managing employee contract salary offers.
Original PR description
Forward-Port-Of: odoo/enterprise#88918