Wednesday, June 18, 2025
14 changes
3 changes
Resolved issues and error corrections
This fixes a communication issue with the Belgian POS blackbox where repeated status messages could interfere with later requests. It improves reliability for certified point-of-sale operations by ensuring the system receives the expected device response instead of stale status information.
Original PR description
We did not send an `ACK` after asking for blackbox status, leading in BlackBox sending it again. This lead to situations where we sent requests to the BlackBox, and received the status instead of the actual response. In addition, the repeated status responses were missing the leading `ACK`, resulting in our log: `sent 1 NACKS without receiving response, giving up.` More, if we sent a command too soon to the BlackBox (before it finished instanciating), we were receiving its `certified ref` instead of the actual response, due to the `_push_status` method called from the `run` method of the BlackBox Driver parent class. This `run` method is now overridden by the BlackBox driver Task: 4750435
The bank reconciliation search dialog now avoids loading every matching accounting line when it opens. This improves performance and responsiveness, especially for companies with large accounting datasets, while preserving the ability to calculate remaining amounts for selected lines.
Original PR description
Before this commit, when entering the search view dialog a searchRead was done to create a dict of displayed move line per id. This dict is useful to compute the residual amount when selecting a line. The problem is that we don't have any limit on the search which is bad perf wise. no task id
Bank reconciliation no longer fails when Odoo tries to automatically create a reconciliation rule and cannot find a shared text pattern in previous payments. This prevents an RPC error and lets users continue assigning expense accounts without interruption.
Original PR description
When we set an expense account in Bank reconciliation, we get a RPC error followed by a traceback In this commit we fix the following trackback when there is no common substring is matched Traceback-…
When we set an expense account in Bank reconciliation, we get a RPC
error followed by a traceback
In this commit we fix the following trackback when there is no common substring is matched
Traceback-
```py
Traceback (most recent call last):
File "/home/odoo/src/odoo/saas-18.3/odoo/http.py", line 2167, in _transactioning
return service_model.retrying(func, env=self.env)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/saas-18.3/odoo/service/model.py", line 165, in retrying
result = func()
^^^^^^
File "/home/odoo/src/odoo/saas-18.3/odoo/http.py", line 2134, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/saas-18.3/odoo/http.py", line 2396, in dispatch
result = self.request.registry['ir.http']._dispatch(endpoint)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/saas-18.3/odoo/addons/base/models/ir_http.py", line 349, in _dispatch
result = endpoint(**request.params)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/saas-18.3/odoo/http.py", line 758, in route_wrapper
result = endpoint(self, *args, **params_ok)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/saas-18.3/addons/web/controllers/dataset.py", line 32, in call_kw
return call_kw(request.env[model], method, args, kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/saas-18.3/odoo/service/model.py", line 84, in call_kw
result = method(recs, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/enterprise/saas-18.3/account_accountant/models/account_bank_statement.py", line 617, in set_account_bank_statement_line
new_rule = self._check_and_create_reconciliation_rule(account_id, self.env.company.id)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/enterprise/saas-18.3/account_accountant/models/account_bank_statement.py", line 660, in _check_and_create_reconciliation_rule
rule_data = self._prepare_reconciliation_rule_data(previous_statement_lines, account_id)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/enterprise/saas-18.3/account_accountant/models/account_bank_statement.py", line 676, in _prepare_reconciliation_rule_data
common_substring = self._get_common_substring(payment_refs).strip()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'strip'
```2 changes
Resolved issues and error corrections
This fixes an issue where contract countersignatures could fail after a previous contract version was archived. It also restores the signatories tab on contract templates, helping HR teams manage required signers more easily.
Original PR description
In this PR we fix countersignature by making sure to flush the env after archiving the previous version. We also reintroduce the signatories tab that was removed on contract templates
9 changes
Resolved issues and error corrections
Fixed package PDF reports so multiple packages no longer overlap on the same page. Each package now starts on its own page, making printed inventory package labels or reports readable and easier to use.
Original PR description
When printing package reports, when having two or more packages, every package was printing one on top of another, instead of cleanly one on each page. ### Steps to reproduce 1. Click on the general…
Approval request owners can no longer modify a request after it has been approved, except when cancelling it. This protects approved decisions from being changed afterward and prevents owners from approving their own requests.
Original PR description
Issue: ------ An approval can be edited by the request approval owner even if it has been approved. Solution: --------- Prevent the owner from writing on the approval after validation except to cancel it. Prevent owner to approve his own approvals. Note: An `ir.rule` is not possible because the owner must always be able to write on his approval (but in a controlled way, i.e. only for cancel). task-4840746
When printing package reports, when having two or more packages, every package was printing one on top of another, instead of cleanly one on each page. ### Steps to reproduce 1. Click on the general settings tab, and look for Packages in the search bar. Then, check the box under Operations in the Inventory section. 2. Go to the inventory app. 3. Click on receipts and New. 4. Fill the "Receive from" field, add a product line and specify an amount under "Demand". 5. Click on Mark as Todo. Then, click on the hamburger menu of the product line and add at least 2 packages, spreading the product amounts across them. 6. Click on validate. Then, click on the action menu (cog), click on print and click on "Packages". Once the PDF has finished downloading, open it. #### Expected behavior Each page prints the content of a single package. #### Unexpected behavior On the pdf, all the packages are one on top of another. ### Origin of the issue In the /odoo-community/addons/stock/report/report_package_barcode.xml file, a for-each operation is present. This for-each iterates over each package present in the report. However, no page break was setup. ### Explanation of the fix I simply added a page breaker as an anchor (line 150). ___ opw-4806024
Attendance durations are now calculated from the employee's original start and end times for fully flexible schedules. This prevents hours from being overstated when time zone adjustments are involved, improving payroll and attendance accuracy.
Original PR description
This commit fixes the calculation of the duration of an attendance record for an employee on a fully flexible working schedule. Previously, we were using the adjusted start and end times, which were adjusted from their original values to be the outer bounds of the interval made up of the original times and the UTC-converted times. This resulted in a duration that was too long. Now, we use the original start and end times to calculate the duration of the attendance because this value is timezone-agnostic.
This fixes an issue where slideshow navigation buttons could disappear after saving and reopening HTML content, such as appointment descriptions. Keeping these buttons prevents display errors and ensures users can continue navigating embedded slideshows normally.
Original PR description
Scenario: - in 18.0, insert a slideshow in sanitize_form=True (the default) html field, for example an appointment description - reload the page Result: the slideshow button have disappeared and a…
Scenario: - in 18.0, insert a slideshow in sanitize_form=True (the default) html field, for example an appointment description - reload the page Result: the slideshow button have disappeared and a traceback appear Issue: Since 3deb8050831c69ca1e32039622b322ffa38cc497 the slideshow uses BUTTON tags instead of LI. The "sanitize_form" field options enable the lxml cleaner "forms" option which removes FORM tags, and kill BUTTON, INPUT, SELECT, TEXTAREA tags. So the buttons used for navigation are removed which causes an issue with the code not expecting it. Fix: We could: - switch buttons to other tags: but not very stable and bootstrap is using buttons itself for similar widget - have a code that refill the button on page display if they disappeared: it's lot of code and we need to be hacky with bootstrap to remove previous carousel and start on the new one we rendered dynamically - allow button in sanitization: they are removed to remove forms, but button can be used anywhere in the page, and they should be as risky as link (which are allowed) for XSS. This fix change the sanitization of forms to allow BUTTON tags. opw-4844700
This fix keeps a customer’s manually selected invoice sending method, such as Email, from being automatically changed to Peppol when Peppol details are present. It reduces confusion during invoice sending and ensures staff choices are respected.
Original PR description
Prevent invoice send method from being overwritten to "Peppol" when it is already manually set to another value like "Email". Steps to reproduce: 1. Install the Peppol module. 2. Create a contact with "Email" as invoice send method and a valid Peppol endpoint. 3. Create an invoice for that contact. 4. Click "Print and Send". 5. The method wrongly switches to "Peppol" instead of staying "Email". A similar overwrite also occurs when clicking "Verify" next to the Peppol endpoint verification on the contact form, but in that case the user sees it immediately, making it less confusing. This fix prevents overwriting the send method if it is already manually set. opw-4826186
This fix prevents scheduled accounting auto-posting from repeatedly retrying the same failed journal entry. It avoids endless error logging and the potential buildup of thousands of unnecessary chatter messages, helping keep accounting operations and system records under control.
Original PR description
**Steps to reproduce:** - For simplicity, create a new account. - Create a new journal entry, with one line on the newly created account. - Set the date to today or older. - Set auto-post to "At…
**Steps to reproduce:** - For simplicity, create a new account. - Create a new journal entry, with one line on the newly created account. - Set the date to today or older. - Set auto-post to "At date". - Make sure the journal has autocheck_on_post set to True. - Keep the journal entry in draft, and duplicate it until you have 100 copies. (Make sure auto-post is set to "At date" on all of the copies aswell) - Set the newly created account to 'Deprecated'. - Manually execute the scheduled action "Account: Post draft entries with auto_post enabled and accounting date up to today" **Issue:** The scheduled action fails and then falls into an infinte loop, and logs an error on the chatter every minute, which could lead to thousands of mail_message records beign created. **Cause:** If the autopost scheduled action fails on a certain move, it marks it as 'move.checked = False'. So that when it is calls itself again (if the number of moves to post is greater than or equal to 100), it won't fetch the same move and fail again. But having 'journal_id.autocheck_on_post = True' in the search domain allows autopost to fetch the same move it marked before (if the journal allows it), which leads to an infinite loop. **Solution:** If autopost fails on a move, set 'auto_post' to 'no' so it won't be fetched again. opw-4815790 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Activities view now looks beyond the initial batch when some records are hidden by access rules, helping the list fill up to the selected page size. This prevents users from seeing fewer activities than expected when changing the pager limit.
Original PR description
**Step to reproduce:** - login as Marc demo - from odoo home page, click on activities icon - click "view all activities" - remove "My activities" filter (you are left with "Overdue or Today") (this…
**Step to reproduce:** - login as Marc demo - from odoo home page, click on activities icon - click "view all activities" - remove "My activities" filter (you are left with "Overdue or Today") (this will show, how many records are accessible to you at this time, say x) - from pager, change limit to smaller value — say y, where y<x. Observation: Number of records returned is z such that z<y **Issue:** currently, when a `limit` is passed to `_search` method it first fetches that much record and then filter out the accessible ones so the final number of records will always be <= limit https://github.com/odoo/odoo/blob/f448966f727a89e26c3f8b08001c0cb116b3ce0a/addons/mail/models/mail_activity.py#L352-L357 **Example**: here we have 5 accessible records if we search now, with limit 5, what happens is, first 5 records are initially fetched then filtered out for access, in this case we get 3 and those 3 activities are returned ``` +----+-------------------+ | ID | ACCESSBILE OR NOT | +====+===================+ | 1 | yes | +----+-------------------+ | 2 | no | +----+-------------------+ | 3 | yes | +----+-------------------+ | 4 | yes | +----+-------------------+ | 5 | no | +----+-------------------+ | 6 | yes | +----+-------------------+ | 7 | yes | +----+-------------------+ ``` Fix: We optimistically increase the search space by factor of 2 in hope that we alteast find the `limit` amount of records opw-4744785 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes macOS keyboard shortcuts in the HTML editor so Option or Command with Backspace/Delete removes the expected word or line instead of a single character. It makes text editing feel consistent with normal Mac behavior and reduces frustration for users editing content in Odoo.
Original PR description
Problem: On macOS, pressing Option (Alt) + Backspace does not delete the previous word as expected. Instead, only a single character is removed. Cause: The `hotkey_service` does not support registering shortcuts that use the `Alt` key, which macOS relies on for word-level deletion. This prevents native macOS editing behavior from being handled properly. Solution: Add a dedicated `keydown` listener for macOS that manually handles deletion shortcuts involving `Alt` (Option) and `Command`. This restores expected word and line deletion behavior for macOS users. Steps to reproduce: - On macOS, enter a two-word line in the editor. - Press Option (Alt) + Backspace. - Only the last character is deleted, instead of the last word. opw-4781484 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Colombian company migrations now load accounting setup starting with parent companies before their subsidiaries. This avoids duplicate account or journal records and reduces the risk of migration failures for multi-company databases.
Original PR description
In migration scripts, while loading the chart of accounts, we should always initiate with parent companies to avoid creating duplicate chart records. When a new account is added and the chart is…
In migration scripts, while loading the chart of accounts, we should always initiate with parent companies to avoid creating duplicate chart records.
When a new account is added and the chart is loaded from the child company before the parent (due to sequence, name ordering), the account will be created for both companies. Sometimes resulting into singleton error from [here](https://github.com/odoo/enterprise/blob/saas-18.3/account_reports/models/chart_template.py#L31).
With this commit, the COA for Colombian-based companies will now be loaded hierarchically — i.e. parent company first — ensuring proper inheritance and avoiding redundant account or journal creation.
Community PR - #182706
UPG - [2982418](https://upgrade.odoo.com/odoo/upgrade.request/2982418)
Traceback faced:
```python
Traceback (most recent call last):
File "/home/odoo/src/odoo/saas-18.3/odoo/service/server.py", line 1396, in preload_registries
registry = Registry.new(dbname, update_module=update_module, install_modules=config['init'], upgrade_modules=config['update'])
File "<decorator-gen-6>", line 2, in new
File "/home/odoo/src/odoo/saas-18.3/odoo/tools/func.py", line 83, in locked
return func(inst, *args, **kwargs)
File "/home/odoo/src/odoo/saas-18.3/odoo/orm/registry.py", line 167, in new
load_modules(
File "/home/odoo/src/odoo/saas-18.3/odoo/modules/loading.py", line 487, in load_modules
migrations.migrate_module(package, 'end')
File "/home/odoo/src/odoo/saas-18.3/odoo/modules/migration.py", line 220, in migrate_module
exec_script(self.cr, installed_version, pyfile, pkg.name, stage, stageformat[stage] % version)
File "/home/odoo/src/odoo/saas-18.3/odoo/modules/migration.py", line 257, in exec_script
mod.migrate(cr, installed_version)
File "/home/odoo/src/odoo/saas-18.3/addons/l10n_co/migrations/1.0/end-migrate_update_taxes.py", line 8, in migrate
env['account.chart.template'].try_loading('co', company)
File "/home/odoo/src/odoo/saas-18.3/addons/account/models/chart_template.py", line 160, in try_loading
return self._load(template_code, company, install_demo, force_create)
File "/home/odoo/src/odoo/saas-18.3/addons/account/models/chart_template.py", line 244, in _load
self._load(template_code, subsidiary, install_demo, force_create)
File "/home/odoo/src/odoo/saas-18.3/addons/account/models/chart_template.py", line 227, in _load
self._post_load_data(template_code, company, template_data)
File "/home/odoo/src/enterprise/saas-18.3/account_reports/models/chart_template.py", line 29, in _post_load_data
'account_tax_return_journal_id': closing_journal.id,
File "/home/odoo/src/odoo/saas-18.3/odoo/orm/fields_misc.py", line 117, in __get__
raise ValueError("Expected singleton: %s" % record)
ValueError: Expected singleton: account.journal(28, 29)
```
Description of the issue/feature this PR addresses:
Current behavior before PR:
Desired behavior after PR is merged:
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prUploading attachments to project tasks now works correctly in multi-company setups when the related project folder belongs to another company. This prevents disruptive server errors and keeps document handling reliable for users working across companies.
Original PR description
**Issue**: A server error related to alias domains is raised when uploading an attachment to a task if the associated project folder is assigned to a company in a multi-company environment. **Steps…
**Issue**: A server error related to alias domains is raised when uploading an attachment to a task if the associated project folder is assigned to a company in a multi-company environment. **Steps to reproduce:** - Set up a multi-company environment with Company 1 and Company 2. - Go to Settings > Technical > Email > Alias Domains: - Create "alia1.odoo.com" and assign it to Company 1 - Create "alia2.odoo.com" and assign it to Company 2 - In Settings > Users > Mitchell Admin: - Set Company 1 as the default company - Ensure access to both companies - With Company 2 enabled: - Create a new project - Add a stage (e.g., "New") and create a task within it - Go to Documents > open the "Projects" folder in list view - Select the folder linked to the created project. - Make the Company field visible and set it to Company 2. - Return to the project and try uploading an attachment to the task A server Error appears in the top-right corner. opw-4731193