Monday, April 14, 2025
20 changes · master
New functionality added to Odoo
Spreadsheet users can now create funnel charts from Odoo data, making it easier to visualize staged business flows such as pipelines or conversion steps. This improves reporting options directly in Documents Spreadsheet and Spreadsheet Edition without requiring external tools.
Original PR description
This commit adds the funnel chart type for odoo data. Task: [4629660](https://www.odoo.com/web#id=4629660&cids=1&menu_id=4720&action=333&active_id=2328&model=project.task&view_type=form)
Enhancements to existing features
Journal entries and accruals from purchase and sales orders now include start and end dates, making deferral periods easier to review. Deferred reports also show a new recognized amount that combines prior and current recognized values, helping teams audit deferred revenue and expenses more clearly.
Original PR description
1. Added 'Start Date' and 'End Date' fields on journal entry views. 2. Included 'Start Date' and 'End Date' on accrual entries generated from Purchase/Sales Orders. 3. Introduced a new computed 'Recognized' column in Deferred Reports, representing the sum of 'Before' and 'Current' columns to help audit recognized portions of deferred amounts. task-4636850
Resolved issues and error corrections
Sales-related spreadsheets no longer require users to load access to all spreadsheets unnecessarily. This reduces avoidable data reads and helps improve performance for affected users.
Original PR description
Users don't need to be able to read all spreadsheet. It hurts performance. Task: 4656165
Miscellaneous changes
Some website appointment pages are showing the wrong price, always using the price of the first variant it finds, not the current one. The issue was introduced in Odoo 18.0 with commit [1]. - Create a product.template, add it some variants and for each variants have a different price (eg through the variant extra price). - That product should be a service one - Create an appointment, enable "Up-front payment" in the "Options" tab and add it one of the variant product. Note that it's a vari
Original PR description
Some website appointment pages are showing the wrong price, always using the price of the first variant it finds, not the current one. The issue was introduced in Odoo 18.0 with commit [1]. - Create…
Some website appointment pages are showing the wrong price, always using the price of the first variant it finds, not the current one. The issue was introduced in Odoo 18.0 with commit [1]. - Create a product.template, add it some variants and for each variants have a different price (eg through the variant extra price). - That product should be a service one - Create an appointment, enable "Up-front payment" in the "Options" tab and add it one of the variant product. Note that it's a variant product that you set there, not a template. - You should see next to the variant product you just selected a price per booking being displayed. It is correctly showing the product variant price and not the product template price. - Repeat those 2 steps with the other product variants: create a new appointment and select another variant, you can see the price is correct in the form view. - Now, go to the website appointment page `/appointment`, you will see that all those appointments will show the same price which is the one from the first variant. - The same price error will appear once you click on an appointment (you should land on something like `/appointment/4?`) - Note that if you go further in the appointment booking and land on the shop cart page, the price will be correct there, using the correct variant one. (You'll need to assign a user on the appointment in the backend to be able to book a slot) Side note: Commit [1] seems to have broken commit [2] too. [1]: https://github.com/odoo/enterprise/commit/26fb20ace27b7b522a1105c221e4a52cf224a508#diff-5ffc6d13c61e692b22e4c2fec9218cf96c0c86201aeac951ef36e53e7baa7620R4-R9 [2]: https://github.com/odoo/enterprise/commit/5068b0ae7d38cb03318ad1e97124021121fd66cb opw-4678998 Forward-Port-Of: odoo/enterprise#83104
Starting a self-order point of sale no longer shows a popup with a kiosk link. Instead, the kiosk opens through the IoT Box automatically, making setup and daily operation simpler for users.
Original PR description
When clicking on "Start" on a self order PoS, a popup opened with the link to the self order page. We removed this modal, and requested kiosk opening on the iot box via websocket for simplicity reasons. In addition, a Kiosk PoS is automatically set to work with the IoT Box if selected in the autoconfigure modal when pairing a new IoT Box. Community PR: [https://github.com/odoo/odoo/pull/179767](https://github.com/odoo/odoo/pull/179767) Task: 4166305
Installing FedEx, UPS, or USPS shipping connectors from settings now selects the newer REST API versions instead of the older legacy connectors. This helps businesses use the current carrier integrations consistently across Sales, Inventory, and eCommerce delivery settings.
Original PR description
The new REST API versions of the shipping connectors (FedEx, UPS, USPS) have been released. However, when installing one from the settings, the system still installs the legacy modules. This commits enables the new REST API versions instead of the legacy ones. It applies to FedEx, UPS, and USPS connectors in the following settings: * Sales -> Shipping * Inventory -> Shipping Connectors * eCommerce -> Delivery task: 4613485
Brazilian localization now allows different tax operation types to be set on individual sales order and invoice lines, while keeping the parent document value as the default. This helps businesses invoice mixed scenarios, such as regular goods and free samples, correctly in one document instead of creating separate orders or invoices.
Original PR description
Before, the operation types were could only be set on the Sale Order or on the Invoice level. This works for most cases but if a customer needs to invoice products by different operation types they…
Before, the operation types were could only be set on the Sale Order or on the Invoice level. This works for most cases but if a customer needs to invoice products by different operation types they can't. This commit makes it possible to pick from the same list of values as on the parent orders/invoices as an "override" value for an specific lines that need a different operation type. This means that for any line that does not have an override set, the field of the parent model is used instead. In addition the l10n_br_test_avatax_sale module was kept after the refactor of external_tax modules because the code of the module was no longer necessary but the test cases still had use. Later down the line, the l10n_br_avatax_sale module was created to account for CNAE, operation types, and other new features. As this module expands it makes sense to move the test code back to it instead of keeping a separate test module. Upgrade PR: odoo/upgrade#7390 Task [link](https://www.odoo.com/odoo/project/967/tasks/4569548) task-4569548
Users with read-only access can now mark documents as favorites without needing edit permissions. This makes document organization easier while keeping existing access restrictions intact.
Original PR description
Change the favorite button on documents to use the `toggle_favorite` function instead of writing on the field fo it in sudo for user who don't have write access on the record. task-3805968
Product editing rights are being moved out of various app manager roles and into a dedicated product administrator role. This gives businesses finer control over who can create, change, or delete product information across affected apps.
Original PR description
Remove all write/create/delete permission on product related models from the different 'manager' roles in different modules. Instead, we use a new product administrator group for giving these permissions. task-4321341
When users turn off settings that require removing related modules, Odoo now opens the uninstallation wizard automatically instead of relying on a less clear warning. Users can also disable several such settings and remove the related modules together in one wizard, making cleanup simpler and less repetitive.
Original PR description
* = [pos_self_order_preparation_display] Specifications: - When a user unchecks a boolean field that triggers the uninstallation of a module, the module uninstallation wizard should open automatically. - If the user unchecks multiple boolean fields, they should be able to uninstall multiple modules at once through a single wizard. Purpose: - The current warning is not sufficiently clear or informative. - The existing wizard does not support the uninstallation of multiple modules at once, making it inconvenient for users to uninstall several modules simultaneously. Community: https://github.com/odoo/odoo/pull/205736 task-4513796
Odoo now keeps frequently used actions and views in a browser-based cache that survives normal reloads and can be shared across tabs. This helps previously visited pages render faster, improving day-to-day responsiveness without changing business workflows.
Original PR description
Before this commit, actions, and views were cached in RAM in their respective services. This enhanced the system's performance when loading the same actions/views. However, the RAM cache was flushed…
Before this commit, actions, and views were cached in RAM in their respective
services. This enhanced the system's performance when loading the same
actions/views. However, the RAM cache was flushed on reload (or when the tab
was closed). Additionally, it was not shared between tabs.
This commit introduces a new caching system, which will have two caches: a RAM
cache as before, and a new disk cache (using the IndexedDB API [1]). To utilise
the new caching system, you can add a `cached: true` setting on the rpc, or a
`cached` property on the orm:
```js
this.orm.cached.call(....
```
```js
rpc(url, params, { cached: true });
```
The caching system will behave as follows:
- If a value is found in the RAM cache, it will be used (as it was before).
- Otherwise: If a value is found in the disk cache, is that value that will be
used. The key difference is that, the RPC will also be performed, and the
caches will be updated.
This disk cache will be shared between tabs, and it will not be flushed during
a reload (or when closing of the browser). Please note that a hard reload
(Ctrl + F5) will flush all the caches. Another advantage of this new cached
system is that it is developed on a central place, and the developers will not
need to re-develop their own cache system as it's the case now.
This new caching system will not lower the quantities of RPC performed, but it
will not wait until the return of the RPC to continue the rendering, which will
speed up the rendering of already visited pages.
task-id 4251018
[1]: https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_APIDocument sharing now uses a guided wizard with a fuller partner selection experience, making it easier to invite the right people. The document list is also more useful by showing recently updated items first in All and allowing searches across both document names and tags.
Original PR description
We replace the component "DocumentsMemberInvite" by a wizard to simplify the code and get a standard full-featured partner selection. [IMP] documents: improve search and ordering We change the order for "All" to "last updated on" (write_date) in descending order, and we add a combined search on name and tag name. Task-4545482
Employees can now create to-dos by sending an email to the company's to-do alias, provided their employee record is linked to a user with to-do access. People copied on the email are automatically added as followers when they match existing contacts, making email-based task creation easier to track.
Original PR description
After this commit we can send mail to to-do@company_alias and to do is created if the mail is from a employee and user linked to the employee is linked to todo and all the partners matching cc of the mail will be added as followers. task- 4509976
Performance test coverage for the Documents app has been consolidated into the Documents module. This helps teams monitor efficiency in one place and catch slowdowns earlier without changing user-facing behavior.
Original PR description
Centralizing performance tests for documents in documents. To come: Other tests for bridges features implemented in documents should also be tested in documents. Task-4548076
This update changes how employee schedule changes, part-time work, and credit-time arrangements are handled in payroll. It moves Belgium-specific credit-time logic into Belgian payroll flows, improving payslip and contract accuracy for affected employees.
This update removes unnecessary request details from the session information loaded by IoT and Studio. It helps keep startup data lighter and better aligned with the main Odoo platform change, with no expected change to normal user workflows.
Original PR description
Enterprise counter-part. https://github.com/odoo/odoo/pull/205725
This update adjusts Odoo Studio’s test setup so it works with a new caching service for actions and views. The change supports more reliable validation of Studio behavior as caching is introduced, with no direct impact on day-to-day users.
Social media communications for events with multiple time slots are now sent once for the overall event instead of once per slot. This prevents repetitive posts, keeps event promotion cleaner, and reduces unnecessary communication noise.
Description ----------- When clicking the sharing button on a knowledge article, the system retrieves all members linked to the article. This includes members directly tied to the article or inherited through parent articles ( stopping at the first desynchronized article). In databases where articles have numerous associated members, the `_get_article_member_permissions` method suffers from severe performance issues. It retrieves *all* articles and their associated members, collects all paren
Original PR description
Description ----------- When clicking the sharing button on a knowledge article, the system retrieves all members linked to the article. This includes members directly tied to the article or…
Description ----------- When clicking the sharing button on a knowledge article, the system retrieves all members linked to the article. This includes members directly tied to the article or inherited through parent articles ( stopping at the first desynchronized article). In databases where articles have numerous associated members, the `_get_article_member_permissions` method suffers from severe performance issues. It retrieves *all* articles and their associated members, collects all parent articles in the hierarchy, and only then applies grouping and filtering based on the `id` of `self`. This process includes a `LEFT OUTER JOIN` on related tables to fetch specific `fields` passed as arguments, resulting in an O(n^2) complexity on large tables such as `res.partner` and `knowledge.article.member` (the latter being a Many2many relationship that typically contains a high volume of rows). This patch improves performance by shifting the grouping and filtering logic to the start of the process, effectively injecting all preconditions at the base of the recursion. This reduces the hierarchy of articles and memberships to explore. Additionally, the computation of inherited permissions—sourced from the "closest" ancestor article—is now handled at the SQL level instead of Python. This eliminates unnecessary rows in the process, avoiding unnecessary work in the business logic afterward. Benchmark --------- On a client's database with around 600 articles, 5k partners and 15k knowledge.article.member in total, for a specific article which has a total of 1.7k members (direct and inherited): | Request | Before | After | Speed-up | |--------------------------------|---------|-------|-----------| | `_get_article_permission_data` | 4.7+min | 150ms | **1880x** | Reference --------- opw-4603551 Forward-Port-Of: odoo/enterprise#81264
Currently, an exception is generated when a user tries to save a product record without a barcode, whether it is a newly created record or an existing one. Steps to reproduce: 1. Install the Inventory module. 2. Go to Inventory settings. 3. Set Barcode Nomenclature to Default GS1 Nomenclature. 4. Go to Inventory -> Products, create a product with a barcode, and save it. 5. Edit the same product, remove the barcode, and save it again. 6. An error occurs. Error: `StopIteration` T
Original PR description
Currently, an exception is generated when a user tries to save a product record without a barcode, whether it is a newly created record or an existing one. Steps to reproduce: 1. Install the…
Currently, an exception is generated when a user tries to save a product record without a barcode, whether it is a newly created record or an existing one. Steps to reproduce: 1. Install the Inventory module. 2. Go to Inventory settings. 3. Set Barcode Nomenclature to Default GS1 Nomenclature. 4. Go to Inventory -> Products, create a product with a barcode, and save it. 5. Edit the same product, remove the barcode, and save it again. 6. An error occurs. Error: `StopIteration` This issue [1] occurs because when a user tries to save the record without a barcode, the value is false, and an false value is not iterable. [1] - https://github.com/odoo/odoo/blob/9eb6c16cd7d4fe9364d043e2af96876bf82a44d4/addons/barcodes_gs1_nomenclature/models/barcode_nomenclature.py#L163 This fix resolves an issue where GS1 preprocessing was always applied when checking for duplicate product barcodes. By introducing the skip_preprocess_gs1 context flag, the GS1 preprocessing step is now bypassed when verifying barcode uniqueness. Related Community PR:- https://github.com/odoo/odoo/pull/196438 sentry-6267124218 Forward-Port-Of: odoo/enterprise#80544