Daily updates from Odoo
Navigate
Branch
Friday, July 18, 2025
37 changes
15 changes
Enhancements to existing features
This update removes unnecessary formatting code in several JavaScript screens and uses the platform's built-in translation handling instead. Users should see no functional change, but the code becomes easier to maintain and less prone to translation-related issues.
Original PR description
On the JavaScript side, the main use case for sprintf used to be interpolating values inside translated strings. However, ever since version 17.0, this has been handled directly by _t. This commit gets rid of occurrences of sprintf that can easily be simplified to either a call to _t or a template string. Community: https://github.com/odoo/odoo/pull/216373
This change introduces a new HR access group and applies it across employee-related features such as payroll, appraisals, referrals, documents, and work entries. It helps standardize who can view or manage HR information across these apps, improving consistency and control for HR operations.
Online banking synchronization no longer stores or sends the old encrypted connection data because that information is now managed in Odoofin. This reduces duplicated sensitive data handling while keeping the synchronization flow aligned with the external service.
Original PR description
provider_data contains the encrypted info about the connection. It's not used anymore, as the information is stored on Odoofin. We remove the field and the data passed through the requests. task-4619128 Odoofin PR: https://github.com/odoo/odoofin/pull/409
The Sign app now lets administrators set a default validity period in days for new signature requests. This reduces repetitive manual setup and helps ensure requests expire consistently across the business.
Original PR description
Added a setting in the Sign app to define a default validity period (in days) for sign requests. This improves the user experience by eliminating the need to manually set an expiration date for each new request. task-4942996
Odoo now remembers when a local IoT Box connection method has recently failed and temporarily skips retrying it. This avoids repeated waiting periods and helps affected users connect faster through the fallback method on networks where local requests are unreliable.
Original PR description
To contact an IoT Box, if longpolling fails, we fallback to websocket. We use this logic on every call: if the longpolling fails once, there is chance that it fails on the next call. We now avoid contacting via longpolling if it has failed during the last 20 minutes. We then avoid 6 seconds timeout on every call on networks where local requests fail (clients with DNS for example). Task: 4922624 Forward-Port-Of: odoo/enterprise#89733 Forward-Port-Of: odoo/enterprise#89598
This change updates the Avatax sales test coverage so it stays aligned with new section line behavior on sales orders and invoices. It helps ensure down payment calculations continue to work correctly when section totals and print detail controls are used.
Original PR description
Section lines on Sale order and Invoice lines now support: - a `total`column that displays the total of the lines under the section - print details toggle to control whether the section appears on the backend, reports, and portal. See also: https://github.com/odoo/odoo/pull/208515 Task-4669991
Resolved issues and error corrections
Renaming an employee no longer fails when the user lacks permission to rename the related document folder. This prevents unnecessary interruptions in HR workflows while keeping document access controls intact.
Original PR description
When an employee is renamed, it tries to rename the folder but if you don't have the rights on the folder, it raises an error and prevent you from renaming. Forward-Port-Of: odoo/enterprise#90269
When a field service task includes a kit product, its related delivery is now correctly validated when the task is marked done. This ensures delivered quantities update as expected and prevents orders from appearing undelivered despite the work being completed.
Original PR description
**Problem:** when the product in the sale order linked to a field service task is a kit and the task is marked as done, the delivery is not validate (as it would for a non kit product) **Steps to…
**Problem:** when the product in the sale order linked to a field service task is a kit and the task is marked as done, the delivery is not validate (as it would for a non kit product) **Steps to reproduce:** - Create a product and set up a Kit-type Bill of Materials for it (with at least two components) - Create a service-type product. - Set the Invoicing Policy to Prepaid/Fixed - set the "create on order" field to Task - assign the Project to Field Service. - Create a Sales Order using the service product. - Confirm the Sales Order. - In the linked task, click on the Products smart button - add the kit-type product from step 1. - Mark the task as done. **Current behavior:** On the sale order, the delivered quantity for the kit product is 0. If you click on the delivery smart button, you'll see that the picking is not validated yet **Expected behavior:** the picking should be validated **Cause of the issue:** https://github.com/odoo/enterprise/blob/d8dc0cabd83a29d0522cb5fd25c6956968d4408b/industry_fsm_stock/models/project_task.py#L23 the orer_line is considered as an exception because the order_line product_uom_qty is smaller than total_qty (the sum of the move_ids' product_uom_qty) But this is normal in the case of a kit opw-4848444 Forward-Port-Of: odoo/enterprise#89616 Forward-Port-Of: odoo/enterprise#88363
Restaurant bookings now show the number of guests entered during the reservation instead of incorrectly displaying zero or defaulting to table capacity. This helps staff see accurate party sizes and plan seating more reliably.
Original PR description
Currently when making an appointment for x amount of people, inside the restaurant it will show 0 as the number of people who booked. Steps to reproduce: ------------------- * Activate booking on the restaurant * Open the booking preview * Place a reservation for 5 people * In the restaurant and remove default filter > Observation: It shows 0p on the reservation Why the fix: ------------ By having a default value on the field is would not trigger the compute unless a change was made on `resource_ids` after the create was over. After fixing this bug we also aboserve that if we make a reservation for 1 person but all the tables in the restaurant are 4 person seatings, the reservation will show 4p. The reservation should in priority depend on the number entered while booking otherwise we can compute it regarding the resources. opw-4882681 Forward-Port-Of: odoo/enterprise#90277 Forward-Port-Of: odoo/enterprise#88777
This update fixes an automated test for the Knowledge app's command tour by making it find the clipboard copy button more reliably. It helps keep quality checks stable so valid updates are less likely to be blocked by inconsistent test behavior.
Original PR description
This commit fixes an issue with the embedded clipboard steps in the commands tour. The selector for the problematic steps was too specific as the copy button isn't always the 1st button. runbot-114522 task-4748626 Forward-Port-Of: odoo/enterprise#89496 Forward-Port-Of: odoo/enterprise#80845
Returned check approvals can now only be assigned to users in the Accounting Administrator or Bookkeeper groups. This prevents inappropriate users from being selected as approvers and improves control over accounting approval workflows.
Original PR description
Before this commit: - In the account_return_check any user can be set as approver, regardless of the group. After this commit: - Only Accounting Administrator and Bookkeeper groups can be set as approver on the check. task-4934329 Forward-Port-Of: odoo/enterprise#90159
Social post previews now use the correct preview content source after a recent editor change. Links in previews also keep the behavior expected by the Social app, preventing incorrect link handling before publishing.
Original PR description
This commit fixes an issue with a recent change done in 93aded56aa4f5623dfd4a984c4e52d1a9eac71a2. This commit changed the HtmlField used from the old web_editor to the new html_editor. Following this change the getter was wrongfully kept with the old name, which is what this commit is correcting. This commit also fixes an issue with link retargetting in social previews. The issue is that the links inside the HtmlViewer are retargetted to follow a specific structure which doesn't suit the social module needs. It creates an extension of the HtmlViewer that replaces itself in the components of FieldPostPreview. This extension replaces the retargetLink method to an empty function. task-4950837
This fix restores the Mexican EDI payment method field on bank statement lines so users can edit it during reconciliation. It corrects a missing field in the view, helping businesses keep payment information accurate for Mexican electronic invoicing requirements.
Original PR description
Since https://github.com/odoo/enterprise/commit/2335c953723dce66af8811fdfbfd5b811d42b109 The field l10n_mx_edi_payment_method_id is no longer available on statement lines to be edited by the end user. Forward-Port-Of: odoo/enterprise#90195
The manufacturing shop floor test setup now uses dedicated test warehouse, company, and manufacturing order naming data. This prevents demo data from interfering with automated checks, helping keep quality validation stable without changing user-facing workflows.
Original PR description
This commit modifies the MO sequence as defined in the test's setup from "WH/MO/" to "WH/TEST/MO", this way, there won't be any name's conflict with MO created by demo data. Runbot build error: [223328](https://runbot.odoo.com/odoo/error/223328) Forward-Port-Of: odoo/enterprise#89649
Code cleanup and technical improvements
The checkout page code in Website Sale Ups has been modernized without changing the shopping experience. This keeps the checkout flow aligned with Odoo's newer frontend framework, making it easier to maintain and evolve safely.
Original PR description
task-4737884 Community PR: https://github.com/odoo/odoo/pull/206672
22 changes
Enhancements to existing features
This update improves Odoo's internal Hoot testing tools so automated tests run more reliably, start faster, and use less memory in headless environments. It also makes test filtering and result handling clearer, helping development and quality teams diagnose issues with less friction while keeping changes limited to the testing ecosystem.
Original PR description
## Pull Request HOOT (PRHOOT) 35 This pull requests brings various improvements and fixes to Hoot and the Odoo unit test ecosystem. See the different commit messages for more details. Note: these changes are made in stable to avoid having to support multiple versions of the HOOT API. As such, these changes are intended to be strictly limited to unit tests as to not put the rest of the code base at risk. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Purchase order lines linked to a project now retain their existing analytic allocations while also adding the project’s allocation when there is no conflict. This improves cost tracking accuracy by ensuring project-related purchases are reflected without overwriting manually entered or model-based distributions.
Original PR description
Currently, if a purchase order line has an analytic distribution and then a project with an analytic account is added to the PO, the project analytic distribution is not added. Only in lines without any analytic distribution, the projetc account is added as expected. This commit modifies `_compute_analytic_distribution()` to keep both the project account and the existing analytic distribution (that were added manually or from a distribution model) in all PO lines where the analytic plans do not conflict. task-4904044 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Italian e-invoicing registrations now include an additional identifier, such as the VAT number, so incoming vendor bills can be matched to the correct registered user more reliably. This helps prevent processing failures when documents contain only a VAT number instead of the main identifier.
Original PR description
This improvement addresses an issue in the Italian e-invoicing (l10n_it_edi) and IAP registration logic where incoming vendor bills with only a VAT number failed to match the correct registered EDI user. Changes introduced: - Added `edi_identification_secondary` (e.g. VAT number) to support fallback user matching. - Updated the `/create_user` endpoint to accept and store the secondary identifier. - Modified `create_user` logic to send both primary and secondary IDs from Odoo. - Prepared the base for matching incoming invoices against both identifiers. See also: odoo/iap-apps#1056 Task [link](https://www.odoo.com/odoo/project/967/tasks/4619718) task-4619718
Resolved issues and error corrections
This change makes automated website tours more stable when they navigate to another page. It helps reduce inconsistent test behavior, improving confidence in quality checks without changing normal user workflows.
Original PR description
In this commit, we add expectUloadPage to goToUrl util. This util redirect to another page an involves a unload event so we need to add this key to this util to avoid undeterministic behaviors in tours that use it. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Italian electronic invoice XML generation now excludes linked accounting documents dated after the document being sent. This prevents SDI rejections caused by references to future invoices or payments in credit note XML files.
Original PR description
In a FatturaElettronica xml document <DatiFattureCollegate> allow us to specify any references to other previously sent documents. However, it is currently possible that the system populate this element with moves dated after the current document, causing the SDI to reject the document. Steps to reproduce: - Create an invoice A and register a full payment via the button - Create a credit note for the invoice, unreconcile the credit note if necessary - Create a new invoice B and add the credit note as payment - Create the XML of the credit note Issue: The XML includes info about invoice B, created after the credit note. If invoice B is dated after the credit note, the SDI will reject the xml Solution: Avoid including reconciled elements with date later than the current document date opw-4795664 Forward-Port-Of: odoo/odoo#219106
Project to-do activity counts now use each user's timezone to decide whether items are late, due today, or planned for the future. This prevents mismatches where dashboard counts and the activity list showed different results during certain hours of the day.
Original PR description
User timezone was not being used for activity states and thus the future, today, and late activities would be inaccurate. They were being computed with CURRENT_DATE through SQL which is based on the timezone that the SQL server is in. This would lead to there being a period of some hours based on the user timezone where the actual activities page that you click into and the systray showing different counts of activity states. For example, on our Odoo production database, activities that SF office members create on projects that were for tomorrow would show today after 5pm and when clicking on the today activities there would be nothing until midnight. Using the user timezone in order to compute what today is for them, then using this in the SQL query fixes this issue. This is the same behavior as the compute_state for the state field in mail.activity. opw-4893182
When a project task or subtask is assigned a milestone, it now uses the sales order item linked to that milestone instead of falling back to a parent task or project value. This prevents incorrect invoicing links after users manually clear and reassign milestones on sales-driven project tasks.
Original PR description
**Step to reprocduce :** 1. Install sale_project module 2. Create a product - type: Service - Invoice policy: based on the milestones - Create on order: Project & Task. 3. Create a sale order with…
**Step to reprocduce :**
1. Install sale_project module
2. Create a product
- type: Service
- Invoice policy: based on the milestones
- Create on order: Project & Task.
3. Create a sale order with that product and add two SO lines with different descriptions.
4. Confirm the sale order.
5. Click on the Tasks smart button in the sale order to open the generated tasks.
6. From one of the tasks (e.g., m1)
7. Manually remove the existing milestone and sales order item from the task.
8. Then assign a different milestone (e.g., m2) to the task.
9. The sale order item set different (e.g., m1) instead of the newly set milestone.
**Issue:**
When a task has its `milestone_id` and `sale_line_id` manually cleared, and a new milestone
is later assigned, the task does not get the correct Sales Order Item.
**Cause:**
In the `_compute_sale_line` method, the logic priority the parent task and project when
computing the `sale_line_id`, and only uses the `milestone_id.sale_line_id` as a fallback.
https://github.com/odoo/odoo/blob/259f7eafb15882807640a00cf6939129f27c8fbb/addons/sale_project/models/project_task.py#L109-L113
**Solution :**
To fix this `_compute_sale_line` method to priority the milestone's `sale_line_id`
when a milestone is explicitly set. This ensures that if the task’s milestone
changes, its sale line reflects the one from the milestone, even for subtasks.
opw-4701106This fix makes an automated mail test more reliable by shortening the simulated reconnect timing so the warning appears within the expected window. It helps prevent false test failures in busy environments without changing the user-facing product behavior.
Original PR description
The "show warning when bus connection encounters issues" test simulates a disconnected WebSocket that fails to reconnect. In this scenario, an alert is shown to warn the user that some features may…
The "show warning when bus connection encounters issues" test simulates a disconnected WebSocket that fails to reconnect. In this scenario, an alert is shown to warn the user that some features may be unavailable or slow. However, the websocket worker’s initial reconnect delay is 1.5s, with an added random jitter up to 1 second which means the first reconnect attempt can take up to 2.5s. The test waits up to 2.5s for the alert to show, which is not always enough. The reconnect attempt alone may be that long, and under high CPU load, processing the resulting event can take even longer. This commit reduces the initial reconnect delay and the jitter during this test, ensuring that the reconnect attempt fails and the alert is shown within the expected time. fixes runbot-226443 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Electronic invoice exports now include the product barcode in the same field already used when importing invoices. This improves consistency between incoming and outgoing UBL/CII documents and helps partners identify products more reliably.
Original PR description
[FIX] account_edi_ubl_cii: export product barcode too Currently we use the `Item/StandardItemIdentification` as the barcode when importing a product. But we do not export the same information. In 18.0+ the `Item/StandardItemIdentification` was added to the UBL XML (for exporting) in commit 72e312815f372de88388c47c612bb5f44b4d8b4e. But there it is only used in `l10n_co_dian`. After this commit we export and fill the tag "by default". task-4941855 Forward-Port-Of: odoo/odoo#218779
Deleting a customer or address will no longer automatically remove related draft or cancelled sales orders. This prevents users from unknowingly losing orders when removing a partner that was only used as a shipping or invoicing address, and lets them review and handle those orders themselves.
Original PR description
On partner deletion, draft & cancelled orders were automatically deleted as well (to ease the deletion of 'unused' partners). Nevertheless, since both the main customer and the shipping and invoicing addresses were considered, the deletion of a partner might lead to the unexpected deletion of an order where the deleted partner was only the invoicing or shipping address. The user might not even be aware of it if they didn't enable the shipping/invoicing addresses setting. We believe it's better to drop this magical deletion and let the user be aware that there are orders related to the customer, so that they can handle it the way they want to, without the program deciding for them. opw-4866778 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
When settling a sales order in Point of Sale, the order lines are now reloaded from the server instead of relying on older cached data. This ensures cashiers see the latest quantities and prices after changes made in Sales or previous partial payments, reducing billing mistakes.
Original PR description
Steps to reproduce ------------------ 1. Create a Sales Order, add a product with QTY = X 2. Open PoS 3. Load this same Sales order (by clicking "Settle the order"-> QTX is X as expected 4. Return to…
Steps to reproduce ------------------ 1. Create a Sales Order, add a product with QTY = X 2. Open PoS 3. Load this same Sales order (by clicking "Settle the order"-> QTX is X as expected 4. Return to Sales order (in the sales app) 5. Edit QTY from X to Y and save 6. Go back to PoS 7. Delete the laoded Sales Order and load it again -> Notice that QTY is still X and not the updated Y!! Other Flow in frontend ---------------------- 1. Create a Sales Order, add a product with QTY = X 2. Open PoS 3. Load this same Sales order (by clicking "Settle the order"-> QTY is X as expected 4. Change the quantity manually, to pay for X - 1 5. Validate and pay for the order 6. Load the same Sales order again with "Settle the order" -> The quantity is still X and the price is the unit price times X!! Why the issue ------------- When settling the order, we get its value using _getSaleOrder which basically reads it from the cache. So it will read the old order lines having the old qty, and not the updated one. The fix ------- Instead of reading the lines from the cache, we read them direcly from the backend, to accomodate for cases where the data might have been changed on another device or has not been updated in the cache. opw-4819708 opw-4913397 Co-authored-by: Arthur Nanson <artn@odoo.com>
Odoo now blocks users from archiving a pricelist that is still linked to an active loyalty or promotional program. This prevents coupon codes from being rejected unexpectedly and keeps discount program setup consistent for sales teams.
Original PR description
**Step to Reproduce:** 1. Install `sale_loyalty` and `sale` 2. Enable the `Pricelists` option in the settings. 3. Create a pricelist named demo. 4. Create a Discount & Loyalty named `test program`…
**Step to Reproduce:**
1. Install `sale_loyalty` and `sale`
2. Enable the `Pricelists` option in the settings.
3. Create a pricelist named demo.
4. Create a Discount & Loyalty named `test program` with type `Discount Code`,
5. Assign the demo pricelist to the loyalty program.
6. Copy the discount code from the program’s conditional rules.
7. Archive the demo pricelist.
8. create sale order for any product.
9. Try to apply the copied coupon code.
**Observation:**
- An error is shown: "This code is invalid".
- check loyalty program `test program` pricelist field is empty, that suggesting it's valid for all pricelists, but the coupon still fails.
**Issue:**
- When a linked pricelist is archived, it's hidden in the UI, but the relation still exists in the relational table.
```17_sale=# select id,name,active from product_pricelist;
id | name | active
----+------------------------------------+--------
1 | {"en_US": "Default USD pricelist"} | t
2 | {"en_US": "new"} | f
(2 rows)
17_sale=# select * from loyalty_program_product_pricelist_rel;
loyalty_program_id | product_pricelist_id
--------------------+----------------------
5 | 2
(1 row)
```
- While filtering the domain for coupon, the condition is not satisfied due to the program's pricelist.
https://github.com/odoo/odoo/blob/94d727bd9ba38116d3e14188c730c7566744e9f0/addons/sale_loyalty/models/sale_order.py#L636-L647
**Solution:**
- Display a validation error to the user when trying to archive a pricelist
that is linked to any active promotional programs.
opw-4841678
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#214968Automatic invoice sending now reports its scheduled job progress using the correct number of invoices processed and still pending. This avoids misleading logs that previously suggested no records were processed, making monitoring clearer for administrators.
Original PR description
The scheduled action for the automatic sending of invoices currently does not explictly use the `_notify_progress` method introduced since Odoo 18 to track the progress of CRON jobs. This means that implicitly, by default the CRON will log `processed 0 records, 0 records remaining` at each run. This can be confusing, as the automatic invoice sending CRON is batched, and might run multiple times in sucession, reporting each time that it processed 0 records (which might not be true). ## Proposed fix: We correctly count the total account moves that need to be processed (using a `search_count`) and calculate the number of processed records and the remaining ones. opw-4926541 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Reinstalling the Amazon sales integration on databases with past Amazon sales could previously run out of memory. This change reduces the data loaded during setup, making reinstallations much more reliable and lowering peak memory use significantly.
Original PR description
Description ----------- On databases that had `sale_amazon` installed in the past, were used for sales for a certain period, then had the module uninstalled, and later attempted to re-install it, a…
Description ----------- On databases that had `sale_amazon` installed in the past, were used for sales for a certain period, then had the module uninstalled, and later attempted to re-install it, a memory error will occur. The peak memory usage stems from `sale.order.line._compute_is_service`. The reason the compute is triggered is because of the "re-creation" of the master data products `default_product` & `shipping_product`, which writes `type`, which the compute depends on. So the compute will be triggered for all `sale.order.line` records that had those products. This commit avoids the excessive memory usage by explicitly fetching the fields that are needed for the compute, which avoids fetching large fields like the different products' HTML descriptions. Benchmark --------- On a database with 400k+ `sale.order.line` with an amazon related product, installing `sale_amazon` peak memory usage was: | | Peak Mem. | |--------|-----------| | Before | 3.8 GiB | | After | 580 MiB | Reference --------- opw-4915892 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
French electronic invoices sent through Peppol now use the expected XML identifier field. This prevents Peppol validation errors when companies send BIS Billing 3.0 invoices with French SIRET details.
Original PR description
### Issue: BIS3 XML is not valid for Peppol ### Steps to reproduce: - Install l10n_fr_facturx_chorus_pro and switch to french company - Activate peppol - Create a French customer - Under Sales and…
### Issue: BIS3 XML is not valid for Peppol ### Steps to reproduce: - Install l10n_fr_facturx_chorus_pro and switch to french company - Activate peppol - Create a French customer - Under Sales and Purchase tab, set SIRET to "11000201100044" - Under Accounting tab, set the following: - Invoice sending = Peppol - Einvoice format = BIS Billing 3.0 - peppol_eas = France SIRET - peppol endpoint = 11000201100044 - Use Invoice/Invoiced smart button, then select New to create an invoice for this french customer - Add any non-zero invoice line, then confirm - Send and print, send to peppol - Download the XML. The /PartyIdentification/ID element will have the schemeName attribute set. ### Cause: Previous [commit](https://github.com/odoo/odoo/commit/0f3a9dee5cf15fa978a1857c184413003147c4a6#diff-10c62c279423109c43458eab15a3177ff5592d6570451f890fead74389bc3740) added `schemeName`. But Peppol doesn't want any `schemeName`, see the [doc](https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-tc434/UBL-DT-08/). ### Solution: The correct attribute here seems to be `schemeID`. See an [example from the docs of Peppol](https://docs.peppol.eu/poacc/billing/3.0/bis/#_parties_2). Change `schemeName` to `schemeID`. opw-4934436
This fix prevents an error that could occur while editing a website header and pressing the Tab key when no text area was selected. It improves editing stability by safely handling cases where the cursor selection is missing.
Original PR description
This PR fixes traceback issue: Steps to Reproduce for 1st traceback: 1. Go to Website in edit mode. 2. Click on the menu in the header such a way that the cursor is not placed inside. 3. Press the tab key. 4. You will receive the traceback. Issue: When the selection is null, the anchorNode also becomes null, resulting in closestUnbreakable being null. Therefore, we should avoid accessing nodeName on a null element to prevent errors. Fix: Safely access elements using optional chaining to prevent errors when elements are not found. task-4577864
This update makes an internal mail suggestion helper available for customizations. It helps partners and developers apply targeted custom patches more reliably without changing the standard mail behavior for everyday users.
Original PR description
Useful for custom patches.
This update prevents referral refusal notifications from being sent just because HR opens the refusal wizard. Notifications are now sent only after the refusal is confirmed and are attached to the correct referrer user records, avoiding unnecessary emails and improving email processing performance.
Original PR description
## [PERF] hr_referral: Send refusal notification to referrer's users Description ----------- Following https://github.com/odoo/enterprise/commit/764f9b6f513c90eb79935d9e8469989ea704b61b,…
## [PERF] hr_referral: Send refusal notification to referrer's users Description ----------- Following https://github.com/odoo/enterprise/commit/764f9b6f513c90eb79935d9e8469989ea704b61b, `_send_notification` will not attach the message on the `hr.applicant` itself, so a `model` was provided. But due to a missing `res_id`, `message_notify` will set both `model` & `res_id` to `False` since both are not specified. This leads to the creation of a `mail.message` with no `res_id` and no `model` (as `self` is an empty `mail.thread` recordset). This leads to a performance regression when mail references need to be computed to attach to the notification in `_notify_by_email_get_base_mail_values`, due to the missing `model` and `res_id` of the message. This commit attaches the notification to the referrer's users instead, providing its `model` and `res_id`. Reference --------- opw-4943488 --- ## [FIX] hr_referral: Do not send notif when opening the refuse wizard Description ----------- Currently, when opening the refusal wizard for an applicant, a call to `archive_applicant` is made. However, there is an override of it in `hr_referral` to send a notification for the applicant's refusal, and closing the `referral_state`, even though the applicant may have not been provided a reason for refusal, and the HR can simply close the wizard instead of confirming it. This commit removes the override of `archive_applicant` and moves its logic into `action_refuse_reason_apply` which is called when the wizard is confirmed. Reference --------- opw-4943488 Forward-Port-Of: odoo/enterprise#90309
This fix removes an incorrect default setting in the Swiss payroll ELM transmission configuration. It helps ensure payroll transmission settings use the proper company configuration instead of applying an unintended preset value.
Original PR description
…lated field Forward-Port-Of: odoo/enterprise#90425
Fixes an error that could prevent users from reconfirming a loan after cancellation when Accounting Audit Trail is enabled. This ensures loan workflows remain usable even when past posted accounting entries must be preserved for compliance.
Original PR description
Steps: - Activate Audit Trail in Accounting configuration - Create and confirm a loan, having some moves posted in the past - Cancel it, reset it to draft the re-confirm it again -> ValueError: Expected singleton This is because posted moves can not be unlinked when canceling/closing the loan if audit trail is activated. Therefore we try to access the `state` field from a recordset instead of a singleton. With this commit, we filter the generated move to get the newly created one. opw-4834361
This fix prevents the Barcode app from storing invalid empty values while scanning lots during receipt operations. It avoids a crash when users scan multiple lots, helping warehouse teams complete incoming shipments reliably.
Original PR description
## How to reproduce: https://github.com/user-attachments/assets/bf44f9fd-0402-4d70-8b55-5baf192d42e8 - Enable Consignment - On Receipt operation type, enable 'Use existing lots' - Create product P,…
## How to reproduce:
https://github.com/user-attachments/assets/bf44f9fd-0402-4d70-8b55-5baf192d42e8
- Enable Consignment
- On Receipt operation type, enable 'Use existing lots'
- Create product P, tracked by lot
- Create lot SN-001 & SN-002
- Add 1 unit on hand with lot SN-001
- Create Receipt for 10 units of P -> Confirm
- Open receipt on Barcode App
- Scan "SN-002" => 'undefined' value added to 'dbQuantCache'
- Scan "SN-001" => Uncaught Promise > quantsByLocation is not iterable (cannot read property undefined)
---
## Test result without fix:
```
2025-07-18 09:30:33,801 20801 ERROR oes_test_18 odoo.addons.stock_barcode.tests.test_barcode_client_action_picking: FAIL: TestPickingBarcodeClientAction.test_barcode_lazy_cache_scan_two_lots
Traceback (most recent call last):
File "/home/odoo/projects/odoo-src/multiverse/src/18.0/enterprise/stock_barcode/tests/test_barcode_client_action_picking.py", line 3508, in test_barcode_lazy_cache_scan_two_lots
self.start_tour(url, 'test_barcode_lazy_cache_scan_two_lots', login='admin')
File "/home/odoo/projects/odoo-src/multiverse/src/18.0/odoo/odoo/tests/common.py", line 2264, in start_tour
return self.browser_js(url_path=url_path, code=code, ready=ready, timeout=timeout, success_signal="tour succeeded", **kwargs)
File "/home/odoo/projects/odoo-src/multiverse/src/18.0/odoo/odoo/tests/common.py", line 2235, in browser_js
self.fail('%s\n\n%s' % (message, error))
AssertionError: The test code "odoo.startTour('test_barcode_lazy_cache_scan_two_lots', {"stepDelay": 0, "keepWatchBrowser": false, "debug": false, "startUrl": "/odoo/147/action-stock_barcode.stock_barcode_picking_client_action", "delayToCheckUndeterminisms": 0})" failed
TypeError: quantsByLocation is not iterable (cannot read property undefined)
at LazyBarcodeCache.getQuants (http://127.0.0.1:8565/web/assets/3d6bda7/web.assets_web.min.js:21482:279)
at BarcodePickingModel._processBarcode (http://127.0.0.1:8565/web/assets/3d6bda7/web.assets_web.min.js:21748:631)
at async http://127.0.0.1:8565/web/assets/3d6bda7/web.assets_web.min.js:21661:75
```
OPW-4942192Project profitability now includes relevant budget lines even when a project’s analytic account is linked through a different analytic plan. This prevents missing budget information after upgrades or account-plan mismatches, giving users a more complete view of project finances.
Original PR description
In version 17.3, the analytic mixin was introduced in budget.line model to allow to link a budget line to multiple analytic accounts belonging to different analytic plans. The issue is that we have…
In version 17.3, the analytic mixin was introduced in budget.line model to allow to link a budget line to multiple analytic accounts belonging to different analytic plans. The issue is that we have not adapted the code in project profitability, to take those changes into account. A problematic situation could be the following: 1. We have a project where the account "X" is set to the main project plan (the first one) "Projects" BUT the account "X" actually belongs to the analytic plan "Departments" (yes, it's possible that there is a mismatch between the project plan and the analytic plan, especially after the 18.0 upgrade where "analytic_account_id" just became "account_id", no matter in which plan it was). 2. We have a budget line linked to the account "X" for the plan "Departments". 3. We want to display the budget lines in project profitability, but this line does not appear. That's because we currently only look for the budget lines belonging to the analytic plan "Projects" aka the main/first plan, that match the account "X" of the project. But as account "X" actually belongs to the analytic plan "Departments", no budget lines are found. task-4901400 version-18.0