Daily updates from Odoo
Navigate
Branch
Monday, September 1, 2025
86 changes
44 changes
New functionality added to Odoo
A new Italian payroll module adds a wizard to export employee work entries to SD Worx. This helps Italian payroll teams share payroll-related time data with their payroll provider more efficiently and consistently.
Original PR description
Created a new wizard to export work entries to SD Works Task-4574967
Helpdesk agents can now create and email gift cards directly from a customer ticket, making after-sales compensation faster and easier to track. The update also adds related ticket visibility controls, customer communication history, and quick access to gift cards created from each ticket.
Original PR description
## [IMP] helpdesk_sale_loyalty: create a gift card option in the helpdesk tickets - Added a gift card option in the `after-sales` part. - Added `Gift Card` button in the helpdesk ticket - Created a…
## [IMP] helpdesk_sale_loyalty: create a gift card option in the helpdesk tickets - Added a gift card option in the `after-sales` part. - Added `Gift Card` button in the helpdesk ticket - Created a gift card generation wizard when clicking on the `Gift Card` button - Order the `gift card`, `convert to opportunity`, and `convert to lead` buttons. - Allow visibility to the gift card option only to users with the required access - Generate a gift card for the customer and send it by email - Post the email and the attachments sent to the customer in the chatter. - Create a stat button that shows all the gift cards created in the ticket - Hide the smart buttons when users don't have sales access - Hide the `Gift Cards` stat if the `gift card` option is disabled in the settings - Make the `gift card program` selectable in the gift card form - Add a helper to the stat menu for both gift cards and coupons if nothing is found - Adjust the gift card program to show only gift card options - make `Gift Cards` active for the `VIP Support` helpdesk team in demo data --- task-4778562
This change adds Slovenian Intrastat support so businesses can use the correct local reporting periods and submission deadlines. It helps companies operating in Slovenia stay aligned with local statistical reporting requirements in Odoo.
Original PR description
[ADD] l10n_si_intrastat: Slovenian Intrastat Tax returns feature was introduced in 18.3, this module implements the specific Slovenian periodicities and deadlines for Intrastat. task-4987884
Odoo now supports creating a Stripe connected account and managing employee expense cards directly from the expense workflow. This first version focuses on EU companies and virtual cards, helping businesses issue and control employee spending more efficiently.
Original PR description
## [IMP] account_reports: Improve tests
Some reporting tests were written in a way that would prevent
adding new journals in others modules, as the accounts codes
would be shifted by one.
This adds some dynamic computation where needed, to refocus the tests on
the function, not the form
## [ADD] hr_expense_stripe{,_demo}: Stripe Issuing Integration
Adds the possibility to create a Stripe connected account through Odoo
and manage expense cards for the company's employee.
In the first implementation it will be restricted to the EU zone
and to virtual cards.
task-4370689
Co-authored-by: Logan Staelens <lost@odoo.com>
Co-authored-by: Arnaud Sibille <arsi@odoo.com>
Co-authored-by: Hugo Poncelet <hupo@odoo.com>Enhancements to existing features
The knowledge editor's revision history dialog has been improved and its automated checks were updated. This helps ensure users have a more reliable experience when reviewing prior content changes.
Original PR description
* adapt and improve tests task-3560677
Document-related settings have been reorganized across several connected Odoo apps, making configuration easier to find and understand. This should reduce setup friction for teams using Documents with accounting, approvals, fleet, recruitment, products, projects, or signing workflows.
Original PR description
\* includes: documents_account, documents_approvals, documents_fleet, documents_hr_recruitment, documents_product, documents_project, and documents_sign. This commit simply reorganize all those bridges settings. Task-4910842
VoIP call session handling has been reorganized into a dedicated structure, making the call experience easier to maintain and extend. This supports ongoing improvements in VoIP and AI-assisted VoIP features without changing the core user workflow.
Original PR description
Introduce a Session class to hold the ever-growing amount of session-related logic.
Managers can now use the appraisal campaign wizard to start appraisals for the employees they manage. This improves HR workflow by allowing managers to initiate reviews directly while keeping access limited to their own teams.
Original PR description
-Previously, managers could not access the appraisal campaign wizard to launch appraisals for their employees. -Wizard access is now available to all users, limited to the employees they actually manage. -Views were updated so all users can see the "Launch Campaign" button, but only managers can create campaigns for their subordinates.
Auto-planning now treats flexible workers according to their daily and weekly capacity instead of forcing them into a standard 8-to-5 schedule. This helps teams plan shifts and project tasks more accurately, including shared tasks and round-the-clock operations, while avoiding overbooking.
Original PR description
[IMP] planning,project: auto plan for flexible resources Before this commit: - auto plan, for planning and project, considers flex resources as regular resources working with a regular calendar from…
[IMP] planning,project: auto plan for flexible resources Before this commit: - auto plan, for planning and project, considers flex resources as regular resources working with a regular calendar from 8 to 17. for fully flexible resources, they are considered working the full range, without checking leaves, and the overload on the day itself, there is no daily limit in the calendar, but the day is limited to 24 hours. - when a task is assigned to many users, it's planned with its real allocated hours, but the real time to allocated is allocated_hours divided by the number of users. After this commit: - flex resources should not follow a regular calendar as flex calendars doesn't have attendances, they can work at any moment of the day without exceeding a number of hours per day and a number of hours per week (configured in the flex calendar). The auto plan plans shifts/tasks without exceeding daily/week rate and without following a regular calendar, a flex employee is considered working from 00:00 to 23:59 to cover more use-cases, such as restaurants, hospitals, firefighters. Same for fully flexible employees, the auto plan makes sure no overload on a range of time, example: it's not possible to do a shift/task of 4 hours between 8 and 10 (only 2 working hours available) - hours to plan for tasks = allocated_hours / number of users task-4822880
Spreadsheet pivot views can now group data using a chain of related fields, such as grouping leads by a customer's country. This makes spreadsheet reporting more precise and helps users analyze business data through richer categories without leaving the pivot configuration flow.
Original PR description
This commit adds support for grouping by a sequence of fields in the spreadsheet pivot view. It allows users to define a sequence of fields to group by, for example, grouping the Leads by the country of the customer (partner_id.country_id). Task: 4883357
After closing a VAT or tax return period, users can now email payment instructions, including payment details and a QR code, to selected colleagues. This helps route payment information to the right people and marks the return as paid once the instruction email is sent.
Original PR description
Before this commit - users who close the VAT period isn't necessarily the one who pay, they need to be able to send the VAT instructions on how to file the return. After this commit - user after closing the tax period from VAT return payment wizard can send email to selected users with vat payment details and qr code to ease tax return payment process - return state will be marked as paid once the mail is send task-4852346
The office printer test action now prints a PDF report instead of a basic test output. This makes printer checks better match real business documents and helps users confirm that report printing works as expected.
Original PR description
When clicking "test" on an office printer, we now print a pdf report, making the test print more realistic. Forward-Port-Of: odoo/enterprise#92531
VoIP now includes data for providers that have been successfully tested, making them easier for users to find and set up. This reduces configuration effort and helps businesses get VoIP services running more reliably.
Original PR description
This commit makes working providers more discoverable for users and ease the providers' configurations by adding those providers' data in VoIP be default. Task-4987919
Point of Sale scales now use a shared connection service that can switch between multiple communication methods if one fails. This improves reliability for weighing products and supports smoother operation across IoT setups.
Original PR description
We now use the iot http service to manage scales. This allows using both webrtc, longpolling or websocket when one protocol or the other is failing. This commit also refactors the IotHttpService to bring a new global `onMessage` method that handles only listenting for events with fallbacks. (e.g. waiting for an event with webrtc fails? Fallback using longpolling). Community PR: odoo/odoo#223795 Task: 5031975
The HR work entry export employee list now shows the "Contracts" column header with consistent capitalization. This small wording polish improves readability and presentation quality for payroll users exporting work entry information.
Original PR description
Capitalized the "Contracts" column header in the HR work entry export employee list view Task ID: 5047763
New salary offers are now always connected to the relevant employee or applicant and limited to people in the current company. This helps prevent offers from being created with mismatched company or person details, improving data accuracy in the salary offer process.
Original PR description
When creating a new offer: - it is always linked to either an employee or an applicant, depending on the application used, - the employee/applicant domain is restricted to the current company, - the 'company_id' is automatically set to the active company based on the chosen employee/applicant. task-4981877
The Indian reporting feature has been decoupled from the electronic signature app. This reduces unnecessary app dependencies, making setup and maintenance simpler for businesses that only need reporting.
Original PR description
This commit removes dependency between `l10n_in_reports` and `sign` module.
Manual advance invoicing for post-paid subscriptions now bills the complete billing period instead of stopping at the current date. This gives businesses more predictable subscription invoices while still accounting for products that may be delivered during the period.
Original PR description
Currently when users are manually invoicing a post-paid subscription in advance (before the next invoice date), the invoice is generated for the past period until today --> Only a partial period. This has been done to avoid users to invoice a future period during which some other products may be delivered.
taskid-4929802The GSTR document summary for GSTR-1 Table 13 is now part of the main Indian reports module instead of a separate add-on. This simplifies setup and maintenance while keeping the required compliance reporting available without extra dependencies.
Original PR description
Before: - A separate module `l10n_in_reports_gstr_document_summary` was introduced across all stable versions up to saas-18.4 to provide GSTR1 Table 13 reporting After: - From saas-18.5 onwards, the GSTR document summary functionality is merged directly into l10n_in_reports. Impact: - Consolidates functionality into a single module for easier maintenance. - Ensures GSTR-1 Table 13 compliance continues without additional dependencies. Related Upgrade PR https://github.com/odoo/upgrade/pull/8269 Original Module PR https://github.com/odoo/enterprise/pull/85473
Resolved issues and error corrections
This fix makes the French VAT report wizard handle incomplete draft records safely, avoiding crashes during automated checks or setup flows. It ensures VAT amounts are recalculated when key report dates or report selections change, improving reliability without changing the visible reporting workflow.
Original PR description
steps to reproduce the issue : 1- install l10n_fr_hr_payroll_account without demo data 2- and run this test .test_computed_fields_without_dependencies Added a dependencies using…
steps to reproduce the issue :
1- install l10n_fr_hr_payroll_account without demo data
2- and run this test .test_computed_fields_without_dependencies
Added a dependencies using @api.depends('report_id', 'date_from', 'date_to') on the _compute_vat_amount method to ensure automatic re-evaluation when any of these fields change.
In test_computed_fields_without_dependencies, the record is created using model.new(), which means required fields like report_id, date_from, and date_to may not be set yet. This caused a crash due to ensure_one() on an empty report_id.
Even though these fields are required, they are not automatically filled when using model.new() (unlike saved records).
Also introduced early exits by setting default values (vat_amount = 0.0, is_vat_due = False) and skipping computation when any of the required fields (report_id, date_from, date_to) or result VAT lines are missing because of ensure_one() in options.
These safeguards prevent errors in the test
build_error-115299
Forward-Port-Of: odoo/enterprise#87608Bank statements can now be created even when a bank journal has no outstanding receipt or payment account configured. This prevents an error that blocked users during statement creation in Accounting.
Original PR description
**Steps to reproduce:** - Install Accounting - Make sure that no outstanding receipt/payment account is configured on the Bank journal - Go to the Bank journal - Create a new statement **Issue:** A traceback is raised while executing a SQL query. **Cause:** A IN condition is evaluated with an empty tuple: `AND aml.account_id IN ()` This is due to the fact that there is no outstanding account. **Solution:** Only execute the SQL query if there is an outstanding account. opw-5039931 Forward-Port-Of: odoo/enterprise#93091
The Estonian tax report XML export now avoids creating duplicate 22% tax transaction entries. It combines the relevant report line balances into a single XML entry, helping businesses submit cleaner and more accurate tax reports.
Original PR description
Before this pr: - There are two transactions22 entries were introduced because we are having two report lines for 22% tax computation, one with '1' tag, which is valid till 31 June 2025, and another one with '1_2' tag, which is valid from 1 July 2025. After this pr: - The balance computation during export to XML is now adding the balance of both line '1' and '1_2' into line '1' only. - So now we do not need an extra transactions22 entry in the XML tax report. - We are keeping both report lines for now, but the XML report will have only one entry with the total sum of balances in both report lines Related PR: https://github.com/odoo/enterprise/pull/91364 Forward-Port-Of: odoo/enterprise#93298 Forward-Port-Of: odoo/enterprise#92662
The French VAT reporting process now uses the correct account when creating reimbursement entries. This helps ensure reimbursement accounting is posted accurately and reduces the need for manual corrections.
Original PR description
This commit will change the account used for the reimbursement move. task-4932427 Forward-Port-Of: odoo/enterprise#91212
The timesheet leaderboard now correctly shows the tip of the day when the leaderboard feature is enabled. This restores expected guidance for users viewing leaderboard dialogs and timer grid screens.
Original PR description
Steps to Reproduce: -- - Open timesheet module - Go to setting and enabled leaderboard feature - Open leaderboard dialog and there you will be able to see tip of the day is not visible Issue: -- The issue was even after enabling the leaderboard feature the tip of the day was not visible inside the leaderboard dialog which is unexpected behaviour. Cause: -- The root cause was inside the getLeaderboardData method call where we were not fetching tip from the orm call and the issue is caused by this PR https://github.com/odoo/enterprise/pull/78541 Fix: -- To resolve this, I have include tip while making orm call also store that tip value inside leaderboardData task-4981767 Forward-Port-Of: odoo/enterprise#92811
Fixes an issue where Mexican sales orders could show zero invoiced quantity after an invoice cancellation was completed through CFDI. The sales order now updates its invoiced quantities when the CFDI status changes, helping keep order and billing records accurate.
Original PR description
How to reproduce the issue: In l10n_mx: 1. Create a sale order. 2. Create an invoice from the SO, with yesterday’s date, and send it to the CFDI. 3. Lock the period at yesterday’s date. 4. Request the invoice cancellation with the “01” method. This creates a new invoice — confirm it. 5. Create a credit note for the original invoice. 6. Retry sending the cancel request to the CFDI; the CFDI state is now cancelled for the original invoice. On the original SO, the quantity invoiced is 0 despite the CFDI state of the original invoice being cancelled. This commit forces a recompute of the quantity invoiced when the CFDI state changes. Since _compute_qty_invoiced uses _get_invoice_lines, which filters out invoices in sent state, only lines from invoices in cancelled state will be taken into account. opw-4910139 Forward-Port-Of: odoo/enterprise#93480 Forward-Port-Of: odoo/enterprise#91924
Gantt popover cards now show standard labels such as Name, Start, and Stop in the user's selected language. This improves the experience for non-English users when viewing custom Gantt menus created through Studio.
Original PR description
Steps to Reproduce: - Change the language to something other than English. - Create a new menu in the Appointment module using Studio. - Link that menu with the existing model (Resource Time of…
Steps to Reproduce: - Change the language to something other than English. - Create a new menu in the Appointment module using Studio. - Link that menu with the existing model (Resource Time of Detail). - Save the changes and add the Gantt view - Save the changes and close Studio. - View this new menu in the Gantt view Issue: - When clicking onto the kanban popover card for any record, the labels will remain as "Name" , "Start" , and "Stop" in English, and it will not translate. Reason: - [1] changed the rendering of default kanban card templates from XML to JS. This changed the default template to be static. Fix: - Add a call to the translation core tool "_t" on the three labels upon their generation in _getKanbanViewParams(). This ensures that the arch template that is generated is translated correctly into the user's set language. [1] : b2e31239041e6b7850888a3ae070c3f8a40ea5ee [opw-4861899](https://www.odoo.com/odoo/my-tasks/4861899) Forward-Port-Of: odoo/enterprise#90605
Replacing work entries in the Gantt view now correctly creates a new entry using the selected type and the appropriate duration. This helps HR users avoid incorrect work entry totals when updating employee schedules, including empty days where expected working hours are used.
Original PR description
task-5043872
The AI command palette now avoids repeated background lookups while a user types. This prevents flickering and makes the command palette feel steadier and more responsive.
Original PR description
Previously, when typing in the command palette with the AI module installed, the system called `get_ask_ai_agent` on every keystroke. This caused flickering in the command palette. Now, the rpc call is made only once to retrieve the id and name, avoiding repeated calls while typing. task-4997566
This fixes Italian POS receipts so change given back to customers is not sent to fiscal printers as a negative payment. This helps ensure orders are accepted by fiscal printers and properly reported to the authorities.
Original PR description
Before this commit, specifying the payment method used to give back the change in a POS order would lead to the fiscal printer receiving a negative payment as input, which is not supported, thus leading to the order not being treated by the fiscal printer (so not reported to the government). Only the payments with is_change=true where filtered out. I am now adding a filter to only keep the positive payments in the receipt, as the fiscal printer is computing the change itself. opw-4931671 Forward-Port-Of: odoo/enterprise#91794
This update resolves an access problem that could prevent authorized HR users from viewing or using a UAE payroll salary field. The field is now limited to the appropriate HR user group, reducing errors during payroll work.
Original PR description
Issue: - Getting access error on l10n_ae_total_salary as no group defined in the field. Fix: - Added group hr.group_hr_user to this field. task-5028831
This update removes an unnecessary duplicate country field from account reports and restores the ability to edit the main country setting where needed. It also makes automatic generation default correctly for tax return types, helping reduce setup mistakes.
Original PR description
this field is no longer needed since the field country_id contains the necessary information. Also, makes the field country_id readonly=False, it was originally the case and got changed when switched to a computed field Finally, change the recently added field auto_generate to a computed field since we want the default value to be True if it is of category "Tax Return".
Fixes an issue that could block users from deleting a generated bank statement line when the related journal entry used multiple reconciliation rules. This helps accounting users correct bank reconciliations without encountering an unexpected error.
Original PR description
Currently, an error occurs when trying to remove a move line from a bank statement line if the journal entry contains lines with different reconciliation models. **Steps to Reproduce:** 1. Install…
Currently, an error occurs when trying to remove a move line from a bank statement line if the journal entry contains lines with different reconciliation models. **Steps to Reproduce:** 1. Install the Accounting module. 2. Duplicate the "Internal Transfer" reconciliation model. 3. Accounting dashboard > click on Bank > create new record. 4. Add the invoice, apply "Internal Transfer" reconciliation model. 5. Edit the balance of the line to lower, apply duplicated model(Internal Transfers (copy)). 6. Try deleting the generated Liquidity Transfer line. (Refer [this video](https://drive.google.com/file/d/1cz80Q5325x3rqYUlGahVzFIXH2iqrbRF/view?usp=drive_link) for steps to reproduce.) **Error:** ValueError - Expected singleton: account.reconcile.model(8, 6) **Cause:** In the method `delete_reconciled_line` at [1], the `reco_model_id` is fetched from `self.move_id.line_ids.reconcile_model_id`. If the move contains lines linked to multiple reconcile models, this causes a singleton error during subsequent processing. **Fix:** This commit uses the already computed `move_lines_to_remove` to retrieve `reconcile_model_id` instead of accessing it from `self.move_id.line_ids`, which may result in a multi-recordset. [1] - https://github.com/odoo/enterprise/blob/89aa58029a79928788277489414f8192aa5353e4/account_accountant/models/account_bank_statement.py#L1041-L1049 sentry-6781788260 Forward-Port-Of: odoo/enterprise#91619
The automated purchase and rental comparison test now checks the redesigned comparison bottom bar instead of an old removed button. This keeps quality checks aligned with the current shopping experience and helps prevent false test failures.
Original PR description
This PR fixes an issue with the comparison tour, which was still looking for `product_comparison_button`, which was removed in the comparison redesign. It now uses the new bottom bar component instead. task-4911142
Kenyan e-invoicing checks now ignore cancelled or draft credit notes when validating quantities and amounts against the original invoice. This prevents incorrect blocking errors when businesses create replacement credit notes after cancelling earlier ones.
Original PR description
[FIX] l10_ke_edi_edi_oscu: ensure quantity and monetary values checks are performed on reconciled reversals only. Fixes a behavior where the checks performed on the credit notes related to their quantities and monetary values include non reconciled credit notes. Steps to reproduce: 1 - activate `l10n_ke` on some company. 2 - Create an invoice. 3 - Create a partial or full credit note ( this one will be reconciled with the invoice automatically ) 4 - cancel the credit note or reset it to draft. 5 - create another credit note where the quantities and/or monetary values exceed that of the invoice if summed up with the cancelled credit note. Following the steps will result in an error message saying that the monetary value or quantities on the credit notes exceed that of the invoice. The correct behavior is to simply not count any credit note that isn't explicitly reconciled with the invoice. opw-4779976 Forward-Port-Of: odoo/enterprise#92319
Sales commission reports now use the right database access mode when preparing report data. This prevents warnings or failures when users open commission reports, improving reliability without changing report content.
Original PR description
Since https://github.com/odoo/enterprise/pull/88646 a temporary table is created to speed up computation of commission report. As dislayng the report is creating and dropping the temporary table, it is not compatible anymore with a read only cursor. This commit ensure that a read write cursor is used to prevent warning and errors. task-4982555 Forward-Port-Of: odoo/enterprise#91352
This fix avoids unnecessary warning messages when automated tests create document records from reports that only look like PDFs. It keeps test logs cleaner and reduces noise for teams validating document and accounting workflows.
Original PR description
Following the activation by default of account document synchronization, a lot of tests now create indirectly documents. In test mode, IrActionsReport._pre_render_qweb_pdf renders pdf as html but with the pdf mime type leading to a warning when this fake pdf is provided to documents_document._get_is_multipage method. In odoo/enterprise#90662, we have prevented _get_is_multipage to emit a warning by turning it in an info log when in testing mode, and we detect that the document content is actually a html content. Unfortunately, at that time, pypdf was not emitting a warning so we have done that check when an error happens. To solve the problem we check the content before sending it to pypdf to avoid the pypdf warning. Task-5052041
Fixed an issue where users saw an Aadhaar warning popup unnecessarily when editing signer settings with multiple documents uploaded. Users can now assign roles and save signer changes without irrelevant interruptions.
Original PR description
**Vession:** - saas-18.5 **Steps to reproduce:** - Add Signer - Click three dot menu - Click Edit - Change something / nothing - Save **Issue:** - When multiple documents are uploaded, the Aadhaar popup always appears when opening the signer settings panel. **Solution:** - Added a condition to check for multiple documents and roles before showing the Aadhaar popup. **Impact:** - Now you can upload multiple documents, assign roles, and save without seeing unnecessary warnings. task-5051317
This fixes a payroll settings issue so Croatia-specific configuration options are tied to the correct country. It helps ensure businesses see the appropriate payroll settings for their localization and avoids confusion from incorrect country targeting.
Original PR description
ref - https://github.com/odoo/enterprise/pull/83609
Receipts now correctly show the order tracking number when a point-of-sale setup uses a preparation display or preparation printer. This helps staff and customers match receipts with prepared orders more reliably.
Original PR description
- Ensure the `tracking_number` is dipslayed on receipts for config which use a preparation dipslay or a preparation printer. task-id: 4922308 community PR: https://github.com/odoo/odoo/pull/222094 Forward-Port-Of: odoo/enterprise#93318 Forward-Port-Of: odoo/enterprise#91833
Payslip calculations for terminated employees in Egyptian payroll now continue even when the employee has no annual leave allocation. Instead of crashing, the system treats the remaining leave as zero, helping payroll teams process final payslips reliably.
Original PR description
When computing payslips for terminated employees (archived) with no annual leave allocations, the method `_l10n_eg_get_annual_remaining_leaves` raised a traceback due to missing allocation data. This fix ensures the method safely handles employees without allocations by returning 0 remaining leaves instead of crashing. This guarantees payslip computation works correctly for employees with no leave allocations. task-5026406 Forward-Port-Of: odoo/enterprise#92777
Default values for tax return types are now applied when companies and return types are created, rather than only during initial chart setup. This prevents missing or incorrect defaults when country-specific reporting modules are installed later, improving consistency for accounting compliance setups.
Original PR description
Before the company dependent default values for the return types were set only during the ```_post_load_data``` of the chart template. The issue with this way is that when we install a l10n for instance 10n_be_reports which add new return types, l10n_be would create a new company then trigger the _post_load_data function on return types that existed at that time. The only problem is that return types from l10n_be_reports are still not installed. The change here is that we set the default value on the creation of the company and return type.
Fixed an issue where returning a rental order linked to a Point of Sale picking could incorrectly increase the delivered quantity. This helps keep rental order records accurate after PoS settlement and return workflows.
Original PR description
**Issue:** Before this commit, the qty_delivered was wrong when using the Return button when a Picking was made in PoS **Cause:** The `_compute_qty_delivered` method in `pos_sale` adds `pos_line.qty`…
**Issue:** Before this commit, the qty_delivered was wrong when using the Return button when a Picking was made in PoS **Cause:** The `_compute_qty_delivered` method in `pos_sale` adds `pos_line.qty` to the related `sale_line` each time it runs When there is no PoS order, the method add 0 to the line, so the expected behavior work But when you have a PoS Picking, a quantity was added to `qty_delivered` each time the `rental.order.wizard` is used The issue also occured earlier when the `flush_all()` is called in `_process_order()` **Fix:** There is already a `_compute_qty_delivered` method in `pos_sale_stock_renting` that override the `qty_delivered` But it's restricted by `_are_rental_pickings_enabled()` That's not necessary because we don't use any `stock.picking` in the `_compute_qty_delivered` function, only `stock.move` so we removed that verification To make the code working, we also need to extend the _get_outgoing_incoming_moves() results Because there were also block by a `_are_rental_pickings_enabled()` condition even if there is only moves here We need all the moves to calculate `qty_delivered` properly **Steps to reproduce:** - Create a New Product "Rental PoS" that Can be Rented - Create and confirm a New Rental Order, with any customer and your product - Open a PoS Session - Click on Quotation/Order - Choose the last Order and Settle the order - Click on Yes (to confirm import to PoS) - Click on Payment, select Cash and Pay - Go in the Backend, and to your RO - Click Return and Validate - Before the fix, the Delivered should be 2.0 opw-4877019 Forward-Port-Of: odoo/enterprise#93406 Forward-Port-Of: odoo/enterprise#90510
Features or functions removed from Odoo
The payroll pay run kanban view no longer shows the see-off cycle button, and the related action has been removed. This simplifies the screen by removing an option that is no longer needed, reducing clutter for payroll users.
Original PR description
Remove the button from the header in Kanban view and remove its corresponding action. task-5026008
Code cleanup and technical improvements
This change adjusts several guided test flows so a shared browser testing helper is loaded only when it is needed. It should reduce unnecessary upfront loading in the test environment while preserving existing business workflows.
42 changes
New functionality added to Odoo
Adds support for Taiwan electronic invoicing through ECPay, enabling businesses to send, refund, and print compliant invoices directly from Odoo. This helps companies operating in Taiwan streamline invoicing workflows and meet local e-invoicing requirements.
Original PR description
This commit adds the module for implementing the ECPay integration for Taiwan's electronic invoicing system task-2663805 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Enhancements to existing features
This update lets developers run selected Odoo tests directly from the shell after changing test code, reducing the need for full server restarts during debugging. It improves developer productivity and supports faster validation of changes, while business logic changes still require restarting the shell.
Original PR description
This commit introduces a new function `run_tests` to the Odoo shell. This function allows users to run specific tests directly from the shell, even after the test code is modified. This significantly…
This commit introduces a new function `run_tests` to the Odoo shell. This function allows users to run specific tests directly from the shell, even after the test code is modified. This significantly speeds up the debugging process by avoiding the need for a full server restart. In the odoo shell ``` >>> from odoo.tests.shell import * >>> run_tests(env, 'test_tags', modules=[module_name], reload_tests=True) ``` Note: `run_tests` automatically reloads test modules but does not reload Odoo model code. A shell restart is still required after any change to business logic. used by https://github.com/HydrionBurst/odoo-test-vscode for hot test vscode extension: [odoo-test-0.0.1.vsix.zip](https://github.com/user-attachments/files/22089685/odoo-test-0.0.1.vsix.zip) tutorial: https://github.com/HydrionBurst/odoo-test-vscode?tab=readme-ov-file#-hot-test Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#224048
This change adds support for official Turkish company information codes needed for compliant Nilvera invoice submissions. It prevents invoices from being sent when required codes are missing or empty, and ensures those codes appear consistently in both PDF and XML outputs.
Original PR description
Description of the issue/feature this PR addresses: Nilvera requires official codes on company contacts for submission to be compliant. Current behavior before PR: Invoices may be sent to Nilvera…
Description of the issue/feature this PR addresses: Nilvera requires official codes on company contacts for submission to be compliant. Current behavior before PR: Invoices may be sent to Nilvera without the required codes, resulting in non-compliance. Currently, only the VKN and TCKN codes are sent, while other required codes are not supported. Desired behavior after PR is merged: Official codes are added as non-deletable tags (non-mandatory ones archived). An error is raised when required tags are missing or empty. Invoices cannot be sent to Nilvera without valid codes. Codes are always reflected in both PDF and XML. [IMP] l10n_tr_nilvera: support for official information codes Added codes as tags from the official list and archived non-mandatory ones. These tags cannot be deleted, and an error is shown on attempt. Invoices are blocked from being sent to Nilvera if either MERSISNO or TICARETSICILNO is missing, or if assigned but without a value. Codes are reflected in both PDF and XML. task-4992049 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#223182
Improved translations for Spanish Latin American language for some terms in MX localization task-4938338 target: 17.0 -> master Forward-Port-Of: odoo/enterprise#91875
Original PR description
Improved translations for Spanish Latin American language for some terms in MX localization task-4938338 target: 17.0 -> master Forward-Port-Of: odoo/enterprise#91875
Resolved issues and error corrections
This fix ensures employee time-off timesheets are recreated correctly when a related public holiday is deleted or its working calendar changes. It prevents missing or duplicated timesheet entries, helping payroll and project reporting remain accurate after holiday schedule updates.
Original PR description
…ay change **Steps to reproduce** - Create a public holiday without a calendar during a work day. - Create a leave for an employee overlapping the public holiday for a time off type generating…
…ay change **Steps to reproduce** - Create a public holiday without a calendar during a work day. - Create a leave for an employee overlapping the public holiday for a time off type generating Timesheets. Validate it. - Expected: on the day of the public holiday, no timesheet is generated for the `hr.leave` to avoid duplication. - Either delete the public holiday, or set a calendar on it different than the one defined on the employee. - Issue: the public holiday timesheet has been deleted, but its deletion should've lead to the creation of the `hr.leave` timesheet that we didn't create at the time the public holiday existed. - Second issue: after that, change the calendar of the public holiday to the same as the employee's. Still a missing timesheet. **Solution** We can use `_reevaluate_leaves` to find the leaves affected by changes in public holidays. `_generate_timesheets` then re-generates the timesheets as if the leave was just validated (the call to `list_work_time_per_day` ignores the already present resource.calendar.leave). We also check missing public holidays timesheets to fix the second issue. opw-4819697 Forward-Port-Of: odoo/odoo#216901
This fix prevents an error in Spain's Veri*Factu electronic invoicing flow when a company has no tax ID recorded. It makes the batch sending check more reliable, avoiding interruptions caused by incomplete company setup.
Original PR description
Replaced `['NIF']` with `.get('NIF')` to avoid a `KeyError` when the company does not have a NIF.
When the VAT value is not set on the company and the `_send_as_batch_check` method is executed, the system raises an error from [1].
This PR updates the code to use `.get('NIF')` instead of direct access, making it more robust.
[1]: https://github.com/odoo/odoo/blob/dff2423ac320fdb97d6bf1f106dc84be1d71cac2/addons/l10n_es_edi_verifactu/models/verifactu_document.py#L1165
**sentry-6829500308**
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis fix ensures online point-of-sale payment orders send their order date in the expected universal time format. It helps prevent timezone-related mismatches between the customer-facing payment flow and the backend records.
Original PR description
In 2a5f1ab, we formatted the `order_date` with `toFormat(...)`, however, that transforms the date into local, while the backend expects it to be in UTC. In this commit, we set the date tz back to UTC before formatting it. opw-4942697
Return slips for returned deliveries are now generated in the customer's preferred language. This avoids confusion for customers and keeps return documentation consistent with their sales order language.
Original PR description
In this bug, the language of return label is not set properly. The return label should be in customer language. To reproduce: 1- Create a quote for a client with a specific lang, e.g. fr and and confirm the order 2- In Delivary, return the order 3- Print Return slip 4- As you can see the return label is in wrong language In this fix, we put the template inside a wrapper template. It makes it be translated correctly. opw-4945685
Journal entry numbers can no longer be changed directly from the list view when the entry is not in draft. This helps preserve accounting data integrity and prevents accidental edits to finalized entries.
Original PR description
**Issue** It was possible to edit the journal entry number in the list view even when the entry state was not 'draft'. **Steps to Reproduce** 1. Go to Accounting > Accounting > Journal Entries. 2. Select any journal entry. 3. Double-click on the Journal Number field and attempt to edit it. **Root Cause** The 'name' field in the list view did not have a readonly attribute, allowing inline editing regardless of the journal entry's state. Opw-5009421 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change restores the ability to find products in purchase orders using a vendor's product code or name. It reverses a previous display change that showed extra vendor information but unintentionally made supplier-based product searches fail.
Original PR description
This reverts commit 28d53e0e565e266ca3fa2b67e359b4383fa42c36. The commit displayed both product name and vendor name in a purchase order form. However, it breaks the search using the vendor code/name. https://github.com/odoo/odoo/pull/223250 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Hungarian electronic invoicing now classifies credit notes more accurately when an invoice has already received a payment. This prevents incorrect STORNO submissions to NAV and helps businesses keep tax reporting aligned with the actual payment history.
Original PR description
Before this PR: - Previously, a credit note was marked as STORNO if the base invoice's residual amount was zero, regardless of whether any payments had been made. This led to incorrect STORNO reports being sent to NAV in cases where the invoice had been partially or fully paid before reversal. After this PR: - If any payment was made, the credit note is marked as MODIFY instead of STORNO. Example: - Case 1: No payments before reversal Invoice: 1000 Credit Note 1: -100 Credit Note 2: -900 => Credit Note 1 should be sent as a Modification, Credit Note 2 as STORNO. - Case 2: Payments before reversal Invoice: 1000 Payment: -100 Credit Note: -900 => The Credit Note should be sent as a Modification. task-4818762 Forward-Port-Of: odoo/odoo#211831
This fix prevents projects from failing to open when a saved embedded action points to a module that has since been uninstalled. It cleans up those saved actions properly, so users are not blocked by outdated Timesheets-related filters after uninstalling the app.
Original PR description
The system failed to evaluate the embedded action, which refers to the Uninstalled module. Steps to produce: 1. Install `Project` and `Timesheets`. 2. Go to Project and open any project. 3. Click on…
The system failed to evaluate the embedded action, which refers to the Uninstalled module.
Steps to produce:
1. Install `Project` and `Timesheets`.
2. Go to Project and open any project.
3. Click on the embedded action icon and select `Timesheets`.
4. Save the view from the embedded action's icon.
5. Now, Uninstall `Timesheets`.
6. Now, go to that Project and try to open it.
Error:-
`KeyError: 'allow_timesheets'`
`ValueError: Invalid field in filter of project.project:
[('allow_timesheets', '=', True)]`
Solution:-
- Here,
https://github.com/odoo/odoo/blob/e7efc2c3ad70aa9273412b089a71a9ade75ad525/odoo/addons/base/models/ir_embedded_actions.py#L19
- Also, use `ondelete="cascade"`. but `ondelete="cascade"` not works on `ir.actions.actions`.
https://github.com/odoo/odoo/blob/e7efc2c3ad70aa9273412b089a71a9ade75ad525/odoo/addons/base/models/ir_actions.py#L117-L127
We should remove `ondelete="cascade"` from the `action_id` field and add explicit unlink logic for `ir.embedded.actions`in the unlink method.
Sentry - 6495174314
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prDeleting a group chat from the messaging menu is corrected so users no longer encounter an unexpected error. This improves reliability in the Discuss messaging experience and avoids disruption when managing conversations.
Original PR description
task-4860196
This fix prevents an error when sales teams use lead assignment filters based on custom CRM lead properties. Businesses can now use property-based rules reliably to route leads to the right salespeople.
Original PR description
The system gives an error if we set the filter in the relation of lead_properties. Steps to Produce: 1. Install the `CRM` module. 2. CRM > Configuration > Settings. 3. Enable the `Rule-Based…
The system gives an error if we set the filter in the relation of lead_properties. Steps to Produce: 1. Install the `CRM` module. 2. CRM > Configuration > Settings. 3. Enable the `Rule-Based Assignment` and save the changes. 4. CRM > Reporting > Leads, then go to list view. 5. Click on NEW and add the required values. 6. From the gear icon, click on Add properties, set a random value, and then save. 7. CRM > Sales > Teams. 8. Click on the 3 dots of any team and click on Configuration. 9. Add the new salesperson and set the Lead Assignment Filter like Properties > Property 1(name of the property you added in lead form view) - is equal - demo (values of that property that you gave previously) and then save. 10. Click the gear icon and select the CRM: Lead Assignment. Error: `AttributeError: ' dict ' object has no attribute '_fields'` Solution: The code filters records based on complex domain conditions and combines matching IDs using logical operators. It also supports special fields like properties. Sentry - 6544761414
This fixes a mismatch where quality checks could remain linked to the original receipt after part of a transfer was moved into a new wave. Users will now see and process the right quality checks on the correct picking, reducing errors during receipt and wave operations.
Original PR description
*{quality_control,stock}_picking_batch ### Steps to reproduce: - Got to Quality > Quality control > Control Point - Create a quality control point: - Operation: receipt - Control per quantity or…
*{quality_control,stock}_picking_batch
### Steps to reproduce:
- Got to Quality > Quality control > Control Point
- Create a quality control point:
- Operation: receipt
- Control per quantity or product
- Create a and confirm a receipt transfer with 2 products
- Go to the receipt list view > select your receipt > Wheel action > Add to wave > Add to a new wave > Add only one of the move line to the wave
#### > A new picking is created and the move line reassigned to it but the related quality check picking_id is not updated.
> In particular, there is no "quality check" button on the new picking and the "quality check" button of the first picking allows you to process a QC related to the wave transfer.
### Cause of the issue:
While the move lines or move are can be moved to a new picking during the `_add_to_wave` call:
https://github.com/odoo/odoo/blob/605e47a85561614c17fe2e6f59618610f87c69bb/addons/stock_picking_batch/models/stock_move_line.py#L69-L90 Nothing is done with respect to the quality check which pciking_id field is not computed:
https://github.com/odoo/enterprise/blob/d73f7ef6fe61ccddbe1fe4e32c1670611ba3c5d2/quality/models/quality.py#L185
### Fix:
While the quality check measured on move_line are linked to a move line, the quality checks measured on products and operation are not. For the first kind, we rely on an override of the write method of stock move lines to reassign the check to the apporpiate picking. For the other kinds, we add a post batch hook to unlink the obsolete checks and recreate the appropiate one. Note that since operation and product types are created during the action confirm of moves and since certain moves will be created and auto confirm during the new picking creation here: https://github.com/odoo/odoo/blob/73fd3af560c967f41339bfc4c71a51dc5baba4a8/addons/stock_picking_batch/models/stock_move_line.py#L90 https://github.com/odoo/odoo/blob/73fd3af560c967f41339bfc4c71a51dc5baba4a8/addons/stock/models/stock_picking.py#L857 https://github.com/odoo/odoo/blob/73fd3af560c967f41339bfc4c71a51dc5baba4a8/addons/stock/models/stock_picking.py#L1263-L1267 https://github.com/odoo/enterprise/blob/b99d7073a34b24d4d3b863278e68f292fdd3c0b0/quality_control/models/stock_move.py#L12-L15 we rely on the `extra_move_mode` to avoid quality check creation during this step (as they will be created in the hook).
Enterprise: https://github.com/odoo/enterprise/pull/92951
opw-5009635
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#223852This fixes an issue where an empty PDF attached to a sales quote could trigger an error during validation. The system now skips the encryption check when there is no document content, helping quote setup and data loading complete reliably.
Original PR description
If the document is empty we don't need to check for encryption. Otherwise we risk getting an error. ``` Traceback (most recent call last): File "/home/odoo/src/odoo/18.0/odoo/tools/convert.py", line…
If the document is empty we don't need to check for encryption. Otherwise we risk getting an error.
```
Traceback (most recent call last):
File "/home/odoo/src/odoo/18.0/odoo/tools/convert.py", line 544, in _tag_root
f(rec)
File "/home/odoo/src/odoo/18.0/odoo/tools/convert.py", line 444, in _tag_record
record = model._load_records([data], self.mode == 'update')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 5500, in _load_records
data['record']._load_records_write(data['values'])
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 5418, in _load_records_write
self.write(values)
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 4827, in write
real_recs._validate_fields(vals, inverse_fields)
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 1631, in _validate_fields
check(self)
File "/home/odoo/src/odoo/18.0/addons/sale_pdf_quote_builder/models/product_document.py", line 46, in _check_attached_on_and_datas_compatibility
utils._ensure_document_not_encrypted(base64.b64decode(doc.datas))
File "/home/odoo/src/odoo/18.0/addons/sale_pdf_quote_builder/utils.py", line 12, in _ensure_document_not_encrypted
if pdf.PdfFileReader(io.BytesIO(document), strict=False).isEncrypted:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/18.0/odoo/tools/pdf/__init__.py", line 91, in __init__
super().__init__(stream, strict)
File "/home/odoo/.local/lib/python3.12/site-packages/PyPDF2/_reader.py", line 317, in __init__
self.read(stream)
File "/home/odoo/.local/lib/python3.12/site-packages/PyPDF2/_reader.py", line 1408, in read
self._basic_validation(stream)
File "/home/odoo/.local/lib/python3.12/site-packages/PyPDF2/_reader.py", line 1449, in _basic_validation
raise EmptyFileError("Cannot read an empty file")
PyPDF2.errors.EmptyFileError: Cannot read an empty file
```
Description of the issue/feature this PR addresses:
Current behavior before PR:
Desired behavior after PR is merged:
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis fixes a crash that could happen when testing a CSV import containing an unsupported company-related field. Instead of failing with an error, the import test now handles the missing field conversion gracefully, helping users validate files without interruption.
Original PR description
The system will crash when we import a CSV with a field `employee_properties_definition` and click on `Test`. Steps to Produce: 1. Install `Employees`. 2. Go to Settings > User & Companies > Companies > Import Records. 3. Upload a file with the column title `employee_properties_definition` and provide any data. 4. Click on `Test`. Error:- `TypeError: 'NoneType' object is not callable`. Solution:- - To handle the case where the converter is `None`, resulting in a `TypeError`, I included TypeError in the `except` block. This ensures graceful handling when a field's converter is not properly defined. Sentry - 5854109138 I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents Odoo from crashing when a user saves a report or view with empty source content. Instead of failing with an error, the system now handles the empty content safely, improving stability for users working with Studio and reports.
Original PR description
The system will crash when they get the view where the arch is null. Steps to Produce: 1. Install `Sales` and `Studio`. 2. Sales > Toggle studio > Reports. 3. Click on New > External. 4. `Add a separator` to the page after `Expression` and save the report. 5. On the right side, click on `Edit Source`. 6. Remove all content and save the report. Error: `lxml.etree.XMLSyntaxError: Document is empty, line 1, column 1` Solution: - I used the try-except block to prevent the application from crashing when `view.arch` is empty. Sentry - 6288795955 Related Enterprise PR-https://github.com/odoo/enterprise/pull/84503 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
When Greek MyDATA bill retrieval fails due to access or data issues, the system now records a warning instead of a full error traceback. This reduces unnecessary error noise for expected user-side problems and makes logs easier to review.
Original PR description
Currently, the system logs an error when a `RequestException` or `ValueError` occurs while fetching MyDATA bills.
**Error:**
`Something when wrong when fetching MyDATA bill: HTTPError('403 Client Error: Forbidden for url: https://mydataapidev.aade.gr/RequestDocs?mark=0&dateFrom=03%2F04%2F2025&dateTo=02%2F07%2F2025`
**Root Cause:**
At [1], using `_logger.error` for `RequestException` or `ValueError` causes unnecessary tracebacks for user-side issues, such as forbidden access.
[1]
https://github.com/odoo/odoo/blob/1b657cf1e1ce43874a3ede307b2f8ad68216aa56/addons/l10n_gr_edi/models/res_company.py#L54-L55
This commit ensures `RequestException` or `ValueError` are logged as warnings instead of `error`, preventing unnecessary tracebacks and correcting the `typo` in the log message.
sentry–6713444740The website editor now handles temporary connection problems when accessing Odoo's media service. This prevents a DNS or network hiccup from causing a visible error, making media browsing more reliable for users.
Original PR description
The error was probably caused by a temporary failure in DNS resolution, preventing the domain `media-api.odoo.com` from being translated into an IP address.
Error:
`ConnectionError: HTTPSConnectionPool(host='media-api.odoo.com', port=443): Max retries exceeded with url: /media-library/1/search (Caused by NameResolutionError('<urllib3.connection.HTTPSConnection object at 0x72ea796dfce0>: Failed to resolve 'media-api.odoo.com' ([Errno -2] Name or service not known)'))`
Solution:
- Wrapped the HTTP request in a `try-except` block to catch and handle request-related exceptions.
sentry-6544378472
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prSales orders now correctly remove all nested combo product lines when a parent combo product is deleted. This prevents an error that could block users from saving orders after replacing combo items with another combo product.
Original PR description
Currently, an error occurs when a combo product is added to a sales order, and one of its combo items is replaced with another combo product, then the original parent combo product is deleted. Steps…
Currently, an error occurs when a combo product is added to a sales order, and one of its combo items is replaced with another combo product, then the original parent combo product is deleted. Steps to reproduce: - Create a sales order and add a combo product to it. - Modify one of the combo items by replacing it with another combo product. - Delete the original parent combo product from the order lines and save. Error: `ValueError: Expected singleton: sale.order.line()` The error occurs because the parent combo item is deleted, which causes `line.virtual_id` to become False. As a result, the filter [1] returns no matching records, and ensure_one() fails by raising a singleton error due to receiving zero records. This happens because the function [2] called from onchange in `sales_order` [3] that performs all the changes only checks the first level of combo items and doesn’t handle cases where those items are also combo products with their own linked items. This commit fixes the error by properly deleting all nested combo items in the sales order, ensuring no leftover items from nested combos remain that could cause errors. [1] - https://github.com/odoo/odoo/blob/7bb84621b773cdd7e9984222d61d70d622f8ac43/addons/sale/models/sale_order_line.py#L1567-L1569 [2] - https://github.com/odoo/odoo/blob/57b4056798b9a380027fd3da1c4f3965249a4509/addons/sale/models/sale_order_line.py#L1572-L1591 [3] - https://github.com/odoo/odoo/blob/7bb84621b773cdd7e9984222d61d70d622f8ac43/addons/sale/models/sale_order.py#L922 sentry-6653847384 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Website setup now continues safely if the default homepage has been deleted. This avoids a crash during website creation and lets users complete configuration even when the original homepage record is no longer available.
Original PR description
The error occurred because the website.homepage view was deleted. When the website configurator attempted to access it, a ValueError was raised. Steps to replicate: - Initialize a DB without any apps installed. - Manually install website and wait till u reach `Website Configurator` page. - Duplicate the current window and search for `views`, search `homepage` and delete the first record that you find. - Go to `website > site > pages` and delete the record with page title as `Home`. - Go back to the page with website configurator and build the website. Error: `ValueError: No record found for unique ID website.homepage. It may have been deleted.` Solution: - Used `raise_if_not_found=False` with `viewref()` to avoid crashing if the homepage view is missing. - Safely skipped rendering the homepage instead of raising an error. sentry-6311940742 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Manufacturing setup now requires a reference sequence, preventing users from saving an incomplete operation type that can later break sample loading or manufacturing order creation. This avoids a confusing system error and makes the manufacturing workflow more reliable when demo data is not installed.
Original PR description
The error was caused by missing `sequence_id` during Manufacturing Order creation. This led to an invalid SQL query where `id = False`. Steps to Replicate: - Install `MRP` without any demo data (--without-demo=1). - Go to `Inventory > Configuration > Operation Types`, click on `Manufacturing`. - Remove the value from the field `Reference Sequence` and Save. - Go to Shop Floor and then click on `Load Samples` and the error should occur. Error: `UndefinedFunction: operator does not exist: integer = boolean LINE 1: SELECT number_next FROM ir_sequence WHERE id=false FOR UPDAT...` Solution: - Made the `Reference Sequence` field required to prevent errors caused by leaving it empty during record creation. sentry-6589772561 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Editing a reordering rule linked to an existing manufacturing order no longer triggers an unexpected error. This keeps inventory planning updates working smoothly when businesses adjust replenishment settings for manufactured products.
Original PR description
Currently, an error is encountered while editing a Reordering Rule which is already related to some confirmed MO. **Setup:** - Install mrp and sale_management. - Create a storable product with the…
Currently, an error is encountered while editing a Reordering Rule which is already related to some confirmed MO. **Setup:** - Install mrp and sale_management. - Create a storable product with the Manufacture route enabled and its on-hand quantity set to 0. - Create a Bill of Materials (BoM) for the product and also add at least 1 component. - Create a Reordering Rule for the product with Min Quantity 0 and Max Quantity 0. **steps to reproduce:** - Create and confirm a Sales Order for 40 units of the product. This generates a Manufacturing Order (MO). - Navigate to the generated MO and add a line for Work Order(set Expected Duration: 1000min). - Edit the product's Reordering Rule (e.g., change the min Quantity). for steps reference you can use [this video](https://drive.google.com/file/d/120srSySVHI0FzaWCruz0LVIBKCjK4oOL/view?usp=sharing) **Error:** `KeyError: 1` **Root Cause:** - The KeyError is triggered when a reordering rule is edited. At this moment, the system calls the `_quantity_in_progress` method to update the forecast. This method prepares a results dictionary (res) that only knows about the ID of the record currently being edited (which might be a new, unsaved record with a temporary ID). - The issue arises in the loop that processes confirmed Manufacturing Orders, at [1], the value of orderpoint.id is still `<NewId origin=2>` and on trying to access it at [1] causing an error [1]- https://github.com/odoo/odoo/blob/f1e11af050aa4d7be40e5179dc67a74ff81de076/addons/mrp/models/stock_orderpoint.py#L138 **Solution:** This commit ensures that only valid orderpoint IDs are processed at [1] Sentry-**6135193468**
Payment attempts using Adyen now handle unreachable or incorrectly configured API addresses without producing large technical error tracebacks. This keeps logs cleaner and helps teams focus on the underlying configuration issue instead of noisy system error reports.
Original PR description
Currently, an error occurs when the Adyen API endpoint is unreachable due to invalid domains or DNS resolution issues, the system logs a full traceback. **Error:** `ConnectionError:…
Currently, an error occurs when the Adyen API endpoint is unreachable due to invalid domains or DNS resolution issues, the system logs a full traceback.
**Error:**
`ConnectionError: HTTPSConnectionPool(host='000.adyen.com', port=443): Max
retries exceeded with url: /checkout/V71/paymentMethods (Caused by
NameResolutionError('<urllib3.connection.HTTPSConnection object at
0x7c4ec2c8f140>: Failed to resolve '000.adyen.com' ([Errno -2] Name or service
not known)'))`
**Root Cause:**
At [1] and [2], using `logger.exception` for `HTTPError` and `ConnectionError` causes unnecessary tracebacks for user-side issues like invalid API domains.
[1]
https://github.com/odoo/odoo/blob/bfb9c0141e595c97cd25ace1a219183cc213b0c4/addons/payment_adyen/models/payment_provider.py#L124-L127 [2]
https://github.com/odoo/odoo/blob/bfb9c0141e595c97cd25ace1a219183cc213b0c4/addons/payment_adyen/models/payment_provider.py#L132-L133
This commit ensures `ConnectionError` and `HTTPError` are logged as `warnings` instead of `exceptions`, preventing unnecessary tracebacks.
sentry - 4955120723Activating PEPPOL Electronic Invoicing no longer fails when a company profile has no country set. This helps users complete setup more reliably and avoids an unexpected error during configuration.
Original PR description
Currently, an error occurs when attempting to activate `PEPPOL Electronic Invoicing` without a country set on the company profile. **Steps to produce:** - Install `l10n_be` and `account_peppol` modules. - Switch to `BE Company CoA`. - Navigate to: `Settings > Users & Companies > Companies > BE Company CoA` and remove the `country name` from the `Address`. - Open `Settings`, search `'PEPPOL Electronic Invoicing'`, and click on `'Activate Electronic Invoicing'`. **Error:** `AttributeError: 'bool' object has no attribute 'upper'` **Root Cause:** At [1], `wizard.company_id.country_code` is `False`, and calling `.upper()` on it raises an `error`. [1] https://github.com/odoo/odoo/blob/c88c1e2f69c7cb25ac9c51d91ea7f47c9236e229/addons/account_peppol/wizard/peppol_registration.py#L83 This commit prevents error when user activate `PEPPOL Electronic Invoicing` and country is not set on company profile. Sentry – 6680941491
The website editor now handles incorrectly formatted web addresses more gracefully when users add image links. Instead of triggering a technical error, it shows a clear validation message so users can correct the URL by including the proper prefix such as http:// or https://.
Original PR description
Currently, an error occurs when the user adds an invalid URL without a scheme (e.g., http:// or https://). **Steps to produce:** - Install the `website` module. - Open the Website app and click `Edit`. - From the `Categories` section, drag and drop the `Images snippet` onto the page. - Double-click on the image. - In the `Documents` tab, enter `'www.kalkiranonlinestore.com'` in the `Add URL` field and click `Add URL`. **Error:** **MissingSchema: Invalid URL 'www.kalkiranonlinestore.com': No scheme supplied. Perhaps you meant https://www.kalkiranonlinestore.com?** **Root Cause:** At [1], the URL is missing a valid scheme (`http:// or https://`), causing an error. [1] https://github.com/odoo/odoo/blob/9f45d0de54f8349c18cabeb08be95c9b841b98b4/addons/html_editor/controllers/main.py#L255 This commit ensures an error message is raised when the user provides an invalid URL format. Sentry – 5967688614
Odoo no longer crashes when the Accounting Audit Trail menu item has been deleted or is unavailable. This keeps users from seeing an error page during normal navigation and makes the system more resilient to menu configuration changes.
Original PR description
Currently, If a user deletes the `account.account_audit_trail_menu` record from Settings → Technical → User Interface → Menu Items, ValueError is encountered.
**Steps to Reproduce:**
1) Install the `Accounting (account + accountant)` modules.
2) Activate Developer Mode, Navigate to `Settings → Technical → User Interface → Menu Items`.
3) Search for `Audit Trail` and **delete** the corresponding menu item.
4) Refresh any page.
**Error:**
ValueError: External ID not found in the system: account.account_audit_trail_menu** **Traceback (most recent call last)
**Root Cause:**
- The override of `_load_menus_blacklist()` unconditionally calls `env.ref('account.account_audit_trail_menu')`, which, by default, raises if that XML-ID is absent.
**Solution:**
- Use the `raise_if_not_found=False` flag on `env.ref()` and only append the menu ID when the reference actually exists.
Sentry-6590284629This fix stops spreadsheet pivots from offering JSON-based fields, such as Analytic Distribution, as grouping columns. Users can build Sales Order Line pivots without hitting a crash caused by unsupported field types.
Original PR description
Steps to reproduce: - Create a spreadsheet with a pivot on Sales Order Lines - Add "Analytic Distribution" as column => Boom Note that the test for this fix is add in the enterprise codebase Task-5055300 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Uploading a file to a request or replacing a file through the manage versions dialog now shows progress on the existing document instead of creating a duplicate card or row. This reduces confusion for users and keeps the document list accurate during uploads.
Original PR description
Step to reproduce: 1. Upload a file to a request: - Create a Request. - Upload a file for that request. - Another Kanban card / List row is created showing the upload progression. 2. Upload a file into the manage version dialog. - Manage version for an existing document. - Upload a new document. - Another Kanban card / List row is created showing the upload progression. The upload progression should be shown on the existing document. Task-4863051
The Chilean electronic invoicing demo data now includes the required certificate identifier, preventing errors when users test sending invoices to the SII. This helps trial and training environments work out of the box without affecting production certificates.
Original PR description
**Issue** When installing l10n_cl_ed, the `subject_serial_number` field is left empty. This causes an error when attempting to send an invoice to the SII. **Steps to Reproduce** 1. Install Accounting and l10n_cl_edi 2. Create and confirm an invoice 3. Click "Send Now to SII" 4. Error: Invalid Operation **Root Cause** The `subject_serial_number` is not set during installation, and this field is required for electronic document generation. **Fix** Restore the behavior from version 17.0 by setting a default `subject_serial_number` if it's missing and the certificate is available. This ensures the demo data is functional and allows users to test the SII integration out-of-the-box. Opw-4961801
The rental checkout test now waits for the cart and page updates to finish before checking totals. This helps prevent false build failures caused by timing issues, improving confidence in the rental sales flow.
Original PR description
steps to reprduce: 1. duplicate multi enterprise 18.0 database 2. run the tour `website_sale_change_rental_duration` in the duplicated database inspired from: https://github.com/odoo/enterprise/commit/c7542e897c537650966497065db9c7d033dcb8ee added a delay to wait when choosing the rental duration, after page is loaded when go to cart , check if the next page is loaded before checking untaxed amount build_error-227718
The XML export for Belgium’s EC Sales List now includes the expected month or quarter when opened from the VAT Return, even if the user did not manually choose a period. This prevents incomplete tax report exports and reduces the risk of filing issues caused by missing period information.
Original PR description
**Issue** When accessing the EC Sales List report via the smart button from the VAT Return page, downloading the XML without explicitly selecting a period omits the <Month> element—even though a…
**Issue** When accessing the EC Sales List report via the smart button from the VAT Return page, downloading the XML without explicitly selecting a period omits the <Month> element—even though a month is visibly preselected. **Steps to Reproduce** 1. Install the Accounting module and Belgium localization. 2. Go to the Accounting dashboard. 3. Open the VAT Return via the "Miscellaneous Operations" section. 4. Click the smart button to access the EC Sales List report. 5. Use the gear icon to export the XML. 6. Observe that the XML <Period> section only includes the <Year>—the <Month> is missing. **Root Cause** If no period is explicitly selected, the report uses a period_type of "tax_period". However, this value was not handled when generating the XML, so the logic to include the \<Month> or \<Quarter> elements skipped it. As a result, only the \<Year>, which is always included, was rendered. **Fix** Extend the handling of tax_period to derive the period from the company’s tax periodicity settings and adjust the filter accordingly. This ensures that the generated XML always includes the \<Month> or \<Quarter> element, in addition to \<Year>, whenever the report is based on a tax period. Opw-4702613
The tax report no longer fails with a server error after changing its root report configuration. This keeps accounting users from being blocked when opening tax reports and improves reliability of financial reporting workflows.
Original PR description
**[FIX] account_reports: ensure join on account_move for tax report base amount calculation** Fixes a server error in the generic tax report where `account_move_line__move_id` was referenced without an explicit join. The fix adds a conditional join on `account_move` to make fields like `always_tax_exigible` available, preventing `UndefinedTable` during SQL execution. Steps to reproduce: 1 - in a fresh db or runbot go to `Accounting > Config > Accounting Reports`. 2 - Open the Tax Report and change the `Root Report` to Balance Sheet. 3 - Save and try to open the tax report. opw-4990771
Fixes an issue where a website form configured through Studio to send an email could fail during submission. This helps prevent lost customer inquiries and avoids error logs when businesses customize website forms for outgoing emails.
Original PR description
Currently, an error occurs when submitting the 'Send Email' form. Steps to Reproduce: - Install the `website` and `web_studio` modules. - Go to `website` > `Click on Edit` > `Drag and drop form`. -…
Currently, an error occurs when submitting the 'Send Email' form. Steps to Reproduce: - Install the `website` and `web_studio` modules. - Go to `website` > `Click on Edit` > `Drag and drop form`. - click the form and in actions select the `more models`, and select `outgoing mails(mail.mail)` model and `save`. - `Submit` the form, and the error appears in the `logs`. **Error:** `KeyError: 'website_form_signature'` **Cause:** This error occurs when submitting the "Send Email" form from the website. By default, the form action is `"Send an E-mail"`, and when the user `changes` the form’s model to outgoing mails (mail.mail), which also has the action "Send an E-mail," the system checks the existing model [1] and retrieves it. Since `shouldRerender` is set to false, [2] is not executed, and as a result, the `email_to(hidden field)` is not present in the form. And the website_form_signature is added from [3], but due to the condition at [4], the code at [3] is not executed. When it is accessed at [5], KeyError is raised. **Fix:** This commit ensures that when the user changes the model, `rerenderXml` is executed so that the `hidden field` is also added. [1]: https://github.com/odoo/enterprise/blob/359a1c546fc9e4bc113517bf6ea912a70a9ea123/website_studio/static/src/website_form_editor.js#L155-L156 [2]: https://github.com/odoo/enterprise/blob/359a1c546fc9e4bc113517bf6ea912a70a9ea123/website_studio/static/src/website_form_editor.js#L174-L178 [3]: https://github.com/odoo/odoo/blob/82639728f2bcb4e7786f120de2aeba3f5fbab209/addons/website/tools.py#L252 [4]: https://github.com/odoo/odoo/blob/82639728f2bcb4e7786f120de2aeba3f5fbab209/addons/website/tools.py#L236 [5]: https://github.com/odoo/odoo/blob/82639728f2bcb4e7786f120de2aeba3f5fbab209/addons/website/controllers/form.py#L88 sentry-6746753251
When items from a receipt are moved into a new wave transfer, their related quality checks are now moved or recreated on the correct transfer. This prevents staff from missing required checks on the new transfer or completing checks from the wrong receipt.
Original PR description
*{quality_control,stock}_picking_batch ### Steps to reproduce: - Got to Quality > Quality control > Control Point - Create a quality control point: - Operation: receipt - Control per quantity or…
*{quality_control,stock}_picking_batch
### Steps to reproduce:
- Got to Quality > Quality control > Control Point
- Create a quality control point:
- Operation: receipt
- Control per quantity or product
- Create a and confirm a receipt transfer with 2 products
- Go to the receipt list view > select your receipt > Wheel action > Add to wave > Add to a new wave > Add only one of the move line to the wave
#### > A new picking is created and the move line reassigned to it but the related quality check picking_id is not updated.
> In particular, there is no "quality check" button on the new picking and the "quality check" button of the first picking allows you to process a QC related to the wave transfer.
### Cause of the issue:
While the move lines or move are can be moved to a new picking during the `_add_to_wave` call:
https://github.com/odoo/odoo/blob/605e47a85561614c17fe2e6f59618610f87c69bb/addons/stock_picking_batch/models/stock_move_line.py#L69-L90 Nothing is done with respect to the quality check which pciking_id field is not computed:
https://github.com/odoo/enterprise/blob/d73f7ef6fe61ccddbe1fe4e32c1670611ba3c5d2/quality/models/quality.py#L185
### Fix:
While the quality check measured on move_line are linked to a move line, the quality checks measured on products and operation are not. For the first kind, we rely on an override of the write method of stock move lines to reassign the check to the apporpiate picking. For the other kinds, we add a post batch hook to unlink the obsolete checks and recreate the appropiate one. Note that since operation and product types are created during the action confirm of moves and since certain moves will be created and auto confirm during the new picking creation here: https://github.com/odoo/odoo/blob/73fd3af560c967f41339bfc4c71a51dc5baba4a8/addons/stock_picking_batch/models/stock_move_line.py#L90 https://github.com/odoo/odoo/blob/73fd3af560c967f41339bfc4c71a51dc5baba4a8/addons/stock/models/stock_picking.py#L857 https://github.com/odoo/odoo/blob/73fd3af560c967f41339bfc4c71a51dc5baba4a8/addons/stock/models/stock_picking.py#L1263-L1267 https://github.com/odoo/enterprise/blob/b99d7073a34b24d4d3b863278e68f292fdd3c0b0/quality_control/models/stock_move.py#L12-L15 we rely on the `extra_move_mode` to avoid quality check creation during this step (as they will be created in the hook).
Community: https://github.com/odoo/odoo/pull/223852
opw-5009635
Forward-Port-Of: odoo/enterprise#92951Odoo Studio now avoids crashing when a report's source content is accidentally left empty. This helps users continue working safely instead of hitting an error page when editing custom reports.
Original PR description
The system will crash when they get the view where the arch is null. Steps to Produce: 1. Install `Sales` and `Studio`. 2. Sales > Toggle studio > Reports. 3. Click on New > External. 4. `Add a separator` to the page after `Expression` and save the report. 5. On the right side, click on `Edit Source`. 6. Remove all content and save the report. Error: `lxml.etree.XMLSyntaxError: Document is empty, line 1, column 1` Solution: - I used the try-except block to prevent the application from crashing when `arch` is empty. Sentry - 6288795955
Users checking the latest AFIP rate with expired or invalid certificate credentials will no longer hit a confusing system error. The process now blocks the action when credentials are invalid, helping Argentine localization users understand and resolve the issue more reliably.
Original PR description
An error occurs when a user attempts to check the latest AFIP rate while their certificate has expired and the certificate key is null. **Error:** `TypeError: argument should be a bytes-like object or ASCII string, not 'bool'` **Root Cause:** When the user tries to check the `latest AFIP rate` with an expired certificate and a certificate key having invalid or null `pem_key`, the system attempts to access `pem_key` at [1], causing a `TypeError`. [1]- https://github.com/odoo/enterprise/blob/b185bd5bf9bb828fca83330ed4bde4ef8c9aa726/l10n_ar_edi/models/certificate.py#L54 **Solution:** This commit prevents error by ensuring that user cannot check `latest AFIP rate` with invalid credentials. Sentry-6640198098
Spreadsheet pivots now avoid offering fields that cannot be grouped, preventing a crash when users choose the Analytic Distribution field on sales order lines. This keeps spreadsheet reporting more reliable and avoids disruption while building pivot views.
Original PR description
…elds Steps to reproduce: - Create a spreadsheet with a pivot on Sales Order Lines - Add "Analytic Distribution" as column => Boom Task-5055300
Fixes an issue where a reconnected blackbox could be treated as a new device if the Raspberry Pi assigned it a different serial port. Existing blackbox configurations are now preserved by matching the device name and updating its identifier instead of creating a duplicate.
Original PR description
Before this commit, if a blackbox was unplugged and re-plugged, and it was assigned a different serial port by the Raspberry Pi, it would show up as a new device in the database meaning the existing…
Before this commit, if a blackbox was unplugged and re-plugged, and it was assigned a different serial port by the Raspberry Pi, it would show up as a new device in the database meaning the existing configuration wouldn't work. After this commit, we handle the blackbox as a special case, and if the name of the device matches exactly with our existing blackbox, we update its identifier instead of creating a new device. This does require a new device specific check in the controller which is quite ugly. Another approach would have been to make the identifier of the blackbox equal its FDM ID instead of the serial port, but this was not done for the following reasons: - Changing the identifier format in stable would cause all existing clients' blackboxes to become unconfigured once their IoT box restarts. - Making the identifier different to the serial port would require a hack in the blackbox driver to change its own identifier and update the devices dictionary, since the serial interface assumes all devices use the port as their identifier. task-5055027
Documentation and clarification updates
This pull request records an individual contributor license agreement signature for hildickethan. It is an administrative legal update that helps ensure contributions can be accepted under Odoo's licensing terms, with no product or user-facing behavior changes.
Original PR description
I hereby agree to the terms of the Odoo Individual Contributor License Agreement v1.0. Forward-Port-Of: odoo/odoo#224747
Miscellaneous changes
This PR updates the Peruvian electronic invoicing configuration to reflect the recent brand change from Digiflow to Estela (formerly Digiflow). Changes: - Updated help texts and string labels in `res_company.py` - Adjusted references in `account_edi_format.py` - Updated translations in `es.po` This change is purely textual and does not affect logic or behavior. It ensures users see the correct branding across the Peruvian EDI settings. Forward-Port-Of: odoo/enterprise#86082 Forward-Por
Original PR description
This PR updates the Peruvian electronic invoicing configuration to reflect the recent brand change from Digiflow to Estela (formerly Digiflow). Changes: - Updated help texts and string labels in `res_company.py` - Adjusted references in `account_edi_format.py` - Updated translations in `es.po` This change is purely textual and does not affect logic or behavior. It ensures users see the correct branding across the Peruvian EDI settings. Forward-Port-Of: odoo/enterprise#86082 Forward-Port-Of: odoo/enterprise#85934