Tuesday, September 10, 2024
25 changes · master
New functionality added to Odoo
Point of Sale can now use Avalara AvaTax to calculate taxes during checkout. This helps businesses apply more accurate tax amounts in POS transactions when they rely on AvaTax for compliance.
Original PR description
Adding `pos_avatax` module that allow to calculate taxes using the Avatax service. taskId: 4135131 Thank to @jot-odoo for his help on this task. Community: https://github.com/odoo/odoo/pull/178079
Odoo now includes payroll localization for Jordan, covering local salary structures, rules, and contract fields. The update also connects payroll with accounting so Jordan payroll entries can be posted more consistently, with basic tests added to help protect the setup.
Original PR description
Payroll localization for Jordan Ticket [3243941](https://www.odoo.com/odoo/project.task/3243941)
Enhancements to existing features
WhatsApp channels now support sub-threads, helping teams keep related customer messages grouped more clearly. This improves conversation tracking and makes it easier for users to follow separate discussion topics within the same channel.
Original PR description
task-3972988
Resolved issues and error corrections
This fixes an issue where editing a food delivery order in Point of Sale and going back could create duplicate order lines. Orders now keep the correct line identity, reducing billing mistakes and manual cleanup for restaurant staff.
Original PR description
Steps: - Install pos_urban_piper - Open Point of Sale. - Configure Food Delivery Connector for one of pos - Place a test order. - Edit order and add a new product. - Press Back button Issue: - Duplicate orderline is been created. Fix: - uuid was not handled while creating orderline which is been taken care of from this commit. task-4147488
Miscellaneous changes
task-4068657 Forward-Port-Of: odoo/enterprise#68619
Original PR description
task-4068657 Forward-Port-Of: odoo/enterprise#68619
New module for electronic invoicing Forward-Port-Of: odoo/enterprise#69605 Forward-Port-Of: odoo/enterprise#51266
Failed quantities from quality checks are now separated into their own stock moves instead of only separate move lines. This helps ensure follow-up warehouse rules, such as moving failed goods to another location, are applied correctly; quantity-based quality checks are also avoided for manufacturing orders.
Original PR description
Previous to this commit, failed quantities in quality checks controlled per quantity were split into a separate move line in the same stock move. This prevents triggering additional push rules, specially if failed quantities are moved to a different location. This commit splits the failed quantities into their own move. Task-4063922
Department visibility has been expanded so managers can access department sections even without broader HR permissions. This helps managers better understand activity and context within their own departments while keeping the change focused on HR-related views and reports.
The rental sales kanban views were simplified to make them easier to read and maintain. This updates the layout to use newer Odoo interface patterns, helping ensure a more consistent experience without changing core business workflows.
Original PR description
In this commit we have simplified the kanban arch for the sale and their related modules.the goal is to simplify them, make them easier to read and use bootstrap utility classnames. - Previously, we used kanban-box, but now we are using kanban-card instead. - Deprecated oe_kanban_global_click and oe_kanban_global_click_edit. - More use of <field/> tags - Removed the oe_kanban_colorpicker class and replaced it with the kanban_color_picker widget. - Changed type='edit' to type='open' to open records. since version 16, records always open in edit mode by default. - kanban_image from rendering context, is deprecated so we use <field name="..." widget="image"/> instead - kanban_color, kanban_getcolor and kanban_getcolorname are deprecated use new attribute highlight_color="color_field_name" on root node Task-3992107
The Studio customization icon is now hidden from the systray when users open a project to-do form. This prevents users from accessing Studio actions in a context where they are not intended, reducing confusion and keeping the form experience focused.
Original PR description
- master ### Improvement Studio icon will disabled from systray for project todo form view. task - 3995765
Approval and Frontdesk kanban card layouts were simplified to use newer interface building blocks. This makes the views easier to maintain and helps keep the user experience aligned with current Odoo standards.
Original PR description
In this commit we have simplified the kanban arch for the approvals and frontdesk modules.the goal is to simplify them, make them easier to read and use bootstrap utility classnames. - Previously, we used kanban-box, but now we are using kanban-card instead. - Deprecated oe_kanban_global_click and oe_kanban_global_click_edit. - More use of `<field/>` tags - Removed the oe_kanban_colorpicker class and replaced it with the kanban_color_picker widget. - Changed type='edit' to type='open' to open records. since version 16, records always open in edit mode by default. - kanban_image from rendering context, is deprecated so we use <field name=... widget=image/> instead - kanban_color, kanban_getcolor and kanban_getcolorname are deprecated use new attribute highlight_color=color_field_name on root node Task-3992107
Helpdesk ticket and team cards were simplified to use newer standard layouts and controls. This makes the interface easier to maintain and helps keep Helpdesk aligned with current Odoo UI practices, with limited direct impact on daily workflows.
Original PR description
In this commit we have simplified the kanban arch for the helpdesk and helpdesk_timesheet modules.the goal is to simplify them, make them easier to read and use bootstrap utility classnames. - Previously, we used kanban-box, but now we are using kanban-card instead. - Deprecated oe_kanban_global_click and oe_kanban_global_click_edit. - More use of `<field/>` tags - Removed the oe_kanban_colorpicker class and replaced it with the kanban_color_picker widget. - Changed type='edit' to type='open' to open records. since version 16, records always open in edit mode by default. - kanban_image from rendering context, is deprecated so we use <field name=... widget=image/> instead - kanban_color, kanban_getcolor and kanban_getcolorname are deprecated use new attribute highlight_color=color_field_name on root node Task-3992107
This update replaces an outdated internal label used for list views across several accounting-related screens. The change helps keep the product terminology consistent and reduces confusion for future maintenance, with little expected impact on day-to-day users.
Original PR description
Remove historical error from semantically incorrect <tree>. Viewtiverse task-3599136 task-27709
Original PR description
New module for electronic invoicing Forward-Port-Of: odoo/enterprise#69605 Forward-Port-Of: odoo/enterprise#51266
The stepDelay argument in the l10n_co_edi_website_sale tour tests fails when loading the js for the tours https://runbot.odoo.com/web/#id=77298&menu_id=424&cids=1&action=573&model=runbot.build.error&view_type=form Forward-Port-Of: odoo/enterprise#69732
Original PR description
The stepDelay argument in the l10n_co_edi_website_sale tour tests fails when loading the js for the tours https://runbot.odoo.com/web/#id=77298&menu_id=424&cids=1&action=573&model=runbot.build.error&view_type=form Forward-Port-Of: odoo/enterprise#69732
Since the convertion of the gantt view to OWL in saas-16.1 the search_default_* type context is no longer passed from the gantt view to the gantt.form dialog window of a record, thus the "I am unavailable" button couldn't appear anymore replaced the search_default domain by 'my_planning_action' in planning gantt view and transmited the corresponding context through the openDialog method in the planning_gantt_controller Task-3819134 Forward-Port-Of: odoo/enterprise#69714 Forward-Port-Of: o
Original PR description
Since the convertion of the gantt view to OWL in saas-16.1 the search_default_* type context is no longer passed from the gantt view to the gantt.form dialog window of a record, thus the "I am unavailable" button couldn't appear anymore replaced the search_default domain by 'my_planning_action' in planning gantt view and transmited the corresponding context through the openDialog method in the planning_gantt_controller Task-3819134 Forward-Port-Of: odoo/enterprise#69714 Forward-Port-Of: odoo/enterprise#59226
Current behaviour: --- Ivory Coast phone numbers aren't formatted correctly `0708151718 => 225708151718` Expected behaviour: --- `0708151718 => 2250708151718` National number leading zero should be preserved Steps to reproduce: --- ```py from ... import phone_validation as wa_phone_validation wa_phone_validation.wa_phone_format( record, number='0708151718', force_format="WHATSAPP", ) ``` Result => `'225708151718'` Should be => `'2250708151718'` NB: record has an
Original PR description
Current behaviour: --- Ivory Coast phone numbers aren't formatted correctly `0708151718 => 225708151718` Expected behaviour: --- `0708151718 => 2250708151718` National number leading zero should be…
Current behaviour:
---
Ivory Coast phone numbers aren't formatted correctly
`0708151718 => 225708151718`
Expected behaviour:
---
`0708151718 => 2250708151718`
National number leading zero should be preserved
Steps to reproduce:
---
```py
from ... import phone_validation as wa_phone_validation
wa_phone_validation.wa_phone_format(
record, number='0708151718',
force_format="WHATSAPP",
)
```
Result => `'225708151718'`
Should be => `'2250708151718'`
NB: record has an Ivory Coast `country_id`
Cause of the issue:
---
`WHATSAPP format` is country_code + national_number
But because `national_number` is an `int`, the leading zero gets removed.
Fix:
---
See [phonenumbers/phonenumber.py](https://github.com/daviddrysdale/python-phonenumbers/blob/7f60158f325ed2ee14212b71ef7e7dc2ce5f01bb/python/phonenumbers/phonenumber.py#L124 )
The `italian_leading_zero` is set True when the national number starts with a zero,
and it should be kept. (ie: Italian numbers) `number_of_leading_zeros` counts the zeros.
Taking those into account when formatting.
opw-3963124
Forward-Port-Of: odoo/enterprise#67132Open consolidation dashboard Try to access any Consolidated Balance Traceback File "/home/odoo/src/enterprise/saas-17.4/account_reports/models/account_report.py", line 4766, in _get_annotations_domain_date_from if options['date']['filter'] in {'today', 'custom'} and options['date']['mode'] == 'single': ~~~~~~~^^^^^^^^ KeyError: 'date' This occurs because when opening consolidation reports a custom inizializer will remove the date from options dict https://github.com/odoo/enterprise/blob
Original PR description
Open consolidation dashboard
Try to access any Consolidated Balance
Traceback
File "/home/odoo/src/enterprise/saas-17.4/account_reports/models/account_report.py", line 4766, in _get_annotations_domain_date_from if options['date']['filter'] in {'today', 'custom'} and options['date']['mode'] == 'single': ~~~~~~~^^^^^^^^
KeyError: 'date'
This occurs because when opening consolidation reports a custom inizializer will remove the date from options dict https://github.com/odoo/enterprise/blob/67986c6492f38703b0ec4c81199dab1e4d8fc3d6/account_consolidation/report/trial_balance.py#L38
opw-4154017
Forward-Port-Of: odoo/enterprise#69398Current behaviour: --- When you create a campaign, if you add more activity (56) than the default pager limit (40) The next pager page will be empty (instead of showing the remaining 16 activities) Steps to reproduce: --- 1. Go to Marketing Automation 2. Create a campaign 3. Create more than 40 activities 4. Alternate parents/child when creating 5. The pager will appear, with at least 2 pages 6. Go to the second page 7. Nothing displayed NB: When inputting the number of activitie
Original PR description
Current behaviour: --- When you create a campaign, if you add more activity (56) than the default pager limit (40) The next pager page will be empty (instead of showing the remaining 16 activities)…
Current behaviour: --- When you create a campaign, if you add more activity (56) than the default pager limit (40) The next pager page will be empty (instead of showing the remaining 16 activities) Steps to reproduce: --- 1. Go to Marketing Automation 2. Create a campaign 3. Create more than 40 activities 4. Alternate parents/child when creating 5. The pager will appear, with at least 2 pages 6. Go to the second page 7. Nothing displayed NB: When inputting the number of activities in the pager, everything is rendered fine. Cause of the issue: --- To be displayed, the activities are hierarchised, by finding child and parents (`_getSortedRecordsByHierarchy`) However this system works great when all the records are given. Using a pager, some records are not used in the hierarchy, causing the outputted list to be incomplete. (ie if an activity A is in the first 40 and the child in the last 16, it will not be rendered correctly) Fix: --- Disabling the pager by setting a higher limit opw-4006610 Forward-Port-Of: odoo/enterprise#69363 Forward-Port-Of: odoo/enterprise#67979
Step to reproduce: 1. Setup barcodelookup 2. Try with 7501030682332 Error: an Odoo Error is displayed "AttributeError: 'dict' object has no attribute 'content'" Getting the image leads to a 418 response and in such case, we return a dict with few informations https://github.com/odoo/enterprise/blob/abcffc2744f9867fc63bb4e658fcfc1c9cba573f/product_barcodelookup/tools/barcode_lookup_service.py#L19-L25 but the current code considers that the response will always have be a `Response` ob
Original PR description
Step to reproduce: 1. Setup barcodelookup 2. Try with 7501030682332 Error: an Odoo Error is displayed "AttributeError: 'dict' object has no attribute 'content'" Getting the image leads to a 418 response and in such case, we return a dict with few informations https://github.com/odoo/enterprise/blob/abcffc2744f9867fc63bb4e658fcfc1c9cba573f/product_barcodelookup/tools/barcode_lookup_service.py#L19-L25 but the current code considers that the response will always have be a `Response` object with a content: https://github.com/odoo/enterprise/blob/9319cfa788033bda7a0be084075c6dd2fd82e8ac/product_barcodelookup/models/product_template.py#L44-L46 sentry-5790228190 Forward-Port-Of: odoo/enterprise#69419
The employee name is cropped if too long on the appraisal form view. The field can be extended to full width to handle any name. Task: 4163637 Forward-Port-Of: odoo/enterprise#69409
Original PR description
The employee name is cropped if too long on the appraisal form view. The field can be extended to full width to handle any name. Task: 4163637 Forward-Port-Of: odoo/enterprise#69409
### Steps to reproduce: - Enable multi-step routes in the settings - Inventory > Configuration > Warehouse Management > Operations types - Click on Manufacturing and put "Always" on create a backorder - Create a product P (no need for a bom) - Create and confirm a manufacturing order for 2 units of the product - Go to the barcode module > operations > manufacturing > the MO - Register only one unit of P and produce #### > A backorder is automatically created but you are redirected to t
Original PR description
### Steps to reproduce: - Enable multi-step routes in the settings - Inventory > Configuration > Warehouse Management > Operations types - Click on Manufacturing and put "Always" on create a…
### Steps to reproduce: - Enable multi-step routes in the settings - Inventory > Configuration > Warehouse Management > Operations types - Click on Manufacturing and put "Always" on create a backorder - Create a product P (no need for a bom) - Create and confirm a manufacturing order for 2 units of the product - Go to the barcode module > operations > manufacturing > the MO - Register only one unit of P and produce #### > A backorder is automatically created but you are redirected to the backend. ### Note: If you were in "ask" on create backorder or if your product had a bom and you did not register the quantities of consumed components, a pop up would appear and resolving the pop up would redirect you to the kanban view of mrp.production in the barcode module. ### Cause of the issue: The issue was originally solved by commit d90acab by overriding the `action_backorder` however, since commit 1e5c82f the action_backorder is no more part of the flow in "always" flows. opw-3890886 Forward-Port-Of: odoo/enterprise#69540 Forward-Port-Of: odoo/enterprise#69169
Description: - This PR introduces an Rs. 1 tolerance for amount matching to prevent unnecessary bill creation for minor discrepancies (e.g., paisa differences). It also improves bill reference number matching by handling special characters and comparing numerically as text. Impact: - Reduces unnecessary bill creation. - Enhances accuracy in matching bill reference numbers. Task ID: 3975209 Forward-Port-Of: odoo/enterprise#66121
Original PR description
Description: - This PR introduces an Rs. 1 tolerance for amount matching to prevent unnecessary bill creation for minor discrepancies (e.g., paisa differences). It also improves bill reference number matching by handling special characters and comparing numerically as text. Impact: - Reduces unnecessary bill creation. - Enhances accuracy in matching bill reference numbers. Task ID: 3975209 Forward-Port-Of: odoo/enterprise#66121
Versions -------- - 16.0+ Steps ----- 1. Enable Belgian localization; 2. create a public holiday; 3. have a contracted employee with CP200 salary structure; 4. make sure they get representation fees; 5. create a month-long maternity leave overlapping the holiday; 6. generate a payslip for that month. Issue ----- Employee receives representation fees, meant to compensate work expenses, despite not having worked that month. Cause ----- Representation fee calculation is curren
Original PR description
Versions -------- - 16.0+ Steps ----- 1. Enable Belgian localization; 2. create a public holiday; 3. have a contracted employee with CP200 salary structure; 4. make sure they get representation fees; 5. create a month-long maternity leave overlapping the holiday; 6. generate a payslip for that month. Issue ----- Employee receives representation fees, meant to compensate work expenses, despite not having worked that month. Cause ----- Representation fee calculation is currently based on "paid days" rather than days where the employee worked. As maternity leave is unpaid, the employee would normally not get representation fee, but because of the paid public holiday, the calculation continues as if the worker wasn't on leave. Solution -------- Check the `work_entry_type_id` of worked days, and skip representation fee calculation if all have `is_leave` set to `True`. opw-3908980 Forward-Port-Of: odoo/enterprise#69742 Forward-Port-Of: odoo/enterprise#68462
Steps to reproduce the bug: 1. Install the Sales and Loyalty apps. 2. Create a sales order for 'client x' and assign a loyalty reward to it. 3. Invoice the sales order with a down payment. 4. Navigate to the Helpdesk app and create a ticket for 'client x'. 5. Create a task for the ticket and check the Sales order item list. Issue: The sales order item list incorrectly includes down payments and loyalty rewards due to an imprecise domain. Solution: Adding a domain function that we ca
Original PR description
Steps to reproduce the bug: 1. Install the Sales and Loyalty apps. 2. Create a sales order for 'client x' and assign a loyalty reward to it. 3. Invoice the sales order with a down payment. 4. Navigate to the Helpdesk app and create a ticket for 'client x'. 5. Create a task for the ticket and check the Sales order item list. Issue: The sales order item list incorrectly includes down payments and loyalty rewards due to an imprecise domain. Solution: Adding a domain function that we can override computed field where it's necessary, to filter the sale_order_line records accurately. opw-4001226 odoo pr : https://github.com/odoo/odoo/pull/173667 Forward-Port-Of: odoo/enterprise#69570 Forward-Port-Of: odoo/enterprise#66388
Using distinct websockets (ws) per company cause a lot of diffent issues, for example: ## Issue this PR solve: ### Multi-company: Assume we have an IoT with no company set. In this case, it should be able to print from any company. In practice, it is not the case as the IoT will listen to the channel of the first company, so it will always fail if the user company is not the first one. Same goes if we have child companies, if C2 is a child company of C1, then C2 should be able to print
Original PR description
Using distinct websockets (ws) per company cause a lot of diffent issues, for example: ## Issue this PR solve: ### Multi-company: Assume we have an IoT with no company set. In this case, it should be…
Using distinct websockets (ws) per company cause a lot of diffent issues, for example: ## Issue this PR solve: ### Multi-company: Assume we have an IoT with no company set. In this case, it should be able to print from any company. In practice, it is not the case as the IoT will listen to the channel of the first company, so it will always fail if the user company is not the first one. Same goes if we have child companies, if C2 is a child company of C1, then C2 should be able to print too. With current code it is not the case as C1 and C2 will have distincts channels ### Change of IoT company: When the IoT start, it makes a call to know its channel (see iot/setup route). However, if we change the company set on the IoT, it should change its channel to match the one of newly set company. In practice it is not the case and will only happen on the next iot/setup call (which happen each 3 seconds call in theory IF new devices are detected) ### Simplicity Help simplifying the code as it was sometime complicated to be get the right websocket. For example, when the IoT reply back that the operation completed, see `/iot/printer/status` route. Relying on the IoT device company might be wrong as if no company is set, we don't know the company that the user who did the request is, so we might send on the bus on the wrong channel. In this case, the document did print but the pop-up will still pop ### Visibility The iot.channel had no practical way to be browsed as there is no view defined for this model. The only feasible way to get its data for a functional would be to run a server action or create a view. Using a system parameter is more practical and only accessible for admin users ## Downside of this PR: - system parameter could be modified manually - websocket send/receive more messages - stability: to ease the transition, I tried to get the existing ws channel using basic heuristics, but it might be wrong (if a company other than the first is set on the IoT). In the worst case, they will have to restart their IoT to get the new channel opw-4038176 Forward-Port-Of: odoo/enterprise#68308 Forward-Port-Of: odoo/enterprise#66573