Daily updates from Odoo
Tuesday, August 18, 2026
19 changes · master
Resolved issues and error corrections
Invoice and bill numbers now reflect fiscal years that span more than 12 months, such as using a 25-26 year range instead of only 2026. This prevents misleading document numbering and keeps accounting sequences aligned with the company’s configured fiscal year records.
Original PR description
Issue: When a fiscal year begins, for example, the 01/12/2025 and ends the 31/12/2026, the sequence mechanism for the invoices and bills do not take into account that the fiscal year covers more than a year and the sequence starts at INV/2026/0001 instead of INV/25-26/0001. Source of the issue: when computing if the year is stagerred, we took into account only the fiscalyear_last_day and fiscalyear_last_month of the company, instead of checking if there exists any record of account.fiscal.year, and if there is, prioritize the existing records. task-4951257
The timesheet assistant display now keeps durations readable, adds clearer spacing, and prevents long titles from overlapping with time information. This makes timesheet entries easier to scan and reduces visual confusion for users.
Original PR description
- enforce duration in one line - add a gap between the title and duration - wrap title if so long - adapt flex direction of chronological view to avoid overlapping of title and start time --- task-6432434 Forward-Port-Of: odoo/enterprise#128037 Forward-Port-Of: odoo/enterprise#126236
The Belgian payroll accounting test demo data now defines employee working schedules correctly. This helps keep payroll-related tests and sample scenarios reliable, reducing confusion from incorrect demo setup.
Original PR description
The way calendar attendances were defined for the working schedules demo data was incorrect. task-6466997
Shopfloor users can now unplan manufacturing work orders without being blocked by an access error linked to Belgian payroll leave records. This fixes a disruption caused when removing planned work time triggered a payroll-related check the user was not allowed to perform.
Original PR description
After https://github.com/odoo/enterprise/pull/104335 , A search on `hr.leave.allocation` is done, which the normal shopfloor user doesn't have access to. In shopfloor,`leave_id` (a field related to `resource_calender_leaves` in `mrp_workorder`) gets unlinked in a couple of different actions, which then triggers the unlink method added that performs the search consequently. Simple steps to reproduce: - Use shopfloor user - Create MO - Plan workorders - Unplan At unplanning, `leave_id` is unlinked, which then triggers the `on_delete` method in `l10n_be_hr_payroll` that performs the search and throws the access error.
The accounting reports comparison dropdown now keeps a consistent width when users hover over the “Percentage of” selector. This prevents a small visual jump, making the reporting interface feel smoother and more polished.
Original PR description
In the comparison dropdown, the "Percentage of" RecordSelector shows its caret only on hover. Since the caret was not accounted for before hover, the selector slightly resized when the caret appeared. Reserve a small, fixed slot for the caret and toggle its visibility so the dropdown keeps a stable width. task-6268556
Users can now select multiple bank journal lines in the kanban view without triggering an error. This restores a smoother bank reconciliation workflow for teams handling multiple statement lines at once.
Original PR description
Fix a bug where an error is raised when the user tries to multi-select lines (with alt) in the kanban view of bank journals. The view for BankRecStatementLine class was using an other object than rootRef defined in the KanbanRecord class as a t-ref. This made every call to rootRef crash in the parent class. This commit fixes it by using the parent rootRef in the BankRecStatementLine class. task-6462758
Luxembourg payroll now calculates historical payslips using the wage index that applied at the payslip date, rather than today’s index. This helps ensure past salary calculations remain accurate when wage index values change over time.
Original PR description
Historical payslips incorrectly used today's wage index instead of the index active during the payslip period. Now, salary rules evaluate the indexed wage using `payslip.date_to` via the new `_get_l10n_lu_indexed_wage(date)` contract method. Task: 6395557 Forward-Port-Of: odoo/enterprise#125861
Rental orders using custom routes now correctly generate the expected return transfer, even when the route is configured for make-to-order purchasing. This prevents missing return logistics after a rental delivery, helping teams track rented products through the full rental cycle.
Original PR description
### Steps to reproduce: - In the settings enable: Multi-Steps Routes and rental transfers - Unarchive the MTO route - Create a rental product P with a buy route and a set vendor - Create a rental…
### Steps to reproduce: - In the settings enable: Multi-Steps Routes and rental transfers - Unarchive the MTO route - Create a rental product P with a buy route and a set vendor - Create a rental order for 1 x P and set the the MTO route on the sol - Confirm the order #### > The delivery as well as the purchase for 1 unit of P was generated but the return was not. ### Cause of the issue: The procurement generated to handle both the delivery and the return rental picking are handled by the `_create_procurements`: https://github.com/odoo/enterprise/blob/b0e48baaf99bdc4faefd2ffdd3bd5637fb548593/sale_stock_renting/models/sale_order_line.py#L353-L374 The `route_ids` set and used is the `mto_route` set on the sol: https://github.com/odoo/odoo/blob/0f061503e26ac8c441d62d91947419119e48c47a/addons/sale_stock/models/sale_order_line.py#L415-L422 https://github.com/odoo/odoo/blob/0f061503e26ac8c441d62d91947419119e48c47a/addons/sale_stock/models/sale_order_line.py#L282-L297 However, in the present case, the mto route does not contain any rule with a relevant `location_src_id` in the rental location so that the return will not be generated. opw-6361322 Forward-Port-Of: odoo/enterprise#126410 Forward-Port-Of: odoo/enterprise#124097
This update adds a missing dependency so barcode batch quality control loads the related batch picking components reliably. It prevents test and module loading failures without changing day-to-day user workflows.
Original PR description
Before this commit, this bridge patches the barcode picking batch model of stock_barcode_picking_batch while not depending on it. This goes unnoticed in the backend, where every installed module lands in the same bundle, but a Hoot test file only loads the modules of the dependency closure of its addon, so the first test suite added here dies on "error while registering suite". This commit adds the missing dependency. stock_barcode_picking_batch is auto installed on top of stock_barcode and stock_picking_batch, both already required here, so it comes along with this module anyway.
The payroll attendance module now explicitly includes a related attendance planning component it already relies on. This prevents automated tests from failing when they load only the module's declared dependencies, improving reliability without changing day-to-day user behavior.
Original PR description
Before this commit, hr_payroll_attendance patches the gantt view of hr_attendance_gantt while not depending on it. This goes unnoticed in the backend, where every installed module lands in the same bundle, but a Hoot test file only loads the modules of the dependency closure of its addon, so the first test suite added here dies on "error while registering suite". This commit adds the missing dependency. hr_attendance_gantt is auto installed on top of hr_attendance and hr_gantt, both already required here, so it comes along with this module anyway.
The Time Type form now hides the Validity label for companies outside Hong Kong when the related field is not shown. This prevents misaligned fields and makes the payroll configuration screen clearer for users in non-HK companies.
Original PR description
Steps to reproduce: 1. Go to Payroll > Configuration > Time Types. 2. Open a Time Type form for a non-HK company (e.g. Belgium). 3. The "Validity" label appears without its field, misaligning "Selectable in Time Off". Reason: The "Validity" label had no visibility condition. Solution: Hide the "Validity" label when the company is non-HK. Task-6448696
Barcode receipts now keep the correct putaway destination when users scan multiple lots for the same product. This prevents items from being shown or processed as going to the default stock location instead of the intended shelf, reducing warehouse handling errors.
Original PR description
Steps to reproduce --- 1. Enable Storage Locations and Lots & Serial Numbers. 2. Add a putaway rule sending a lot-tracked product from WH/Stock to WH/Stock/Shelf 1. 3. Confirm a receipt reserving 2…
Steps to reproduce --- 1. Enable Storage Locations and Lots & Serial Numbers. 2. Add a putaway rule sending a lot-tracked product from WH/Stock to WH/Stock/Shelf 1. 3. Confirm a receipt reserving 2 units of that product; putaway sets the reserved move line destination to WH/Stock/Shelf 1. 4. In the Barcode app, scan a first lot, then a second lot. The second lot lands on a separate line at WH/Stock instead of WH/Stock/Shelf 1. Issue --- The first lot reuses the reserved line and keeps its Shelf 1 destination. The second lot cannot reuse it because its tracking number differs, so `_findLine` returns nothing and `_getNewLineDefaultValues` builds a new line with `location_dest_id` set to `_defaultDestLocation()`, the picking's default destination (WH/Stock). https://github.com/odoo/enterprise/blob/314a79b774f30dc9377b2971492576c4b84483e1/stock_barcode/static/src/models/barcode_picking_model.js#L1591-L1601 Putaway relocates the destination on the move line at reservation, never on the picking, so only the reserved line carries Shelf 1. Since `groupKey` includes `location_dest_id`, the new line does not group with the first lot and shows separately at WH/Stock. This is not a regression: new lines have always defaulted to the operation destination. https://github.com/odoo/enterprise/blob/314a79b774f30dc9377b2971492576c4b84483e1/stock_barcode/static/src/models/barcode_picking_model.js#L239-L241 The new line now inherits the selected line's `location_dest_id`, already relocated by putaway, instead of the default. opw-6317077 Forward-Port-Of: odoo/enterprise#127906 Forward-Port-Of: odoo/enterprise#125309
Odoo now recognizes valid Brazilian electronic invoice XML files even when the main invoice tag has no extra attributes. This prevents legitimate vendor bills from being skipped during import, helping accounting teams process supplier invoices more consistently.
Original PR description
### Issue before this commit: Certain valid Brazilian NF-e (electronic invoice) XML files fail to import because the system silently ignores them during the initial EDI recognition phase. ### Steps to reproduce the issue: 1. Download Accounting and l10n_br_edi 2. Go to Vendor > Bills 3. Try to import both xmls in the ticket 4. One of the two will not be imported correctly ### Cause of the issue: https://github.com/odoo/enterprise/blob/3ed1721b702555e96c9774969927f6517e855704/l10n_br_edi/models/account_move.py#L819-L827 This function relies on a strict byte string search for b"<NFe " while it's also correct if the tag is only `<NFe>`. ### Reason to introduce the fix: To make the initial NF-e file recognition more robust and compliant with standard XML namespace rules, ensuring Odoo successfully processes all valid Brazilian invoices regardless of attribute formatting. opw-6402843 Forward-Port-Of: odoo/enterprise#127851 Forward-Port-Of: odoo/enterprise#126881
This update adds a missing dependency needed by the Time Off Gantt module so its related test suites load correctly. It prevents registration failures during automated testing without changing day-to-day user functionality.
Original PR description
Before this commit, every Hoot suite of hr_holidays_gantt, hr_payroll and planning_holidays dies while being registered:
HootError: error while registering suite "avatar_card" (in parent
suite "@hr_holidays_gantt")
This happens because the gantt cog menu imports @base_import/import_records/import_records while the module does not depend on base_import. A test file only loads the modules of the dependency closure of its addon, so the import resolves to undefined and the file throws as soon as it is loaded.
This commit adds the missing dependency. base_import is auto installed and depends only on web, so it is already there in every database.This fixes a display issue in Referrals where the x icon was missing from job positions when sharing jobs. The change helps users clearly see and use the expected close or remove action in that workflow.
Original PR description
Since https://github.com/odoo/enterprise/pull/112607, the x icon is not displayed on job positions. Steps to reproduce: - Referrals - View Jobs - Share Expected behavior: The x icon should be displayed on job positions. <img width="213" height="188" alt="image" src="https://github.com/user-attachments/assets/14d1e75b-f419-4315-93b3-ef0642351079" /> Current Behavior: The x icon is not displayed on job positions. <img width="558" height="374" alt="image" src="https://github.com/user-attachments/assets/52bffb8b-b7ba-43df-8a44-c507966d5073" /> task-6469820
Belgian DIMONA fields are now shown when employee types are relevant to Belgium or not limited to a country, avoiding missing setup options. The update also prevents mismatched employee type and company countries, reducing payroll configuration errors.
Original PR description
company/country validation DIMONA category and sub-types were hidden whenever the employee type's country was not exactly 'BE', including when no country was set at all. They should be visible whenever the type has no country or BE, and no company or a BE company. Add a `company_country_code` related field to expose the company's country for use in the view invisible domain, and add a constraint raising a validation error if an employee type's country and its related company's country don't match. Task: 6442738 PR community: [odoo/odoo#281923](https://github.com/odoo/odoo/pull/281923)
The Timesheets Assistant now opens in a chronological view so employees can match activities to work more naturally. It also avoids repeated loading, keeps dismissed suggestions from coming back, reduces visual flicker when selecting suggestions, and better recognizes Discord activity from a browser.
Original PR description
## [FIX] timesheet_grid: remove duplicate rpc call Before this commit, the `loadTimesheets` method is called 2 times in a row, that method does a rpc call to load the existing timesheets and so, it…
## [FIX] timesheet_grid: remove duplicate rpc call Before this commit, the `loadTimesheets` method is called 2 times in a row, that method does a rpc call to load the existing timesheets and so, it is not needed to call it 2 times since the rpc will return the exact same result. This commit removes the rpc call when we compute the suggestions to only load the timesheets when we load all the data. ## [FIX] timesheet_grid: show chronological view instead of project view Before this commit, the `by project` view were loaded first in the timesheet assistant action, to group the suggestion by project, the problem is at the beginning the view will not really show a perfect matching and so the user could think the feature does not work and he will not understand how to correctly match the suggestions shown in the view. This commit changes the view loaded by default in Timesheets Assistant to first show the chronological view, that view is more logical for the current user to rethink what he did in the past to correctly map the events to a project and a task when he generates his timesheets thanks to those events. The by project view is still useful afterwards when the system has learned the choices made by the current user. ## [FIX] timesheet_grid: ensure events are consumed forever Before this commit, the suggestions removed by the current user comes back when he changes the date and come back to the day he removes the suggestions. The reason is because a shallow copy of events consumed is made and that copy alters the duration of the initial object. This commit avoids copying the consumed events object to make sure the initial object is not altered when processing the events to remove them if they are removed before by the user. ### Steps to reproduce the issue: 1. install timesheet_grid and Activity watch, makes sure Activity watch collects some activities on your computer. 2. Go to Assistant menu in timesheets app. 3. Remove some suggestions displayed in the right panel. 4. Go to next date. 5. Come back to previous date. ### Expected Behavior: The suggestions removed should not appear again. ### Actual Behavior: The suggestions removed come back in the view. ## [FIX] timesheet_grid: fix flicker when suggestion selected Before this commit, when the user selects a suggestion in timesheet assistant, there is a small flicker appears because the height of the row grows because of the border added to highlight the suggestion selected. This commit reviews a bit the style to make sure the border bottom in the previous element is removed if the element is not selected or if the 2 consecutives suggestions are selected. ## [FIX] timesheet_grid: fix discord rules to handle discord in web Before this commit, when the user uses discord in its browser instead of the app on his computer, the discord rules don't catch the activity watch events because the tab title is different than the windows name in the app. This commit adapts the regex of Discord rules to handle the both use cases. task-[6385639](https://www.odoo.com/odoo/project.task/6385639) Forward-Port-Of: odoo/enterprise#126435 Forward-Port-Of: odoo/enterprise#124855
Spreadsheet pivot tables now apply currency exchange rates when they are inserted. This helps users working with multi-currency data see more accurate financial figures in their reports.
Original PR description
apply currency exchange rates when inserting a pivot in spreadsheet Task: 6022608
The Timesheet Assistant now combines selected suggestions that come from the same rule template into one clearer description. This avoids repetitive text separated by semicolons, making generated timesheet entries easier to read and edit.
Original PR description
In this task, we improved the Timesheet Assistant by merging descriptions generated from the same rule templates. When multiple suggestions are selected that use the same rule template, the assistant now combines them into a single timesheet description instead of joining with ';' Example: Rule template: `Discussing with $1` Before: Discussing with A; Discussing with B After: Discussing with A and B Task-6348575 Forward-Port-Of: odoo/enterprise#127358 Forward-Port-Of: odoo/enterprise#126157