Daily updates from Odoo
Navigate
Branch
Tuesday, July 2, 2024
61 changes
22 changes
Resolved issues and error corrections
Fixes an issue where spreadsheet links to list or pivot views could fail because required context was not passed along. Users can now open these linked views from spreadsheets without encountering errors.
Original PR description
## Description: navigateTo helper function in helpers.js was not passing the context to the action. This commit resolves the problem by ensuring the context is properly passed to the action. task-3880304 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Merging customer or vendor records no longer fails when both partners have the same bank account linked to posted payments. The system now consolidates duplicate bank accounts first, helping users clean up partner records without payment history blocking the process.
Original PR description
Currently, you cannot merge partners if they have bank accounts linked to payments. ### Steps to reproduce 1. Install the `account` module. 2. Create two partners, each having the same bank account…
Currently, you cannot merge partners if they have bank accounts linked to payments. ### Steps to reproduce 1. Install the `account` module. 2. Create two partners, each having the same bank account number. 3. Create and post payments for each of those partners. 4. Attempt to merge those partners. You should be met with the following message: ``` The operation cannot be completed: another model requires the record being deleted. If possible, archive it instead. Model: Journal Entry (account.move) Constraint: account_move_partner_bank_id_fkey ``` ### Cause When merging partners, the system attempts to update all foreign keys referencing the partners being merged. In certain circumstances, this update violates unicity constraints. In such cases, the system simply deletes the records that can't be updated. In our case, the `res_partner_bank` table has the following unicity constraint: `unique(sanitized_acc_number, partner_id)`. When we merge the two partners and the system attempts to update the `partner_id` field on `res_partner_bank`, the constraint is violated because both partners originally had the same account number. The system then tries to delete those bank accounts, but it fails because they are linked to payments (with an `ondelete restrict` clause). ### Fix Identify the bank accounts that are duplicated between the source and destination partners, and merge them before merging the partners. ### Note `_update_foreign_keys_generic` is basically just `_update_foreign_keys` from `data_merge`. `_merge_additional_models` exactly the one from `data_merge` opw-3925952
Online course managers now see a clear prompt if they try to publish certification content without selecting a certificate, preventing an error page. The front-end option to create a new certification during upload was removed so certifications are properly set up through the back office before use.
Original PR description
**Crash Prevention:** Added validation to ensure a certificate is selected before saving and publishing, preventing errors. **Creation Restriction:** Removed the option to create certifications from the front-end to avoid incomplete setups, requiring back-end customization. **Code cleanup**: Remove an unused template. Task-3940344
Indian e-invoicing can now process invoice lines with negative amounts. This fixes an unnecessary restriction, helping businesses handle discounts, corrections, or adjustments more smoothly.
Original PR description
This PR removes the restriction on invoice lines having negative amounts in the `l10n_in_edi` module, which was introduced in PR https://github.com/odoo/odoo/pull/170736. This fix allows invoice lines with negative amounts to be processed, aligning with the intended functionality and ensuring a smoother invoicing experience.
This update brings the spreadsheet component to a newer version with several small fixes. Users should see smoother spreadsheet editing, including better sheet name editing, corrected translation loading, and improved find-and-replace navigation.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/fac2351f9 [REL] 17.2.13 Task: 0 https://github.com/odoo/o-spreadsheet/commit/ef733da35 [FIX] BottomBarSheet: Prevent drag of sheet while editing its name Task: 4010842 https://github.com/odoo/o-spreadsheet/commit/235ff4cc8 [FIX] model: mark default translations as loaded Task: 3999116 https://github.com/odoo/o-spreadsheet/commit/af15d3af3 [FIX] find_and_replace: fix previous command Task: 3839575 Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Mehdi Rachico (mera) <mera@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com>
This fix prevents a confusing failure when confirming a sales order if a delivery operation has no default destination location set. Users are now guided more clearly to correct the stock configuration, helping avoid blocked deliveries after upgrades or manual setup changes.
Original PR description
Steps to reproduce: - Enable locations in Stock settings - Edit delivry order picking type in Inventory overview - Edit the form view and remove required from default_location_dest_id - Set Default Destination Location to blank - Create and confirm a new SO Bug: default_location_dest_id is only required on the frontend if not set an error is thrown when confirming an SO (impossible to create the move) Fix: -Stable: upgrade script has already been fixed https://github.com/odoo/upgrade/pull/5873 but it's better to still add a more userfreindly redirect for customers that upgraded before the PR was merged (particularly since it's still possible to mess it up as the field is not required on the backend) -Matser: set the field as required on the backend aswell opw-3970295
Code cleanup and technical improvements
The Project app's automated tests were converted to a newer testing approach and shared chart-checking utilities were moved into a reusable location. This is an internal quality improvement that helps developers maintain project features more reliably without changing day-to-day user behavior.
This change updates the internal test setup for Project Todo to use Odoo's newer testing approach. It helps maintain reliability for future changes without altering day-to-day user functionality.
Miscellaneous changes
### Steps to reproduce: - Create and mark as to do a delivery order for a partner with a move: - 2 x Product P - Set the quantity of the move to 1 - Create and confirm a batch transfer containing your picking - Validate the batch transfer and create a backorder #### > The picking is removed from the batch ### Cause of the issue: The pickings are removed from the batch by these lines: https://github.com/odoo/odoo/blob/b4872364f9f8926bbf5b843db014f33652124cb9/addons/stock_picking_ba
Original PR description
### Steps to reproduce: - Create and mark as to do a delivery order for a partner with a move: - 2 x Product P - Set the quantity of the move to 1 - Create and confirm a batch transfer containing your picking - Validate the batch transfer and create a backorder #### > The picking is removed from the batch ### Cause of the issue: The pickings are removed from the batch by these lines: https://github.com/odoo/odoo/blob/b4872364f9f8926bbf5b843db014f33652124cb9/addons/stock_picking_batch/models/stock_picking.py#L141-L145 However, they should only be removed if at least one of the pickings is not backordered. opw-4001981 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#171218
Current behaviour: --- Product name can overflow from the label box Expected behaviour: --- Truncate the name if it's too long Steps to reproduce: --- 1. Go to Inventory > Products > Lots/Serial Numbers 2. Open one Serial Number > open its product 3. Rename product with long name 4. Go back to Lots/Serial Numbers 5. Select the Serial Number with renamed product 6. Click on Print > PDF 7. Barcode is out of the box Cause of the issue: --- Caused by: https://github.com/odoo/o
Original PR description
Current behaviour: --- Product name can overflow from the label box Expected behaviour: --- Truncate the name if it's too long Steps to reproduce: --- 1. Go to Inventory > Products > Lots/Serial Numbers 2. Open one Serial Number > open its product 3. Rename product with long name 4. Go back to Lots/Serial Numbers 5. Select the Serial Number with renamed product 6. Click on Print > PDF 7. Barcode is out of the box Cause of the issue: --- Caused by: https://github.com/odoo/odoo/commit/a5924bfe11cd9324e2ba056e0ac1d449aed730c8 Fix: --- Reverting: https://github.com/odoo/odoo/commit/a5924bfe11cd9324e2ba056e0ac1d449aed730c8 opw-3819349 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#169226
## Description Following a1bc13b39559fa82763a9f0b3b603f6026b8a151 the field `One2many: applicant_ids` becomes `Many2one: applicant_id`. The field is used in lookups (ir.rules) and is also the inverse of `hr.applicant.response_ids`, and is present on the model `survey.user_input`, which is a large table, therefor should be indexed. ## Reference task-4011294 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#170918
Original PR description
## Description Following a1bc13b39559fa82763a9f0b3b603f6026b8a151 the field `One2many: applicant_ids` becomes `Many2one: applicant_id`. The field is used in lookups (ir.rules) and is also the inverse of `hr.applicant.response_ids`, and is present on the model `survey.user_input`, which is a large table, therefor should be indexed. ## Reference task-4011294 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#170918
**Description of the issue/feature this PR addresses:** The field condition is used but it is not show in any view. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#169077
Original PR description
**Description of the issue/feature this PR addresses:** The field condition is used but it is not show in any view. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#169077
Before this PR, the `Channel subscription is renewed when channel is manually added` test was sometimes failing. This test ensures the bus subscription is renewed when the user joins a channel. To do this, the test relies on the `assert.step` API: the channel is added, we wait for a tick, and then we assert that the step was correctly registered. However, a tick is sometimes not enough. This PR replaces the usage of QUnit's tep API with the web one that waits for the step to be triggered,
Original PR description
Before this PR, the `Channel subscription is renewed when channel is manually added` test was sometimes failing. This test ensures the bus subscription is renewed when the user joins a channel. To do this, the test relies on the `assert.step` API: the channel is added, we wait for a tick, and then we assert that the step was correctly registered. However, a tick is sometimes not enough. This PR replaces the usage of QUnit's tep API with the web one that waits for the step to be triggered, which is far more robust. fixes runbot-61018 Forward-Port-Of: odoo/odoo#171401
The `Message shows up even if channel data is incomplete` test sometimes fails. This test ensures that a message received on a partially known channel still appears. To achieve this, the test needs to manually refresh the bus subscription and wait for this subscription to complete before sending a notification on the bus. Sometimes, the notification occurs before `waitUntilSubscribe` is called. Consequently, the `waitForSubscribe` function hangs because the expected subscription for
Original PR description
The `Message shows up even if channel data is incomplete` test sometimes fails. This test ensures that a message received on a partially known channel still appears. To achieve this, the test needs to manually refresh the bus subscription and wait for this subscription to complete before sending a notification on the bus. Sometimes, the notification occurs before `waitUntilSubscribe` is called. Consequently, the `waitForSubscribe` function hangs because the expected subscription for the test has already been completed. This PR resolves this issue. runbot-59270 Forward-Port-Of: odoo/odoo#171404
When you take a time off for which there is no need of validation, you can refuse it, although you don't have any time off rights. This fixes the issue, you have to be either a time off officer or the manager of the one who took the time off. Task: 3981373 Forward-Port-Of: odoo/odoo#170514
Original PR description
When you take a time off for which there is no need of validation, you can refuse it, although you don't have any time off rights. This fixes the issue, you have to be either a time off officer or the manager of the one who took the time off. Task: 3981373 Forward-Port-Of: odoo/odoo#170514
Use of the record.{field}.value was causing the displayed (string) values to be used in the kanban card's t-if logic rather than the actual value of the field. This resulted in - `record.cap_accrued_time.value` ALWAYS being evaluated as True (since "False" is True) - `record.maximum_leave.value > 0` evaluating as True when the language wasn't a language that uses "." as it's decimal separator. e.g. "5.00" > 0 == True but "5,00" > 0 == False opw-3999753 Also, re-export the po
Original PR description
Use of the record.{field}.value was causing the displayed (string) values
to be used in the kanban card's t-if logic rather than the actual value
of the field. This resulted in
- `record.cap_accrued_time.value` ALWAYS being evaluated as True (since
"False" is True)
- `record.maximum_leave.value > 0` evaluating as True when the language
wasn't a language that uses "." as it's decimal separator. e.g.
"5.00" > 0 == True but "5,00" > 0 == False
opw-3999753
Also, re-export the pot file since it was noticed that it's no longer correct.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#171394
Forward-Port-Of: odoo/odoo#170321same as: https://github.com/odoo/odoo/pull/159321 opw-3786308 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#170807
Original PR description
same as: https://github.com/odoo/odoo/pull/159321 opw-3786308 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#170807
Steps to reproduce the bug: - Create a storable product “P1” with BoM - Operation: OP1, OP2 - OP2 blocked by OP1 - Navigate to Mrp > Configuration > Operations - Select OP1 and select another BoM - Return to the BoM of “P1” Problem: The OP2 is still linked to OP1, And a traceback when attempting to duplicate the BoM. Solution: Remove the link between OP2 and OP1 opw-3948817 Forward-Port-Of: odoo/odoo#171054 Forward-Port-Of: odoo/odoo#169417
Original PR description
Steps to reproduce the bug: - Create a storable product “P1” with BoM - Operation: OP1, OP2 - OP2 blocked by OP1 - Navigate to Mrp > Configuration > Operations - Select OP1 and select another BoM - Return to the BoM of “P1” Problem: The OP2 is still linked to OP1, And a traceback when attempting to duplicate the BoM. Solution: Remove the link between OP2 and OP1 opw-3948817 Forward-Port-Of: odoo/odoo#171054 Forward-Port-Of: odoo/odoo#169417
Steps --- * create MO * confirm > produce all * unlock > set produced quantity to 0 * click 'Overview' => Traceback (zero div) Fix --- set overview fields that do not make sense when the final production quantity is 0 to `False`, so they are left blank on the report opw-3958811 Forward-Port-Of: odoo/odoo#168529
Original PR description
Steps --- * create MO * confirm > produce all * unlock > set produced quantity to 0 * click 'Overview' => Traceback (zero div) Fix --- set overview fields that do not make sense when the final production quantity is 0 to `False`, so they are left blank on the report opw-3958811 Forward-Port-Of: odoo/odoo#168529
## Description The `web_read_group` done when loading the "All Applicants" view is slow when having a large quantity of `hr.applicant` ## Analysis The query done by the `web_read_group` will get all the `active` `hr.applicant`, but the field isn't indexed, so even if only a small portion of applicants are active, we are still scanning the whole table to filter out the applicants. ## Solution Index the `active` field. ## Benchmark On a DB with 900k `hr_applicant`, where only 80k are
Original PR description
## Description The `web_read_group` done when loading the "All Applicants" view is slow when having a large quantity of `hr.applicant` ## Analysis The query done by the `web_read_group` will get all the `active` `hr.applicant`, but the field isn't indexed, so even if only a small portion of applicants are active, we are still scanning the whole table to filter out the applicants. ## Solution Index the `active` field. ## Benchmark On a DB with 900k `hr_applicant`, where only 80k are `active`, the main query for the `web_read_group` takes | | Before | After | |---------|--------|-------| | Timings | 320ms | 80ms | ## Reference task-4011294 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#171000
Since the automation revamp, it is not possible to update read-only fields without executing Python code. This commit removes this limitation as some use-cases are useful: - Automatically update the invoice status of SO when an action is executed. - Force the SO status to "sent" without sending the email. Task: 3983645 Forward-Port-Of: odoo/odoo#170729
Original PR description
Since the automation revamp, it is not possible to update read-only fields without executing Python code. This commit removes this limitation as some use-cases are useful: - Automatically update the invoice status of SO when an action is executed. - Force the SO status to "sent" without sending the email. Task: 3983645 Forward-Port-Of: odoo/odoo#170729
**Steps to reproduce the bug:** - Parent company: CompanyA with a purchase tax of “15%” - Create a branch from Company - select only the brunch as current company - Create a storable product P1: - Add vendor: Azure Interior, price: $10 per unit - Create a recording rule: - Trigger: Manual - Route: Buy - Minimum quantity: 10 - save - Click on order **Problem**: A purchase order is created with Azure Interior as the vendor and 10 units
Original PR description
**Steps to reproduce the bug:**
- Parent company: CompanyA with a purchase tax of “15%”
- Create a branch from Company
- select only the brunch as current company
- Create a storable product P1:
- Add vendor: Azure Interior, price: $10 per unit
- Create a recording rule:
- Trigger: Manual
- Route: Buy
- Minimum quantity: 10
- save
- Click on order
**Problem**:
A purchase order is created with Azure Interior as the vendor and 10 units of P1, but the tax is not set. This happens because when the PO line values are prepared, the tax is retrieved from the supplier tax, but it is filtered by the current company, So only the branch taxes. However, it should also check in the parent company.
opw-3937178
Forward-Port-Of: odoo/odoo#171052
Forward-Port-Of: odoo/odoo#16963526 changes
New functionality added to Odoo
Spreadsheet users can now use area charts, which show line chart trends with the space below the line filled in. Line charts inserted from graph views now appear as area charts in spreadsheets, making reporting visuals more consistent across Odoo.
Original PR description
This commit adds the area charts subtype for odoo charts. Those are line charts with the area filled below the line. From the graph view, line charts are inserted as Area charts to be consitent between the graph view and the spreadsheet. Task: [3981124](https://www.odoo.com/web#id=3981124&cids=1&menu_id=4720&action=333&active_id=2328&model=project.task&view_type=form)
Enhancements to existing features
The appraisal module now presents appraisal records in a clearer, more actionable way by keeping key dates stable, prioritizing upcoming appraisals, and applying a default To Do view. Date displays and overdue indicators are also clearer, helping HR teams focus on appraisals that need attention without confusion from completed or cancelled items.
Original PR description
This commit introduces several improvements: - The Appraisal Date is no longer automatically rewritten upon changing the state to Cancel or Done. - The order of appraisals in the list view is adjusted to show those with the appraisal date closest to the current date at the top. - A "To Do" filter is now added by default to the list view. - The appraisal date color coding is refined. Dates are only displayed in red if they are before today and if the appraisal's state is neither Cancel nor Done. - Both the final Interview and appraisal date columns in the list view will display dates in absolute terms instead relative dates. Task-3777667
Swiss payroll functionality has been consolidated into the main Swiss payroll module, making related payroll and insurance reporting easier to maintain. Salary attachment handling was also moved into the core payroll area, improving consistency for payroll teams managing deductions and wage-related records.
The working schedules list now includes a Company Full Time column, which can help users compare schedules against the company standard. The column is hidden by default, so existing views remain uncluttered unless users choose to display it.
Original PR description
added company full time column on working schedules list view. hidden by default task-3954222
Website helpdesk forms now avoid adding the same customer-provided details twice when the ticket description already captures them. This keeps the ticket history clearer for support teams while preserving the information submitted by customers.
Original PR description
Before this commit, we got custom code to add custom message and add additional message to the description of the ticket. This commit just log the message if the default field set on the website is the description field of the ticket field since now the description field will already contain the additional information gathered by the formulae filled by a public user. task-3419255
Users handling Mexican electronic invoicing can now select the required payment method while creating or editing bank transactions in the bank reconciliation view. This helps businesses capture mandatory compliance information earlier in the accounting workflow and reduces follow-up corrections.
Original PR description
For Mexico, the payment way has to be declared. This commit adds the ability to choose that value when creating/editing bank transactions in the bank reconciliation view. Task [link](https://www.odoo.com/web#model=project.task&id=3874278) task-3874278
The product configurator is now available on the website storefront for rental and subscription products, using the newer interface already adopted in the backend. It also keeps rental durations and subscription billing periods consistent between the main product and optional add-ons, making checkout choices clearer and less error-prone.
Original PR description
This change adapts the backend product configurator (which has been recently migrated to Owl [1]) to make it usable in the frontend as well, and uses it in the frontend. This change also adds support for rentals and subscriptions in the product configurator, both in the backend and the frontend (e.g. it displays the rental duration/billing period and ensures the main and optional products use the same rental duration/billing period). [1] https://github.com/odoo/odoo/pull/106511 Community PR: https://github.com/odoo/odoo/pull/153779 Upgrade PR: https://github.com/odoo/upgrade/pull/5896 task-3572125
Planning progress messages now more clearly explain whether an employee is unavailable because they are on leave or because their contract has expired. This helps managers understand scheduling issues faster and make better staffing decisions.
Original PR description
This PR enhances the accuracy of progress bar message because in the current flow the message was not clear about employee's status but now after this commit it is been clear either employee is on leave or its contract has been expired. task-3609539
This update adjusts field service report testing and related views to reflect a newer rule that private tasks cannot have parent tasks. It helps keep the module compatible with recent project task validation changes and reduces the risk of test failures during upgrades.
Original PR description
This PR just adapt test to the constraint that has been added in related pr. Namely: "project_task_private_task_has_no_parent". related: https://github.com/odoo/odoo/pull/131015 task-3450270
Odoo Studio now supports showing and editing documented widget options and attributes directly from the sidebar. This makes form customization more consistent and easier for users, while also tidying shared sidebar property components and improving subtitle sizing.
Original PR description
This commit is part of the improvements allowing to edit some widgets directly in the Sidebar, as well as fields were already available. Now, following commit (1), it is possible to add documentation to supportedOptions and attributes on widget components. This is directly used to display the options accordingly in the Sidebar. (1): https://github.com/odoo/odoo/commit/097f6c8709e4cbecf8d08e3683225b76fde97f8f
Spreadsheet pivots are now inserted using dynamic formulas instead of static grid content. This helps users refresh or adjust pivot data more safely and reduces unexpected errors caused by editing fixed pivot outputs.
Original PR description
This revision completely changes the insertion process of pivots inside a spreadsheet. The pivots will now be inserted in the grid with their dynamic formula. This will prevent people from editing static pivots and getting errors out of the blue. task-3947821
Code cleanup and technical improvements
This update simplifies the internal setup used for guided test tours by removing an extra condition field. It helps make future maintenance of these tests easier while keeping expected business behavior unchanged.
Original PR description
In order to simplify the tours API, it was decided to remove the extra_trigger key from the steps. To check that an element is in the DOM, simply create a step with a trigger. task~3974087 https://github.com/odoo/odoo/pull/171555
The spreadsheet documents area has had its automated tests moved to a newer testing framework. This is an internal quality update that helps maintain reliability without changing day-to-day user features.
Original PR description
Task: [4011327](https://www.odoo.com/odoo/2328/tasks/4011327?cids=1)
This update removes an obsolete width setting from several guided tour definitions. It does not change the customer-facing tour behavior, but keeps the codebase simpler and easier to maintain.
Original PR description
In this commit, we remove "width" attribute to step definition because it's no longer used in codebase. task~3974087 https://github.com/odoo/odoo/pull/171386
Miscellaneous changes
When printing an invoice including a fixed tax, we don't want the base amount to be displayed after said tax, since the fixed computation doesn't take into account said amount. Added a check to differentiate fixed taxes from other and adapt display accordingly. see https://github.com/odoo/odoo/pull/168638 task-3964942 Forward-Port-Of: odoo/enterprise#65812 Forward-Port-Of: odoo/enterprise#65385
Original PR description
When printing an invoice including a fixed tax, we don't want the base amount to be displayed after said tax, since the fixed computation doesn't take into account said amount. Added a check to differentiate fixed taxes from other and adapt display accordingly. see https://github.com/odoo/odoo/pull/168638 task-3964942 Forward-Port-Of: odoo/enterprise#65812 Forward-Port-Of: odoo/enterprise#65385
Versions: ------------ saas-17.1 Steps to reproduce: ------------------- 1. Go to the Sign module. 2. Switch to mobile view in the Sign template. 3. Click on a record; it won't open. Issue: ------- Sign template records do not open in mobile view. Cause: ------ During old static declaration refactor PR: https://github.com/odoo/odoo/pull/142276 they forget to adapt Sign kanban renderer part which is why SignKanbanRecord does not call from SignKanbanRenderer. Solution: ---
Original PR description
Versions: ------------ saas-17.1 Steps to reproduce: ------------------- 1. Go to the Sign module. 2. Switch to mobile view in the Sign template. 3. Click on a record; it won't open. Issue: ------- Sign template records do not open in mobile view. Cause: ------ During old static declaration refactor PR: https://github.com/odoo/odoo/pull/142276 they forget to adapt Sign kanban renderer part which is why SignKanbanRecord does not call from SignKanbanRenderer. Solution: --------- Remove SignKanbanRecord which contains logic for not letting open record in mobile view. task-3978310 Forward-Port-Of: odoo/enterprise#64159
Avoid to check calendar for each record. Follows the logic of the community PR: https://github.com/odoo/odoo/pull/167310 Forward-Port-Of: odoo/enterprise#65770 Forward-Port-Of: odoo/enterprise#65417
Original PR description
Avoid to check calendar for each record. Follows the logic of the community PR: https://github.com/odoo/odoo/pull/167310 Forward-Port-Of: odoo/enterprise#65770 Forward-Port-Of: odoo/enterprise#65417
In gantt, if there are no allowed companies none of the resources will have their unavailabilities filled in. Resources not linked to any company should still have their unavailabilities filled in. task-3981513 Forward-Port-Of: odoo/enterprise#65760 Forward-Port-Of: odoo/enterprise#64254
Original PR description
In gantt, if there are no allowed companies none of the resources will have their unavailabilities filled in. Resources not linked to any company should still have their unavailabilities filled in. task-3981513 Forward-Port-Of: odoo/enterprise#65760 Forward-Port-Of: odoo/enterprise#64254
When creating an invoice for a sales containing a recurring product, if the user doesn't have access to PoS you will have an access errorr Steps to reproduce: ------------------- * Remove PoS right from Marc Demo * Create a recurring product * Connect as Marc Demo * Create a sale with the recurring product * Try to invoice the sale > Observation: You get an access error opw-4010753 Forward-Port-Of: odoo/enterprise#65406
Original PR description
When creating an invoice for a sales containing a recurring product, if the user doesn't have access to PoS you will have an access errorr Steps to reproduce: ------------------- * Remove PoS right from Marc Demo * Create a recurring product * Connect as Marc Demo * Create a sale with the recurring product * Try to invoice the sale > Observation: You get an access error opw-4010753 Forward-Port-Of: odoo/enterprise#65406
When a contact is created with an RFC (VAT number) but no country configured, signing an invoice for that contact results in the invoice being signed correctly. However, the PDF shows the partner's RFC, while the XML file shows the generic RFC (XAXX01010101). This discrepancy misleads users into believing their setup is correct, as no error or alert is provided. This commit introduces a non-blocking warning message in the 'Send and Print' wizard for cases where the contact's country is missin
Original PR description
When a contact is created with an RFC (VAT number) but no country configured, signing an invoice for that contact results in the invoice being signed correctly. However, the PDF shows the partner's RFC, while the XML file shows the generic RFC (XAXX01010101). This discrepancy misleads users into believing their setup is correct, as no error or alert is provided. This commit introduces a non-blocking warning message in the 'Send and Print' wizard for cases where the contact's country is missing. opw-3891896 Forward-Port-Of: odoo/enterprise#63255
This commit fixes an issue withthe embedded views inside the columns block in the editor. The embedded views were overlapping the columns on their right meaning that some text could be hidden behind them. To fix this a new rule is added to these blocks so that when they are inside a column block that is not the last one we remove the negative margin-right. This way we preserve their style when inside the right-most column. task-3901864 Forward-Port-Of: odoo/enterprise#63480
Original PR description
This commit fixes an issue withthe embedded views inside the columns block in the editor. The embedded views were overlapping the columns on their right meaning that some text could be hidden behind them. To fix this a new rule is added to these blocks so that when they are inside a column block that is not the last one we remove the negative margin-right. This way we preserve their style when inside the right-most column. task-3901864 Forward-Port-Of: odoo/enterprise#63480
When a document has an attachment, the export done through the general ledger and "Datev + ATCH (zip)" should have a column filled with the guid of the document, which is not the case currently. To solve it, use the helper to get the attachments opw-3984450 Forward-Port-Of: odoo/enterprise#65756
Original PR description
When a document has an attachment, the export done through the general ledger and "Datev + ATCH (zip)" should have a column filled with the guid of the document, which is not the case currently. To solve it, use the helper to get the attachments opw-3984450 Forward-Port-Of: odoo/enterprise#65756
[FIX] sale_subscription: prevent multiple in_progress orders Before this commit, it was possible to obtain several in progress orders sharing the same hierarchy by doing the folllowing steps: 1) create a recurring order, invoice it 2) create a payment link 3) renew the order, confirm the renewal quote 4) pay the payment link and post-process it. The post processing will call set_open which will reopen the renewed order. taskid: 4008453 Forward-Port-Of: odoo/enterprise#656
Original PR description
[FIX] sale_subscription: prevent multiple in_progress orders
Before this commit, it was possible to obtain several in progress orders
sharing the same hierarchy by doing the folllowing steps:
1) create a recurring order, invoice it
2) create a payment link
3) renew the order, confirm the renewal quote
4) pay the payment link and post-process it.
The post processing will call set_open which will reopen the renewed
order.
taskid: 4008453
Forward-Port-Of: odoo/enterprise#65666
Forward-Port-Of: odoo/enterprise#65386## How to reproduce: 1. Go to Documents > Settings > Change the deletion days of docs. (Optional) 2. Go to Documents > Trash #### Issue - The Deletions Days shown 'undefined'. It says: 'Items in trash will be deleted forever after undefined days.' ## After this commit: Deletions Days will be shown there even after you update them. Task-3984627 Forward-Port-Of: odoo/enterprise#64538
Original PR description
## How to reproduce: 1. Go to Documents > Settings > Change the deletion days of docs. (Optional) 2. Go to Documents > Trash #### Issue - The Deletions Days shown 'undefined'. It says: 'Items in trash will be deleted forever after undefined days.' ## After this commit: Deletions Days will be shown there even after you update them. Task-3984627 Forward-Port-Of: odoo/enterprise#64538
During upgrade `_compute_total_due` method calculate for `total_due` and `total_overdue`, with too many move lines, so raises MemoryError queries: ``` jard_1413607=> select partner_id, count(id) total_move_lines from account_move_line where partner_id is not null group by partner_id order by total_move_lines desc limit 5; partner_id | total_move_lines ------------+------------------ 1905 | 547530 1371 | 288578 1396 | 18423
Original PR description
During upgrade `_compute_total_due` method calculate for `total_due` and `total_overdue`, with too many move lines, so raises MemoryError queries: ``` jard_1413607=> select partner_id, count(id)…
During upgrade `_compute_total_due` method calculate for `total_due` and `total_overdue`,
with too many move lines, so raises MemoryError
queries:
```
jard_1413607=> select partner_id, count(id) total_move_lines from account_move_line where partner_id is not null group by partner_id order by total_move_lines desc limit 5;
partner_id | total_move_lines
------------+------------------
1905 | 547530
1371 | 288578
1396 | 18423
3223 | 10945
1244 | 6988
```
traceback:
```py
Traceback (most recent call last):
File "/tmp/tmpj_23hd3k/migrations/testing.py", line 208, in test_check
self.check(value)
File "/tmp/tmpj_23hd3k/migrations/base/tests/test_mock_crawl.py", line 151, in check
self.assertFalse(diff, msg)
AssertionError: [('account.menu_action_move_journal_line_form', 125, 'Accounting > Accounting > Journals > Journal Entries', 205), ('purchase.menu_procurement_management_supplier_name', 247, 'Purchase > Orders > Vendors', 218), ('account.menu_account_customer', 115, 'Accounting > Customers > Customers', 217), ('account.menu_action_move_out_refund_type', 111, 'Accounting > Customers > Credit Notes', 207), ('account.menu_account_supplier', 122, 'Accounting > Vendors > Vendors', 218), ('account.menu_action_move_out_invoice_type', 110, 'Accounting > Customers > Invoices', 206), ('account.menu_action_move_in_refund_type', 118, 'Accounting > Vendors > Refunds', 209), ('account.menu_action_account_moves_all', 126, 'Accounting > Accounting > Journals > Journal Items', 204), ('account.menu_action_move_in_invoice_type', 117, 'Accounting > Vendors > Bills', 208), ('sale.res_partner_menu', 179, 'Sales > Orders > Customers', 217), ('point_of_sale.menu_point_of_sale_customer', 461, 'Point of Sale > Orders > Customers', 217)] is not false : At least one menu or view working before upgrade is not working after upgrade.
('account.menu_action_move_journal_line_form', 125, 'Accounting > Accounting > Journals > Journal Entries', 205):
Traceback (most recent call last):
File "/tmp/tmpj_23hd3k/migrations/base/tests/test_mock_crawl.py", line 252, in crawl_menu
self.mock_action(action_vals)
File "/tmp/tmpj_23hd3k/migrations/base/tests/test_mock_crawl.py", line 409, in mock_action
mock_method(model, view, fields_list, domain, group_by)
File "/tmp/tmpj_23hd3k/migrations/base/tests/test_mock_crawl.py", line 438, in mock_view_form
[data] = record.read(fields_list)
File "/home/odoo/src/odoo/17.0/odoo/models.py", line 3538, in read
return self._read_format(fnames=fields, load=load)
File "/home/odoo/src/odoo/17.0/odoo/models.py", line 3749, in _read_format
vals[name] = convert(record[name], record, use_display_name)
File "/home/odoo/src/odoo/17.0/odoo/models.py", line 6590, in __getitem__
return self._fields[key].__get__(self, self.env.registry[self._name])
File "/home/odoo/src/odoo/17.0/odoo/fields.py", line 1207, in __get__
self.compute_value(recs)
File "/home/odoo/src/odoo/17.0/odoo/fields.py", line 1389, in compute_value
records._compute_field_value(self)
File "/home/odoo/src/odoo/17.0/addons/base_automation/models/base_automation.py", line 745, in _compute_field_value
return _compute_field_value.origin(self, field)
File "/home/odoo/src/odoo/17.0/addons/mail/models/mail_thread.py", line 424, in _compute_field_value
return super()._compute_field_value(field)
File "/home/odoo/src/odoo/17.0/odoo/models.py", line 4867, in _compute_field_value
fields.determine(field.compute, self)
File "/home/odoo/src/odoo/17.0/odoo/fields.py", line 102, in determine
return needle(*args)
File "/home/odoo/src/odoo/17.0/addons/stock_landed_costs/models/account_move.py", line 19, in _compute_landed_costs_visible
account_move.landed_costs_visible = any(line.is_landed_costs_line for line in account_move.line_ids)
File "/home/odoo/src/odoo/17.0/addons/stock_landed_costs/models/account_move.py", line 19, in <genexpr>
account_move.landed_costs_visible = any(line.is_landed_costs_line for line in account_move.line_ids)
File "/home/odoo/src/odoo/17.0/odoo/fields.py", line 1182, in __get__
recs._fetch_field(self)
File "/home/odoo/src/odoo/17.0/odoo/models.py", line 3775, in _fetch_field
self.fetch(fnames)
File "/home/odoo/src/odoo/17.0/odoo/models.py", line 3825, in fetch
fetched = self._fetch_query(query, fields_to_fetch)
File "/home/odoo/src/odoo/17.0/odoo/models.py", line 3930, in _fetch_query
self.env.cache.insert_missing(fetched, field, values)
File "/home/odoo/src/odoo/17.0/odoo/api.py", line 1108, in insert_missing
field_cache.setdefault(id_, val)
MemoryError
```
Failed request: UPG-1403488
Ticket: 3797437
Forward-Port-Of: odoo/enterprise#65633
Forward-Port-Of: odoo/enterprise#60004Before this commit, the test `test_auto_plan_employee_with_break_company_no_breaks` fails because the auto plan feature will plan the open shifts to a resource generated by appointment feature since those resources are always available according to their calendar. This commit adds a role on the open shift and the employee created in that test to be sure we will just fetch the resources with the role of the open shift since the test just makes sure the resource doing night shifts with breaks i
Original PR description
Before this commit, the test `test_auto_plan_employee_with_break_company_no_breaks` fails because the auto plan feature will plan the open shifts to a resource generated by appointment feature since those resources are always available according to their calendar. This commit adds a role on the open shift and the employee created in that test to be sure we will just fetch the resources with the role of the open shift since the test just makes sure the resource doing night shifts with breaks is correctly assigned to that shift. runbot-64874 Forward-Port-Of: odoo/enterprise#65825
13 changes
Security fixes and vulnerability patches
This update fixes a security vulnerability where digital certificates were being returned with elevated permissions (sudo access) to users with company access. The fix ensures that digital certificates are no longer returned with these elevated permissions, protecting sensitive authentication credentials from unauthorized access.
Original PR description
Problem --------- `_get_digital_signature` currently returns a sudo certificate. This is not safe. Objective --------- Don't return a sudo certificate to anyone having access to this company. Forward-Port-Of: odoo/enterprise#65836 Forward-Port-Of: odoo/enterprise#65607
New functionality added to Odoo
This update adds support for automatically retrieving currency exchange rates from Uruguay's Central Bank (BCU). Businesses operating in Uruguay can now use the official BCU webservices to keep their currency rates current and accurate, eliminating the need for manual updates.
Original PR description
Add a currency rates update method using the BCU (Banco Central Uruguayo) webservices for Uruguay (UY). Webservices used: - Get last currency rate update date https://cotizaciones.bcu.gub.uy/wscotizaciones/servlet/awsultimocierre - Get rates https://cotizaciones.bcu.gub.uy/wscotizaciones/servlet/awsbcucotizaciones Latest PDF specification [here](https://drive.google.com/file/d/122UtHhpdYEmbOti0nr0d-brZs65kiLDT/view) Rates can be manually verified [here](https://www.bcu.gub.uy/Estadisticas-e-Indicadores/Paginas/Cotizaciones.aspx) For questions or updated specifcations, please send an email to mesadeayuda@bcu.gub.uy *Note: the `CodigoISO` tag isn't a reliable ISO code, that's why we use their specific `Moneda` currency code instead.* Credits to **Adhoc** for the development. Original PR: odoo/enterprise#49519
Enhancements to existing features
This update adds automated testing to verify that Balance Sheet reports are properly balanced across all localizations. The system now validates that debits equal credits in Balance Sheets by generating test transactions and checking the results, helping catch accounting errors early. This improvement ensures financial reports maintain their fundamental accounting principle of balanced entries.
Original PR description
This PR introduces a `l10n` test over the Balance Sheet reports. Each Balance Sheet report in the `LOC_DATA` global at the head of the file will be tested. The test generates a journal entry with a…
This PR introduces a `l10n` test over the Balance Sheet reports.
Each Balance Sheet report in the `LOC_DATA` global at the head of the file will be tested.
The test generates a journal entry with a line in every account that is not `off_balance`.
It then checks whether the Balance Sheet is balanced.
The test does this both for debits and for credits.
The test will give a warning for any installed Balance Sheet report which is not specified in the LOC_DATA global. The aim is to change this to an error once all existing Balance Sheets are tested, to make this test mandatory for any new localizations.
For each localization with a Balance Sheet, the test needs to know the XMLIDs of:
- the CoA
- the Balance Sheet report
- the Total Assets line of the Balance Sheet
- the Total Liabilities line of the Balance Sheet
- the Total Equity line of the Balance Sheet (if applicable)
Setting the global `IDENTIFY_INCORRECT_ACCOUNTS` to `True` switches the behaviour of the test: it identifies the accounts that cause the imbalance using a binary search. This is off by default for runbot.
**Performance impact**
- For each Balance Sheet, the test does the following:
- load the chart template
- create an account.move with 4 AMLs for each account (one debit and credit in the account; and one debit and credit in the counterpart account)
- generate the report once.
- The Binary Search (which can be toggled when testing locally) is quite efficient:
- If there is just one incorrect account, then the report needs to be generated `log2(<number of accounts>)` times.
- If there are `X` incorrect accounts, then in the worst-case the report may need to be generated `X * log2(<number of accounts>)` times.
On the Belgian CoA, with no incorrect accounts, the test takes 14s on my PC. With 4 incorrect accounts, the test takes 33s.
Task: 3060790
Forward-Port-Of: odoo/enterprise#36838This update improves how Odoo handles global discounts and negative line items by moving the core logic to the main accounting module. This allows other countries' localization modules to reuse the same discount handling approach, while the Mexico localization module continues to provide country-specific tax and document processing. This change makes the system more efficient and easier to maintain across different regions.
Original PR description
To allow other localizations to use the same logic for negative lines, we moved the methods in account. We still extend it in the module to add specific logic about taxes and documents. task-3943357
Resolved issues and error corrections
A recent update accidentally removed the scroll bar from the left side of the bank reconciliation widget, making it difficult to navigate transaction lists. This fix restores the scroll functionality so users can properly scroll through transactions on both sides of the reconciliation interface.
Original PR description
With https://github.com/odoo/enterprise/pull/45256/files we broke the left scroll bar of the transactions. Both sides of the bank rec widget should have their own. Before the fix:  After the fix:  opw-4029287
This update fixes a crash that occurred when editing timesheet entries in the list view. The system was incorrectly trying to access timer information that didn't exist, causing an error. The fix ensures the system properly checks whether a timer is active before attempting to access timer-related data, allowing users to edit timesheets without encountering errors.
Original PR description
Versions -------- - 17.0 - saas-17.1 - saas-17.2 - saas-17.3 Steps ----- 1. Go to timesheets; 2. go to list view; 3. edit a timesheet line. Issue ----- `UncaughtPromiseError` Cause ----- Commit bae2e8146d48 added the `onRecordChanged` method, which fixed the issue of the timer not recording time spent on a project. The issue is that this method is also called when changing a row from the list view, and there's no `timesheet` value set by the timer, causing an error when trying to access `this.timesheet.resId`. Solution -------- Check `this.timerState.timesheetId` instead of `this.timesheet.resId`. `this.timerState` is guaranteed to exist, and its `timesheetId` value will be `undefined` if the timer isn't running, skipping the timer-specific logic. Also handle default projects when set. opw-4027099
This fix resolves a crash that occurred when setting certain pay period frequencies (semi-annually, bi-monthly, or semi-monthly) in the Australian payroll module. The system was missing configuration data for these payment periods, causing errors when creating new contacts. The fix adds the missing period definitions so all supported pay frequencies work correctly.
Original PR description
To reproduce the bug: - Have payroll and its l10n-au additional modules installed - Go to payroll -> config -> structure types - Change the first element 'Default Scheduled Pay' to semi-annually - Go to contacts and create click on New A python traceback will show. That's due to giving the PERIODS_PER_YEAR dictionary a non-existent key. As we can see, it lacks 'semi-monthly', 'bi-monthly', and 'semi-annually' periods. opw-4015682
This update resolves a testing problem in the Peru electronic invoicing module where automated tests were failing due to a recent change in how the system handles external service calls. The fix ensures that tests can properly validate the cancellation status checking functionality without being blocked by testing restrictions.
Original PR description
PR #62452 (15.0+) added extra IAP calls that retry requesting the cancellation status in case the cancellation was not processed yet. In odoo/odoo#122663 (17.0+), IAP calls were disabled in tests. When fw-porting the first PR above, this change of behaviour in 17.0 was not taken into account meaning that the tests kept failing in 17.0+. We fix this by applying the same strategy as #62452 - patch the thread to remove the testing attribute during IAP calls. runbot-64793
This fix corrects how monthly recurring revenue (MRR) is calculated for subscription orders placed in currencies different from the company's main currency. Previously, the system locked in the exchange rate from the order date, which was incorrect since customers continue paying in their original currency while exchange rates fluctuate. The fix now properly accounts for currency rate changes over time, ensuring accurate revenue reporting.
Original PR description
Steps to reproduce: Create a Subscription order in a different currency (THS) than the main currency (USD). Bug: We consider that the MRR is a "living amount". The customer will continue to pay the amount is TSh. This amount is converted into the currency of the company at the order date rate (from TSH to USD) which means, the TSh value is fixed at order date which is not correct as customer will continue to pay in TSh and the rate evolve. opw-3813197
Fixed an issue where EU sales invoices containing lines without products were not appearing in the EC sales report. This fix ensures all eligible invoices are properly included in the report, improving the accuracy of EU sales tracking for Dutch companies. The underlying data retrieval method was updated to support this change.
Original PR description
Before, when creating an invoice for eu operations, lines without product were not accounted inside the ec sales report. Now when an invoice with lines without product happens, it will be displayed inside the ec sales report. This fix had to change the way the sbr icp export retrieved those values. Task: 3978307 Forward-Port-Of: odoo/enterprise#64265
When copying a rental product with custom pricing for different variants, the pricing information now correctly links to the new product variants instead of pointing back to the original product. This ensures that copied rental products maintain their pricing structure accurately.
Original PR description
Versions -------- - 16.0+ Steps ----- 1. Create a rental product template; 2. add an attribute w/ 2 or more values; 3. go to "Rental prices" and add new pricings for specific variants; 4. copy the product template; 5. go to the "Rental prices" of the copied product. Issue ----- The pricings refer to the products variants of the original template instead of the newly created ones. Cause ----- Default copy logic doesn't link the new pricings to the new products. Solution -------- Add a `copy` override which creates new pricings for the proper variants. opw-3878124 Forward-Port-Of: odoo/enterprise#63284
Fixed an issue where the backorder confirmation dialog was not appearing when warehouse staff manually edited barcode quantities using the edit form instead of scanning. The dialog will now always display when the system is configured to ask about creating backorders, ensuring consistent behavior regardless of how quantities are updated.
Original PR description
**Current behavior:** Having a picking whose operation type has the `create_backorder='ask'` setting, if a barcode line is modified using the edit button rather than actually scanning, the…
**Current behavior:**
Having a picking whose operation type has the
`create_backorder='ask'` setting, if a barcode line is modified
using the edit button rather than actually scanning, the
confirmation dialog for the backorder will be skipped.
**Expected behavior:**
When the 'ask' option is used, the dialog should always be
displayed.
**Steps to reproduce:**
1. Create a picking with a demand of 2.0 for some product,
ensure the picking's op type has the 'ask' options set for
backorder creation (it's the default option) -> confirm the
picking
2. In Barcode, open the picking and add 1.0 quantity to the
barcode line
3. Save the edit form, then validate the picking -> no dialog
**Cause of the issue:**
Compared the actually scanning product, modifying the line via
the form actually updates the record data. This causes the
corresponding `StockMoveLine` to get marked as `picked=True`
(via `_inverse_qty_done()` in `stock_barcode::StockMoveLine`.
The end result is `!this.lineIsReserved(line)` evaluates to
True in the Barcode client when checking whether to do
the backorder dialog which means we skip it.
**Fix:**
Remove the `lineIsReserved()` check, only look at whether
the line quantity is positive, non-zero.
*Note: the behavior between the two flows (scans vs. form edits)
diverges when the user reloads the page, however, this was also
the case prior to this change.*
opw-3972478This fix corrects how the system records who uploaded files when using document sharing features. Previously, the system incorrectly credited the person who created the share link instead of the actual person who uploaded the file. Now the correct uploader is properly identified and recorded.
Original PR description
Prior to this commit, when uploading a file through a share, the file upload note used the share creator's id instead of the id of the actual user who uploaded the file. After this commit, the id of the actual file uploader is used.