Monday, March 10, 2025
25 changes · master
New functionality added to Odoo
A new base module has been added to make IoT-related app development more consistent across Odoo editions. This reduces duplicated work and should make future IoT features easier to build and maintain.
Original PR description
We added a module to simplify IoT development and avoid code reuse by providing a common base to both Enterprise and Community IoT apps. Community PR: [https://github.com/odoo/odoo/pull/192667](https://github.com/odoo/odoo/pull/192667)
Enhancements to existing features
Gantt views no longer show placeholder sample records when there is no real data. This avoids confusing or unattractive totals and keeps attendance and planning screens focused on actual business information.
Original PR description
This commit removes the sample data records from gantt because it looks weird with the total row and it isn't adding much to the user experience. task-4009082
The appointment invitation screen no longer shows shortcode warnings before an appointment type is chosen. This avoids confusing users with warnings that are not relevant yet and makes the setup flow cleaner.
Original PR description
Purpose ======== - Unique Shortcode warning and shortcode format warning are visible even when there is no appointment type selected which seems weird. Specification ============== - This commit addresses the issue now, the warning will not be there when no appointment type is selected. Task-4437892
Users can now delete a GST return period when an error occurs while it is being sent. This helps businesses recover from failed GST filing attempts without being blocked by a stuck period.
Original PR description
With this PR, user can delete the GST return period if an error is received while the status is `sending`. task-4471668
This update tightens internal validation so new records are created using the expected data format. It helps catch developer mistakes earlier, improving reliability across accounting, appointments, and recruitment workflows without changing day-to-day user behavior.
Planning publication now includes the final day chosen in a date range. This makes scheduling more intuitive by ensuring a range such as day 1 to day 10 includes day 10 when publishing.
Original PR description
This commit's purpose is to add the last day selected when the 'publish' button is used since it is not intuitive to miss the day 10 when a user select a date range from day 1 to day 10
The Studio chatter area is now easier to see when users hover over it in dark mode. This improves readability and makes form editing more comfortable for users working with dark themes.
Original PR description
SPECIFICATION: Improves the visibility of the chatter in dark mode when hovering in studio. Task-4574621
Resolved issues and error corrections
This fix corrects an issue in the Add IoT Box window where the pairing button could not be properly disabled during the pairing process. It helps prevent errors when users connect an IoT Box, making setup more reliable.
Original PR description
Since we moved the pair button in the Add IoT Box Modal footer, its ref was incorred, leading to an error while trying to disable it during pairing process. Task: 4637137
Ratings now show the actual date when a customer rating was created or updated, instead of changing when the related task or ticket is edited. This makes rating history clearer and prevents unrelated updates from misleading teams reviewing customer feedback.
Original PR description
This commit changes new field of view to show the rating date. Task-4023246
The Gantt view now shows row sidebars with consistent, less distracting borders when sample data is displayed. This improves the visual polish of planning screens and avoids making placeholder data look heavier than real content.
Original PR description
This commit fixes an issue where the Gantt row sidebar displayed overly prominent borders in sample data mode. The issue occurred because the borders were applied to elements that lacked the sample data class. Task ID: 4009082
Code cleanup and technical improvements
The spreadsheet pivot details panel now reuses a shared update control, making the interface more consistent and easier to maintain. This is an internal cleanup with minimal direct impact for users, but it helps keep future spreadsheet improvements reliable.
Miscellaneous changes
Purpose ======= Recent changes have made bill encoding easier than ever (most notably, a bill date is set by default if left empty), but offering a robust duplicate bill detection is more important than ever in the modern electronic invoicing world, where bills are more and more handled automatically. We want to make sure that: - Potential duplicates remain visible at all time, including in list view - Automated actions like auto posting are not done when a potential duplicate is detect
Original PR description
Purpose ======= Recent changes have made bill encoding easier than ever (most notably, a bill date is set by default if left empty), but offering a robust duplicate bill detection is more important…
Purpose ======= Recent changes have made bill encoding easier than ever (most notably, a bill date is set by default if left empty), but offering a robust duplicate bill detection is more important than ever in the modern electronic invoicing world, where bills are more and more handled automatically. We want to make sure that: - Potential duplicates remain visible at all time, including in list view - Automated actions like auto posting are not done when a potential duplicate is detected. Specs ===== 1. Do not hide the warning on potential bill duplicate for posted invoices. The information remains pertinent. 2. When a move should be posted automatically (by the Auto-post feature on account.move or by the OCR auto-post), but a potential duplicate is found, prevent the auto-post from happening. Log the information in the chatter: "Auto-post was disabled on this invoice because a potential duplicate was detected." 3. In list view put the reference in red background when a potential duplicate on that invoice is detected. task-4578751 Community PR: https://github.com/odoo/odoo/pull/197891 Forward-Port-Of: odoo/enterprise#79471
We made invisible the `screen_orientation` field if `can_be_kiosk` was `False` on the IoT Box, but we still updated the screen orientation if `screen_orientation` was set: which was always the case as it has a default value. We now update only if the IoT Box `can_be_kiosk`. Task: 4606855 Forward-Port-Of: odoo/enterprise#81023
Original PR description
We made invisible the `screen_orientation` field if `can_be_kiosk` was `False` on the IoT Box, but we still updated the screen orientation if `screen_orientation` was set: which was always the case as it has a default value. We now update only if the IoT Box `can_be_kiosk`. Task: 4606855 Forward-Port-Of: odoo/enterprise#81023
## Issue: In Luxembourg companies, when creating an employee contract with an hourly wage, the indexed wage is always displayed as 0, causing the payslip to incorrectly show 0 for the basic salary. ## Steps to reproduce: 1. Create a new employee 2. Create a new contract for this employee with a hourly wage and Luxembourg: Regular Pay structure 3. Create a new payslip for this employee 4. Check the basic salary: it will be 0 ## Root cause: - The previous implementation did not account
Original PR description
## Issue: In Luxembourg companies, when creating an employee contract with an hourly wage, the indexed wage is always displayed as 0, causing the payslip to incorrectly show 0 for the basic salary.…
## Issue: In Luxembourg companies, when creating an employee contract with an hourly wage, the indexed wage is always displayed as 0, causing the payslip to incorrectly show 0 for the basic salary. ## Steps to reproduce: 1. Create a new employee 2. Create a new contract for this employee with a hourly wage and Luxembourg: Regular Pay structure 3. Create a new payslip for this employee 4. Check the basic salary: it will be 0 ## Root cause: - The previous implementation did not account for hourly wage contracts when computing the indexed wage, leading to incorrect salary calculations. ## Solution: - Added logic to correctly compute the indexed wage for hourly contracts. - Adjusted related salary rules to differentiate between hourly and monthly wage types. - Updated views to reflect the correct unit (per month or per hour) based on the wage type. - Added a test case to validate the correct computation for hourly contracts. OPW-4460735 Forward-Port-Of: odoo/enterprise#79987 Forward-Port-Of: odoo/enterprise#78789
How to reproduce the issue: - Create an expense budget and associate it to a project. - Create invoice/bills related to the project In the project dashboard view, the remaining value will be marked in green for expenses that exceed the budget (over-achieving costs) and in red for expenses that are under the budget (under-achieving costs). However, this was deemed non-intuitive, as under-achieving costs should be seen as a positive indicator. After this commit the color for expense budg
Original PR description
How to reproduce the issue: - Create an expense budget and associate it to a project. - Create invoice/bills related to the project In the project dashboard view, the remaining value will be marked in green for expenses that exceed the budget (over-achieving costs) and in red for expenses that are under the budget (under-achieving costs). However, this was deemed non-intuitive, as under-achieving costs should be seen as a positive indicator. After this commit the color for expense budget are inverted. opw-4562815 Forward-Port-Of: odoo/enterprise#79965
Steps to reproduce: 1. Open new table appointment form from the appointment app 2. Select a table ressource that is linked to a pos_config that has no current_session_id 3. Save Traceback is shown Fix: When notifying the tables of the appointment update the wrong session object was used. This commit ensure that the correct object is used in order to notify the sessions linked to the reserved tables Forward-Port-Of: odoo/enterprise#80949 Forward-Port-Of: odoo/enterprise#80889
Original PR description
Steps to reproduce: 1. Open new table appointment form from the appointment app 2. Select a table ressource that is linked to a pos_config that has no current_session_id 3. Save Traceback is shown Fix: When notifying the tables of the appointment update the wrong session object was used. This commit ensure that the correct object is used in order to notify the sessions linked to the reserved tables Forward-Port-Of: odoo/enterprise#80949 Forward-Port-Of: odoo/enterprise#80889
Steps to Reproduce the Bug: - Install stock_picking_batch. - Go to Barcode > Operations > Delivery Orders > Batches. - Select any batch: - Click on the Parameters button > In the Operation section: - Click on Return Products. Problem: A traceback is raised: "The method 'stock.picking.batch.action_create_return_picking' does not exist." The function “action_create_return_picking” belongs to the “stock.picking” model, not to “stock.picking.batch” records. We are not
Original PR description
Steps to Reproduce the Bug: - Install stock_picking_batch. - Go to Barcode > Operations > Delivery Orders > Batches. - Select any batch: - Click on the Parameters button > In the Operation section: -…
Steps to Reproduce the Bug:
- Install stock_picking_batch.
- Go to Barcode > Operations > Delivery Orders > Batches.
- Select any batch:
- Click on the Parameters button > In the Operation section: - Click on Return Products.
Problem:
A traceback is raised:
"The method 'stock.picking.batch.action_create_return_picking' does not exist."
The function “action_create_return_picking” belongs to the “stock.picking” model, not to “stock.picking.batch” records. We are not supposed to be able to return products from a batch.
Moreover, even for “stock.picking” records, products can only be returned from done pickings. However, this button is displayed in all picking states except the done state:
https://github.com/odoo/enterprise/blob/2d5dbb93e6b33c2be786f9b2361c993f715d1a7f/stock_barcode/static/src/components/main.xml#L119
Solution:
Have the same condition for done pickings as in:
https://github.com/odoo/enterprise/blob/2d5dbb93e6b33c2be786f9b2361c993f715d1a7f/stock_barcode/static/src/components/main.xml#L165-L170
opw-4624039
Forward-Port-Of: odoo/enterprise#80717This commit upgrades the image upload endpoint to the one available in the v2 API. This is done because X is deprecating the old upload API endpoint. We also needed to update how the media id was fetched from the response as it changed between versions. task-4606722 Forward-Port-Of: odoo/enterprise#80232
Original PR description
This commit upgrades the image upload endpoint to the one available in the v2 API. This is done because X is deprecating the old upload API endpoint. We also needed to update how the media id was fetched from the response as it changed between versions. task-4606722 Forward-Port-Of: odoo/enterprise#80232
### Issue: - Refused overtime in attendance, is not correctly excluded from work entries, for employees where the contract work entry resource is attendances. ### Steps To Reproduce: - Create a new employee with a 40h work schedule. - Create a new contract for the employee, and set the `Work Entry Source` to `Attendances` - Change the contract status to running. - Go to the attendance tab. - Create a new attendance for the employee. - Make sure the attendance interval includes some ove
Original PR description
### Issue: - Refused overtime in attendance, is not correctly excluded from work entries, for employees where the contract work entry resource is attendances. ### Steps To Reproduce: - Create a new…
### Issue: - Refused overtime in attendance, is not correctly excluded from work entries, for employees where the contract work entry resource is attendances. ### Steps To Reproduce: - Create a new employee with a 40h work schedule. - Create a new contract for the employee, and set the `Work Entry Source` to `Attendances` - Change the contract status to running. - Go to the attendance tab. - Create a new attendance for the employee. - Make sure the attendance interval includes some overtime. - Confirm the attendance. - Refuse the overtime in the attendance. - Go to work entries and regenerate new ones. - Notice the work entry duration includes refused overtime. ### Solution: - In `_get_attendance_intervals` we rely on the `check_out` date to determine the attendance interval. however this date coresponds to the end of the attendance including refused overtime. - We modified the attendance `check_out` date to remove hours that are refused overtime. opw-4571285 Forward-Port-Of: odoo/enterprise#80831
Problem ---------- - Number field of HrPayslip model was removed, it makes crash the SHIF Report wizard - Demo data payslips doesn't contains NHIF or SHIF amount, it makes the SHIF report wizard add the payslip with an amount of 0. Objective ---------- - fix the SHIF Report wizard - check if the SHIF/NHIF amount == 0 before add it in report entries. Solution ---------- - replace payslip.number by payslip.name - add a condition on the SHIF/NHIF amount to add the payslip task-446
Original PR description
Problem ---------- - Number field of HrPayslip model was removed, it makes crash the SHIF Report wizard - Demo data payslips doesn't contains NHIF or SHIF amount, it makes the SHIF report wizard add the payslip with an amount of 0. Objective ---------- - fix the SHIF Report wizard - check if the SHIF/NHIF amount == 0 before add it in report entries. Solution ---------- - replace payslip.number by payslip.name - add a condition on the SHIF/NHIF amount to add the payslip task-4463586 Forward-Port-Of: odoo/enterprise#80456
- Fix issue raising an "Odoo server error". Steps to reproduce : -Open PoS restaurant -Confirm order with at least 2 lines -Go to preparation display -Click first line of the order to mark it as done -Now click its preparation display card => Nothing happens and there is an "Odoo Server Error" in the console. - Since this PR (https://github.com/odoo/enterprise/pull/78512) we've introduced a function `get_displays_by_orders` that receive a `pos.order` as parameter. The issue was rais
Original PR description
- Fix issue raising an "Odoo server error". Steps to reproduce : -Open PoS restaurant -Confirm order with at least 2 lines -Go to preparation display -Click first line of the order to mark it as done -Now click its preparation display card => Nothing happens and there is an "Odoo Server Error" in the console. - Since this PR (https://github.com/odoo/enterprise/pull/78512) we've introduced a function `get_displays_by_orders` that receive a `pos.order` as parameter. The issue was raised when we call this function with a `Pos_Preparation_DisplayOrder` object instead of it's linked `pos.order`. task-id: 4627321 Forward-Port-Of: odoo/enterprise#80804
Before this commit, the `helpdesk_pick_template_as_message_from_knowledge` tour fails in no demo because the admin user is not named `Mitchell Admin` and so the step does not find the signature field. This commit adds the signature on the admin user to make sure the signature will be the same with demo data and without demo data. Forward-Port-Of: odoo/enterprise#80743
Original PR description
Before this commit, the `helpdesk_pick_template_as_message_from_knowledge` tour fails in no demo because the admin user is not named `Mitchell Admin` and so the step does not find the signature field. This commit adds the signature on the admin user to make sure the signature will be the same with demo data and without demo data. Forward-Port-Of: odoo/enterprise#80743
In the external and internal layouts, some default variables are set conditionally (`o` in particular) This commit evaluates the content of the t-if expression to imitate what the real qweb does. Otherwise, the variable risks of being erased from the context of the node, which is necessary to add field on the right variable with the right type. opw-4592446 Forward-Port-Of: odoo/enterprise#80019
Original PR description
In the external and internal layouts, some default variables are set conditionally (`o` in particular) This commit evaluates the content of the t-if expression to imitate what the real qweb does. Otherwise, the variable risks of being erased from the context of the node, which is necessary to add field on the right variable with the right type. opw-4592446 Forward-Port-Of: odoo/enterprise#80019
As a user I want to be able to choose if I want the frame or not, and as it's saved in a preference like way, I want to be able to disable the default frame if I enable it previously Steps: - Setup a signature image for your user - Open Sign - Upload a document and add Signature field - Sign the document - Open the Sign dialog - Check the "frame" option - Sign - Repeat the steps BUT uncheck frame option Actual result: - Signature frame is still there for the user - All signature
Original PR description
As a user I want to be able to choose if I want the frame or not, and as it's saved in a preference like way, I want to be able to disable the default frame if I enable it previously Steps: - Setup a signature image for your user - Open Sign - Upload a document and add Signature field - Sign the document - Open the Sign dialog - Check the "frame" option - Sign - Repeat the steps BUT uncheck frame option Actual result: - Signature frame is still there for the user - All signature have the frame by default Expected result: - If user sign without frame, this preferences is apply for next signature opw-4610410 Forward-Port-Of: odoo/enterprise#80848
First commit: Fix a bug which prevents un-embedding actions: Reproduce: 1. Install documents_account 2. Go to the finance folder 3. Try to un-embedd the action "Create a Vendor Bill" 4. You can't This occurs because we created the embedded actions by passing a group in the data, but we can't do that in the UI, so we cannot un-embed the existing action. This also means that groups cannot be enforced at the embedded actions level using their groups_id field, but rather the groups_id
Original PR description
First commit: Fix a bug which prevents un-embedding actions: Reproduce: 1. Install documents_account 2. Go to the finance folder 3. Try to un-embedd the action "Create a Vendor Bill" 4. You can't This occurs because we created the embedded actions by passing a group in the data, but we can't do that in the UI, so we cannot un-embed the existing action. This also means that groups cannot be enforced at the embedded actions level using their groups_id field, but rather the groups_id field of the related server action, and it was actually redundant. Thankfully these records are correct. Second commit: Fix using embedded actions when viewing documents from a container shortcut. Task-4525850 Forward-Port-Of: odoo/enterprise#81005 Forward-Port-Of: odoo/enterprise#78114