Daily updates from Odoo
Friday, July 11, 2025
15 changes
2 changes
Enhancements to existing features
Expense receipt scanning now captures real merchant or location descriptions, such as restaurant or fuel station names, instead of broad categories like food or gasoline. This makes automatically created expense records clearer and easier for employees and approvers to understand.
Original PR description
The detection of the description has been improved in the latest version of the expense OCR API. It now actually detects a description (restaurant name, fuel station name, etc) instead of predicting a category ('food', 'parking', 'gasoline', etc).
Task [link](https://www.odoo.com/odoo/project/2068/tasks/4623180)
task-4623180
Forward-Port-Of: odoo/enterprise#89898
Forward-Port-Of: odoo/enterprise#89448IoT requests and responses are now matched with a unique identifier, reducing the chance that simultaneous device communications are mixed up. This helps improve reliability when multiple IoT actions happen at the same time.
Original PR description
We now generate a unique identifier we provide both longpolling and websocket requests and responses to ensure we don't callback for the wrong response if two requests are made simultaneously.
9 changes
Enhancements to existing features
Spreadsheet users can now choose filter matching options such as including, excluding, or containing values depending on the type of filter. This makes spreadsheet analysis more precise and easier to tailor to business questions.
Quality checks for registering consumed materials now show the lot or serial information only once. This reduces confusion for users by removing duplicate information without changing the underlying tracking data.
Original PR description
- For quality checks of type Register Consumed Materials , Component lot id is saved in: 'Component Lot/Serial' Additionally, we also set the same id on the field above: 'Lot/Serial' and it is the same exact field `lot_id` . There is no reason to duplicate that information. Task: 4894434
This update prevents records in several Odoo apps from using names reserved for system communication. It reduces the risk of confusing errors or broken integrations in invoicing, manufacturing, sales timesheets, and timesheet grids.
Original PR description
odoo/odoo#218355
Payroll can now identify extra hours and apply a configurable payment rate directly from work entry types. This gives HR teams a clearer, more consistent way to pay overtime or additional hours on top of regular salary across multiple country payroll setups.
Original PR description
- The goal of this change is to improve the payroll system by providing clearer and more efficient way to manage extra hours and overtime. - This update introduces the ability to track extra hours worked and apply an adjustable payment rate for those extra hours. **This PR includes the following changes:** - Added new options to track extra hours and set a rate for extra hours worked. - Updated the UI to make it easier to configure extra hours and rates. - Improved the logic behind calculating extra hours, ensuring that extra hours are compensated correctly based on the set rate. - Ensured that extra hours are paid in addition to the regular monthly salary in payslip when applicable. Task - 4420535
The India payroll payslip report has been improved to show more comprehensive information using the India payslip format. This helps employees and payroll teams review pay details more clearly and consistently.
Original PR description
- customized the standard payslip using the IN: Payslip task-4790769
The spreadsheet document tests now reflect the latest chart side panel behavior, including sticky tabs, preserved scroll position, and retained expanded or collapsed sections. This helps ensure the updated interface remains reliable for users working with charts in documents.
Original PR description
Update test cases to reflect recent UI changes in the chart side panel: - Tabs are now sticky while scrolling - Scroll position is preserved when switching tabs - Expanded/collapsed section state is retained Task: [4752564](https://www.odoo.com/odoo/2328/tasks/4752564)
Payroll payment report details are now cleared when a payslip or payslip batch is moved back to draft, helping avoid outdated payment information being reused by mistake. The update also removes obsolete payroll payment report references, making the process cleaner and less error-prone across supported local payroll modules.
Original PR description
this PR aims to - reset the `payment_report` related fields when the payslip is set to `draft` state. - remove the dead view ID (`hr_payslip_payment_report_view_form`) from the actions. task-4894688
This update changes how Point of Sale data is prepared for India GSTR-1 reporting, especially the product classification totals used in the filing JSON. It reduces unnecessary POS-specific calculation complexity and adds checks to help ensure the exported tax data stays accurate and compliant.
Original PR description
**Remove HSN Computation for POS**: The HSN computation logic for Point of Sale (POS) entries has been removed to streamline the processing and avoid unnecessary complexity in the calculations. Task Id: 4193554
Employee contract version lists now show the yearly cost next to the wage by default. This gives HR teams a clearer view of total compensation costs without opening each contract record.
Original PR description
In this PR, we added the yearly cost field to the version list to the right to the wage and will be visible by default. Related task: 4901173.
4 changes
Enhancements to existing features
Saudi Arabia invoicing now prevents valid posted invoice PDFs from being deleted after they have been generated and sent to ZATCA, supporting auditability and compliance requirements. If a PDF was created while an invoice was rejected and the invoice is later accepted, the system can distinguish that older attachment and allow appropriate cleanup without resetting finalized records unnecessarily.
Original PR description
Task ID: 4730762 Description of the issue/feature this PR addresses: - As per ZATCA's auditability principles (clause 3 sub-heading C, paragraph 2): The Compliant E-Invoice solution must be able to…
Task ID: 4730762 Description of the issue/feature this PR addresses: - As per ZATCA's auditability principles (clause 3 sub-heading C, paragraph 2): The Compliant E-Invoice solution must be able to protect the generated Electronic Invoices and Electronic Notes from alteration or deletion. - This PR aims to restrict the deletion of valid invoice PDFs once the invoice has been generated & sent to ZATCA. Current Behavior before PR: - Invoice PDF attachments were allowed to be deleted in l10n_sa, even when the invoice is posted. - For l10n_sa_edi, if and invoice PDF is generated during a rejected state, it is kept there unless you reset to draft. Desired behavior after PR is merged: - in l10n_sa, deleting an attached invoice PDF raises a user error (reset to draft is required to detach the invoice first) - For l10n_sa_edi, if the invoice PDF is generated during a rejected state, but the invoice is resubmtited to ZATCA and accepted. The creation & write dates of the attachment linked & edi_documents respectively are compared and the deletion of the pdf attachment is allowed to be deleted in the case where the creation date was less than the write date. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Peppol invoice retrieval jobs now handle large invoice volumes by processing documents in smaller batches and automatically continuing when more work remains. This reduces the risk of scheduled jobs timing out, helping businesses with high transaction volumes keep electronic document processing running smoothly.
Original PR description
For database with big invoice volume, it is necessary to be able to retrieve documents in smaller batches otherwise crons will timeout due to the 15 minutes limit. Add a retrigger mechanic to the possibly heavy crons. opw-4925532 Forward-Port-Of: odoo/odoo#218383
Improves Profit and Loss report loading by avoiding unnecessary duplicate analytic accounting rows when no analytic plan is present. This reduces report processing time significantly, with benchmarks showing roughly twice as fast loading for grouped analytic account reports.
Original PR description
Description ----------- For the P&L report, a view of the `account_analytic_line` is created to mascarade as `account_move_line` for the reporting engine. The `analytic_distribution` is takens from…
Description ----------- For the P&L report, a view of the `account_analytic_line` is created to mascarade as `account_move_line` for the reporting engine. The `analytic_distribution` is takens from the plans of the analytic lines. This is done by collecting all potential plans a line can be associated with and *unnesting* them into the main table. Unnesting creates a duplicate of the row for each possible value of the analytic plans. This can quickly balloon the row count of the view, depending on how many plans are present. This also creates a duplicate row when the line isn't associated with a specific plan, adding the value `NULL` for the `analytic_distribution`. This commits filters out the `NULL` values of the array of plans before unnesting into the main table. Since on average an analytic line is associated with a few plans, this prevents the significant growth of the view, leading to more reasonable performance. Benchmark --------- On a database with ~700k AAL and ~600k AML for 2025, opening the P&L report with a grouping by analytic accounts, took: | Accounts count | Before | After | |----------------|----------|----------| | 1 | 10.3 sec | 4.76 sec | | 5 | 51 sec | 20.8 sec | | 10 | 96 sec | 41.7 sec | | 15 | 2:26 min | 1:04 min | | 20 | 3:15 min | 1:25 min | So roughly a ~2x improvement on average. Reference --------- opw-4845164
The manufacturing planning screen now reloads only the schedules currently visible to the user instead of processing all affected schedules in the background. This makes updates much faster for large, complex production plans, reducing a benchmarked reload from 31.6 seconds to 3.5 seconds.
Original PR description
Description ----------- Only fetch forecasts for MPS schedules visible in the view rather than all impacted schedules. Schedules not visible due to pagination are skipped when reloading the MPS state. Benchmark --------- Adjusting a quantity for a product, which will impact around 1k+ other schedules (hierarchy is deep with boms), `get_production_schedule_view_state` takes: | Before | After | Speed-up | |--------|-------|----------| | 31.6s | 3.5s | 9x | Reference --------- opw-4778588