Daily updates from Odoo
Friday, March 6, 2026
20 changes · master
New functionality added to Odoo
This update introduces a new Profit and Loss report specifically designed to align with Mexican tax regulations (NIF B3). This ensures accurate reporting for businesses operating in Mexico, simplifying tax preparation and compliance.
Original PR description
Added new Profit and Loss report to follow NIF B3 structure task-5174207
This update allows repair operators to easily create quality checks directly from the repair order form, eliminating the need for prior configuration. This streamlines the quality control process, enabling checks to be performed only when necessary and improving workflow efficiency. The change also corrects XML errors to ensure the quality check button is visible.
Original PR description
Currently, it is not possible to perform a quality check on a repair order without configuring a quality point for the repair operation type and product. However, in many cases, operators need to create a quality check directly from the repair order form view. This commit introduces the ability to create on-demand quality checks from a dedicated action available on the repair order form view. When users click the action, it opens the quality check form, allowing users to perform quality checks during repair operations only when needed, based on their workflow and preferences. Also, remove some errors in the xml to display the quality checks button. [Task-4714794](https://www.odoo.com/odoo/966/tasks/4714794)
This update allows users to tag specific individuals and pages within social media posts, enhancing engagement and reach across platforms like Twitter, Facebook, Instagram, and LinkedIn. The system now supports the specific formatting requirements of each social network's API, ensuring accurate mention implementation.
Original PR description
This commit adds the possibility for users to search and add mentions for specific users for social networks. This adds a new widget in social that implements this behavior. This commit adds a new…
This commit adds the possibility for users to search and add mentions for
specific users for social networks.
This adds a new widget in social that implements this behavior.
This commit adds a new `mentions` text field to the social.post model that is
structured as a JSON object.
This field will contain for each social media_type as key, a dictionary that for
each mentionned name in the post has a specific value.
This value can either be a singular string, e.g. `Norbert: "albert"`, or another
dict, e.g. `Norbert: { "some_info": some_value, "username": "albert" }`.
This all depends on the needs of each media_type. e.g. for Twitter/X only the
username is needed to create a mention so we can only store a String.
But e.g. for Facebook, we need to store the ID of the page we are mentionning as
their mentioning system requires it. A valid mention for them would look like
`@[1234567] Page Name`, this means that the dictionary stored for it is
'{"facebook": {"Page Name": {"id": 1234567, "name": "Page Name"}}}'.
This also adds an option to the `instagram_image_ids` field in the template's form view.
It adds the option `accepted_file_extensions` to force the input the file to only accept .jpg and .jpeg images. These file extensions are the only ones that Instagram's API accepts to add to a post.
task-3801654Enhancements to existing features
This update improves the accuracy of employee payroll data by adding three new fields to DMFA work locations. These changes automatically populate related competence information, streamlining payroll processing and ensuring data consistency. This enhancement supports compliance with Belgian payroll regulations.
Original PR description
This commit aims to add 3 new fields on the DMFA work locations, some data is updated accordingly to prefill competence field on existing data task-5979423
This update makes it easier for users to add sign templates to offers. Now, when no templates exist, a clear warning message with an upload button guides them to set up their first template. This eliminates the previous manual process of adding PDFs, creating a more streamlined workflow.
Original PR description
Before this PR, if no PDF was uploaded, users had to add it manually. In this PR, - If no Sign templates exist in the system, show a blue warning message: "No templates are configured yet. Do you want to set up the first one?" - The warning includes an Upload PDF button. - When no Contract Template is selected, show an Upload PDF button next to the field. Impact - Users can now add a PDF Sign Template directly from the Offer, without needing an existing Contract Template first. This provides a smoother and more intuitive experience. task-5358196
This update streamlines testing for the `mrp_workorder` module by running tests after other modules are installed, speeding up the process. Additionally, a fix resolves an access issue preventing workorder cancellation for users without full accounting permissions, and removes an obsolete quality override.
Original PR description
The main change is to set `mrp_workorder` tests as `post_install`. Other commits are fixes that emerged from trying to run those tests with other modules installed.
This update adjusts how holiday pay is recovered, ensuring accurate calculations since 2024. A final regularization step in December or upon termination corrects any imbalances, proportionally based on actual holiday days taken. This improves the accuracy of payroll reporting and financial reconciliation.
Original PR description
Since 2024, holiday pay recovery is calculated as a fixed 90% of the daily salary and is no longer capped monthly by the total debt. A final regularization is now performed in December or upon…
Since 2024, holiday pay recovery is calculated as a fixed 90% of the daily salary and is no longer capped monthly by the total debt. A final regularization is now performed in December or upon termination to balance the account. - **Recovery Logic:** Updated the monthly recovery rule to deduct only 90% of the holiday pay amount without capping it by the `to_recover` balance. - **December or termination Regularization:** Added new salary rules (`HolPayRegN`, `HolPayRegN1`) running only in December or upon employee termination to calculate the difference between the target amount and the amount actually recovered. The regularization is calculated proportionally to the holiday days actually taken. * Example: If an employee takes only 2 out of 10 accrued days, we regularize based on 1/5th of the full certificate amount. - **DMFA Mapping:** Updated the DMFA report to dynamically assign the regularization amount: - **Code 12:** If further recovery is needed (Negative amount). - **Code 14:** If a reimbursement is due to the employee (Positive amount). - **Deterministic Grouping:** Ensured that employees grouped by NISS are sorted by ID during DMFA generation. Task: 5419509
Resolved issues and error corrections
This update resolves an issue where buttons in the Master Production Schedule (MPS) view remained visible even when no MPS records were present, creating a confusing user experience. The fix ensures these buttons are hidden when no records exist and refreshes the view after deleting all records, directing users to the next available MPS record.
Original PR description
Before this commit: ==================== In the Master Production Schedule (MPS) view, the `Order` and `Duration` buttons remain visible even when there are no MPS records. It leads to a confusing…
Before this commit: ==================== In the Master Production Schedule (MPS) view, the `Order` and `Duration` buttons remain visible even when there are no MPS records. It leads to a confusing user experience, as actions are shown while no records are available to act upon. Steps to Reproduce: ==================== 1. Install `mrp` module. 2. Go to Settings → Enable `MPS` option. 3. Navigate to MPS → Delete all MPS records → the `Order` and `Duration` buttons are still visible. Additionally, when MPS records span multiple pages and the user deletes all records from current page, the view is not refreshed to redirect the user to another page that still contains records. Cause of the issue: ==================== - The visibility of the `Order` and `Duration` buttons was not tied to the presence of MPS records. The logic did not check whether any MPS records existed, so both remains visible even when no MPS records were present. After this commit: ==================== This commit ensures that `Order` and `Duration` buttons are hidden when there are no MPS records. Additionally, the view is refreshed after deleting all records from a page, ensuring the user is redirected to a page with remaining MPS records. TaskID-5356994
This update fixes an issue where multi-employee payslips were defaulting to the language of the first employee. The change ensures that each employee's payslip is printed in their correct, selected language, improving accuracy and user experience. This resolves a previous bug related to date formatting and caching.
Original PR description
Steps to detect the bug: - Install payroll - Create more than one employee with different payslip languages - Add a contract for the employees - Payroll -> Payslip -> Pay run - Create a new payroll for more than one employee - Select all the employees in the pay run - Click 'print' button - Dates for the employees that are not the first one are in the language of the first employee This commit will allow the user to create multiemployee payslips maintaining the correct selected payslip language for each one of them. The issue was caused by a cache dictionary that used only the date and date format as a key, failing to include the user language. This led the system to reuse the first translated date for all subsequent employees. opw-5865260 Forward-Port-Of: odoo/enterprise#107269 Forward-Port-Of: odoo/enterprise#106575
This update resolves a crash issue that occurred when viewing pay runs on mobile devices with a smaller screen size. The fix ensures the system correctly identifies the scrollable container, preventing errors and improving the stability of the payroll module. This update maintains the existing Kanban layout while addressing a critical functionality problem.
Original PR description
**Steps to Reproduce:** 1. Open Payroll->Payslips->Pay Runs 2. Click on a Pay Run in Mobile View (Width < 600px). 3. Return to the previous view using the breadcrumb. 4. The system crashes with…
**Steps to Reproduce:** 1. Open Payroll->Payslips->Pay Runs 2. Click on a Pay Run in Mobile View (Width < 600px). 3. Return to the previous view using the breadcrumb. 4. The system crashes with Traceback: TypeError: Cannot set properties of null (setting 'scrollLeft') **Bug Cause:** The custom 'hr_payroll.PayrunKanbanRenderer' template overrode the 'class' attribute of the root div. By setting it only to 'o_payrun_kanban', the standard 'o_renderer' class was removed. The Kanban controller's scroll restoration logic (introduced in recent lazy-loading updates) relies on the '.o_renderer' selector to find the scrollable container. When missing, querySelector returns null, leading to a traceback. **Solution:** Updated the XML template to explicitly include 'o_renderer' in the class list. This restores the functional hook required by the JavaScript controller for scroll restoration while maintaining the custom 'o_payrun_kanban' layout. Task: 5971861 Forward-Port-Of: odoo/enterprise#108847
This update corrects a bug that prevented the billable timesheet KPI from accurately filtering timesheets. The fix now uses a more reliable method – checking for a linked Service Order Line – to determine billable status. This ensures accurate reporting and improves the usability of timesheet data.
Original PR description
Due to a previous [commit](https://github.com/odoo/odoo/commit/8e8b273), the "Billable" and "Non-Billable" were incorrect for timesheets. This lead the billable timesheet KPI button not to filter the timesheets anymore. This is fixed by filtering based on whether the analytic line has an SOL associated to it, which is more robust to changes in the `billable_type` field, and improves clarity. Further, remove unnecessary service patch introduced in odoo/enterprise#108035. See odoo/odoo#250149 task-5956027 Forward-Port-Of: odoo/enterprise#108347
This update resolves a bug that caused a RecursionError when producing large quantities of products with serial tracking. The issue stemmed from excessive recordset access during order splitting, leading to performance problems. This change ensures stable production processes for high-volume operations.
Original PR description
**Issue** When producing a large number of serial-tracked products, a RecursionError can occur. **Steps to reproduce** - Create three products tracked by serial number (ensure MTO and Manufacture…
**Issue** When producing a large number of serial-tracked products, a RecursionError can occur. **Steps to reproduce** - Create three products tracked by serial number (ensure MTO and Manufacture routes are enabled). - Create a BoM for product A containing product B. - Create a BoM for product B containing product C. - Create a BoM for product C containing another product. - Create a manufacturing order of 100 units for product A and confirm it. - Go to the MO C and split into 100 mo - Go to the MO B and split into 100 mo -> RecursionError: maximum recursion depth exceeded. **Cause** While splitting, this method is called: https://github.com/odoo/odoo/blob/cda011dc8590773f6c3a26f4ae9d5242a3147024/addons/mrp/models/mrp_production.py#L2031 which ultimately calls: https://github.com/odoo/odoo/blob/cda011dc8590773f6c3a26f4ae9d5242a3147024/addons/stock/models/stock_move.py#L658-L661 This retriggers `_compute_packaging_uom_id` for all moves in `move_orig_ids` or `move_dest_ids`, and accessing the full recordsets causes recursive recomputation leading to a RecursionError. opw-5265424 Forward-Port-Of: odoo/enterprise#106999
This update fixes an issue where the depreciation amounts for assets with analytic distribution weren't being calculated correctly in the depreciation schedule report. Now, when the analytic filter is enabled, the depreciation amounts are accurately distributed across each asset's analytic account, ensuring more precise financial reporting.
Original PR description
Previously, when the analytic filter is enabled in the depreciation schedule, the total depreciation amount was shown in each respective depreciation column, and the analytic distribution was not taken into account. This commit fixes the depreciation amount for assets with analytic distribution in the depreciation schedule report. When the analytic filter is enabled, the amounts are computed correctly under each analytic's depreciation column. task-5959962 Forward-Port-Of: odoo/enterprise#108484
A recent update caused a disruption in SEPA direct debit payments, preventing customers from completing transactions. This fix addresses a missing data element within the payment provider object, resolving the error and restoring functionality. The change was introduced following another update and is now corrected.
Original PR description
Issue: --- The SEPA direct debit is broken. Steps to reproduce: --- 1- Enable SEPA direct debit in payment providers. 2- Add something to cart and try paying using SEPA direct debit. You get the error: `payment.provider object has no attribute company.` Cause: --- This is introduced after #250326. opw-5993720 Forward-Port-Of: odoo/enterprise#109672
This update corrects a bug where the hours displayed for shifts spanning across multiple days were incorrectly truncated. The issue stemmed from outdated logic related to grid snapping. Removing this logic ensures accurate hour display for shifts, regardless of their duration, now that the Gantt chart no longer truncates pill names.
Original PR description
### Issue: The pill name contains the hours when it spans over the next day for less than 3 hours but not if more than 3 hours. ### Steps to reproduce: - Go to Planning app - Create a shift for an…
### Issue: The pill name contains the hours when it spans over the next day for less than 3 hours but not if more than 3 hours. ### Steps to reproduce: - Go to Planning app - Create a shift for an employee from 3pm to 2am (over two days) - The hours of the shift are displayed - Modify the shift end to 3am - The hours of the shift aren't displayed ### Cause: Before the refactor adapting the gantt view to OWL, when a shift spanned over two days less than three hours, then the gantt view truncated the pill to display it in only one day. (see [`_snapToGrid()`](https://github.com/odoo/enterprise/blame/a16b2ef569903c0ae5803c169dbd68acd0141fe1/web_gantt/static/src/js/gantt_row.js#L1044-L1072)) The same logic was done for the computation of the pill's name in [this commit](https://github.com/odoo/enterprise/commit/98a86cbacf484646f486e4648788cfa53cc9648c). But as the pills are no longer truncated since 17.0, the computation of pill names is faulty. ### Solution: We remove the checks of the 3-hour margin. This also makes the variable `spanMoreThanOneDay` useless, so we delete it. opw-5881532 Forward-Port-Of: odoo/enterprise#109548 Forward-Port-Of: odoo/enterprise#107233
This update fixes an issue where the VoIP keypad wasn't correctly updating during calls. Now, when users type digits on the keypad, the system accurately reflects those presses in the softphone, ensuring a seamless call experience. This improves the reliability and usability of the VoIP feature.
Original PR description
When typing digits in the VoIP PiP keypad during an in-progress call, only DTMF was sent and the in-call keypad model was not updated. This change syncs PiP keypad presses with the softphone. task-5979774
This update corrects a problem with how leave periods are calculated, specifically addressing potential inconsistencies caused by different time zones. By using a new date field, the system now accurately reflects leave schedules regardless of where the data is accessed, ensuring accurate payroll processing for employees in Switzerland.
Original PR description
This commit fixes the leaves work interruption constraint by replacing `date_from` and `date_to` with `request_date_from` and `request_date_to`, thereby resolving any inconsistencies that may arise from time zone differences. task-5966780 Forward-Port-Of: odoo/enterprise#109736 Forward-Port-Of: odoo/enterprise#108541
This update resolves an issue where rapidly clicking the 'Back' button during barcode internal transfer creation resulted in duplicated quantities being added to the transfer. The fix prevents multiple 'save' calls, ensuring accurate quantity tracking.
Original PR description
**Steps to reproduce:** * Install `stock` module. * Go to the > Settings*, enable *Packages* and *Storage Locations*(warehouse). * Create a storable product and set *Tracking Inventory* to **By…
**Steps to reproduce:** * Install `stock` module. * Go to the > Settings*, enable *Packages* and *Storage Locations*(warehouse). * Create a storable product and set *Tracking Inventory* to **By Quantity** and set some *barcode* * Update the on-hand quantity for the product and assign it to one packages. * Open *Barcode > Operations > Internal Transfer* and create a new transfer. * Click the *gear icon* in the top-right corner to open the barcode scanning flow. * manually enter the created product barcode and apply it. * Click the **Back** button multiple times in quick succession. * Go to the backend and open the created internal transfer. **Observed behavior:** * The internal transfer is created with *double quantities* compared to what was added in the barcode interface. **Cause:** * When clicking the *Back* button, the following flow is triggered: `exit()` → `beforeQuit()` → `save()`. https://github.com/odoo/enterprise/blob/07ede9bda567d94da27da79b945e2189fa5aca6e/stock_barcode/static/src/components/main.js#L406-L414 https://github.com/odoo/enterprise/blob/07ede9bda567d94da27da79b945e2189fa5aca6e/stock_barcode/static/src/models/barcode_model.js#L473-L475 https://github.com/odoo/enterprise/blob/07ede9bda567d94da27da79b945e2189fa5aca6e/stock_barcode/static/src/models/barcode_picking_model.js#L828-L832 https://github.com/odoo/enterprise/blob/07ede9bda567d94da27da79b945e2189fa5aca6e/stock_barcode/static/src/models/barcode_model.js#L477-L483 * If the button is clicked multiple times rapidly, `exit()` is called again before the previous `save()` RPC completes. * This results in multiple `save()` calls being executed, causing duplicated quantities on the picking. reference - https://github.com/odoo/enterprise/pull/103999/changes/b791239c154deb6a25f85d65ebc72e3ac53b6c74 **Fix:** * Prevent rapidly clicking the Back button multiple times does not multiply quantities. --- opw-5375899 Forward-Port-Of: odoo/enterprise#109128 Forward-Port-Of: odoo/enterprise#103130
A recent update to the Avatax integration for expense processing caused crashes when posting expense entries. This fix addresses a key error related to how the system handles 'in_receipt' move types, ensuring expenses with Avatax now process correctly. The change improves the reliability of expense reporting.
Original PR description
Currently, the expenses flow with Avatax integration crashes when posting the expense entry. Steps to reproduce: - Have an employee with an address in the US. - Enable 'Detect Automatically' in the Avalara fiscal position. - Create an expense for the employee, paid by Employee. - Submit > Post Journal entry > Post Expense. Action will be blocked by a traceback reporting error `KeyError: 'in_receipt'` Analysis: After [1] expense journal entries are now 'in_receipt'. The dictionary in account_avatax does not take into account this move type. This provides a fallback to 'Any' for any other move types [1] https://github.com/odoo/odoo/commit/f835ac0c8adb49d04bed746fd624b8976cc32991 opw-5872768 Forward-Port-Of: odoo/enterprise#109381
This update resolves an issue where commission reports were incorrectly calculating amounts due to how large numbers (bigints) were handled between Python and the JavaScript framework. By ensuring the full ID is always used, the system now accurately reflects commission amounts, preventing data conflicts and ensuring reliable reporting.
Original PR description
In commission report, we need unique ids for achievements and commissions. We avoid using row_number because it becomes really slow when the amount of records increases. That's why we need reliable unique ids, build from the account move line/sale order line/sale order log, user_id, commission rules. As it represents a lot of information stored inside a unique integer, bigint are necessary. It works great in python because int() can be used to handle bigint but JavaScript is not great with that. It will cast the value sent by the ORM silently and as a result, when the ORM is called back by the JS framework, it will pass a truncated id that either conflict with another record or may not exists (ids are generated using recipe). This commit ensure that the full id is always accessible and is used to browse records when the framework js contact methods. task-5973128 Forward-Port-Of: odoo/enterprise#109646 Forward-Port-Of: odoo/enterprise#108751