Saturday, September 19, 2026
28 changes · master
New functionality added to Odoo
Odoo AI can now answer accounting questions using financial report data and help audit teams investigate checks with supporting evidence. This helps users compare periods, drill into entries, create audit working files, and keep concise findings in one place.
Original PR description
Let users ask accounting questions using figures from Odoo's financial reports. The agent can work from the report already open, adjust supported options, compare periods and drill into the…
Let users ask accounting questions using figures from Odoo's financial
reports. The agent can work from the report already open, adjust supported
options, compare periods and drill into the underlying entries. It can
then open the supporting report with the same settings.
Add tools to create audit working files, read check instructions and
inspect the actions associated with each check. Each investigation can
select its working file when reading audit-specific fields. Findings are
saved as short conclusions and statuses, refreshing the working-file view.
Agent hierarchy:
- Odoo AI handles the conversation, assigns checks, brings the findings
together and saves them to the working file.
- Auditor investigates one check and proposes a conclusion.
- Audit Reviewer independently checks the evidence and challenges
the proposed conclusion.
Independent checks can run in parallel. Odoo AI summarizes the overall
outcome and next actions, leaving individual findings in the working file.
Three skills guide this work:
- Accounting explains how to coordinate accounting questions and audits.
- Accounting Report Analysis explains how to choose reports, read figures
and investigate their details.
- Accounting Audit Evidence explains how to investigate native checks
and interpret the accounting records.
Odoo AI receives Accounting and Accounting Report Analysis. Both audit
agents receive Accounting Report Analysis and Accounting Audit Evidence,
along with the existing Search Database skill.
TASK-ID: 5153883
Forward-Port-Of: odoo/enterprise#132085Enhancements to existing features
Accounting reports were updated to avoid relying on browser-specific behavior. This helps make the reporting experience more consistent and easier to maintain, with minimal visible impact for users.
Original PR description
Following odoo/odoo#282230. Forward-Port-Of: odoo/enterprise#131997
Resolved issues and error corrections
Mail notification items now display more evenly by reducing the timestamp size and centering the unread counter with the preview text. This makes the messaging menu look cleaner and easier to scan without changing the spacing between notifications.
Original PR description
Before this commit, the notification item parts were unbalanced: - datetime was too big - badge counter looks like "about to fall" The badge counter is bigger than the row, therefore the top is aligned with text but the rest is not. This also had the consequence to make the bottom of notification item bigger than the top. This commit fixes the issue by reducing size of datetime and aligning the center of badge counter with text in the row. The spacing between notification items was good so this is kept unchanged. <img width="1656" height="814" alt="livechats-before-after" src="https://github.com/user-attachments/assets/7d7293c9-7f5f-4db6-b7a9-1f7079f69b93" /> Forward-Port-Of: odoo/odoo#289019
Code cleanup and technical improvements
Spreadsheet side panels now use the central store mechanism instead of the previous environment-based approach. This internal cleanup helps keep spreadsheet features such as charts, filters, lists, pivots, and comments more consistent and easier to maintain without changing the user workflow.
Original PR description
This commit adapts the spreadsheet to use the side panel method from the store instead of the env. Task: 6566084
Miscellaneous changes
Related: https://github.com/odoo/enterprise/pull/132108 Related: https://github.com/odoo/design-themes/pull/1346 Related: https://github.com/odoo/documentation/pull/20132 Forward-Port-Of: odoo/odoo#289121
Original PR description
Related: https://github.com/odoo/enterprise/pull/132108 Related: https://github.com/odoo/design-themes/pull/1346 Related: https://github.com/odoo/documentation/pull/20132 Forward-Port-Of: odoo/odoo#289121
Calendar users can now view the other members of a shared calendar, even when they are not the calendar owner. This makes it clearer who can see shared events and helps users understand their collaboration context.
Original PR description
Users should be able to see other calendar members, even if they don't own the calendar. It is useful to know who you are sharing your events with. Task-6574702 Forward-Port-Of: odoo/odoo#289107
Appointment scheduling now shows a clearer option for controlling automatic slot splitting. This makes it easier for users to understand when slots will be split automatically versus kept as configured, reducing confusion in setup.
Original PR description
Currently a slot duration of 0 disables automatic slot splitting in the slot editor. We add a radio button to make it more explicit, though the logic is still based on the duration being 0 or not. task-6544898 Forward-Port-Of: odoo/enterprise#132103
Small-screen views now present action buttons, menus, status controls, and pagers in a clearer, more consistent layout. This makes Odoo easier to use on phones and tablets by grouping related controls together and making buttons more visually consistent.
Original PR description
task-6564150 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#288472
The control panel has been adjusted so buttons and search actions fit better on small screens. Users working on phones or narrow displays will see cleaner menus, easier access to key actions, and less crowded headers across affected apps.
Original PR description
task-6564150 Forward-Port-Of: odoo/enterprise#131684
This fix corrects how Point of Sale session reversals are recorded so they can be properly matched with customer invoices. It also makes related reversal entries visible from the session invoice button, improving accounting traceability.
Original PR description
Two lines were added into the reverse moves of the session. But these lines were added to the same account. So its the same as having no lines To be able to add the reconciliation between the new partner invoice and the reversal, the payment reversal lines is now on the partner receivable account. Also, the invoices action button on the pos.session form is now also showing the reversal move. Forward-Port-Of: odoo/odoo#288910
This fix corrects how reversal entries are handled for Mexican point-of-sale sessions so they can be properly matched with the related customer invoice. It also makes reversal entries visible from the session invoice button, improving accounting traceability.
Original PR description
Two lines were added into the reverse moves of the session. But these lines were added to the same account. So its the same as having no lines To be able to add the reconciliation between the new partner invoice and the reversal, the payment reversal lines is now on the partner receivable account. Also, the invoices action button on the pos.session form is now also showing the reversal move. Forward-Port-Of: odoo/enterprise#132153
Planning now shows each employee or resource only their own allocated hours when a shift is shared, avoiding overstated workload in the Gantt view. Field service planning also calculates break time correctly when resources with different schedules are added or removed, keeping allocated hours accurate.
Original PR description
# [FIX] planning: split gantt progress bar hours per resource Issue: ---------------------------------------- On the planning gantt view, when a shift is assigned to several resources, the progress…
# [FIX] planning: split gantt progress bar hours per resource Issue: ---------------------------------------- On the planning gantt view, when a shift is assigned to several resources, the progress bar of each individual resource shows the sum of all resources' allocated hours instead of that resource's own hours. Steps to reproduce: ---------------------------------------- - Give two employees working calendars with a different number of daily hours (e.g. 8h and 4h) - Create one shift covering both calendars' full working hours and assign both employees to it - Open the gantt view and check the progress bar of each employee for that shift Cause: ---------------------------------------- `_gantt_progress_bar_group_by_field()` computes one duration per shift via `_get_duration_over_period()`, which already sums the working hours of every resource assigned to the shift. That same total is then added to the progress bar of each resource. Solution: ---------------------------------------- Add `_get_working_hours_over_period_per_resource()` and `_get_duration_over_period_per_resource()`, which returns the results into a dict per resource. `_get_working_hours_over_period()` then calls `_get_working_hours_over_period_per_resource()` and sums the values. `_gantt_progress_bar_group_by_field()` now calls this per-resource breakdown when grouping by `resource_ids`. # [FIX] planning_field_service: fix break_time computation Issue: ---------------------------------------- When adding multiple resources to a slot, we can break the Steps to reproduce first issue: ---------------------------------------- - Create a slot for a resource working 8 hours per day - Add another resource working 4 hours per day - Remove the resource working 4 hours - The allocated hours show "9h 36m" instead of 8h Cause: ---------------------------------------- `_get_in_schedule_break_time()` can return negative values, so it breaks the computation of `allocated_percentage` which then impacts the future allocated percentages. Solution: ---------------------------------------- Add a `max(..., 0)` to `_get_in_schedule_break_time()`. Steps to reproduce second issue: ---------------------------------------- - Create a slot for a resource working 8 hours per day - Add another resource working 4 hours per day - The break time is 0, it should be 4h Cause: ---------------------------------------- The calculation of `break_time` with multiple resources was supposed to be fixed in 583ccb226970787b9dbd4cb03ccbfd43849fb8c7 but the value is never used. Using it fixes the case for multiple resources having the same work schedule but not all case: In our case it will output 12 allocated hours and 2 hours of breaktime instead of 4. This is because the breaktime hours are only from one resources but they still get divided by the number of resources. Solution: ---------------------------------------- We should instead multiply the duration by the number of resources to get the correct number of break hours. This ensures that `allocated_hours + break_time` equals the total duration of the shift. Same in `_get_in_schedule_break_time()`. opw-6500685 Forward-Port-Of: odoo/enterprise#132009 Forward-Port-Of: odoo/enterprise#130429
This fixes an issue where users could encounter a crash when discarding changes in the mass mailing editor. The change ensures the editor recognizes the correct close-and-discard action, making campaign editing more reliable.
Original PR description
Commit [1] introduced usage of a `discardAndClose` props, but declared it as `discardChanges`. This did not cause any issue because `owl3_compatibility_layer` uses `useProps()` which accepts any props without validation. However, after commit [2] in Odoo 20.0, usage of `useProps` in the `MassMailingBuilder` means that `useProps()` is overwritten, and the component will only accept props that are declared in the schema. This commit fixes the invalid props schema. [1]: https://github.com/odoo/odoo/commit/c6fbfb69c2a59041fc360bb4ddf3b09a1eeaf012 [2]: https://github.com/odoo/odoo/commit/5df880f7ba851abf4151fca2f2af50b1c18afb2c task-6584680 Forward-Port-Of: odoo/odoo#289272 Forward-Port-Of: odoo/odoo#289167
Improves the new Marketing Automation app by preventing crashes, correcting customer enrollment from website sales, and ensuring campaign steps link to the right participants. These fixes make campaign setup and execution more reliable for users testing or running automated marketing flows.
Original PR description
This PR adds some fixes and feedbacks received during the testing of the new marketing_automation app. ### [FIX] marketing_automation: reinforce view_coordinates and view names This commit fixes…
This PR adds some fixes and feedbacks received during the testing of the new marketing_automation app. ### [FIX] marketing_automation: reinforce view_coordinates and view names This commit fixes issues that were introduced with the new marketing automation revamp. The calls to the view_coordinates field are reinforced to take into account a possible empty value. Some views were either wrongly renamed or no longer used to display server actions or trigger form views in the flow view. ### [FIX] marketing_automation: fix triggering_trace_id computation This commit fixes an issue with the computation of the triggering_trace_id field when generating children traces. Before, when creating the hash map to group all traces per activity and ids we used the field res_id. The issue is that if you have multiple traces that are using the same res_id, e.g. when testing participants, then you would have multiple traces on a specific key. Meaning that you would get crashes when trying to get the correct trace's ID. Now, instead of using a trace's res_id we use the participant_id directly. The idea is that for a specific activity you would have unique participants for each trace but each participant could have the same res_id. This way we ensure that when we create the children traces they get each their own correct triggering_trace_id. ### [FIX] marketing_automation_website_sale: fix participant enrollment This commit fixes an issue with the marketing_website_sale bridge and the way it enrolled participants. The issue was that no matter what the participant was never created it was simply caused by a wrong method override. Now, we override the correct method so that the enrollment can work as intended. task-6559148 Forward-Port-Of: odoo/enterprise#131559
Italian Split Payment taxes now use the correct VAT report placement, formula sign, and invoice labels. This helps Italian companies produce more accurate VAT reports and clearer customer invoices for SP tax rates.
Original PR description
The`SP` (Split Payment) taxes have incorrect configurations: - **Tax Grid Tags on `SP` Taxes**: The ve38 grid tag was incorrectly assigned to the tax line instead of the base line. - **`VE38` VAT…
The`SP` (Split Payment) taxes have incorrect configurations: - **Tax Grid Tags on `SP` Taxes**: The ve38 grid tag was incorrectly assigned to the tax line instead of the base line. - **`VE38` VAT Report Formula**: In Tax Report > VAT Report, the line `VE38 - Transactions with parties referred to in Article 17-ter` was using a negative formula `-ve38` and should be `ve38` - **Tax Group Invoice Label**: Updated the default label on invoices for the SP tax group to display 22% SP instead of 22%. Steps to reproduce: - Install `account` and `l10n_it` - Switch to IT company - Go to taxes and filter for `SP` taxes - The tax grid is wrong for the negative taxes since `ve38` should be in the base line instead of in the tax line - Go in the Tax report > VE VAT Report - The line `VE38 - Transactions with parties referred to in Article 17-ter` has a negative formula `-ve38`, should be positive `ve38` - The label on invoices of the tax group should be `4% SP`, `5% SP`, `10% SP` not `4%` etc. References: https://www.informazionefiscale.it/IMG/pdf/dichiarazione_modello_iva_2026_agenzia_delle_entrate.pdf <img width="1413" height="141" alt="immagine" src="https://github.com/user-attachments/assets/7fa15859-beaa-4345-bf81-fedc3f0af2fa" /> https://fiscomania.com/quadro-ve-della-dichiarazione-iva/ <img width="705" height="154" alt="immagine" src="https://github.com/user-attachments/assets/4f23b407-0e4d-4104-9695-f9891ccfd2f2" /> Ticket [link](https://www.odoo.com/odoo/project.task/6543520) opw-6543520 Forward-Port-Of: odoo/odoo#287238
Credit notes for invoices already accepted in Poland's KSeF system now export the correct KSeF reference information. This prevents the XML from wrongly marking the original invoice as issued outside KSeF, helping businesses stay compliant with official Polish e-invoicing rules.
Original PR description
### Issue before this commit: When generating a credit note for an invoice already accepted in the Polish KSeF system, the exported XML incorrectly includes the <NrKSeFN>1</NrKSeFN> tag. This tag…
### Issue before this commit: When generating a credit note for an invoice already accepted in the Polish KSeF system, the exported XML incorrectly includes the <NrKSeFN>1</NrKSeFN> tag. This tag falsely indicates that the original invoice was issued outside of KSeF, and the official KSeF number of the corrected invoice is entirely omitted from the file. ### Steps to reproduce the issue: 1. Download Accounting and l10n_pl 2. Go to Settings > Polish Localization > Insert certificate 3. Go to Invoices > Create an invoice > Send it to KSeF 4. Create a credit note for that invoice, reverse it and send it to KSeF 5. Tag <NrKSeFN>1</NrKSeFN> should not be there ### Cause of the issue: The tag <NrKSeFN>1</NrKSeFN> is emitted in every case without any rule handling it. ### Reason to introduce the fix: To comply with the official FA(3) logical structure rules. According to the specifications, if the corrected invoice was issued and accepted in KSeF, the XML must include the <NrKSeF>1</NrKSeF> flag and additionally provide the original KSeF number in the <NrKSeFFaKorygowanej> field. Otherwise, if the original invoice was issued outside of KSeF, the system must enter "1" in the <NrKSeFN> field and strictly omit the <NrKSeF> and <NrKSeFFaKorygowanej> fields. <img width="866" height="981" alt="image" src="https://github.com/user-attachments/assets/53b42f9f-aaab-4642-be38-2a5abc1d8539" /> opw-6541941 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#288286
The live chat interface now makes the time a visitor has been waiting for help easier to see by displaying it as a more noticeable badge. A tooltip also explains what the timer means, helping operators understand and prioritize waiting conversations more quickly.
Original PR description
Before this commit, when a livechat is in looking for help, the timer was barely visible next to the language of visitor. This duration is quite important, so the visibility should be made more obvious. Also the duration lacks clarity for people not yet aware what this duration means, and there's no title shown on mouse-hover to state it clearly what this represents. This commit change the visual of timer as a primary badge with reduced opacity, so this is a bit more catchy but not too much. On mouse-hover it now shows a tooltip that clearly tells this represents the duration the livechat has been in looking for help. <img width="1868" height="361" alt="lfh-timer-before-after" src="https://github.com/user-attachments/assets/72508b32-608a-42e5-a8e6-12dc2e02aa5f" /> Forward-Port-Of: odoo/odoo#289031
This fix updates remaining references to an old precision setting name so product quantities use the intended number of decimal places. It helps prevent quantities from being silently rounded to two decimals in affected POS, Jordanian EDI, and stock package workflows.
Original PR description
…al.precision The `decimal.precision` "Product Unit of Measure" was renamed "Product Unit" in 18.1. Some occurences called the old name still exist in the code. This is silently fallbacking on the default 2 decimals from the `precision_get`. See: https://github.com/odoo/odoo/pull/193490 task-none Forward-Port-Of: odoo/odoo#289204 Forward-Port-Of: odoo/odoo#288508
Fixed an issue where some form values in quotation header or footer PDFs could disappear when generating PDF quotes. This ensures sales documents using advanced PDF form structures keep the expected customer-facing information after PDF processing.
Original PR description
Issue: --- When a quotation header/footer PDF has a hierarchical AcroForm field, the value set for that field is silently dropped from the generated PDF Quote when running on pypdf 5.4.0. Steps to…
Issue: --- When a quotation header/footer PDF has a hierarchical AcroForm field, the value set for that field is silently dropped from the generated PDF Quote when running on pypdf 5.4.0. Steps to reproduce: 1- Using a python 3.13 env, install requirements.txt (or otherwise run with pypdf==5.4.0 instead of PyPDF2). 2- Upload a header/footer PDF whose form field is a hierarchical field (`/T`/`/FT`/`/V` on the parent, not on the widget itself). The attachment from the ticket can be used as a sample to reproduce the bug. 3- Create a SO and select that document in the Quote Builder tab. 4- Print -> PDF Quote. 5- The value bound to that field does not appear in the printed PDF. Cause: --- After https://github.com/odoo/odoo/commit/4b02fbd717f62dd5345dad3ffb8d428c1c180007 `_add_pages_to_writer` renames the parent `/Field` object's `/T` when the widget itself has none. PyPDF2's `addPage` inserted the reader's page as is, keeping the widget's `/Parent`. pypdf 5.4.0 deep clones the page instead and ignores `/Parent` at every depth, so the widget loses the link to that field. It ends up with neither `/T` nor `/FT`, hence nothing matches the value mapping. Fix: --- Merge the field into its widget annotations instead: copy the prefixed `/T` and the inheritable keys onto each of them, then drop `/Parent`. The field's own `/T` is left untouched, so a field owning several widgets is filled on all of them. opw-6508728 Forward-Port-Of: odoo/odoo#287910 Forward-Port-Of: odoo/odoo#286186
This fix lets websites customize which flag is shown for a language instead of always using the default derived from the locale code. It matters for businesses serving specific regions or preferring local branding, without requiring heavier technical workarounds.
Original PR description
Which flag stands for a language is a presentation choice, not a property of its code. `_compute_field_flag_image_url` derives the URL from the country part of the locale, and a site that wants a…
Which flag stands for a language is a presentation choice, not a property of its code. `_compute_field_flag_image_url` derives the URL from the country part of the locale, and a site that wants a different flag for a language it offers, a regional one or the flag of the country it actually serves rather than the one the code names, has to compute that URL its own way.
That is not possible today. The field passes the compute as the function object:
flag_image_url = fields.Char(compute=_compute_field_flag_image_url)
`determine()` takes the `callable` branch and calls that object with the recordset. A plain function is not bound, so the implementation of `base` runs whatever class the record has: a module that inherits res.lang and defines `_compute_field_flag_image_url` changes nothing, and nothing says so. No error, no warning, and the field keeps answering the same URL. Getting around it means redeclaring the field only to replace its compute, which is more than the situation calls for.
Passing the method name puts the computation back on the MRO and costs nothing else: `Field.get_depends` resolves a string with `resolve_mro` and collects `_depends` from every implementation it finds, so the `@api.depends('code', 'flag_image')` declared here keeps applying, to this implementation and to an override alike.
This is the same kind of fix as #185419, which made the `domain` of a field reachable by an override for the same reason. Two field declarations in the codebase still pass a function object this way; the other is `website.menu.is_mega_menu`, which passes `inverse` the same way and is left alone here.
Forward-Port-Of: odoo/odoo#288686On small screens, Sales quotation lists could show an ellipsis menu next to the New button that opened to an empty dropdown. This fix prevents the hidden upload control from being counted as a visible action on mobile, keeping the toolbar clean while preserving normal upload behavior on desktop.
Original PR description
The views built on `file_upload_list`/`file_upload_kanban` can hide their Upload button and offer the upload elsewhere: Sales does it for its quotations, where it lives in the cog menu…
The views built on `file_upload_list`/`file_upload_kanban` can hide their Upload button and offer the upload elsewhere: Sales does it for its quotations, where it lives in the cog menu (`upload_rfq_cog_menu`). Only the button was dropped though, as the uploader has to stay in the DOM for its file input: both the drop zone and the paste handler reach for it with `querySelector('.document_file_uploader.o_input_file')`.
That left an empty `d-contents` wrapper among the control panel buttons. 928ac7d6fe8f made the control panel fold every button but the first into an ellipsis dropdown on small screens, counting as a button any child that is not `.d-none`/`.o_hidden`. The wrapper matched, so the ellipsis showed up next to "New", and opening it revealed nothing: the menu hides its own first entry, leaving only that same invisible wrapper.
Render the uploader only when its button is visible or the screen is not small. A drop zone and a paste are out of reach on a small screen anyway, so nothing is lost there, and the desktop DOM is untouched.
Steps to reproduce:
- switch the browser to a small screen (< 768px)
- open Sales > Orders > Quotations, in list or kanban
- an ellipsis button sits next to "New"; clicking it opens an empty menu
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#289191This update corrects an internal reference used to determine product quantity decimal precision in field service sales timesheets. It helps ensure quantities use the intended rounding rules instead of silently falling back to a generic default.
Original PR description
The `decimal.precision` "Product Unit of Measure" was renamed "Product Unit" in 18.1. Some occurences called the old name still exist in the code. This is silently fallbacking on the default 2 decimals from the `precision_get`. See: https://github.com/odoo/odoo/pull/193490 task-none Forward-Port-Of: odoo/enterprise#132166 Forward-Port-Of: odoo/enterprise#131709
Engineering Change Order PDF reports now paginate long change tables correctly. This prevents rows from being split or cut off between pages, making printed reports easier to read while keeping the on-screen report behavior unchanged.
Original PR description
The ECO report kept its scrollable overflow when rendered as a PDF. This interfered with pagination and cut a table row at the boundary between two pages. Override the report overflow in PDF mode so its table can flow normally across pages, while preserving the existing HTML overflow behavior. Steps to reproduce: 1. Open an ECO containing enough changes to produce multiple pages. 2. Open the changes report and print it. 3. Inspect the table at the boundary between the first two pages. Before this commit: The last table row on the first page was cut between pages. After this commit: The table content is paginated without cutting the row. Forward-Port-Of: odoo/enterprise#131706
Fixed an issue where adding a note to a new appointment booking in Point of Sale could trigger an error when the user clicked away from the note field. This makes the booking flow smoother and prevents interruptions for staff managing appointments.
Original PR description
Steps: - Open a store with appointments enabled. - Go to the Bookings tab. - Open a new booking form. - Click on the note input, enter some text, and click away. Issue: - A traceback appears when focusing out of the note editor. Fix: - Add `MediaPlugin` to the `htmlField` editor configuration, as the plugin is used by the field when committing local changes via `_commitChanges`. [here](https://github.com/odoo/odoo/blob/saas-19.4/addons/html_editor/static/src/fields/html_field.js#L253) Task-6580877 Forward-Port-Of: odoo/enterprise#132145
Fixed an issue that caused an error when administrators clicked the Import Website button in Website settings. This restores access to the website import flow and prevents an unexpected crash during configuration.
Original PR description
To reproduce: - Connect in Odoo as an administrator - Go to Website / Configuration / Settings - Click on "Import Website" button. It traceback with an `OwlError: Invalid component props (WebsiteGeneratorForm)` error. Followup of odoo/enterprise@44c582b708bd, all props are in fact optional and already handled as such by the component. Forward-Port-Of: odoo/enterprise#132132
This fix prevents spreadsheet version history from being rebuilt from the wrong starting point when older revision data was altered by migration cleanup. It protects users from restoring a corrupted spreadsheet version and helps preserve spreadsheet data integrity.
Original PR description
…heet history Some spreadsheet can end up in a corrupted history state Original Data ⮕ no revision (XX) ⮕ Snapshot ⮕ Active Revisions and where the original data differ from the snapshot. XX: can…
…heet history Some spreadsheet can end up in a corrupted history state Original Data ⮕ no revision (XX) ⮕ Snapshot ⮕ Active Revisions and where the original data differ from the snapshot. XX: can occur after the script added https://github.com/odoo/upgrade/issues/6340. The migration script is supposed to rewrite the history of the spreadsheet when there are holes in the archived revisions continuity (eg. the history was original Data ⮕ rev **A** ⮕ rev **B** ⮕ rev **C** ⮕ snapshot ⮕ rev **D** and user deleted rev **B** for instance, the script deletes **A** and **C** and marks **D** as the very first revision). Version history was designed with the idea to replay every single revision that existed since the creation of the spreadsheet and apply it to the original data, and in case of missing revisions, in our example, B is missing, we detect the lack of continuity, we start from the snapshot, and replay every single revision since that snapshot. When the migration fixes the continuity, by deleting all the old revisions, and changing their order, we can no longer detect the lack of continuity and end up replay every available revision to the original data ,even though they are based on the snapshot. In that scenario, since the revisions will be applied on the original data but since they are based on the state of the snapshot only, the final state of the spreadsheet will be corrupted since a part of the . If a user then decides to restore the spreadsheet to the version they see in the version history (which is corrupted as mentioned) and the last snapshot is overwritten with the corrupted state, effectively breaking the spreadsheet. With this revision, we add a detection of this corrupted history state, in which case we enforce the history to be replayed from the snapshot and not the original data. Task-6533708 Forward-Port-Of: odoo/enterprise#132033 Forward-Port-Of: odoo/enterprise#130649
The spreadsheet interface now relies on the application's central store to manage side panels instead of passing that behavior through the environment. This internal cleanup should make spreadsheet-related screens easier to maintain while keeping the user experience unchanged.
Original PR description
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
Related: https://github.com/odoo/odoo/pull/289121 Related: https://github.com/odoo/design-themes/pull/1346 Related: https://github.com/odoo/documentation/pull/20132 Forward-Port-Of: odoo/enterprise#132108
Original PR description
Related: https://github.com/odoo/odoo/pull/289121 Related: https://github.com/odoo/design-themes/pull/1346 Related: https://github.com/odoo/documentation/pull/20132 Forward-Port-Of: odoo/enterprise#132108