Daily updates from Odoo
Monday, March 31, 2025
28 changes · master
Security fixes and vulnerability patches
Document actions can now only be pinned when the user has write access to the target folder. This helps prevent unauthorized changes to shared document workflows while keeping action behavior aligned with folder permissions.
Original PR description
Purpose ======= Check that we have write access on a folder to be able to pin an action. Create a new type of action (new `usage`). With that type, we check that the action is pinned on the folder of the documents we are executing the action on. Remove unused file. Task-4535626
Enhancements to existing features
Payroll batch lists can now be filtered by the current period, a specific month, or a custom date range. This helps payroll teams find the relevant batches faster and manage period-based payroll work more efficiently.
Original PR description
- Batch filtering for the current period and specific month or date range is important. Task: 4602976
The field service map now shows each intervention's scheduled time directly in the side list, making it easier for planners and technicians to match tasks to their timing. This reduces confusion when many jobs appear on the map and helps users prioritize visits more quickly.
Original PR description
The map view can look quite messy with all of the tasks displayed in the left-side panel. It's not obvious which intervention falls on which time. In map view, in the left side panel (list of items), we added the time of the intervention to the display name. task-3705158
Payroll salary rule categories can now share the same code when needed, avoiding upgrade issues for customers who customized categories manually. This gives businesses more flexibility to keep their payroll setup aligned with their own rules without being blocked by duplicate-code restrictions.
Original PR description
Issue: As Salary Rule Category could be updated by hand, it will viloate the constrain at upgrade Improve: remove constaint will marking dup rules So customers can cuztomize thier own rules with the same code Task: 4626756
Resolved issues and error corrections
This change removes unnecessary default permission groups from shared accounting test setup and adds them only where individual tests need them. It helps keep automated tests more accurate and easier to maintain without changing customer-facing behavior.
Original PR description
Followup to https://github.com/odoo/odoo/pull/203271 This PR removes the groups that have little to no effects on the test, and fix the tests that get broken by them. Further groups require more work.
A payroll expense test now consistently uses the same accounting journal as the base setup. This prevents failures when demo data is not installed, improving reliability for development and validation environments.
Original PR description
[FIX] hr_payroll_expense: fix test failure in non-demo mode In `test_no_expense_rule_means_no_linkage` we create a new salary structure to test the case where a missing rule shouldn't link expenses to the payslip. In the copy of the base setup structure we didn't mention a journal, this lead to the use of another journal that worked because demo data would ensure it was properly setup. Without demo data, this test would fail. This commit ensures the journal used in the test is the one from the base setup.
Rental sales now use the same company rules as standard sales when choosing products. This prevents users in subsidiary companies from seeing inconsistent product options and makes rental order entry more reliable.
Original PR description
The `company_id` part of the product_id/product_tmpl_id domain on sale order lines has been removed by odoo/odoo@b0f0fd2ee3dcc3bbb24a123d4a1b38d17d0ce8c9 but not adapted in rental, leaving to an inconsistency between the two apps. This commit (and the community counterpart) refactor the domains of those fields to rely on the standard `check_company` logic, simplifying the logic and avoiding inconstitencies.
A spreadsheet edition error message in the global filter editor is now properly prepared for translation. This helps users working in different languages see clearer, localized guidance when an error occurs.
Original PR description
Task-4680832
The German financial reports now calculate prior-year profit or loss and current-year net income more accurately on the balance sheet. This helps businesses relying on German localization reports see correct carried-forward and annual result figures for fiscal reporting.
Original PR description
Profit and loss from previous year was not well calculated on the balance sheet. With this commit, we change the date scope for the `Net profit/loss for the year` line from `normal` to `from_fiscalyear`. We also change the way we calculate `Profit carried forward/loss carried forward` and `Net income/loss for the year` lines. opw-3663626
The Gantt view now calculates column widths correctly when some columns are folded. This prevents layout issues and helps users read schedules and timelines more reliably.
Original PR description
This commit fixes an issue introduced in https://github.com/odoo/enterprise/commit/4f3682b4edf88f5423bb4111b4f1e0d2fc42e627, where a confusion between the number of hidden columns and the actual number of folded columns led to incorrect width calculations for non-folded columns. This fix resolves the ambiguity and ensures accurate column width.
Miscellaneous changes
…putation To allow people with low gross wages to take mobility budget, we allow iterative computation to reduce it until minimum gross wage is obtained task-4647060 Forward-Port-Of: odoo/enterprise#81336
Original PR description
…putation To allow people with low gross wages to take mobility budget, we allow iterative computation to reduce it until minimum gross wage is obtained task-4647060 Forward-Port-Of: odoo/enterprise#81336
Test that resetting a statement line that was merged with a batch payment also resets the payments, especially for payments without an outstanding account. It wasn't the case because there is no real link between the batch payment and the statement line, and neither between the statement line and the payment itself. The fix is in community. Forward-Port-Of: odoo/enterprise#81911 Forward-Port-Of: odoo/enterprise#81839
Original PR description
Test that resetting a statement line that was merged with a batch payment also resets the payments, especially for payments without an outstanding account. It wasn't the case because there is no real link between the batch payment and the statement line, and neither between the statement line and the payment itself. The fix is in community. Forward-Port-Of: odoo/enterprise#81911 Forward-Port-Of: odoo/enterprise#81839
When drag-and-dropping a CSV in the bank journal, the statements lines don't get reconciled directly while they should (if a reco model allows it). Users have to wait for the auto-reconcile cron to run. After the statement and its lines have been created through import, we now trigger the cron computation. Ticket [link](https://www.odoo.com/odoo/project/967/tasks/4545446) opw-4545446 Forward-Port-Of: odoo/enterprise#82006 Forward-Port-Of: odoo/enterprise#81587
Original PR description
When drag-and-dropping a CSV in the bank journal, the statements lines don't get reconciled directly while they should (if a reco model allows it). Users have to wait for the auto-reconcile cron to run. After the statement and its lines have been created through import, we now trigger the cron computation. Ticket [link](https://www.odoo.com/odoo/project/967/tasks/4545446) opw-4545446 Forward-Port-Of: odoo/enterprise#82006 Forward-Port-Of: odoo/enterprise#81587
Forward-Port-Of: odoo/enterprise#82398
Original PR description
Forward-Port-Of: odoo/enterprise#82398
Certain reports were incorrectly referring to DIAN, even though the Industry and Commerce Tax (ICA) is administered at the district level. According to Colombian regulations (e.g., Decree 807 of 1993, Agreement 65 of 2002 for Bogotá), the collection and administration of ICA falls under the local Secretariat of Finance, not DIAN. This commit adds logic so that if the report is for ICA, it shows the correct reference to the Secretariat of Finance; otherwise, it preserves the reference to DIAN.
Original PR description
Certain reports were incorrectly referring to DIAN, even though the Industry and Commerce Tax (ICA) is administered at the district level. According to Colombian regulations (e.g., Decree 807 of 1993, Agreement 65 of 2002 for Bogotá), the collection and administration of ICA falls under the local Secretariat of Finance, not DIAN. This commit adds logic so that if the report is for ICA, it shows the correct reference to the Secretariat of Finance; otherwise, it preserves the reference to DIAN. Forward-Port-Of: odoo/enterprise#82218 Forward-Port-Of: odoo/enterprise#79630
Purpose ======= Currently, we need a write access on a document to post message in it. We want the reader of the documents to be able to post. Task-4677687 Forward-Port-Of: odoo/enterprise#82375 Forward-Port-Of: odoo/enterprise#82302
Original PR description
Purpose ======= Currently, we need a write access on a document to post message in it. We want the reader of the documents to be able to post. Task-4677687 Forward-Port-Of: odoo/enterprise#82375 Forward-Port-Of: odoo/enterprise#82302
This commit adds the possibility to access multiple attachment inside the salary rule while having the total amount of the recordset if amount is access directly task-4640076 Forward-Port-Of: odoo/enterprise#82226
Original PR description
This commit adds the possibility to access multiple attachment inside the salary rule while having the total amount of the recordset if amount is access directly task-4640076 Forward-Port-Of: odoo/enterprise#82226
Somehow we lost the frontend interface to the backend-ready downloading of folder. Also fix testing helpers to make the details panel usable without crashing, and to make non-root folders appear as children of their parents in the search panel. While we're here, linting test code introduced in this version allows to be ready to limit diffs in future fixes & FW ports. Task-4677814 Forward-Port-Of: odoo/enterprise#82505 Forward-Port-Of: odoo/enterprise#82310
Original PR description
Somehow we lost the frontend interface to the backend-ready downloading of folder. Also fix testing helpers to make the details panel usable without crashing, and to make non-root folders appear as children of their parents in the search panel. While we're here, linting test code introduced in this version allows to be ready to limit diffs in future fixes & FW ports. Task-4677814 Forward-Port-Of: odoo/enterprise#82505 Forward-Port-Of: odoo/enterprise#82310
Forward-Port-Of: odoo/enterprise#82463
Original PR description
Forward-Port-Of: odoo/enterprise#82463
Since 17.0, and before this commit, when the user navigates from an account report to another page and then comes back to the report through the breadcrumb, the user is brought to the top of the report. In 16.0, the user would be brought to the same position they were looking at. This commit brings this behavior back. task-4578468 Forward-Port-Of: odoo/enterprise#82496 Forward-Port-Of: odoo/enterprise#82072
Original PR description
Since 17.0, and before this commit, when the user navigates from an account report to another page and then comes back to the report through the breadcrumb, the user is brought to the top of the report. In 16.0, the user would be brought to the same position they were looking at. This commit brings this behavior back. task-4578468 Forward-Port-Of: odoo/enterprise#82496 Forward-Port-Of: odoo/enterprise#82072
- Adjusting fetchmail_server behavior to read specific fuel taxes from vendor bills, which can be extended for other taxes. - Adding the functionality of manually uploading CL EDI documents to account_move. Unrecognized documents are parsed as vendor bills. - Adjusting fetchmail_server methods to work with manual upload process. - Adding relevant tests for specific fuel taxes. task-4359365 Forward-Port-Of: odoo/enterprise#82386 Forward-Port-Of: odoo/enterprise#76630
Original PR description
- Adjusting fetchmail_server behavior to read specific fuel taxes from vendor bills, which can be extended for other taxes. - Adding the functionality of manually uploading CL EDI documents to account_move. Unrecognized documents are parsed as vendor bills. - Adjusting fetchmail_server methods to work with manual upload process. - Adding relevant tests for specific fuel taxes. task-4359365 Forward-Port-Of: odoo/enterprise#82386 Forward-Port-Of: odoo/enterprise#76630
Version: 18.0 When the invoice is a refund, it should reduce the achievement's amount and not increase it. opw-4610960 Forward-Port-Of: odoo/enterprise#82111 Forward-Port-Of: odoo/enterprise#81671
Original PR description
Version: 18.0 When the invoice is a refund, it should reduce the achievement's amount and not increase it. opw-4610960 Forward-Port-Of: odoo/enterprise#82111 Forward-Port-Of: odoo/enterprise#81671
The MRR log amount was stored in the currency of the SO. Before this commit, that amount was assumed to be in the currency of the plan before being converted into the currency of the current company. This commit reuse the mechanism of the MRR report to convert the amount from the SO currency to the current company currency directly. taskid: 4652771 Forward-Port-Of: odoo/enterprise#82175
Original PR description
The MRR log amount was stored in the currency of the SO. Before this commit, that amount was assumed to be in the currency of the plan before being converted into the currency of the current company. This commit reuse the mechanism of the MRR report to convert the amount from the SO currency to the current company currency directly. taskid: 4652771 Forward-Port-Of: odoo/enterprise#82175
Currently, a traceback occurs when the user tries to create a Export to Group S report. To reproduce this issue: 1) Install `l10n_be_hr_payroll_group_s` without demo data 2) Shift to the Belgium company 3) Create a running contract from payroll with stating date should be in past 4) Now create a Work Entry from payroll with the From date also be in the past 5) Now create a new `Export to Group S report` report from payroll/reporting 6) Make sure the date and moth are also in the pas
Original PR description
Currently, a traceback occurs when the user tries to create a Export to Group S report. To reproduce this issue: 1) Install `l10n_be_hr_payroll_group_s` without demo data 2) Shift to the Belgium…
Currently, a traceback occurs when the user tries to create a Export to Group S report. To reproduce this issue: 1) Install `l10n_be_hr_payroll_group_s` without demo data 2) Shift to the Belgium company 3) Create a running contract from payroll with stating date should be in past 4) Now create a Work Entry from payroll with the From date also be in the past 5) Now create a new `Export to Group S report` report from payroll/reporting 6) Make sure the date and moth are also in the past and click the `Populate` 7) Now click the `Generate Export File` Error:- ``` TypeError: can only concatenate str (not "bool") to str ``` The error is occurring because there is no `group_s_code` value by default in the company. The user has to give the value from the settings. If there is no `group_s_code` in the company, It leads to the above exception when concatenation is done between False and a string. Also, a userError was already raised from the very next life. https://github.com/odoo/enterprise/blob/eb1eff85d2119a34997067fedb602e963a5d6f02/l10n_be_hr_payroll_group_s/models/hr_payroll_export_group_s.py#L41-L43 So by making an extra check of the presence of the `group_s_code` in the company. We can resolve this issue and also make the code more robust. sentry-6289053708 Forward-Port-Of: odoo/enterprise#79334
When accountant is not installed, valid_payment_states includes both "paid" and "in payment" options, which means that amount_residual and amount_residual_currency have the same value as amount. original commit for the test: https://github.com/odoo/enterprise/commit/8faa7fccd296aab290f96b05832f1152cc2d4b1c [runbot-errors](https://runbot.odoo.com/odoo/error/161370) Forward-Port-Of: odoo/enterprise#82158
Original PR description
When accountant is not installed, valid_payment_states includes both "paid" and "in payment" options, which means that amount_residual and amount_residual_currency have the same value as amount. original commit for the test: https://github.com/odoo/enterprise/commit/8faa7fccd296aab290f96b05832f1152cc2d4b1c [runbot-errors](https://runbot.odoo.com/odoo/error/161370) Forward-Port-Of: odoo/enterprise#82158
Forward-Port-Of: odoo/enterprise#82209
Original PR description
Forward-Port-Of: odoo/enterprise#82209
Versions -------- - 18.0+ Steps ----- 1. Have purchase & sale_stock_renting installed; 2. create a 2nd company; 3. enable inter-company transactions for Sale/Purchase Orders for both; 4. enable Warehouse storage locations; 5. enable multi-step routes; 5. enable dropshipping; 6. enable rental transfers; 7. create a dropshipping route assigned to the 1st company; 8. create a purchasable, rental product, tracked by quantity; 9. add dropship route to its operations; 10. add 2nd comp
Original PR description
Versions -------- - 18.0+ Steps ----- 1. Have purchase & sale_stock_renting installed; 2. create a 2nd company; 3. enable inter-company transactions for Sale/Purchase Orders for both; 4. enable…
Versions -------- - 18.0+ Steps ----- 1. Have purchase & sale_stock_renting installed; 2. create a 2nd company; 3. enable inter-company transactions for Sale/Purchase Orders for both; 4. enable Warehouse storage locations; 5. enable multi-step routes; 5. enable dropshipping; 6. enable rental transfers; 7. create a dropshipping route assigned to the 1st company; 8. create a purchasable, rental product, tracked by quantity; 9. add dropship route to its operations; 10. add 2nd company as vendor; 11. create a rental order with the product; 12. confirm the rental order; 13. go to the generated purchase order via the smart button; 14. confirm the purchase order; 15. switch to the 2nd company; 16. try to open the generated sale order. Issue ----- > TypeError: '>' not supported between instances of 'datetime.datetime' and 'bool' Cause ----- On confirming the purchase order, the sale order it generates gets created as a rental order, due to the `in_rental_app` context value being set. When trying to open the rental order, it attempts to compute the quantity available for the tracked rental products during the rental period. The rental order was generated based on purchase order data, which lacks any kind of rental information, hence the rental order doesn't have a rental period set. The lack of rental dates is what causes the error when trying to partition the lines based on rental period. Solution -------- When creating a sale order via a purchase order, pass the `in_rental_app=False` context value to ensure it won't be created as a rental order. opw-4583210 Forward-Port-Of: odoo/enterprise#82220
How to reproduce the issue: - Create an analytic distribution model. - In the bank reconciliation, create a new transaction. In manual operations, remove the analytic. If you reload the reconciliation, the analytic distribution is not deleted. In the `bank_rec_widget` of account_accountant, the method `_line_value_changed_analytic_distribution` is triggered when the analytic field is modified. However it does not save the new value of the analytic on the account.move.line. opw-446
Original PR description
How to reproduce the issue: - Create an analytic distribution model. - In the bank reconciliation, create a new transaction. In manual operations, remove the analytic. If you reload the reconciliation, the analytic distribution is not deleted. In the `bank_rec_widget` of account_accountant, the method `_line_value_changed_analytic_distribution` is triggered when the analytic field is modified. However it does not save the new value of the analytic on the account.move.line. opw-4460079 Forward-Port-Of: odoo/enterprise#82256 Forward-Port-Of: odoo/enterprise#78732