Daily updates from Odoo
Navigate
Branch
Tuesday, April 15, 2025
28 changes
21 changes
New functionality added to Odoo
Sales teams can now upload or take a photo of a business card and automatically create a CRM lead from the extracted contact details. This reduces manual data entry after meetings and helps turn new contacts into follow-up opportunities faster.
Original PR description
This commit allows end users to upload business card images (or take a picture on the fly) and generate leads from them. The underlying logic relies on an API call to an AI service to read the image and return a dictionary of information that we use to create lead records. The AI service is IAP by default but can be configured to a custom openAI key. Task-4210816
Enhancements to existing features
Cash basis taxes now better account for exchange rate changes between invoice confirmation and payment. This helps prevent tax discrepancies in foreign currency invoices and makes accounting reports more accurate.
Original PR description
### Purpose If you use Cash Basis taxes, at confirmation of the invoice the tax is put on a temporary account (Cash Basis Transition Account). On payment, that tax amount is moved to another account,…
### Purpose If you use Cash Basis taxes, at confirmation of the invoice the tax is put on a temporary account (Cash Basis Transition Account). On payment, that tax amount is moved to another account, amount due, for the next Tax report. If you are using invoices in foreign currency, the currency rate can be different between the invoice date and the payment date. In Odoo, this will create a discrepancy because the tax amounts are not the same. It's missing a foreign currency difference to explain the difference. This is the case when the Cash Basis Transition Account is not set as reconcilable. ### Implementation -Cash Basis Transition Account now has to be reconcilable (error is raised when setting up tax account) -The disable_partial_exchange_diff parameter is removed -The 'full exchange reconciliation' is removed as it will always be covered by the 'partial exchange reconciliation' -Rounding errors for cash basis taxes are now covered during the creation of the tax cash basis moves of the partials instead of during the 'full exchange reconciliation' (where it used to create an exchange diff even if there wasn't in order to fix rounding issues). It is now prevented by setting the amount_currency of the tax line to the amount_residual_currency when the journal entry is fully paid or when it's not fully paid yet but has a higher calculated amount_currency than what is needed to pay the residual tax. -In AccountTestInvoicingCommon, armageddon_tax child 2 needs to have tax egibility 'on_invoice' when tests are run at install in order to not trigger the constraint as the cash_basis_transition_account is an empty record in those cases odoo/odoo/pull/202713 odoo/upgrade/pull/7513 task-4404035
Products can now be linked to the specific delivery aggregators or platforms where they should be sold. This helps businesses manage menu availability more accurately across channels and avoid showing items on the wrong platform.
Original PR description
Following this commit : - Introduced a new field to store the list of aggregators/platforms where the product is available for sale. This enhancement allows better control over product availability across different platforms. task- 4376827
The Knowledge app was adjusted to stay compatible with a related platform data-format change. This keeps article comments working correctly after the underlying update, with no expected change to the user experience.
Original PR description
https://github.com/odoo/odoo/pull/202400
Spreadsheet tables now respond more smoothly when users hover over cells and work with linked sales data. This makes spreadsheet editing feel more accurate and interactive, reducing confusion when reviewing or updating business information.
The Documents app now includes multi-company access information in the initial session data. This avoids an extra startup request, helping the app load a little faster for users in multi-company environments.
Original PR description
Since the Document app use the `base.group_multi_company` at startup[1], it's made sense to the session_info bundle to avoid an RPC at webclient startup. [1]: https://github.com/odoo/enterprise/blob/b78e36b16a6b4b157c227d8b222b544f94cb9016/documents/static/src/core/document_service.js#L81
Partner address handling is being streamlined: invoice contacts now cover follow-up needs, and editing a company contact address updates the parent company address. This reduces rarely used contact types and makes customer address management easier to understand and maintain.
Resolved issues and error corrections
When a quality check is marked as failed with a failed quantity of zero, the system now treats the full quantity as passed. This prevents stock from being incorrectly sent to a failure location, keeping inventory movements accurate.
Original PR description
Issue Before This Commit: -------------------------------- For Quality Check per quantity, failing with 0 qty incorrectly marked all as failed and moved stock to the failure location. Steps to Reproduce: -------------------------------- 1. Create a quantity-type Quality Check Point for an operation. 2. Perform a Quality Check, click fail, enter failed qty as 0, and select a failure location. 3. Save the result and check stock moves. 4. The stock move is incorrectly transferred to the failure location. With This Commit: -------------------------------- This issue occurred due to an incorrect quantity assignment. Now, when the failed quantity is 0, all stock is correctly considered as passed and moves to the correct destination. Task-id: 4512017
This update adjusts internal tests after changes to default administrator permissions, making them more accurate and reliable. It also fixes access-related issues when archiving pricelists, copying subscription products, and confirming inter-company purchase orders, reducing errors for users with limited permissions.
Original PR description
Administrators groups have been recently removed from the default groups when creating a database, they're only added when demo data is installed. Tests have been adapted quickly, by adding all those groups in the core `AccountTestInvoicingCommon`, because he doesn't rely on the administrator to run the test setups (when all other tests do), but on a newly made test user `accountman`. This PR removes two of those generic groups from the `AccountTestInvoicingCommon` default groups, moving them to more specific descendants of the class, and fixes the broken tests as well. When possible to easily integrate the test class in the existing tests architecture (with the right parent), this approach is used, otherwise a sudo or an override of `default_groups` is added. task-4677987
This fix keeps spreadsheet charts and figures working correctly after recent spreadsheet changes. It helps users avoid display, insertion, editing, and collaboration issues when working with charts in documents and spreadsheets.
Original PR description
Adapt figures to spreadsheet changes. Task: 4189170
This fix keeps spreadsheet charts and figures working correctly after recent spreadsheet changes. It helps users insert, edit, copy, and collaborate on charts without disruptions or inconsistent behavior.
Original PR description
Adapt figures to spreadsheet changes. Task: 4189170
Features or functions removed from Odoo
The depreciation schedule no longer shows the "First Depreciation Date" column because it could be inaccurate for assets imported from previous accounting systems. This reduces confusion and helps users rely on clearer asset reporting across both imported and Odoo-created assets.
Original PR description
The "First Depreciation Date" column is misleading when importing assets from previous accounting systems, as it often displays an incorrect date. As if the asset is created in Odoo, the date usually matches the acquisition date. But if we import assets that were already depreciated in another system, the date is often wrong. This change removes the "First Depreciation Date" column to prevent confusion and ensure more accurate reporting for both Odoo-created and imported assets. task-4657876
The Master Production Schedule no longer supports setting a maximum quantity to replenish. This simplifies MPS planning behavior by removing a limit that is no longer needed, along with related demo data and tests.
Original PR description
This commit removes the maximum to replenish feature from MPS and deletes the tests that no longer make sense in absence of this feature. Task ID: [4481975](https://www.odoo.com/odoo/project/966/tasks/4481975)
This change removes custom test patches that disabled onboarding tours in individual areas. Since onboarding tours are now disabled globally during automated tour tests, test behavior is more consistent and easier to maintain.
Original PR description
Onboarding tours are now disabled globally during test tours. Ad-hoc patches should not be necessary.
Code cleanup and technical improvements
This update cleans up internal dependency imports and outdated fallback logic across reporting and payroll areas. It reduces maintenance overhead and helps keep the codebase aligned with current requirements without changing business features.
Original PR description
These dependencies are already required / in requirements.
Miscellaneous changes
Bug === 1. Create a folder, and change 'access_internal = view' (so Demo can view it, but not edit it) 2. Login as Demo 3. Create a shortcut to that folder 4. Click on the shortcut in the sidebar 5. You can upload in the shortcut even if you have no access on the target Now, the "Upload", "Request", etc buttons will be disabled if the user has no edit access on the target. Task-4626766 Forward-Port-Of: odoo/enterprise#80782
Original PR description
Bug === 1. Create a folder, and change 'access_internal = view' (so Demo can view it, but not edit it) 2. Login as Demo 3. Create a shortcut to that folder 4. Click on the shortcut in the sidebar 5. You can upload in the shortcut even if you have no access on the target Now, the "Upload", "Request", etc buttons will be disabled if the user has no edit access on the target. Task-4626766 Forward-Port-Of: odoo/enterprise#80782
Before this commit, two access rights records had the same id in the ir.model.access.csv file. This caused issues when trying to upgrade a db from previous versions. As the two records had the same rights, we remove the one linked to the manager group. Forward-Port-Of: odoo/enterprise#82514
Original PR description
Before this commit, two access rights records had the same id in the ir.model.access.csv file. This caused issues when trying to upgrade a db from previous versions. As the two records had the same rights, we remove the one linked to the manager group. Forward-Port-Of: odoo/enterprise#82514
After https://github.com/odoo/odoo/pull/144586, the modules other than base localization module should not have the countries key defined in their manifest. The issue happens because countries key works similar to auto-install and it can lead to unwanted installation of the module. As there was no check implemented, for some modules this key was used accidentally and caused issues with auto-install. This commit removes this field from the manifest of the modules that could have this pro
Original PR description
After https://github.com/odoo/odoo/pull/144586, the modules other than base localization module should not have the countries key defined in their manifest. The issue happens because countries key works similar to auto-install and it can lead to unwanted installation of the module. As there was no check implemented, for some modules this key was used accidentally and caused issues with auto-install. This commit removes this field from the manifest of the modules that could have this problem to avoid the issue. Also in https://github.com/odoo/odoo/pull/201526 a linting test is proposed to avoid having the same issue in the future. Runbot Errors: https://runbot.odoo.com/odoo/error/159875 https://runbot.odoo.com/odoo/error/159877 Forward-Port-Of: odoo/enterprise#81178
If you have multiple taxes on a sale order or invoice, then the total tax amount is displayed with the name of the first tax group. Rename it to show a generic "Taxes" group. This was done before for sale orders but was lost in d5da2b62263f85fbce0f2548085c066cbbf10371. opw-4673667 Forward-Port-Of: odoo/enterprise#83394 Forward-Port-Of: odoo/enterprise#83078
Original PR description
If you have multiple taxes on a sale order or invoice, then the total tax amount is displayed with the name of the first tax group. Rename it to show a generic "Taxes" group. This was done before for sale orders but was lost in d5da2b62263f85fbce0f2548085c066cbbf10371. opw-4673667 Forward-Port-Of: odoo/enterprise#83394 Forward-Port-Of: odoo/enterprise#83078
**Steps to reproduce** On runbot: 1. Activate the website form for the "IT Support (Auto Assignment by Tags)" team. 2. Add the "Tags" field to the form, allowing visitors to select tags for a ticket. 3. Submit a ticket with the "Repair" tag selected. Actual: the ticket is not auto-assigned. Expected: Mitchell Admin is auto-assigned, the same way as if the ticket was created from the backend. **Cause** When using the website form, a `SET` command is used to set the tags, while we ar
Original PR description
**Steps to reproduce** On runbot: 1. Activate the website form for the "IT Support (Auto Assignment by Tags)" team. 2. Add the "Tags" field to the form, allowing visitors to select tags for a ticket. 3. Submit a ticket with the "Repair" tag selected. Actual: the ticket is not auto-assigned. Expected: Mitchell Admin is auto-assigned, the same way as if the ticket was created from the backend. **Cause** When using the website form, a `SET` command is used to set the tags, while we are currently only expecting a `LINK` command. opw-4646654 Forward-Port-Of: odoo/enterprise#82345
At the moment, if a cancellation has been requested, the 'Update SAT' button isn't always visible on the invoice. Analysis: The condition for the 'Update SAT' button being visible is that at least one of the EDI documents falls under one of the domains in `_get_update_sat_status_domains`. In particular, the 'Update SAT' status is visible if there is an EDI document with the 'invoice_sent' status and whose SAT status is not 'cancelled' or 'skip'. If the user requests the cancellation of th
Original PR description
At the moment, if a cancellation has been requested, the 'Update SAT' button isn't always visible on the invoice. Analysis: The condition for the 'Update SAT' button being visible is that at least…
At the moment, if a cancellation has been requested, the 'Update SAT' button isn't always visible on the invoice. Analysis: The condition for the 'Update SAT' button being visible is that at least one of the EDI documents falls under one of the domains in `_get_update_sat_status_domains`. In particular, the 'Update SAT' status is visible if there is an EDI document with the 'invoice_sent' status and whose SAT status is not 'cancelled' or 'skip'. If the user requests the cancellation of the CFDI before the SAT status is fetched for the first EDI document (which represents the sending of the invoice), its SAT status will be set to 'skip'. As a result, the 'Update SAT' button will no longer be visible, meaning that the user can not update the invoice's state from fetching the SAT status.  Fix: The Update SAT button should also be visible if there is a document in 'invoice_cancel_requested' whose SAT state is valid. opw-4375788 Forward-Port-Of: odoo/enterprise#83289
7 changes
Resolved issues and error corrections
Italian point of sale receipts now send global discounts to the fiscal printer in the correct format. This prevents validation errors when applying an overall discount and helps cashiers complete discounted sales normally.
Original PR description
### Before this PR - Go on point of sale (with pos_discount installed) - Click on Action - Click on Discount - Write a discount percentage - Click OK - Validate POS An error appear because the negative price should be a printRecItemAdjustment with type 3 ### After this PR the right printRecitemAdjustiment is sent to printer
Users scrapping products from the Barcode app can now see and change the source location. This helps ensure inventory is removed from the correct shelf or child location, reducing stock accuracy issues.
Original PR description
**Problem:** When doing a scrap from the barcode app, the source location field is not accessible. The default source location of the scrap will be the one of the stock move, this could be a problem…
**Problem:** When doing a scrap from the barcode app, the source location field is not accessible. The default source location of the scrap will be the one of the stock move, this could be a problem if the product is located in a child location. For instance if confirming a sale order for product A (which is stored in WH/stock/Shelf 1), the pick generated by the sale order will be from WH/Stock to WH/Output (default pick values). In the barcode app, if doing a scrap from this picking, the source location will be WH/stock and the client will not be able to change that because the field does not appear. **Steps to reproduce:** - From the inventory app dashboard select "internal transfer" - Create a new internal transfer - Enter a storable product - Set a demand quantity - Click on "Mark as Todo" - Open the barcode app - Click on operations - Select "Internal Operations" - Select the transfer you just created - Click on the gear icon on the top right and select "scrap" **Current Behavior:** The source location field is not visible **Expected Behavior:** The source location field should be visible and editable **Cause of the issue:** The source location field is not in the view https://github.com/odoo/enterprise/blob/a9334bb551606d0151d8fc7a8f3393c3a6e312b9/stock_barcode/views/stock_scrap_views.xml#L68 **Fix:** I added the source location field in the view opw-4489401
Italian point-of-sale receipts with a 100% discount can now be completed even when the final amount is zero. This prevents fiscal printer blocking and supports valid checkout flows for fully discounted sales.
Original PR description
### Before this PR Try to do a receipt with a product, then a full discount of this product. You can't do a receipt with 0.0 as the amount because it is missing printRecTotal ### After this PR: You can do receipt with an amount of 0.0 This PR depends from odoo/enterprise#80951 (i can't create draft PR, but when that PR will be merged i will rebase)
Miscellaneous changes
Steps to Reproduce (Calendar View): 1. Open the Calendar view on the monthly scale. 2. Create a planning slot by clicking on a date to plan. 3. Notice that the default hours are set to 7 AM to 7 PM. Steps to Reproduce (Gantt View): 1. Open the Gantt view on the weekly scale. 2. Create a planning slot by clicking on a grid cell. 3. Observe that the default hours are set to 8 AM to 5 PM. - In the Calendar view on the monthly scale, creating a planning slot defaults to 7 AM to 7 PM.
Original PR description
Steps to Reproduce (Calendar View): 1. Open the Calendar view on the monthly scale. 2. Create a planning slot by clicking on a date to plan. 3. Notice that the default hours are set to 7 AM to 7 PM. Steps to Reproduce (Gantt View): 1. Open the Gantt view on the weekly scale. 2. Create a planning slot by clicking on a grid cell. 3. Observe that the default hours are set to 8 AM to 5 PM. - In the Calendar view on the monthly scale, creating a planning slot defaults to 7 AM to 7 PM. - In the Gantt view on the weekly scale, creating a planning slot defaults to 8 AM to 5 PM. - These default hours do not align with the working calendar, leading to inconsistencies. - This fix adjusts the default hour settings in both views to ensure they align with the working calendar and account for unavailability. task-4164485 Forward-Port-Of: odoo/enterprise#83191 Forward-Port-Of: odoo/enterprise#69888
At the moment, if a cancellation has been requested, the 'Update SAT' button isn't always visible on the invoice. Analysis: The condition for the 'Update SAT' button being visible is that at least one of the EDI documents falls under one of the domains in `_get_update_sat_status_domains`. In particular, the 'Update SAT' status is visible if there is an EDI document with the 'invoice_sent' status and whose SAT status is not 'cancelled' or 'skip'. If the user requests the cancellation of th
Original PR description
At the moment, if a cancellation has been requested, the 'Update SAT' button isn't always visible on the invoice. Analysis: The condition for the 'Update SAT' button being visible is that at least…
At the moment, if a cancellation has been requested, the 'Update SAT' button isn't always visible on the invoice. Analysis: The condition for the 'Update SAT' button being visible is that at least one of the EDI documents falls under one of the domains in `_get_update_sat_status_domains`. In particular, the 'Update SAT' status is visible if there is an EDI document with the 'invoice_sent' status and whose SAT status is not 'cancelled' or 'skip'. If the user requests the cancellation of the CFDI before the SAT status is fetched for the first EDI document (which represents the sending of the invoice), its SAT status will be set to 'skip'. As a result, the 'Update SAT' button will no longer be visible, meaning that the user can not update the invoice's state from fetching the SAT status.  Fix: The Update SAT button should also be visible if there is a document in 'invoice_cancel_requested' whose SAT state is valid. opw-4375788 Forward-Port-Of: odoo/enterprise#83289
Before this commit, the `/iot/get_handlers` endpoint was using the `text/html` mime type, even though it was sending a binary zip response. This was mostly harmless, however it could potentially cause issues if there was some service between the IoT box and DB that assumed it was safe to modify the "text" response in some way. opw-4718821 Forward-Port-Of: odoo/enterprise#83315
Original PR description
Before this commit, the `/iot/get_handlers` endpoint was using the `text/html` mime type, even though it was sending a binary zip response. This was mostly harmless, however it could potentially cause issues if there was some service between the IoT box and DB that assumed it was safe to modify the "text" response in some way. opw-4718821 Forward-Port-Of: odoo/enterprise#83315
Previously, POL did not have a `discount` field which meant that the `discount` of a SOL was transferred in the `price_unit` of the POL. For example, the following SO: Product | Unit Price | Discount | Tax Excl. ------------|------------|----------|---------- Product A | $1000.0 | 10.0% | $900.0 Would be converted into the following PO Product | Unit Price | Tax Excl. ------------|------------|---------- Product A | $900.0 | $900.0 However, as of V17, it
Original PR description
Previously, POL did not have a `discount` field which meant that the `discount` of a SOL was transferred in the `price_unit` of the POL. For example, the following SO: Product | Unit Price | Discount | Tax Excl. ------------|------------|----------|---------- Product A | $1000.0 | 10.0% | $900.0 Would be converted into the following PO Product | Unit Price | Tax Excl. ------------|------------|---------- Product A | $900.0 | $900.0 However, as of V17, it is possible to add discount on POL, but are not taken into account when converting into SOL. With this commit, the discounts are now synchronized when going from SOL->POL and inversely. opw-4446288 Forward-Port-Of: odoo/enterprise#82346 Forward-Port-Of: odoo/enterprise#82079