Thursday, May 15, 2025
28 changes · saas-18.3
Enhancements to existing features
Bank reconciliation users can now access a broader batch payment search when the initial suggestions are not enough. The popover also shows only five batch payments at a time, keeping the selection list clearer and easier to scan.
Original PR description
Adding the search more logic on batch payment and limiting the display to 5 batch in the popover no task id
This update completes recent changes to activities and addresses issues that caused crashes or made the workflow harder to use. It should make activity handling in Odoo more reliable and smoother for everyday users.
Original PR description
task-4592571 changed up the way activities function, but not everything was completed before the end of the freeze; in addition, it included a number of bugs/crashes/usage inconveniences. This commit adds: This commit also fixes: task-4747156
Accounting and Ecuador localization screens now use the standard tax display format after related platform changes. This keeps tax names consistent across forms and search fields, reducing confusion for users working with invoices, products, reimbursements, and withholding flows.
Original PR description
With the removal of custom tax components in the corresponding community commit, views need to be updated to use the standard display_name and markdown formats now available. No Task
Resolved issues and error corrections
The AI chat button is now hidden in Documents folder views where there is no specific record for the chat to reference. This prevents users from encountering an error when opening the chatter and clicking the AI button in that context.
Original PR description
How to reproduce: - Open Documents, go into a folder - Open its chatter, click on the AI btn Current behavior: - Traceback: https://pastebin.com/kyCq2yBE Solution: The AI chat requires a record but when opening a folder in the Documents app, there is no record to refer to, resulting to an error. As a fix, we won't show the AI button in case of missing record. Task-ID: 4796869
Miscellaneous changes
user_lang was missing as it was not set in the test setup, which caused an error in the setup because when creating a company it needed a user_lang to be set in this function `_create_dashboard_notes` build_error-161173 Forward-Port-Of: odoo/enterprise#84249
Original PR description
user_lang was missing as it was not set in the test setup, which caused an error in the setup because when creating a company it needed a user_lang to be set in this function `_create_dashboard_notes` build_error-161173 Forward-Port-Of: odoo/enterprise#84249
Kiosk mode now sends the required authorization information when communicating with IoT devices, so actions such as receipt printing are accepted by the IoT Box. The fix also resolves a payment terminal error that could appear after a payment was approved or cancelled.
Original PR description
Kiosk mode didn't sign the request headers with "Authorisation" needed by the IoT to execute actions like printing. This PR fixes it along with an error caused by the refactoring PR https://github.com/odoo/odoo/pull/186359 To reproduce the authorisation issue: connect a kiosk with an iot box + printer, then make a payment. The printing would never be done because no "authorization" is sent in the headers, so the IoT Box refuses to execute the action To reproduce the bug linked to the refactoring: connect an iot terminal (tested with Worldline) then try to make a payment. A traceback appears upon payment approval or cancellation task-4794798
This fix prevents barcode kanban screens from crashing when background requests finish after a user has left the page. It also groups independent data requests together, improving reliability for stock barcode and batch picking workflows.
Original PR description
… condition In JS, rpc is not a service anymore so it will return no matter if the component is already destroyed. In turn, the orm service is protected, so if it is passed it will crash. After this commit, we prevent this race condition and we batch calls that are independant from one another. runbot-error-190605
This fix prevents crashes when viewing document folder details with aliases enabled, especially in debug or read-only views. It also improves how activity assignees, alias spacing, and cleared domain fields appear, making the Documents details panel more reliable and consistent for users.
Original PR description
1. Configure aliases 2. Open documents in debug mode 3. Select or enter a folder 4. Open details panel (Info & Tags) 5. See crash Without debug mode in readonly, you'll see "Activity assigned to" instead of "No activity assignee". Also fixes * domain field disappearing if cleared * irregular spacing of alias in readonly * filtered props passed to the Many2OneField (see related COM PR) Tests are not exhaustive but expanded to increase coverage of alias fields and `isContainer` 'fake' records. Follow up of 4724349 Task-4749289
Manual tax-related returns now run their validation checks immediately when created, instead of waiting for a page refresh. The checks screen also shows a name that matches the return type, reducing confusion for users handling different return processes.
Original PR description
Before this commit: When we would create return manually for instance: Ec sales and intrastat, the checks would not run automatically since they only run on page refresh. The fix here is to run these checks on creation of the return. Another fix is the display name of the checks view. It was always 'VAT Return Checks' which is wrong. Now we base the view name on the return type name. task-4783937
Forgotten in c632b843 / task 4491333. Task-4703626 Forward-Port-Of: odoo/enterprise#82907
Original PR description
Forgotten in c632b843 / task 4491333. Task-4703626 Forward-Port-Of: odoo/enterprise#82907
### Steps to reproduce: - Create a recurring service (product) with invoicing policy set as 'Based on Timesheets' - Create a subscription using the created product - Create a task and link it to this subscription order - Timesheet 3 line in the task one in the past one on the same date of creation and one in the future. - Create an invoice for this order - Notice the quantity has been invoiced is the present timesheet line only - Notice that the 3 timesheet lines have all been
Original PR description
### Steps to reproduce: - Create a recurring service (product) with invoicing policy set as 'Based on Timesheets' - Create a subscription using the created product - Create a task and link it to this…
### Steps to reproduce: - Create a recurring service (product) with invoicing policy set as 'Based on Timesheets' - Create a subscription using the created product - Create a task and link it to this subscription order - Timesheet 3 line in the task one in the past one on the same date of creation and one in the future. - Create an invoice for this order - Notice the quantity has been invoiced is the present timesheet line only - Notice that the 3 timesheet lines have all been validated ### Cause: This is happening because when trying to link the lines to the invoice we consider the timesheets within the date range that the user might have set in the create invoice wizard. https://github.com/odoo/odoo/blob/9a4ec08b9a6b07470747923d09adcf51f7e4cd6a/addons/sale_timesheet/wizard/sale_make_invoice_advance.py#L33-L51 https://github.com/odoo/odoo/blob/9a4ec08b9a6b07470747923d09adcf51f7e4cd6a/addons/sale_timesheet/models/sale_order.py#L153 ### Fix: In subscription we can use the last and next invoice dates if the user hasn't set a period for the invoice. opw-4523727 Forward-Port-Of: odoo/enterprise#83333 Forward-Port-Of: odoo/enterprise#80582
The error was caused by the ability to `quick-create` digital certificates from the settings screen without providing the actual certificate file. This results in False being stored in the certificate content fields, ultimately triggering a `TypeError` during PDF signing. Steps to reproduce: - Go to Settings > Search for `Cryptographic signature` > Quick create a Certificate with random name and save. - Now sign and validate any file, you will encounter the error. Error: `TypeError: exp
Original PR description
The error was caused by the ability to `quick-create` digital certificates from the settings screen without providing the actual certificate file. This results in False being stored in the certificate content fields, ultimately triggering a `TypeError` during PDF signing. Steps to reproduce: - Go to Settings > Search for `Cryptographic signature` > Quick create a Certificate with random name and save. - Now sign and validate any file, you will encounter the error. Error: `TypeError: expected bytes-like object, not bool` Solution: - Removed being able to quick create certificates. sentry-6545302218 Forward-Port-Of: odoo/enterprise#85276
This commit fixes the thick dashed border on the requested document in kanban view. Task-4721026 Forward-Port-Of: odoo/enterprise#83308
Original PR description
This commit fixes the thick dashed border on the requested document in kanban view. Task-4721026 Forward-Port-Of: odoo/enterprise#83308
- When closing the session from the tour, the `total_due` of the partner was not updated yet. Now when closing the session, the test waits for the `total_due` to be updated before evaluating its value. runbot error: 182096 Forward-Port-Of: odoo/enterprise#84693
Original PR description
- When closing the session from the tour, the `total_due` of the partner was not updated yet. Now when closing the session, the test waits for the `total_due` to be updated before evaluating its value. runbot error: 182096 Forward-Port-Of: odoo/enterprise#84693
Currently the "resend" mechanism relies on `_send`; marking messages to resend as "outgoing". However when used in batch mode `_send` only sends template messages. We enable `_send_cron` to send discuss messages too and to process these in priority. As these have a fixed time limit to be sent. We also do some filtering on resend to avoid marking messages that we know will fail as outgoing. Including "unrecoverable" errors and messages on outdated channel. Methods that use crons are a
Original PR description
Currently the "resend" mechanism relies on `_send`; marking messages to resend as "outgoing". However when used in batch mode `_send` only sends template messages. We enable `_send_cron` to send discuss messages too and to process these in priority. As these have a fixed time limit to be sent. We also do some filtering on resend to avoid marking messages that we know will fail as outgoing. Including "unrecoverable" errors and messages on outdated channel. Methods that use crons are also updated to use direct method trigger and prevent commits during tests to avoid having to patch them every time. task-3547088 Forward-Port-Of: odoo/enterprise#85014 Forward-Port-Of: odoo/enterprise#79050
Steps to reproduce - Install Accounting - Go to settings and activate Analytic Accounting - Go to Configuration and create two analytic plans without any analytic accounts - Go to the Profit and Loss report - Activate the two new analytic plans -> the report is messed up in its columns Cause of the issue: When two analytic plans without any analytic account are present, they have the exact same forced_options, leading to the same column_group_key. task-4675686 Forward-Po
Original PR description
Steps to reproduce - Install Accounting - Go to settings and activate Analytic Accounting - Go to Configuration and create two analytic plans without any analytic accounts - Go to the Profit and Loss report - Activate the two new analytic plans -> the report is messed up in its columns Cause of the issue: When two analytic plans without any analytic account are present, they have the exact same forced_options, leading to the same column_group_key. task-4675686 Forward-Port-Of: odoo/enterprise#82231
**Problem** When purchasing items, then refunding them in PoS with a Peruvian company, a traceback appears, making the refund impossible. **Steps to reproduce** - Install "l10n_pe_edi_pos" - Change to the Peruvian Company - Create an order from PoS - Create a refund for that order - A traceback appears **Why the fix** A previous fix (8af3821) was done to make sure we could select multiple orders in the case of a global invoice. This fix did not take into account the fact that the *l
Original PR description
**Problem** When purchasing items, then refunding them in PoS with a Peruvian company, a traceback appears, making the refund impossible. **Steps to reproduce** - Install "l10n_pe_edi_pos" - Change to the Peruvian Company - Create an order from PoS - Create a refund for that order - A traceback appears **Why the fix** A previous fix (8af3821) was done to make sure we could select multiple orders in the case of a global invoice. This fix did not take into account the fact that the *l10n_pe_edi_refund_reason* could be not set, and get it's default value being False. So when trying to use the join() method on a boolean instead of a string, the traceback appeared. With this fix, we only use the join method if the *l10n_pe_edi_refund_reason* is set, and keeping the join() method to handle the case where multiple *l10n_pe_edi_refund_reason* are set. opw-4761685 Forward-Port-Of: odoo/enterprise#84598
Since f82f9ab7b0351d0c1239c4cafa772bea8c17c6ff, the unreconciled aml domain includes payable accounts, which leads to issue when processing followup. Since we need to get the total value including payable accounts, we add `account_id` to the group by, this way we can conditionnally set the computed values regarding the type of account, but also get the total due/overdue amounts, by adding two computed fields. Steps to reproduce new issue: - create a vendor bill for Demo (Joel Willis), with du
Original PR description
Since f82f9ab7b0351d0c1239c4cafa772bea8c17c6ff, the unreconciled aml domain includes payable accounts, which leads to issue when processing followup. Since we need to get the total value including payable accounts, we add `account_id` to the group by, this way we can conditionnally set the computed values regarding the type of account, but also get the total due/overdue amounts, by adding two computed fields. Steps to reproduce new issue: - create a vendor bill for Demo (Joel Willis), with due date 15 days ago - confirm the bill, print the PDF and attach it to the bill (as if we received it from the vendor) - now open the follow-up wizard from the partner form, and notice that the Vendor bill is attached opw-4664402 Forward-Port-Of: odoo/enterprise#85371 Forward-Port-Of: odoo/enterprise#85296
When user quickly presses the ``Enter`` key multiple times to record a timesheet, A traceback will appear. Steps to reproduce the error: - Go to Timesheets > My Timesheets - Now, Quickly press the ``Enter`` key multiple times to record a timesheet Traceback: ``` ValueError: Expected singleton: timer.timer(1, 2) File "home/odoo/src/enterprise/18.0/timesheet_grid/models/analytic.py", line 433, in action_start_new_timesheet_timer timesheet.action_timer_start() File "home/odoo/
Original PR description
When user quickly presses the ``Enter`` key multiple times to record a timesheet, A traceback will appear. Steps to reproduce the error: - Go to Timesheets > My Timesheets - Now, Quickly press the…
When user quickly presses the ``Enter`` key multiple times to record a timesheet,
A traceback will appear.
Steps to reproduce the error:
- Go to Timesheets > My Timesheets
- Now, Quickly press the ``Enter`` key multiple times to record a timesheet
Traceback:
```
ValueError: Expected singleton: timer.timer(1, 2)
File "home/odoo/src/enterprise/18.0/timesheet_grid/models/analytic.py", line 433, in action_start_new_timesheet_timer
timesheet.action_timer_start()
File "home/odoo/src/enterprise/18.0/timesheet_grid/models/analytic.py", line 460, in action_timer_start
super().action_timer_start()
File "home/odoo/src/enterprise/18.0/timer/models/timer_mixin.py", line 86, in action_timer_start
self._stop_timer_in_progress()
File "home/odoo/src/enterprise/18.0/timer/models/timer_mixin.py", line 140, in _stop_timer_in_progress
model = self.env[timer.res_model].browse(timer.res_id)
File "odoo/fields.py", line 1228, in __get__
record.ensure_one()
File "odoo/models.py", line 6196, in ensure_one
raise ValueError("Expected singleton: %s" % self)
```
https://github.com/odoo/enterprise/blob/58348c5f9276e5cb4397f0f73d23b41f5a454868/timer/models/timer_mixin.py#L128-L131 When a user quickly presses the ``Enter`` key,
``timer`` will have multiple records,
So, It will lead to the above traceback.
sentry-6557099219
Forward-Port-Of: odoo/enterprise#73984…d not CLOC Before this commit, when approvals created action servers, there were part of the CLOC After this commit, they are not. opw-4784181 Forward-Port-Of: odoo/enterprise#85390
Original PR description
…d not CLOC Before this commit, when approvals created action servers, there were part of the CLOC After this commit, they are not. opw-4784181 Forward-Port-Of: odoo/enterprise#85390
- In the check report, the amount in numbers are now moved leftward so that it is closer to the beginning of the line 4720121 Forward-Port-Of: odoo/enterprise#85342
Original PR description
- In the check report, the amount in numbers are now moved leftward so that it is closer to the beginning of the line 4720121 Forward-Port-Of: odoo/enterprise#85342
Description of the issue this commit addresses: When multiple lines that are in budget on their own are above budget when summed together, neither the lines nor the budget button show that the budget will be exceeded. This leads to making purchase orders that shouldn't be made. --- Desired behavior after this commit is merged: This commit makes it so that when the lines together will exceed the budget, the budget smart button and all the lines become red as a single line would.
Original PR description
Description of the issue this commit addresses: When multiple lines that are in budget on their own are above budget when summed together, neither the lines nor the budget button show that the budget will be exceeded. This leads to making purchase orders that shouldn't be made. --- Desired behavior after this commit is merged: This commit makes it so that when the lines together will exceed the budget, the budget smart button and all the lines become red as a single line would. --- task-4710838 Forward-Port-Of: odoo/enterprise#84653
During uninstall, fields (columns) bound to the module get deleted first, so the columns used for the search don't exist anymore and the search fails, which leads to the tables not being properly dropped, which can then lead to the module reinstallation not being clean e.g. because there are rows left in the table which can lead to constraints not being addable on install. This has been the cause of `resource` failing forever in the uninstall nightly test: it's most likely been failing since
Original PR description
During uninstall, fields (columns) bound to the module get deleted first, so the columns used for the search don't exist anymore and the search fails, which leads to the tables not being properly dropped, which can then lead to the module reinstallation not being clean e.g. because there are rows left in the table which can lead to constraints not being addable on install. This has been the cause of `resource` failing forever in the uninstall nightly test: it's most likely been failing since this hook was introduced. Forward-Port-Of: odoo/enterprise#85439
### Before this PR Try to do a receipt with a product, then a full discount of this product. You can't do a receipt with 0.0 as the amount because it is missing printRecTotal ### After this PR: You can do receipt with an amount of 0.0 This PR depends from odoo/enterprise#80951 (i can't create draft PR, but when that PR will be merged i will rebase) Forward-Port-Of: odoo/enterprise#81376
Original PR description
### Before this PR Try to do a receipt with a product, then a full discount of this product. You can't do a receipt with 0.0 as the amount because it is missing printRecTotal ### After this PR: You can do receipt with an amount of 0.0 This PR depends from odoo/enterprise#80951 (i can't create draft PR, but when that PR will be merged i will rebase) Forward-Port-Of: odoo/enterprise#81376
### Before this PR - Go on point of sale (with pos_discount installed) - Click on Action - Click on Discount - Write a discount percentage - Click OK - Validate POS An error appear because the negative price should be a printRecItemAdjustment with type 3 ### After this PR the right printRecitemAdjustiment is sent to printer Forward-Port-Of: odoo/enterprise#83452 Forward-Port-Of: odoo/enterprise#80951
Original PR description
### Before this PR - Go on point of sale (with pos_discount installed) - Click on Action - Click on Discount - Write a discount percentage - Click OK - Validate POS An error appear because the negative price should be a printRecItemAdjustment with type 3 ### After this PR the right printRecitemAdjustiment is sent to printer Forward-Port-Of: odoo/enterprise#83452 Forward-Port-Of: odoo/enterprise#80951