Daily updates from Odoo
Monday, June 30, 2025
21 changes · master
Enhancements to existing features
Payroll users now receive a clearer warning when creating or updating a payslip that duplicates an existing one. This helps teams identify and resolve payroll entry issues more quickly, reducing confusion during payroll processing.
Original PR description
This PR improves the warning message displayed when a duplicate payslip is detected during creation or update. task-4639764
Timesheet grids now show a green line when an employee's recorded time exactly matches their contracted hours. This makes it easier for managers and employees to quickly spot days or periods where expected hours have been fully met.
Original PR description
- Display the line in green (`text-success`) if the employee's time spent hours is equal to their contract hours - configures test files to test this new feature correctly task-4700389
Document copying now uses a safer internal process to avoid unnecessary recalculations. This helps keep copy operations consistent and efficient without changing how users interact with Documents.
Original PR description
Description ----------- When copying documents,values were explicitly set during `write` operations to prevent expensive recomputations. However, this approach relied on the implicit behavior where fields written during a transaction are automatically added to `protected` fields and excluded from recomputation during flushing. This commit explicitly adds copyable compute stored fields that depend on `attachment_id` to the protected environment to handle this behavior.
The billable time target chart layout has been adjusted so its columns use more consistent sizing. This creates a more polished and familiar visual experience aligned with other Odoo screens.
Original PR description
This PR harmonizes the size of the column of the organization chart and makes it more consistent with other screens. task-4865792 Commu PR: https://github.com/odoo/odoo/pull/214392
Recruiters can now generate a salary offer for an applicant even when no email address is available. This makes the hiring process more flexible, with the option to send the offer link by email later when the contact details are ready.
Original PR description
Remove the constraint of required email upon generating an offer for an applicant in the recruitment app. The offer link can be sent later using the "Send by Email" button. task-4879192
Resolved issues and error corrections
The Swedish SIE4 import now accepts files that use tabs by treating them like spaces during import. Users also receive a clearer error message when an address line is incorrectly formatted, making import issues easier to understand and resolve.
Original PR description
The aim of this commit is replacing all the tabulations in the file while reading it for spaces as the csv reader is using spaces as delimiter. This commit also introduces a new user error which indicates the user that the #ADRESS line is malformed. opw-4868415 Forward-Port-Of: odoo/enterprise#88259
Miscellaneous changes
Odoo’s current behaviour - When a Lead is converted into a Ticket, the resulting Ticket contains a reference to the Lead in its chatter. However, the original Lead does not display any reference or information about the created Ticket. - This behaviour differs from how Odoo handles conversions between Tickets and Tasks, where both records include reciprocal chatter messages indicating the link between them. Expected behaviour after PR is merged When a Lead is converted into a Ticket: - The
Original PR description
Odoo’s current behaviour - When a Lead is converted into a Ticket, the resulting Ticket contains a reference to the Lead in its chatter. However, the original Lead does not display any reference or information about the created Ticket. - This behaviour differs from how Odoo handles conversions between Tickets and Tasks, where both records include reciprocal chatter messages indicating the link between them. Expected behaviour after PR is merged When a Lead is converted into a Ticket: - The Ticket should continue to include a reference to the originating Lead (existing behaviour). - The Lead should also display a chatter message referencing the newly created Ticket. Forward-Port-Of: odoo/enterprise#87463
*website_knowledge The related commit on community codebase [1] changed the behaviour of `InteractionService.shouldStop()` such that it returns true also when `el` contains `interaction.el`. This means that in edit mode interactions will restart more often: to prevent timing problems in tours, the step `waitIframeIsReady()` is now included in `clickOnSave()`. task-4367641 [1] https://github.com/odoo/odoo/commit/76a1c09c699c220b3f6f31c121b3defb776b3cc6 Forward-Port-Of: odoo/enterpr
Original PR description
*website_knowledge The related commit on community codebase [1] changed the behaviour of `InteractionService.shouldStop()` such that it returns true also when `el` contains `interaction.el`. This means that in edit mode interactions will restart more often: to prevent timing problems in tours, the step `waitIframeIsReady()` is now included in `clickOnSave()`. task-4367641 [1] https://github.com/odoo/odoo/commit/76a1c09c699c220b3f6f31c121b3defb776b3cc6 Forward-Port-Of: odoo/enterprise#88345
- Before this commit we had a traceback appearing when doing the following steps (`pos_blackbox_be` should be installed): 1. Open a POS session 2. Create a new order 3. Add a product to the order 4. Go to "payments" 5. Close the register -> Traceback occurs This was due becasue just before closing the session when using a blackbox, we create a `Clock out` order and unselected the current order see `removeClockOrder()`, then call `showScreen()`. Now inside `showScreen(
Original PR description
- Before this commit we had a traceback appearing when doing the following steps (`pos_blackbox_be` should be installed):
1. Open a POS session
2. Create a new order
3. Add a product to the order
4. Go to "payments"
5. Close the register -> Traceback occurs
This was due becasue just before closing the session when using a blackbox, we create a `Clock out` order and unselected the current order see `removeClockOrder()`, then call `showScreen()`. Now inside `showScreen()` we make sure the current order exists before accessing its payments.
task-id: 4881969
Forward-Port-Of: odoo/enterprise#88661
Forward-Port-Of: odoo/enterprise#88047Show the Do Not Disturb state text on the voip header Task-4891947 Forward-Port-Of: odoo/enterprise#88362
Original PR description
Show the Do Not Disturb state text on the voip header Task-4891947 Forward-Port-Of: odoo/enterprise#88362
Before when closing agent chat an exception occurred because the `channel_id` was undefined. This happens because when doing an await in the thread is set to `undefined`. This commit introduces a few modifications to the behaviour of the chat with the agent: Firstly, this commit moves the code calling the ORM to delete the chat history when closing the chat window to the `chat_window_model_patch.js`. This allows for the behaviour to also be applied when closing the chat from the chat
Original PR description
Before when closing agent chat an exception occurred because the `channel_id` was undefined. This happens because when doing an await in the thread is set to `undefined`. This commit introduces a few…
Before when closing agent chat an exception occurred because the `channel_id` was undefined. This happens because when doing an await in the thread is set to `undefined`. This commit introduces a few modifications to the behaviour of the chat with the agent: Firstly, this commit moves the code calling the ORM to delete the chat history when closing the chat window to the `chat_window_model_patch.js`. This allows for the behaviour to also be applied when closing the chat from the chat bubble. Additionally, the function has been modified to ensure that the thread is defined when the ORM call is made. The ORM call to close the agent chat was simplified to use the already existing `close_ai_chat` from the `discuss.channel` override. The method now uses a new `channel_type` "ai_chat", to identify channels which contain an `ai.agent`. Along with the new `channel_type`, a new function `_get_or_create_ai_chat` was introduced to properly create the "ai_chat" channels. task-4796898 Forward-Port-Of: odoo/enterprise#88716 Forward-Port-Of: odoo/enterprise#85587
Change: Skip access rights of `hr.contract` when refusing an applicant. Reasoning: If you have the right to refuse an applicant, you should be able to refuse an applicant and retrospectively, **sudo** refuse the associated offer(s). Task-4868368 Forward-Port-Of: odoo/enterprise#87730
Original PR description
Change: Skip access rights of `hr.contract` when refusing an applicant. Reasoning: If you have the right to refuse an applicant, you should be able to refuse an applicant and retrospectively, **sudo** refuse the associated offer(s). Task-4868368 Forward-Port-Of: odoo/enterprise#87730
Currently, an error occurs when the system initializes the voip configuration for the currently logged-in internal user. Steps to Reproduce: - Install the `voip` module. - Delete the activity type where the `Action` is `'Phonecall'`, and then refresh the page. `IndexError: tuple index out of range.` This error occurs when the system initializes the voip configuration and no phonecall activity type exists. The system attempts to search for activity types with the 'phonecall' catego
Original PR description
Currently, an error occurs when the system initializes the voip configuration for the currently logged-in internal user. Steps to Reproduce: - Install the `voip` module. - Delete the activity type where the `Action` is `'Phonecall'`, and then refresh the page. `IndexError: tuple index out of range.` This error occurs when the system initializes the voip configuration and no phonecall activity type exists. The system attempts to search for activity types with the 'phonecall' category, which returns an empty recordset. Then it tries to access the first record of this empty recordset[1], which raises an error. [1] https://github.com/odoo/enterprise/blob/2896974e9eda61bfe5e1d67423dc56f6ab17b2af/voip/models/res_users.py#L128 This commit ensures that if activity type with the 'phonecall' category is present, it store the activity type id, otherwise, it stores False as the activity type id. sentry-6689050392 Forward-Port-Of: odoo/enterprise#87958
Allows the use of less expensive models. GPT-4 is much more expensive than 4o and 4.1. Forward-Port-Of: odoo/enterprise#88781
Original PR description
Allows the use of less expensive models. GPT-4 is much more expensive than 4o and 4.1. Forward-Port-Of: odoo/enterprise#88781
With an MX Company setup: - Have a product with MX info correctly setup for external trade - Create an invoice - Set the external trade to definitive - Add the product on the invoice line and set "Qty UMT" to 0 Try to send and you will get a traceback opw-4807271 Forward-Port-Of: odoo/enterprise#87083 Forward-Port-Of: odoo/enterprise#86118
Original PR description
With an MX Company setup: - Have a product with MX info correctly setup for external trade - Create an invoice - Set the external trade to definitive - Add the product on the invoice line and set "Qty UMT" to 0 Try to send and you will get a traceback opw-4807271 Forward-Port-Of: odoo/enterprise#87083 Forward-Port-Of: odoo/enterprise#86118
Before, aml.ref had to be at least 5char length to be a full match candidate. But it seems 5 is not enough and leads to unwanted matches, so let's increase the limit to 7. no-task Forward-Port-Of: odoo/enterprise#88554
Original PR description
Before, aml.ref had to be at least 5char length to be a full match candidate. But it seems 5 is not enough and leads to unwanted matches, so let's increase the limit to 7. no-task Forward-Port-Of: odoo/enterprise#88554
Reproduce: 1. Create a new folder 2. Set a specific internal user as editor member on it 3. Archive that user 4. Try creating a spreadsheet in that folder -> ValidationError The check wrongly considered archived internal users as portal users. Task-4878693 Forward-Port-Of: odoo/enterprise#87940
Original PR description
Reproduce: 1. Create a new folder 2. Set a specific internal user as editor member on it 3. Archive that user 4. Try creating a spreadsheet in that folder -> ValidationError The check wrongly considered archived internal users as portal users. Task-4878693 Forward-Port-Of: odoo/enterprise#87940
Reproduce: 1. Select a document so that its token is now part of the URL 2. Refresh the page 3. The document is not selected as it should This is problematic because if you are given a link to access a document in a folder with any siblings, you have no way to know which one the link pointed to. Technically, since 18.3, records are no longer found in `onMounted`. Note that due to another (older, independent, and less critical) bug, non-previewable records are not focused. Task-4
Original PR description
Reproduce: 1. Select a document so that its token is now part of the URL 2. Refresh the page 3. The document is not selected as it should This is problematic because if you are given a link to access a document in a folder with any siblings, you have no way to know which one the link pointed to. Technically, since 18.3, records are no longer found in `onMounted`. Note that due to another (older, independent, and less critical) bug, non-previewable records are not focused. Task-4873715 Forward-Port-Of: odoo/enterprise#88555
**= pos_restaurant_preparation_display Following this commit: - In preparation display, translation has been introduced which translates the course ( first letter i.e. C ) into user language. - Presets have been made centered in the UI and encapsulated in the pill for better representation. - Preset background color has been added in the preparation display same as set in the backend. - the `I` button in the preparation display is removed. task-4668552 Community PR - https://github.co
Original PR description
**= pos_restaurant_preparation_display Following this commit: - In preparation display, translation has been introduced which translates the course ( first letter i.e. C ) into user language. - Presets have been made centered in the UI and encapsulated in the pill for better representation. - Preset background color has been added in the preparation display same as set in the backend. - the `I` button in the preparation display is removed. task-4668552 Community PR - https://github.com/odoo/odoo/pull/203442 Forward-Port-Of: odoo/enterprise#88706 Forward-Port-Of: odoo/enterprise#82177
In this commit, we uncomment the listener on beforeUnload to ensure that expectUnloadPage is correctly used in tours. From now on, if a step produces a page unload but didn't declare it, the tour will fail with an Error. This forces step producing page reload/redirect to declare them, s.t. the tour stops after that step, waiting for the next page to be loaded to continue. This is done to remove non determinism in tours. Forward-Port-Of: odoo/enterprise#88726
Original PR description
In this commit, we uncomment the listener on beforeUnload to ensure that expectUnloadPage is correctly used in tours. From now on, if a step produces a page unload but didn't declare it, the tour will fail with an Error. This forces step producing page reload/redirect to declare them, s.t. the tour stops after that step, waiting for the next page to be loaded to continue. This is done to remove non determinism in tours. Forward-Port-Of: odoo/enterprise#88726
The builds were failing due to this PR: https://github.com/odoo/enterprise/pull/72675 The reason is that we removed one column of the report. Another issue is that a test was trying to call an old expand function which is not in use anymore. Build failing: https://runbot.odoo.com/odoo/runbot.build.error/226793/runbot.build.error/226793 Forward-Port-Of: odoo/enterprise#88731
Original PR description
The builds were failing due to this PR: https://github.com/odoo/enterprise/pull/72675 The reason is that we removed one column of the report. Another issue is that a test was trying to call an old expand function which is not in use anymore. Build failing: https://runbot.odoo.com/odoo/runbot.build.error/226793/runbot.build.error/226793 Forward-Port-Of: odoo/enterprise#88731