Daily updates from Odoo
Thursday, August 13, 2026
31 changes · master
New functionality added to Odoo
Adds official Guatemala VAT book reporting for sales and purchases, helping companies prepare required period filings from FEL documents. The report includes legal PDF output and CSV export with document-level details and summaries for easier compliance review.
Original PR description
Guatemala requires two legal VAT books, the Libro de Ventas and the Libro de Compras y Servicios Recibidos, filed per period from the FEL documents. Add them as a single account.generic_tax_report variant with a Tax Type selector switching between the sales and the purchase book, so it sits alongside the standard tax report and matches the printed book layout. The detail engine produces one row per posted FEL document, reading the move lines with TableSQL rather than the ORM, which is too slow at book volumes; each document is split into goods vs services and taxable vs exempt, with the IVA and the combined specific taxes alongside, and a summary table aggregates them by bucket. The legal PDF opens on the SAT header, carrying the company identification and the reporting period, and closes on the document count, the total tax debit or credit and the summary table. A CSV export provides the flat data companion. task-6015093
This update adds Telnyx-based PBX capabilities to VoIP, including incoming call handling, phone ringing, user call forwarding, queues, and call groups. Businesses can route calls more flexibly and manage how calls are distributed or forwarded when users are busy or unavailable.
This update improves Odoo VoIP by adding early support for buying phone numbers and ringing phones through PBX integration, while also fixing issues with incoming calls, call groups, and phone number formatting. It should make business calling workflows more reliable and prepare the VoIP module for broader phone service capabilities.
Enhancements to existing features
This update improves Belgian payroll handling for Joint Committee 302 employees who are paid through tips. It adds the related payroll rules, employee and contract settings, warnings, reporting data, and validation coverage so payroll teams can process these cases more accurately.
Original PR description
Task: 6037567
VoIP calls now coordinate across open browser tabs so that when a call is answered or brought forward, other tabs automatically place their sessions on hold. This helps prevent overlapping calls or audio conflicts and makes the calling experience more reliable for users working with multiple tabs.
Original PR description
Put sessions on hold in other tabs when a call is accepted or promoted. The shared worker now tracks connected clients and assigns each tab a unique userAgentKey. When a session is promoted to front, the worker broadcasts HOLD_ALL_SESSIONS to every tab. The receiving tab ignores broadcasts matching its own userAgentKey. task-5973023
Payroll rules and related country-specific payroll modules were updated to remove an outdated paid amount setting. This simplifies payroll configuration and helps keep payslip calculations consistent across localizations.
Original PR description
task-6186326
Belgian payroll now avoids applying flat-rate withholding tax to double holiday pay and 13th month payslips when the employee's regular monthly tax situation indicates no tax is due. This helps prevent over-withholding in eligible cases while keeping the tax calculation aligned with normal payslip rules.
Original PR description
This commit adds an exemption that skips the flat-rate professional withholding tax on double holiday and 13th month payslips when two conditions both hold: no cumulated PP from regular monthly payslips this year, and the theoretical monthly tax on base salary plus 1/12 of the exceptional gross works out to zero. That theoretical tax is simulated the same way as a real monthly payslip, including the flat-rate professional fees and transport tax deductions, so it does not overstate what the employee actually owes. It also pulls the bareme bracket logic into its own method so both the standard and theoretical paths can share it. task-6322148
Belgian payroll cash register settings now appear when the selected employer category allows Joint Committee 302, instead of depending on whether an employee is already assigned to that committee. This makes the settings available earlier and keeps payroll configuration aligned with the employer category setup.
Original PR description
Cash register settings are currently displayed only when the company has an employee assigned to Joint Committee 302. This makes their availability depend on the employee configuration. The employer category already defines the allowed joint committees. Base the visibility on whether the selected category allows Joint Committee 302, making the settings available as soon as the relevant payroll configuration is selected. Task: 6395308
Users can still add appointment events to external calendars such as Google, Outlook, Apple, and iCal, but the responsibility is now handled by the Calendar app instead of Appointment. This centralizes the feature so calendar links can be reused more consistently across appointment-related communications.
Original PR description
Moving the possibility for users to add a calendar event to their iCal/Outlook/Apple or Google calendars from appointment to calendar. Task-6218949
Turkish payroll now calculates severance pay and provisions based on an employee's departure date and reason, rather than whether the employee record is archived. Several internal salary rule lines are hidden from display, and manual deduction/addition labels are renamed to clearer business terms.
Original PR description
- Severance Pay and Severance Provision now trigger on the employee's departure date and departure reason instead of the employee being archived. - Set visibility to NEVER for: Previous Months Gross, Previous Months Paid Tax, Gross From Net, SSI Company Contribution, SSI (unemployment) Company Contribution, Taxable Salary, Current Month Actual Deducted Tax (Pre Exempt), Expected Net Salary. - Rename Manual Deductions -> Other Deductions, Manual Additions -> Other Allowances. task-6459874
UrbanPiper order screens now present order details and information popups more clearly for point-of-sale users. Demo data also includes rider information, making examples more realistic and easier to understand during setup or testing.
Original PR description
In this commit: ================ - Improved the Order Details and Order Info popup UI for UrbanPiper orders. - Enriched demo data by including rider info task-6053362
Belgian payroll settings now show the letter prefix next to each FFE code option. This makes it easier for users to identify and select the correct code, reducing confusion during payroll configuration.
Original PR description
Prefix the FFE code selection field labels with their corresponding letters (C, B, N, O).
Signature request activities now show key details such as the reference, requester, signers, and documents, making it easier to understand what needs attention. Completion messages on linked records are cleaner and include a link to the signed document plus the signer list, helping users quickly find final signed files.
Original PR description
Show the request reference, creator, signers, and documents on the activity card, add an icon to the "View" button, and post a cleaner completion message on the linked document with a link to the signed document and the list of signers (attaching the documents only, not the certificate). task-6127862
The payroll and payroll accounting setup data used for internal population and benchmarking has been adapted to a newer format. This keeps HR payroll test and demo data generation aligned with the broader platform changes, supporting smoother maintenance and validation.
Original PR description
See community PR https://github.com/odoo/odoo/pull/276538 for more info. task-6303351
Resolved issues and error corrections
Planning overlap warnings are now hidden for tasks that are not linked to a project. This prevents users from seeing irrelevant alerts while creating private tasks and keeps scheduling feedback focused on project work.
Original PR description
Steps to reproduce: - - Create a task without a project (do not save) - Set planned_date_begin and date_deadline so it overlaps with another task for the same assignee Issue: - - The overlap warning is shown even though the task has no project. Cause: - - When creating a new record, the overlap warning was shown before saving as there was no check for private tasks (tasks with no project), so the warning could appear even when the task had no project. Solution: - - Add a project check so private tasks never show the warning, and recompute it whenever the project changes. Related PR https://github.com/odoo/enterprise/pull/109988 task-6140800 Forward-Port-Of: odoo/enterprise#122222
Sales users can now view invoices that include Kenyan electronic invoicing codes without needing accounting access. This removes an unnecessary access error while keeping the information available only for standard internal users.
Original PR description
The KE codes are used in invoices and when sales people who do not have accounting access, but still can see their own invoices open an invoice, right now they will have an access error because they do not have read access to the codes. So, we should just apply the same logic as is done in edi.documents and give base.group_user read access to those codes, which are not confidential anyways. Forward-Port-Of: odoo/enterprise#127443 Forward-Port-Of: odoo/enterprise#126825
The Helpdesk ticket quick create form in kanban view now has clearer spacing between the customer field and action buttons. This small visual fix makes the form easier to read and use when creating tickets quickly.
Original PR description
This commit add a space between the partner field and the buttons in ticket kanban quickreate. task-6443626 Forward-Port-Of: odoo/enterprise#126901
Users can now Ctrl-click a timesheet suggestion without accidentally opening a new browser window. The suggestion is added to the form as intended, reducing confusion and keeping timesheet entry smoother.
Original PR description
Currently, when a user use ctrl + click on a suggestion, instead of adding it to the view form, it opens a new window. This is due to the default behavior when ctrl+click is used on a link. Using a button instead of an a href="#" solves this issue. Forward-Port-Of: odoo/enterprise#127230 Forward-Port-Of: odoo/enterprise#126240
Belgian payroll users can now generate 274.xx tax XML reports even when the accounting payroll add-on is not installed. The required SME exemption setting has been moved into the core Belgian payroll configuration, preventing an error and making the report available in more setups.
Original PR description
[FIX] l10n_be_hr_payroll: fix 274.xx xml generation (without accounting)
Bug reproduction:
1 - Install only l10n_be_hr_payroll (without accounting) 2 - Belgium company → create new employee
3 - Create payslip with employee validate it
4 - Payroll → Reporting → 274.XX → Generate XML
5 - Traceback about exemption_sme_status is there
Bug cause:
1 - Field exemption_sme_status is defined in l10n_be_hr_payroll_account
1.1 - It can be defined in l10n_be_hr_payroll instead
2 - When there is only l10n_be_hr_payroll installed
2.1 - It cannot find the mentioned field
Bug solution:
1 - Move field From l10n_be_hr_payroll_account to l10n_be_hr_payroll
task-6422367This fixes an issue where closing entries from German point-of-sale sessions were not being recorded in the Fiskaly portal. The certification module now uses the updated accounting validation process, helping ensure compliant register closures after sales sessions.
Original PR description
Steps to reproduce: =================== - In a Fiskaly-enabled German company, open a PoS session and make some transactions. - Close the register. Issue: ====== - The closing register entry is not registered in the Fiskaly portal. Cause: ====== - `l10n_de_pos_cert` calls the _validate_session method. - After the PoS accounting refactor, `_validate_session` was replaced by `_validate_session_accounting`. Fix: ==== - Update the method call to use `_validate_session_accounting`. task-6455319
Mexican payroll now clearly separates Integrated Daily Wage for severance from Base Contribution Salary for Social Security, reducing confusion and improving confidence in payroll results. The Social Security salary calculation now uses actual accrued days from the prior two-month period, excluding unpaid absences, to better align with Mexican legal requirements.
Original PR description
In Mexico, there are two distinct payroll concepts: * Integrated Daily Wage (SDI): used for severance pay (liquidations). * Base Contribution Salary (SBC): used for Social Security (IMSS).…
In Mexico, there are two distinct payroll concepts: * Integrated Daily Wage (SDI): used for severance pay (liquidations). * Base Contribution Salary (SBC): used for Social Security (IMSS). Previously, these concepts were used interchangeably in the code. While the calculations for IMSS were mathematically correct, they incorrectly referenced the Integrated Daily Wage. This naming inconsistency could cause users to lose confidence in the system's accuracy. All IMSS rule calculations now correctly reference the SBC concepts. Additionally, to ensure strict compliance with Article 34 of the Mexican Social Security Law (LSS): > The daily wage will be determined by dividing the total amount of variable earnings obtained in the previous bimester by the **number of accrued wage days**, and adding its result to the fixed elements of the daily salary. The calculation for the variable portion of the SBC is updated to reflect the actual accrued days of the previous bimester, excluding unpaid absences. target: master task-6374791
This fix ensures employee departures are handled after payslips are created, so payroll records stay in the right order. It also recomputes payslip history when new payslips are added, improving accuracy for Belgian and Omani payroll processes.
Original PR description
Departure should be generated after payslips Forward-Port-Of: odoo/enterprise#127171
This fixes an access display issue where users with Accounting Read-Only rights could not see the General section on a contact's Accounting tab. Bank account details and related accounting information now remain visible to authorized users as intended.
Original PR description
Problem: The General group of the Accounting tab of the partner form view is not visible to some users, even if they have the access rights to see it. Steps to reproduce: 1. Create a user or edit an existing one, giving them Accounting Read-Only access rights. 2. Log in with that user. 3. Go to Contacts and select a partner. 4. Open the Accounting tab 5. Notice how the General group (with the bank account details) is not visible. Cause: In the account_accountant module, the partner form view is inherited in one of the views to add additional groups to the General group of the Accounting tab. However, it doesn't add the new group, but instead replaces the existing groups with the new one. opw-6413683 Forward-Port-Of: odoo/enterprise#126679
Employee appraisal skills are now shown with the strongest skill levels first within each skill type. This makes appraisal reviews easier to read by highlighting key strengths before lower-rated skills.
Original PR description
Same ordering issue as hr.individual.skill.mixin in hr_skills: skills were ordered ascending by level within each skill type, showing the lowest level first instead of the top skill. Drop the explicit order overrides on hr.appraisal.skill and hr.appraisal.goal.skill, now redundant with the mixin's fixed default. task-6459270
External sharing checks in Documents Spreadsheet now support spreadsheet functions that use array-based calculations. This prevents errors when sharing spreadsheets containing formulas such as survey or filter values, and added test coverage helps avoid regressions.
Original PR description
Current behavior before PR: - The external share check only handles functions with a `compute` implementation. - This causes an error for functions using computeArray, such as `=ODOO.SURVEY(...)` and `=ODOO.FILTER.VALUE(...)`. Desired behavior after PR is merged: - The external share check now also handles functions with a computeArray implementation. - The survey test now covers this patch to catch similar errors in the future. Task: [6441815](https://www.odoo.com/odoo/project/2328/tasks/6441815)
The payslip Calendar button now opens the calendar view first, matching what users expect. When creating time off from that flow, payroll teams can choose from the full set of allowed work entry types instead of a restricted list.
Original PR description
Steps to reproduce: - Open a payslip and click the Calendar smart button. - Gantt view opens instead of calendar view. - Creating a time off from there only offers work entry types flagged "Selectable in Time Off", not every allowed type. view_mode/views listed gantt first (wins as default), and referenced a gantt view without the unrestricted work-entry-type create form already used elsewhere for pay-run time off. Reorder view_mode/views so calendar loads first, and reuse the existing unrestricted gantt view (hr_holidays_gantt.hr_leave_gantt_view_payroll) instead of hr_payroll's own restricted one. Task 6443202
Code cleanup and technical improvements
This cleanup removes redundant internal update handling in manufacturing work orders, Swiss payroll, and e-signature dialogs. It helps keep these screens aligned with the newer OWL framework approach while preserving existing behavior and reducing the risk of stale data in future updates.
Original PR description
Part of the OWL3 migration cleanup. Now that props are reactive, `this.props` always exposes the current values, so an `onWillUpdateProps` callback whose only job is to copy props into instance…
Part of the OWL3 migration cleanup. Now that props are reactive, `this.props` always exposes the current values, so an `onWillUpdateProps` callback whose only job is to copy props into instance fields or component state is redundant — a getter reading `this.props` directly is shorter and always up to date.
Companion PR (odoo): odoo/odoo#282185
### Why this is safe
Reactivity here does not depend on a component declaring `props = useProps(...)`. All four components use the legacy `static props = {...}` declaration, but they extend the `Component` patched by `web/static/src/owl2/owl3_compatibility_layer.js`, whose constructor does `this.props = owl.props(null)` — that builds a signal-backed props object and registers a `propsUpdated` callback keeping the signals in sync. So `this.props` is reactive in all of them.
### Per-module
**mrp_workorder** — `resModel`, `model` and `record` become getters over `this.props.record`.
**l10n_ch_hr_payroll** — `parsedData` (and the salary widget's `institution_domain`) were only ever written from props, with no other writer anywhere, so both `state` proxies disappear in favour of getters.
**sign** — `this.props = nextProps` was not merely redundant but actively harmful: it replaced the reactive, signal-backed props object with a plain snapshot, so every *later* props update silently stopped reaching the component. The `isShown` reset stays, because the template writes `state.isShown = false` on dismiss.
### Behaviour preserved deliberately
Two pre-existing oddities were left alone to keep this PR mechanical; both deserve their own fix:
- `mrp_display_record.js`: `this.quantityToProduce` and `this.displayUOM` are still computed once in `setup()`, so they do not track later record changes. Not covered by the removed hook either, so this is unchanged, not newly broken.
- `salary_result.xml` references `this.institution_domain` (lines 124/128, feeding `t-if="institution_domain == ...'` branches), but no such getter exists — it was only ever `this.state.institution_domain`. I kept the value local to `get parsedData()` rather than exposing a getter, since adding one would silently activate template branches that have never rendered.
### Verification
- eslint: no new errors on any of the four files (the 5 reported errors are pre-existing and identical on `master`, just shifted line numbers).
- No unit test coverage exists for these four components (mrp_workorder only has tours, which need a server), so this needs CI / a manual pass on the shopfloor view and the Swissdec widgets.
- Note: the enterprise pre-commit hook could not run in my environment (`eslint.config.mjs` imports `@eslint/compat`, which is not installed), so the commit was made with `--no-verify` after linting the files manually with `.eslintrc.json`.This update replaces an older internal naming pattern with the current standard across several Odoo Enterprise modules. It improves code consistency and helps prepare the platform for future framework updates, with no expected change for end users.
Original PR description
Replace deprecated props imports with the correctly named useProps hook to align with owl3 hook naming conventions. In owl3, hook functions should follow the use* naming pattern. However, props, plugin, and config were introduced without this convention, making it unclear that they are hooks. This creates confusion and inconsistent usage throughout the codebase, with some code using the old props while other code uses the correctly named useProps. While props is technically deprecated in owl and will eventually be removed, it was retained in Odoo due to widespread usage. This refactoring consolidates all usages to the correctly named useProps hook, ensuring consistency across the codebase and preparing for the eventual removal of the deprecated props function from owl.
This change updates internal test references after a shared testing helper was moved to a new folder. It helps keep automated checks for manufacturing work orders and barcode stock flows running reliably, with no expected change for end users.
Original PR description
Follows the move of tour_helpers.js from web_tour's tour_automatic/ to its own tour_helpers/ folder.
The Swiss payroll interface components were updated to stay compatible with Odoo's newer web framework. This is an internal modernization that helps keep payroll screens reliable without changing business functionality.
Original PR description
As part of the Owl 3 migration, replace onWillUpdateProps hook with the appropriate Owl 3 alternatives.
This update refreshes how several Odoo Enterprise screens listen for internal events, aligning them with the latest web framework practices. It is an internal cleanup intended to keep the interface reliable and easier to maintain, with no expected change in day-to-day user workflows.
Original PR description
- comunity: https://github.com/odoo/odoo/pull/281944 See commit messages for details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr