Daily updates from Odoo
Monday, August 25, 2025
26 changes · master
Enhancements to existing features
Marketing automation now includes a controlled option to bypass the blacklist for important transactional or incident-related emails and SMS messages. This helps ensure critical customer communications can still be delivered when needed, while limiting visibility of the option to ERP managers in debug mode.
Original PR description
Add an option to bypass the black list for example for transactional or incident emails/sms. This option is only displayed for erp manager and when debug mode is enabled. Task-3575361
This update adds missing account mappings for salary rules in the UAE and Egypt payroll accounting modules. It helps ensure payroll entries are posted to the correct accounts, improving accounting accuracy and reducing manual corrections.
Original PR description
xx: ae,eg In this commit we add the mapping for all the salary rules accounts Taks: 4930175
Installing the Guatemalan electronic invoicing module is now safer for companies with large databases. The update avoids heavy recalculations during setup that could previously cause installation failures, and the module will no longer be installed automatically with the base Guatemalan localization.
Original PR description
This commit adds `_auto_init` to the `account.move` object in the Guatemalan EDI that prefills all computed stored fields in the move object with null values. This prevents computation on those fields when installing the module, and also prevents MemoryError on large databases. task-5031330 Forward-Port-Of: odoo/enterprise#92881
Chilean delivery guides can now include editable cross-reference documents, such as purchase orders, directly on stock pickings. This reduces manual work and improves accuracy by copying references from sales orders and backorders while reusing the same reference display across invoices and delivery guides.
Original PR description
Currently Delivery Guides can reference a Purchase Order by using the client_order_ref field on the sale order linked to the picking. This works but has issues, it is hardcoded to only that one reference document, it isn't editable if needed, and has a hardcoded date of the picking. This PR takes advantage of the `l10n_cl.account.invoice.reference` model that exists in `l10n_cl_edi` for `account.move` and supports identical functionality on `stock.picking`. It will automatically copy the reference from the sale order to the picking if it is set and copy over to any related backorders. To remove duplication, l10n_cl_edi was modified to extract the report table to a reusable template that is accessible by both modules. task-4970185
Turkish payroll can now keep an employee's net wage constant and calculate the required gross salary each month. This helps businesses honor net salary agreements while accounting for changing payroll calculations and deductions.
Original PR description
This PR adds the feature of keeping the NET wage constant in payroll of employees with contracts in Turkey, while every month calculating the Gross Salary that will result in said net wage. task link: https://www.odoo.com/odoo/all-tasks/4619061
Mexican electronic invoicing now handles discount distribution across invoice lines more consistently, including complex refunds and point-of-sale invoices. This helps produce more accurate compliant invoice data and reduces errors in edge cases involving negative lines or discounts.
Original PR description
Forward-Port-Of: odoo/enterprise#92910 Forward-Port-Of: odoo/enterprise#92727
Planning schedules now better match employees with the shifts they are eligible to see. Employees are shown slots based on their assigned roles, and non-flexible employees only see slots that fit within their working hours, reducing scheduling confusion.
Original PR description
- Added role-based filtering: employees only see slots that match their roles or have no role assigned (unless they have no roles, in which case all are allowed). - Applied attendance filtering for non-flexible employees, restricting slots to their valid work intervals. related task - 4701095
Maintenance requests now show an explicit scheduled end time, making planned work easier to understand. Teams can also log or plan workcenter maintenance outside normal hours or after it has happened, while conflict checks are handled earlier to avoid unnecessary scheduling records.
Original PR description
With This Commit: ----------------------- 1. Replace duration with schedule_end - Replaced the `duration` field with an `scheduled end` on maintenance requests, in preparation for removing the…
With This Commit: ----------------------- 1. Replace duration with schedule_end - Replaced the `duration` field with an `scheduled end` on maintenance requests, in preparation for removing the problematic `date_delay` attribute in calendar views. - Improves time range visibility by making the end time explicit in the form view. 2. Allow past leave creation - Allowed creating leaves in the past for workcenters. - This matches real-world maintenance use cases where activities are logged after they happen or just started. 3. Reorder logic to prioritize scheduling on the exact desired date - The logic now first checks if the requested time slot is available for the maintenance request. - If the slot is already taken, it raises a UserError before creating any preventive maintenance leaves. - This ensures early validation and avoids unnecessary record creation, improving overall performance. 4. Allow creating maintenance during non-working hours (flexible schedule) - Users can now plan maintenance during nights, weekends, or other off-hours. - This ensures the "MO already scheduled for this time slot" error only shows when there's an actual conflict. - This removes unnecessary restrictions and supports more efficient maintenance planning. 5. Refine `Maintenance Requests Analysis` report - Removed low-impact measures to improve clarity and help users focus on key metrics like request count and duration. - Retained the duration measure to help users analyze time spent by assignee. Framework task: [4609678](https://www.odoo.com/odoo/all-tasks/4609678) task-4582789
The Field Service customer ratings action has been changed so it no longer depends on a live server connection. This improves reliability for users working in offline mode while keeping access to customer rating information.
Original PR description
Before this commit The "Customer Ratings" action in industry_fsm used a server action, incompatible with offline mode due to its dependency on a live backend connection. After this commit The server action is replaced with a standard window action, which is supported in offline mode. task-4920361
Belgian payroll now supports setting a minimum withholding tax amount as an additional payslip input. This helps ensure payroll calculations meet required withholding levels by automatically adjusting payslip lines when the calculated tax is below the specified minimum.
Original PR description
This commit adds a new other input type that can specify the minimum amount of withholding tax that should be applied. The withholding tax is adjusted on the payslip lines if it does not reach the specified minimum. task-4936543
HR users can now open the employee’s contract version directly from an offer before countersigning, making review easier. The signed contract button now consistently opens the correct version, including after the page is refreshed.
Original PR description
New: - A smartbutton for HR to view the employee version before countersigning. - The smart button exists within the offer form view when the offer is partially-signed, redirects to a view of the employee version based on the partially signed contract. Fixes: - When the contract is countersigned, clicking on the "signed contract" smart button now leads to the correct version view. - When the page is refreshed, the correct version is still loaded. Task-4873800
This update improves the Time Off request experience and keeps related payroll, planning, project, and localization workflows aligned. It mainly adjusts supporting checks to ensure existing business processes continue to behave consistently after the time off window changes.
Original PR description
related: https://github.com/odoo/odoo/pull/213604/
The employee form has been reorganized to make key HR and payroll information easier to find and understand. Wording and layout improvements reduce friction for HR teams, while the signatories area has been removed to simplify the page.
Original PR description
In this PR, we improved the existing employee form UX, by moving some parts, improving wording and UX, and removing the Signatories tab. Related task: 4879234 Community PR: https://github.com/odoo/odoo/pull/214962
Shopfloor cards now show which employees are assigned to each work order, making it easier to see which work is already taken and which remains available. Active work orders are more clearly highlighted, and the selected employee's assigned work orders are emphasized in the overview for faster access.
Original PR description
In shopfloor, to know which WOs are free to take, Assigned employees are now shown on the card (limited to 13 employees). With the recent shopfloor redesign, it became less easy to identify active WOs. Therefore, now any active WOs are highlighted for any user. **NEW:** In overview, for the employee currently selected, the WO quick access button is highlighted in WOs they're assigned to. Task: 4987845
VAT returns now separate the VAT total for the period from the balance shown on the closing entry, making amounts easier to understand. The update also improves return management with deadline filtering, archive controls, automatic paid status for zero or negative submitted balances, and more accurate payable amounts across periods.
Original PR description
* Show VAT Total for the period and show the vat balance on the closing entry if it is different from period vat total. * Add Deadline Filter on return search. * Allow Archive and Unarchive automatically generated returns. * Return is paid automatically if submitted and balance is negative or equal to zero. task-4981853
UAE payroll calculations now include days when an employee is outside their contract period. This helps payroll teams produce more accurate salary results by reflecting non-contract days in the relevant salary rules.
Original PR description
days to UAE payroll task-4700453 Forward-Port-Of: odoo/enterprise#92807 Forward-Port-Of: odoo/enterprise#84758
Resolved issues and error corrections
The product search in Kenya localization now works correctly when users filter by KRA item code. This prevents search errors and helps sales users find products more reliably.
Original PR description
This commit odoo/enterprise@c17ebfc7cdf2b218945280e6e3bd09f2b9ee8adc added a [searchview](https://github.com/odoo/enterprise/blob/17.0/l10n_ke_edi_oscu/views/product_views.xml#L74-L84) for `l10n_ke_item_code` but it never worked. as `l10n_ke_item_code` in `product.template` is non-stored field, we generally get error in console about it. fast forward to newer version e.g. saas-18.3, searching on non-stored fields raises traceback on frontend. Step to reproduce: - install L10N_ke and sale_management - switch to kenya company - go to product in sales app - type something in search bar and select 'kra item code' from autocomplete Observation: - nothing happens on frontend - on backend we receive a error `ERROR odoo.osv.expression: Non-stored field product.template.l10n_ke_item_code cannot be searched.` Fix: - we introduce a search method for l10n_ke_item_code field opw-4985176 Forward-Port-Of: odoo/enterprise#91526
Receipt validation now correctly triggers lot or serial number label printing after a quality check is passed. This prevents missing labels when receiving tracked products and improves completion of mixed receipts with and without quality checks.
Original PR description
## Issue: When 'auto_print_lot_labels' is activated on Receipts Operation Type, and you received a product, the print action wasn't trigger when you validate before making the Quality Check The…
## Issue: When 'auto_print_lot_labels' is activated on Receipts Operation Type, and you received a product, the print action wasn't trigger when you validate before making the Quality Check The wizard is automatically opened but when you click on the Pass button, the wizard was closed without sending the print action ## Cause: The action wasn't return by the wizard function 'action_generate_next_window()' making the only action to be a 'act_window_close' ## Note: The state wasn't correctly set to done for all products when you validate pickings both with and without QCs in them at the same time, it should now be fix Enabling Delivery Slip for the Receipts will make the SN to not be print even after disabling the option ## Steps to reproduce: - Toggle the Lot/SN Labels option in the Hardware Tab for the Operation Type Receipts - Create a Product tracked by Unique Serial Number - Add a Quality Check for the Receipts operation - Create a New Receipt for the product - Mark as Done and Add the Serial Number - Validate the receipt and Pass the check - Before the fix, no document was downloaded opw-4790427 Forward-Port-Of: odoo/enterprise#92850 Forward-Port-Of: odoo/enterprise#90134
Users with appointment access can now create resource-based appointments directly from calendar events without hitting an access error. This keeps the booking flow working as expected when an appointment type has a single resource assigned.
Original PR description
Before this commit, trying to create an appointment through a calendar event as an user will raise an AccessError. This is because in this fix #76653 we needed to make sure the appointment_resource_id is being set on the calendar event and for this we needed to make it readonly. This causes that an user, is not able to get the proper access rights to read on to the 'appointment.booking.line' which is being triggered since inside each booking line, we have an appointment_resource_id which is a many2one to the appointment resource. To fix this, we are adding a sudo on the booking lines when we only have 1 booking line and the appointment resource is set on the calendar event. This way, the user will be able to read the booking lines and create the appointment. opw-4614976 Forward-Port-Of: odoo/enterprise#90149 Forward-Port-Of: odoo/enterprise#88373
Manufacturing orders now follow the configured backorder preference when the first work order is completed with a smaller quantity. This prevents unwanted production and work order backorders, helping teams keep manufacturing records aligned with their operational settings.
Original PR description
When marking as done the first workorder with less quantitites, backorders (mo+wo) were always created, with no respect of the 'Create Backorder' setting defined on the Manufacturing picking type. Now this setting is taken into account. task: 4440866
Expiration dates shown in the Barcode app are now displayed using the user's local timezone. This prevents products received with a midnight expiration time from appearing as expiring one day earlier, reducing confusion during warehouse receipt validation.
Original PR description
**Issue**: The expiration date displayed in the barcode app's scan screen may appear incorrect. **Steps to reproduce**: - Go to Settings > Inventory, and enable the `Expiration Date` field - Open the…
**Issue**: The expiration date displayed in the barcode app's scan screen may appear incorrect. **Steps to reproduce**: - Go to Settings > Inventory, and enable the `Expiration Date` field - Open the Purchase app - Create a new Request For Quotation - Select a product that: - is a good tracked by lot - has the `Expiration Date` field enabled (Inventory tab > Traceability) - Confirm the RFQ - Click the `Receipt` smart button - Click the `hamburger button` and enter an expiration date at midnight. - Go to the Barcode application > Operation > Receipts - Open the corresponding RFQ - Click Edit and increase the quantity to 1, then Validate - Observe that the date is displayed as one day earlier **Cause**: The code https://github.com/odoo/enterprise/blob/b5ad18b101f4a2608758762edf0f49270a67ba20/stock_barcode_product_expiry/static/src/components/line.js#L17 assumes that the date is encoded using the local while the date comes from the server https://github.com/odoo/enterprise/blob/b5ad18b101f4a2608758762edf0f49270a67ba20/stock_barcode_product_expiry/static/src/components/line.js#L13, and thus is utc encoded. So for example, if the user's timezone is `Europe/Brussels`, a midnight timestamp will appear as 10 PM the previous day. **Solution**: To solve this issue, use this method https://github.com/odoo/odoo/blob/7a40285fd03f75f07a74f05d4b60e760e1c83eb3/addons/web/static/src/core/l10n/dates.js#L619-L622 instead of https://github.com/odoo/odoo/blob/7a40285fd03f75f07a74f05d4b60e760e1c83eb3/addons/web/static/src/core/l10n/dates.js#L514-L516. This way, it would parse the utc-base server date as a utc-base date. opw-4865513 Forward-Port-Of: odoo/enterprise#92109 Forward-Port-Of: odoo/enterprise#88526
Reconciliation between a customer invoice and a vendor bill now keeps the correct partner on each accounting line. This prevents paid invoices and bills from being reflected under the wrong customer or vendor in reports such as the Partner Ledger.
Original PR description
**Steps to reproduce:** - Install account_accountant - Create an invoice ($100) for Customer X - Create a bill ($100) for Vendor Y - From "Customer Invoices" journal in Accounting dashboard, open…
**Steps to reproduce:** - Install account_accountant - Create an invoice ($100) for Customer X - Create a bill ($100) for Vendor Y - From "Customer Invoices" journal in Accounting dashboard, open "Payments Matching" - Select the invoice and the bill - Reconcile them **Issue:** A move is created with 2 lines that will mark both invoice and bill as paid. However, on both created lines, the partner is "Vendor Y", which is wrong as it will generate incorrect reports (e.g. Partner Ledger). One line should have "Vendor Y" as partner and the other line should have "Customer X". This kind of reconciliation is apparently current in India. **Cause:** When reconciling lines from 2 accounts exactly, a transfer from one account to the other one is created. The transfer is made from the account where the absolute amount to move is the lowest. A transfer is made for each partner that has a move being reconciled with the source account. The transfer is crediting (or debiting) the source account and debiting (or crediting) the reconcile account with the same partner. This is working most of the time but it totally ignores all the partners linked to the moves with the reconcile account. **Solution:** Create one line of the transfer with the source account and the partner as before. For the line on the reconcile account, first check if there's one for the same partner, currency and sign (of the amount to transfer). If not, try to find another partner with the same currency and sign. Otherwise, fall back on the same partner as the line on the source account as it was done before. opw-4735147 Forward-Port-Of: odoo/enterprise#92909 Forward-Port-Of: odoo/enterprise#89972
Users editing a Knowledge article will no longer lose unsaved work when another article is moved beneath it. The system now saves pending changes before reloading the article, reducing frustration and preventing accidental data loss.
Original PR description
Currently, when a user moves another article beneath the one they are editing, the record is reloaded, causing any unsaved changes to be lost. This can be especially frustrating if the user has made significant edits. To address this issue, we will ensure that any changes made to the article are saved before the record is reloaded. This will prevent accidental loss of work and improve the editing experience. Steps to reproduce the issue: 1. Open an article 2. Make changes to the article (e.g, type or edit text) 3. Drag and drop another article beneath the current one. => The article reloads, and your unsaved changes are lost. In the `moveArticle` function, we will check if the record has unsaved changes (i.e., if it's "dirty"). If so, we will save the current content before triggering a reload via `this.props.record.model.load()`. Task-4636494 Forward-Port-Of: odoo/enterprise#87937
Manufacturing users can now search for employees to assign without triggering errors caused by records from companies they cannot access. The employee picker is limited to employees in companies available to the current user, making work order assignment more reliable in multi-company setups.
Original PR description
Task ID: 5005753 Prev behavior: when searching for employees to assign (employee_assigned_ids) from the manufacturing page and using "Search More", it was raising an error bc it was fetching data even from employees part of companies he's not part of New behavior: added domain over employee_assigned_ids such that the accessed users are only the ones being part of a company the current user can access Forward-Port-Of: odoo/enterprise#92079
Payroll users can now edit validated work entries as long as those entries have not yet been included in a payslip. This helps teams correct payroll preparation mistakes earlier without weakening the protection around entries already used for payslip calculations.
Original PR description
Originally, the validated work entries cannot be modified, either they have been included in payslips or not. This logic has been adjusted to allow for modifying the work entries marked as "validated" if they are not linked to a payslip. Task #4921300 Forward-Port-Of: odoo/enterprise#89552
The Indian Payroll yearly salary report now prints correctly when salary structure names are stored in multiple languages. This prevents an error that blocked payroll teams from generating the report after payslips were paid.
Original PR description
Steps to Reproduce:
- Install Indian Payroll Localization
- create a payslip of any employee and mark as paid
- try to print yearly salary report from reporting menu
Issue:
- A traceback error occurs when printing the yearly salary report.
Reason:
- the sturcture name is translatable field, which gives the value in a dict with the key as languages like {'en_US': 'India: Regular Pay'}.
- The error occurs because the code attempts to use this dictionary with setdefault, which expects a string.
Solution:
- Get the structure name corresponding to the appropriate language from the dictionary before passing it to setdefault.
task-5002518
Forward-Port-Of: odoo/enterprise#91901