Daily updates from Odoo
Thursday, June 11, 2026
23 changes · master
Enhancements to existing features
This update expands tax calculation capabilities by incorporating detailed product information, such as screen size and battery status, directly from Avalara. This improves accuracy, particularly for regions with complex tax rules like California, and prepares for upcoming legislation.
Original PR description
The existing three inputs for tax calculation were: - ship from address, - ship to address, - avatax product category In some cases it's not enough to accurately determine taxes. For example, in…
The existing three inputs for tax calculation were: - ship from address, - ship to address, - avatax product category In some cases it's not enough to accurately determine taxes. For example, in California taxes may change depending on whether a device has an embedded battery or depending on the screen size. Because Avalara cannot create categories for every single combination of parameters they support product parameters for these cases. They've been around for a while but weren't commonly needed. In 2026 however, California has introduced some legislation that make these a more requested feature [1]. This amends our exemption syncing mechanism to pull in parameters and their values idempotently and non-destructively. The Avatax parameters are typed. Simple types are booleans, floats, and character fields. Slightly more complex are selection fields and quantity fields (i.e. with UOM). The data type is provided by Avalara during sync and selects which value_* field on avatax.parameter.value holds the input. In the API request they all are converted to a simple string, but splitting them in the model lets the form show the right widget per parameter. Quantity values auto-fill from the product's weight or volume when the picked UOM's measurement type matches and we know the corresponding Odoo UOM. So the common case (e.g. ScreenSize in inches, NetWeight in kg) doesn't require re-entering values that already exist on the product. task-5911386 [1] https://cdtfa.ca.gov/taxes-and-fees/covered-electronic-waste-recycling-fee/
This update allows users to share Odoo spreadsheets with external users, granting them edit permissions. Previously, this functionality was missing, limiting collaboration with those using other spreadsheet programs. This enhancement improves usability and expands the reach of Odoo's spreadsheet capabilities.
This update enhances the user experience for point-of-sale transactions by refining the layout of order buttons and adding new options. Specifically, it includes buttons for printing receipts and accessing detailed order information, streamlining the order process for staff.
Original PR description
In this commit: - Refined the order process button layout by improving placement and reducing button size for better usability. - Added two new buttons: one for printing the order receipt and another for opening the order information pop-up. Task-6123032
This update consolidates premium pay calculations for Belgium within the standard payroll process. Previously, premium pay was handled separately, and this change streamlines the payroll calculations and reporting for Belgian employees. This ensures consistency and simplifies payroll administration.
Original PR description
Task-6230447
This update enhances the Clickbot's ability to thoroughly test Odoo's user interface. It now simulates clicks on records within list and kanban views, allowing for a more complete assessment of application functionality and error detection. The Clickbot now continues running even if errors are encountered, providing a more comprehensive test report.
Original PR description
Before this commit, the Clickbot only verified that the multi-record views of a menu could load successfully. This commit expands the Clickbot's coverage by simulating a click on individual records within list and kanban views. Depending on the view configuration, this will either open the corresponding form view, trigger editable mode for inline-editable lists, or execute the action specified by an open_action attribute. task-id 6249944
This update allows companies to define different salary rules for various expense categories, providing greater control over payroll calculations. Previously, all expenses were mapped to a single rule, limiting customization. This change enhances flexibility and accuracy for diverse business needs.
Original PR description
Previously, all expenses would be mapped to one salary rule of the structure, namely the one with the code 'EXPENSES'. This would limit companies that wanted to have different salary rules for different types of expenses. This commit changes how the flow goes, where now the salary rule is chosen on the expense category, and when the payslip is generated, expenses are mapped to their corresponding salary rule, rather than combining them all in one salary rule. task-4283293
This update refines how timesheet assistant rules handle interruptions like quick messages. Previously, a short event could randomly change the associated project. Now, a 'short_lived' attribute helps ensure rules accurately track activity, preventing unnecessary project switches and improving timesheet data accuracy. This change also includes updates to Google Meet, Sheets, and Slides rules to better capture these events.
Original PR description
Before this commit: Events like Discord discussions are treated as key events, but they are not linked to a fixed project. Instead, they vary daily based on manual matching. This means a short interruption (e.g., replying to a quick message) can switch the project, even if the main work continues afterward. In this commit: - Add a 'short_lived' attribute to aw.rule. - When enabled, the rule sets the project/task for its own activity but does not update the next events (unless it was previously null). task-6198024
This update adjusts payroll calculations in Odoo Enterprise to comply with Belgian social security regulations. Specifically, it updates salary thresholds based on employee age (under 30 vs. 30+) for restructuring reduction amounts. This ensures accurate social security reporting through DMFA files, maintaining legal compliance.
Original PR description
### Why: To comply with Belgian social security regulations, the restructuring reduction amount ($133.33$ per month) is subject to specific gross salary thresholds that differ based on the employee's age (above or below 30 years old). Updating these parameters ensures that payroll calculations are legally accurate and that the resulting social security contributions are correctly reported in the DMFA files using the appropriate technical codes. ### What: - Added new parameter values for the basic salary threshold, split by age categories (under 30 and 30+). - Configured the DMFA mapping for the restructuring amount to ensure compliant electronic reporting. task-6175186
This update improves the softphone's call logging functionality by allowing users to record calls even without a specific contact. Now, when logging a call, the call automatically links to the relevant document, regardless of whether a contact was initially specified. This simplifies call documentation and improves workflow efficiency.
Original PR description
Make it possible to log on calls without contacts on softphone. When no contact, you should be able to log to any documents. Task-[6204798](https://www.odoo.com/odoo/5778/tasks/6204798)
This update simplifies payment processing by replacing the 'state' field with 'is_live', streamlining the system's payment status tracking. Additionally, marketplace menus have been reorganized for better navigation. These changes improve the user experience and operational efficiency related to payment processing and subscription management.
Original PR description
The `state` field is replaced with `is_live`. Marketplace menus are moved into a separate menu category. id-5722033
This update allows employees in Hong Kong to specify a postal address for IRD reports, ensuring accurate data submission. The system now includes postal addresses and ZIP codes in the generated reports, improving compliance and data quality. A cleanup of demo data addresses has also been performed.
Original PR description
Before this commit: - Employees only had a private/residential address for HK IRD reports. - The postal address fields in IR56 XML exports were always left empty, and the PDF reports displayed the postal address label without any value. - ZIP codes were not included in the residential or postal address lines used by IRD XML/PDF reports. After this commit: - A new optional postal address block is available on HK employee forms. - When enabled, this address is used to fill the postal address section in IRD XML and PDF reports, while keeping the residential address unchanged. - Residential and postal ZIP codes are included in the generated IRD address data, including `RES_ADDR_LINE3`, `POS_ADDR_LINE3`, and the PDF address strings. Task-6119163
This update simplifies AI agent configuration by unifying provider selection and response styles. It now supports multiple AI models (Gemini and GPT) for both general conversation and image generation, enhancing flexibility and performance. This change also includes improvements to error handling and UI styling.
Original PR description
This commit aims to simplify the agent configuration process by abstracting llm_model selection. Configuration: - Replaced `llm_model` with `provider` and `response_style` (4 styles). - Agent model is selected based on provider, response_style, and whether agent is called for image generation or website builder. Models: - Defaulted to Gemini-3-Flash/3.1 Pro and gpt-5.4-mini/gpt-5.4. - Image generation uses Gemini-3.1-flash-image and gpt-5.4 series. Service Mapping: - Reworked AIProvider to map directly to provider-specific AIApiService classes, simplifying the addition of future providers. Logic: - Implemented reasoning-based timeouts (up to 120s for medium/high reasoning). - Refined error handling for 429 quotas exceeded. - Various adaptation for tests. UI: - Improved agent card alignment and configuration view styling. task id: 5411094 upgrade PR: https://github.com/odoo/upgrade/pull/9751
This update optimizes the automatic scheduling process by prioritizing shifts based on importance. Now, the system allocates resources to the most critical shifts first, ensuring maximum coverage for high-priority tasks. This prevents lower priority shifts from being assigned when capacity is limited.
Original PR description
This commit orders open shifts by priority (most important ones first) before assigning resources to it (i.e., auto-plan). This ensures resources are allocated to the most important shifts first, leaving lower priority ones unassigned if maximum capacity is reached. task-6176328
This update enhances the Gantt view's ability to fold non-working hours when open shifts are used. Previously, open shifts were treated as always available, preventing the Gantt view from simplifying schedules for companies with fixed working times. Now, the system dynamically adjusts to accommodate both fixed and flexible schedules, improving the visual clarity of the Gantt chart.
Original PR description
### Purpose: The Gantt view has a visual feature that automatically folds non-working days (like nights and weekends) to avoid bloating the interface. However, the Planning app does not benefit from…
### Purpose: The Gantt view has a visual feature that automatically folds non-working days (like nights and weekends) to avoid bloating the interface. However, the Planning app does not benefit from this when open shifts are present, as these unassigned shifts are treated as fully flexible (24/7). This prevents the entire view from folding for companies with fixed schedules. ### Cause: In the `_gantt_unavailability` method, open slots (identified by `False`) were hardcoded to return an empty array of unavailabilities, forcing the Gantt renderer to keep those columns unfolded. ### Solution: Introduce dynamic flexibility checking for open shifts: - If all employees currently in the view have a fixed schedule, open shifts will adopt the company's default working calendar's unavailabilities. This allows the Gantt view to successfully fold weekends/nights. - If any employee in the view has a flexible schedule, open shifts will remain flexible (no unavailabilities), preserving scheduling freedom for flexible workforces. task-6189622
Resolved issues and error corrections
This change prevents the calculation of NSSF deductions for employees who are 60 years or older. It ensures accurate payroll processing and aligns with Kenyan regulations regarding retirement age and social security contributions. The system now correctly stops deductions when an employee reaches the specified age.
Original PR description
This commit refactors the document completion flow to enforce the SRP and resolve duplicate attachments on reference records. Changes include: - Moved PDF generation (`_generate_completed_documents`) from the send method directly into `_sign` to guarantee documents are built exactly when the state changes to 'signed'. - Extracted reference record updates into a dedicated `_update_reference_document` method for cleaner code structure. - Resolved duplicate attachment displays on the source record by explicitly creating the attachment once and removing the redundant `attachment_ids` from the chatter message. - Updated the completion chatter message to notify users that the files are in the attachment tray, and set the message author to the original request creator. - Overrode `_generate_done_message` to cleanly bypass generic activity messages. Task: 6127862
This update fixes an issue where the payroll system incorrectly processed employee data when the NISS (a Belgian employee identification number) was missing or formatted as '/'. The change ensures accurate date extraction for payroll calculations, particularly for employees without a standard NISS.
Original PR description
follow-up of https://github.com/odoo/enterprise/pull/116002 Steps to reproduce: - Belgian company - Have an employee with a NISS set to '/' (accepted value for no NISS) - go on the payroll dashboard `_extract_date` expects the niss that is given to be in the correct format, however the field could be empty or be '/'. This commit returns False in both those situations. no related task/ticket
This update ensures that Wijninckx contributions (code 867) are only processed for the final quarter of the year. The system now prevents incorrect declarations outside of Q4, triggering a user error and a payslip warning to avoid potential payroll issues. This improves accuracy and compliance with Belgian tax regulations.
Original PR description
The Wijninckx contribution (code 867) should only be declared on the last quarter of the year. This commit introduces a restriction to ensure this: - Triggers a UserError in the DMFA if the code 867 is used in a declaration outside of Q4. - Adds a python-based payslip warning if the `ONSSWIJNINCKX` salary rule is applied to a payslip from January to September. Task Id: 6267562
This update resolves an issue in the l10n_mx_edi module related to dependencies on PINT and CEN. The change ensures proper functionality for Mexican electronic invoicing, aligning with current tax regulations. This fix improves the reliability of the module for businesses operating in Mexico.
Original PR description
X-original-commit: 3675550ec7a8ccc0b4646f8e24aa38a3b52cf36c Forward-Port-Of: odoo/enterprise#119983
This update corrects inaccuracies in how Omani payslips are generated, specifically for employees using attendance tracking. The changes ensure that key figures like SPF and provision rules are calculated based on the employee's total paid amount, not just their hourly rate. This improves the accuracy of payroll reporting for Omani employees.
Original PR description
This commit fixes the following problems over Omani payslips: - before, when an employee had attendances as a tracking method, some of its slip lines values (such as SPF and provision rules) were computed over its hourly rate and not its total paid amount - adapted the way the overtime computation is made: if wage is hourly we just take the hourly rate and multiply it by number of overtime hours multiplied by the rate, while if wage is fixed it need to compute hourly wage, which is paid_amount / (Number of worked paid hours). task-6263732
This update addresses a previous issue where unmapped mobile carrier codes (MCCs) caused expense transactions to be rejected, leading to user confusion. Now, a warning is displayed in settings if MCCs are missing, guiding users to correctly map them and preventing future transaction rejections. This ensures smoother expense reporting and accurate financial data.
Original PR description
Before this commit: - If the default expense category was deleted or MCC mappings were manually modified, some MCC codes remained unmapped. - Transactions with unmapped MCC codes were refused without clearly indicating that the issue was due to a missing configuration. - Users could misinterpret the behavior as a feature bug, while it was actually a setup issue. After this commit: - When the Expense Card feature is activated and the account is verified, ensure that all MCC codes are mapped to an expense category. - If any MCC is not mapped, display a warning in the settings. - Clicking on 'Open MCC' should open the MCC list view filtered to show only records where “Expense Category to Use” is not set. - If a transaction is refused because of an unmapped MCC, we create the expense at the refused state without any category set, and show the refused expense message on Chatter. task-5932712
This update resolves an issue preventing users from customizing the font style of headings on the appointment page. By wrapping the heading tag in a div, the system now correctly recognizes font style changes, allowing for consistent branding and design adjustments. This ensures a better user experience for appointment scheduling.
Original PR description
*: appointment Before this commit: The page title ("Choose your appointment") on controller page "/appointment" is a bare `<h1>` element at the root of an editable arch section, and it does not offer…
*: appointment
Before this commit:
The page title ("Choose your appointment") on controller page
"/appointment" is a bare `<h1>` element at the root of an editable arch
section, and it does not offer the Font Style selector in the website
builder, preventing users from changing their headings.
The Font Style option is intentionally hidden on such elements by the
`isRetaggingSafe` check. Retagging the section root (h1 -> h2/...) is
not safe because `replace_arch_section` only saves the content of an
editable section, never its root element (see 4469b36, "only save view
section content"). As a result, a root node tag change would not be
persisted and would silently revert on save.
After this commit:
The `<h1>` is wrapped in a `<div>`. The div becomes the OE directive
section root (kept intact on save) and the inner `<h1>` becomes part of
the editable content. As a result a Font Style change becomes a child
mutation rather than a root node change.
Community PR: https://github.com/odoo/odoo/pull/261797
Upgrade PR: https://github.com/odoo/upgrade/pull/10322
Upgrade Util: https://github.com/odoo/upgrade-util/pull/441
task-[6170946](https://www.odoo.com/odoo/project/974/tasks/6170946)This update corrects a technical issue in the VAT record book export that was incorrectly displaying '01' for invoices with 'No Sujeto por reglas de localización' taxes (like Portuguese VAT). The fix ensures the correct '17' operation code is used, aligning with Spanish VAT regulations and SII reporting requirements. This ensures accurate VAT reporting.
Original PR description
**Steps to reproduce:** * Install the **l10n_es_edi_sii** module. * Create a **Portuguese customer**. * Go to **Settings** and enable **EU Intra-community Distance Selling**, then refresh the tax…
**Steps to reproduce:** * Install the **l10n_es_edi_sii** module. * Create a **Portuguese customer**. * Go to **Settings** and enable **EU Intra-community Distance Selling**, then refresh the tax mapping. * Create a customer invoice with a **"No Sujeto por reglas de localización"** tax (e.g. **23.0% PT VAT**). * Go to **Accounting → Reporting → Tax Report → OSS Sales**. * Export the **VAT Record Books (XLSX)** file and open it. **Observed behavior:** * The "Clave de Operación" column shows "01" for lines with no_sujeto_loc taxes instead of "17". * The SII JSON for the same invoice correctly shows "ClaveRegimenEspecialOTrascendencia": "17". **Cause:** * In `_l10n_es_libros_get_common_line_vals()`, `operation_code` was computed manually as `'02' if exempt_reason else '01'`, which only handled the E2 exempt case and defaulted everything else to "01". * This missed OSS/no_sujeto_loc taxes (e.g. FR VAT, PT VAT) that should produce "17" per the Spanish VAT regime code table. **Fix:** * Extract operation code computation into a new dedicated method `_l10n_es_libros_get_operation_code()`. * For customer invoices, delegate to the existing `_l10n_es_get_regime_code()` method already used by SII, which correctly returns "17" for OSS-tagged taxes, "02" for E2 exempt, and "01" otherwise. * For vendor bills, mirror the SII logic by checking whether the invoice taxes include tags from `mod_303_casilla_10_balance` or `mod_303_casilla_11_balance` (intra-community indicators), returning "09" if so and "01" otherwise. opw-6197141,6216485 Forward-Port-Of: odoo/enterprise#119467 Forward-Port-Of: odoo/enterprise#117236
This update resolves an issue where portal users couldn't access photos attached to completed field service reports. The fix ensures that non-internal users can now view these images within the portal, improving the customer experience and providing more complete service records. This aligns with our commitment to providing a fully functional portal for our customers.
Original PR description
Photos were not accessible in the portal field service report for non-internal users. **Steps to reproduce** - Create a planning slot, set a portal user as the customer and mark the slot as "Completed". Add an image in the chatter. - Logged in with the customer's portal user account, access the field service report in the portal. The "Photos" section displays the name of the picture, but it is not possible to view it. <img width="888" height="320" alt="image" src="https://github.com/user-attachments/assets/523d1d1a-7c9c-4c9a-85f5-acd4df86d7ff" /> **Change** Similar to what is done in `project/controllers/portal.py` to give access to attachments to non-internal users from the portal, generate the necessary access tokens. opw-6236038 Forward-Port-Of: odoo/enterprise#118672