Daily updates from Odoo
Friday, April 24, 2026
375 changes
12 changes
Resolved issues and error corrections
This update clarifies the helpdesk stage Kanban view by removing the confusing "Days to rot" number display. Previously, users couldn't understand the meaning of this value. This change improves usability and reduces potential confusion for support staff.
Original PR description
Currently, only the “Days to rot” number is displayed, so users cannot understand what the number represents. In this commit, it hide from the helpdesk stage kanban view. task-5485507 Forward-Port-Of: odoo/enterprise#114880 Forward-Port-Of: odoo/enterprise#114781
This update resolves an issue where the original product name was incorrectly prepended to product descriptions on invoices and RFQs when editing. The fix ensures that only translated names and descriptions are displayed, improving invoice clarity and accuracy for users working with multiple languages. This change impacts invoicing and purchasing workflows.
Original PR description
Steps to reproduce: 1- Install invoicing app 2- Add French language in the settings 3- Create a customer with language set as French 4- Create a product and define french translations of the name and…
Steps to reproduce: 1- Install invoicing app 2- Add French language in the settings 3- Create a customer with language set as French 4- Create a product and define french translations of the name and the description in Sales tab 5- Create an invoice for that customer and choose the product you created 6- You will find the translated product name and description under the product name 7- Edit the description, save and preview the invoice 8- The invoice line will contain [Product Name EN] [Product Name FR] [Product Description FR] Description of the issue: When creating an invoice for a customer whose language differs from the user's account language, manually editing the product description on an invoice line causes the original product name to be prepended to the description. The same issue happens in a RFQ in Purchase. Expected behaviour: User can edit the product description in the invoice line and the output in the invoice should only be the translated name and description, without the original product name. Why this happens? 1- When the product is selected in the invoice line, the label is loaded from _compute_name method in account_move_line, which holds the translated name and description. 2- After editing the description and escaping the field (clicking outside it), the parseLabel method is called, which prepends the original name to the label, making the invoice output as [original name] [translated name] [translated desc.] Fix: Use the product name returned in the label for trimming and concatenation to handle both original/translated text scenarios. References: original PR: #248401 partial revert: #254158 opw-5480494 Forward-Port-Of: odoo/odoo#256837
This update fixes a minor issue where the company logo wasn't appearing on the journal audit export template. The fix ensures the necessary CSS class ('o_content') is included in the template, correctly applying the logo and improving the visual presentation of reports. This resolves a cosmetic problem impacting user experience.
Original PR description
before this commit, the export template of the journal audit was missing the o_content and so the company logo class was not applied opw-6128819 Forward-Port-Of: odoo/enterprise#114782
This update fixes an issue where self-billed invoices received through Peppol were sometimes incorrectly assigned to the wrong company within a multi-company database. The system has been updated to accurately filter invoices based on the current company's details, ensuring correct accounting and reporting. This improves the reliability of Peppol invoice processing.
Original PR description
Currently, if a database has multiple companies registered on Peppol, receiving a self-billed invoice may assign it to the wrong company. The system was searching the journal using a domain that included all companies (in self), instead of filtering by the correct current company. Steps to reproduce: - Create a database with 2 companies, both on Peppol - Receive a self-billed invoice from a random other company on Peppol - The received invoice will potentially be assigned to the wrong company This is only a test forward-port of #257380 opw-6045669 Forward-Port-Of: odoo/odoo#259524 Forward-Port-Of: odoo/odoo#259072
This update resolves a problem where validating deliveries for kit products could trigger errors. The code was adjusted to correctly handle kit explosions during delivery validation, preventing tracebacks and ensuring accurate stock accounting. This ensures deliveries of kit products can be processed without interruption.
Original PR description
**Issue**: Making a product a kit could prevent confirming deliveries. **Steps to reproduce**: - Make sure the account application is installed - Create a product P without kit - Create a SO and…
**Issue**: Making a product a kit could prevent confirming deliveries. **Steps to reproduce**: - Make sure the account application is installed - Create a product P without kit - Create a SO and confirm it - Make the product P a kit - Validate the delivery associated to the SO -> A traceback occurs: the record does not exist anymore **Cause**: While confirming the delivery: https://github.com/odoo/odoo/blob/a253cff9039fcf729a9922b119acad5ec7c7a0bd/addons/stock_account/models/stock_move.py#L168 It first filters which moves are out (`moves_out`). On the move associated with product P, since the kit is not exploded yet: https://github.com/odoo/odoo/blob/a253cff9039fcf729a9922b119acad5ec7c7a0bd/addons/stock_account/models/stock_move.py#L172 Then explodes the kit: https://github.com/odoo/odoo/blob/a253cff9039fcf729a9922b119acad5ec7c7a0bd/addons/stock_account/models/stock_move.py#L174 https://github.com/odoo/odoo/blob/ea18f34a48d61350f80c79894bef66bf02840bfc/addons/mrp/models/stock_move.py#L357-L361 By doing so, the original move associated to the product P are deleted: https://github.com/odoo/odoo/blob/ea18f34a48d61350f80c79894bef66bf02840bfc/addons/mrp/models/stock_move.py#L399 Thus, `moves_out` contains moves that no longer exist, and eventually, and eventually while accessing `product_id`: https://github.com/odoo/odoo/blob/a253cff9039fcf729a9922b119acad5ec7c7a0bd/addons/stock_account/models/stock_move.py#L179 A traceback is thrown **Aditionnal information** Validating a delivery of a kit product whose moves were not exploded will trigger their explosion and require a second validation. Therefore, no stock valuation errors will be created. opw-6063602 Forward-Port-Of: odoo/odoo#260844 Forward-Port-Of: odoo/odoo#258403
This update fixes a bug where the shipping address wasn't appearing on Purchase Order and Request for Quotation (PO/RFQ) reports. The change involves updating how address information is passed within the Odoo system, ensuring that customer shipping addresses are now correctly displayed in these reports. This improves the accuracy of purchase order data.
Original PR description
Version: ---------- - saas-19.2+ Steps to reproduce: ---------------------- 1. Install `stock_dropshipping` and `sale_management` modules. 2. Create a Customer (res.partner) with a proper address…
Version:
----------
- saas-19.2+
Steps to reproduce:
----------------------
1. Install `stock_dropshipping` and `sale_management` modules.
2. Create a Customer (res.partner) with a proper address block.
3. Create a dropship product (route: Dropship).
4. Create a Sales Order for the created customer.
5. Add the dropship product.
6. Confirm the Sales Order to generate a Purchase Order.
7. Open the generated PO/RFQ and print the report.
Issue:
------
The shipping address is missing in the printed PO/RFQ report.
Cause:
--------
The `t-call` syntax is updated to use the new semantic, which passes
values *as attributes/parameters* on the `<t>` (with `t-call`) tag itself,
instead of relying on nested `t-set` directive.
- Old (Deprecated): Used nested `<t t-set='var_name' t-value='x'/>` tags
inside the calling element to define variables.
- New: Variables are passed as attributes directly on the element where
the `t-call` is located (e.g., `<t t-call='module.template' var_name='x'/>`).
A warning is added to alert developers when using the old deprecated
syntax.
see Reference: https://github.com/odoo/odoo/pull/197296
<details>
<summary>Click here to see the results:</summary>
<p><strong>Before:</strong></p>
<div class="image-row">
<img src="https://github.com/user-attachments/assets/c6892b30-10d6-4fb4-881c-1433d4fe07a0" />
</div>
<p><strong>After:</strong></p>
<div class="image-row">
<img src="https://github.com/user-attachments/assets/6109fcc3-5773-44a8-b07b-6566ed855d3f" />
</div>
</details>
> NOTE: We can also move test into `purchase_stock`
----
opw-6075017
---
Description of the issue/feature this PR addresses:
Current behavior before PR:
Desired behavior after PR is merged:
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#257522A bug was causing night shift templates to incorrectly span an extra day. This update corrects a calculation error within the shift planning process, ensuring that night shift durations are accurately reflected. This fix prevents over-extended shifts and improves the reliability of our scheduling functionality.
Original PR description
Issue: ---------------------------------------- Creating a night shift from a template produces a shift spanning over one additional day. Steps to reproduce: ----------------------------------------…
Issue: ---------------------------------------- Creating a night shift from a template produces a shift spanning over one additional day. Steps to reproduce: ---------------------------------------- - Create a planning shift template form 23h to 1h the next day (2h) - It must have a span over 2 working days - Create a shift and use this template - The shift spans over one more day Cause: ---------------------------------------- In `_calculate_start_end_dates()`, we call `plan_days()` with `start` having the hours specified. So in `plan_days()` when retrieving the worked days, the first day is ignored because the resource is not supposed to be working from 23h to 1h (considering their calendar). Then we count two days, and so the end date is offset by one day. Solution: ---------------------------------------- We should call `plan_days()` without the hour specified so we make sure the first day is included in the count. opw-6134844 Forward-Port-Of: odoo/enterprise#114825 Forward-Port-Of: odoo/enterprise#114616
This update fixes a bug preventing calendar organizers (like administrators) from receiving reminder notifications. The issue stemmed from an outdated filtering method for identifying internal users, now corrected to ensure all organizers receive timely alerts. This improves meeting management and communication.
Original PR description
Steps to reproduce: --------------------------------- 1. Install Calendar module with demo 2. For both Users: User > Preferences > Notifications > In Odoo 3. Log in through Admin > Calendar > New…
Steps to reproduce:
---------------------------------
1. Install Calendar module with demo
2. For both Users: User > Preferences > Notifications > In Odoo
3. Log in through Admin > Calendar > New meeting
4. Set a start time in the near future
5. Add Marc Demo as an attendee
6. Under Options > Reminders, add a reminder that triggers shortly before the meeting (e.g., 15 minutes)
7. Save the meeting
8. Log in as Marc Demo in another browser window
9. Wait until the reminder time is reached
Observation:
---------------------------------
The reminder notification is displayed for Marc Demo. The Administrator (Mitchell Admin) does not receive any notification.
Issue:
---------------------------------
In `_notify_next_alarm`, the domain
`('group_ids', 'in', self.env.ref('base.group_user').ids)`
was used to filter internal users. However, the admin user does not have
`base.group_user` directly in their `group_ids`, it is only present in `group_ids.all_implied_ids` (inherited through group hierarchy). This caused the admin user to be excluded from the user search, so no bus alarm notification was sent to them.
Solution:
---------------------------------
The `share` field on `res.users` correctly identifies internal users (`share=False`) vs portal/public users (`share=True`) by checking the full group hierarchy, including implied groups. This ensures the admin (and all internal users) receive alarm notifications while still excluding portal and public users.
https://github.com/odoo/odoo/blob/b261223c8e15c412a06a0d938d217bdf0ab9f9ff/odoo/addons/base/models/res_users.py#L459-L464
opw-6010337
Forward-Port-Of: odoo/odoo#255263A recent update introduced a failing test in the web interface related to data limits. This commit resolves the underlying issue, ensuring the test now passes correctly. This prevents potential disruptions to the user experience.
Original PR description
PR [1] introduced a count limit test in v18, which was forward-ported to master/19.3. However, the forward-port was merged despite a silent failure caused by CSS changes in PR [2]. This commit fixes the failing test. [1] #259562 [2] #255332
This update resolves an issue preventing the AI's graph view feature from working correctly. The fix ensures that AI-generated groupings are processed properly, preventing a crash and allowing users to successfully generate and view data visualizations through the 'Ask AI' tool. This improves the usability of the AI-powered insights.
Original PR description
Steps to reproduce:
1. Install `crm`, `sale_management`.
2. Navigate to a list view (e.g. Sales > Orders).
3. Open the "Ask AI" chatbox from the system bar.
4. Ask: "graph view of opportunities per month".
5. [ISSUE] Client traceback after the agent loop tries to open the graph view with groupbys.
The pivot and graph AI tools emitted `rowGroupBys` / `groupBys`, but `search_model_patch` relies on `selectedGroupBys` (the key already used by the list/kanban tools). As a result, groupbys bypassed `applyAISearch` and, for graph, landed as raw `{field_name, intervals}` dicts in `modelParams.groupBy`, where `_normalize` crashed.
Rename the keys to `selectedGroupBys` so pivot/graph go through `applyAISearch` like list/kanban.
Task-ID: 6148879This update streamlines the handling of 'Unreachable' project tags by utilizing a pre-defined XML record instead of dynamic creation. This change improves stability and efficiency, ensuring consistent tag management within the Odoo Enterprise system. The old method has been removed and replaced with a more reliable approach.
Original PR description
Replace dynamic creation of the "Unreachable" tag with a static XML record `project_tag_db_unreachable` and use `env.ref()`. Remove the old helper method `_get_unreachable_tag_id()` and update tests accordingly.
This update corrects a technical issue that was causing some automated tests to fail in the Odoo timesheet module. The problem stemmed from a recent change in how floating-point numbers were formatted, specifically the removal of trailing zeros. This fix ensures that the tests accurately reflect the current functionality and prevents future test failures.
Original PR description
Before this commit, some hoot tests in hr_timesheet module failed because the formatting of float field in timesheet uom widget now removes the trailing zeros since the merge of #256621 This commit adapts the hoot tests.
5 changes
Resolved issues and error corrections
This update corrects a previous issue where payroll calculations were inaccurate for employees with contracts that didn't fully overlap with the payslip period. Now, the system correctly identifies and handles fully out-of-contract payslips, preventing incorrect calculations and ensuring accurate reporting. Partially overlapping payslips continue to compute as expected.
Original PR description
Fix:- Block payslip computation when the payslip period does not overlap the employee's contract period. Before this change:- Employees with contracts starting and ending before the payslip period will have 'worked days' and computation will yield numbers even though this is not accurate. After this change: - compute raises "No running contract" for fully out-of-contract slips, - worked days summary stays at 0, -`Out Of Contract` worked day lines are preserved, - partially overlapping payslips still compute as expected. task-[6055170](https://www.odoo.com/odoo/project/1251/tasks/6055170)
This update resolves a test failure related to the leaderboard settings within the timesheet grid. The change ensures that the necessary system calls are executed correctly when the leaderboard feature is enabled, improving the stability and reliability of the timesheet reporting.
Original PR description
This commit checks the steps expected once the leaderboard settings in timesheet grid is enabled to make sure the RPCs called are correctly done as expected. runbot-error-243315
This update corrects an issue where lead conversions sometimes created duplicate company entries, leading to incorrect customer hierarchies. The fix ensures that company creation is handled correctly using existing logic, preventing this duplication and maintaining data integrity.
Original PR description
**Issue:** When converting a lead with both `contact_name` and `partner_name`, the created contact end up with a duplicate company hierarchy, producing an invalid chain like: Person A < Company < Company **Cause:** `_create_customer()` was creating a company from `partner_name` in addition to the normal `parent_name` flow already handled by `res.partner.create()`, so the same company name was effectively used twice. **Fix:** Remove the extra company creation and let the existing `parent_name` behavior create the company once, then attach the contact to it directly. Task-6105653 Forward-Port-Of: odoo/odoo#259300
This update resolves a technical issue related to how channel mentions were handled in follow-up messages. The team has cleaned up the implementation, ensuring that channel mentions function correctly and reliably. This improves the overall communication experience within Odoo.
Original PR description
Follow up of https://github.com/odoo/odoo/pull/261083 This commit provides a cleanup of the channel mention feature fix. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261185
This update fixes a technical issue where the Timesheets assistant was storing outdated suggestions in local storage, leading to performance problems. The change automatically removes suggestions older than 30 days, optimizing the system and improving the user experience.
Original PR description
In the Timesheets assistant, we store the suggested events taken or dismissed by the user to avoid suggesting them again. However, there is no mechanism to remove them from the localstorage, so it currently grows infinitely. With this PR, we now delete events older than 30 days, to avoid filling the localstorage with useless data. Task-6131640 Forward-Port-Of: odoo/enterprise#114562
21 changes
Resolved issues and error corrections
This update resolves an issue with the channel mention feature in Odoo, ensuring it functions correctly. The team has cleaned up the underlying code to enhance reliability and performance. This improves the user experience when collaborating through channels.
Original PR description
Follow up of https://github.com/odoo/odoo/pull/261083 This commit provides a cleanup of the channel mention feature fix. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an error that prevented users from grouping depreciation schedules by analytic plans. The issue stemmed from an incorrect formatting of data within the database query, specifically surrounding analytic account IDs. Removing unnecessary parentheses corrected the query and allows users to properly group schedules by analytic plans.
Original PR description
Currently, an error occurs when user tries to group by an analytic plan on depreciation schedule. Steps to replicate: - Install `accountant` with demo, turn on `Analytic Accounting` from settings. -…
Currently, an error occurs when user tries to group by an analytic plan on depreciation schedule.
Steps to replicate:
- Install `accountant` with demo, turn on `Analytic Accounting` from settings.
- Open `Accounting > Review > Depreciation Schedule`.
- Click `Analytic` > Add a `Plan`.
Error:
```
psycopg2.errors.UndefinedFunction: operator does not exist: text = record
LINE 12: WHERE key IN (('7', '16', '8', '15', '6', '9', '...
^
HINT: No operator matches the given name and argument types. You might need to add explicit type casts.
```
Cause:
- At line [1], we pass a tuple of `analytic_account_ids`, which is then wrapped again in parentheses at line [2].
- This results in the IDs being enclosed in double parentheses, e.g. `(('7', '16', '8', '15', '6'))`.
- When the `IN` clause is used with this double-parenthesized tuple, PostgreSQL treats it as a list containing a single record. It then tries to compare `key` (a text value) with that record `('7', '16', '8', '15', '6')`, effectively resulting in a `text = record` comparison, which is invalid and causes error.
Solution:
- Removed the extra parentheses from the query.
[1]: https://github.com/odoo/enterprise/blob/847b5be291adbfa315f8f74ab7a6dd3d1fb7d518/account_asset/models/account_assets_report.py#L124
[2]: https://github.com/odoo/enterprise/blob/847b5be291adbfa315f8f74ab7a6dd3d1fb7d518/account_asset/models/account_assets_report.py#L121
sentry-7423121981This update fixes a potential error in bank statement reconciliation. Previously, the system incorrectly matched bank transactions with payments from different companies using the same UUID. This could lead to foreign tax lines being added to the wrong company's accounting records. The fix ensures both the bank statement and payment share the same company hierarchy for accurate reconciliation.
Original PR description
ticket-5992100 When auto-reconciling bank statement lines, the end-to-end UUID lookup correctly checked that matched AMLs and their payment belong to the same company hierarchy, but missed checking that the payment also belongs to the same company hierarchy as the bank statement line itself. This allowed a payment from an unrelated company (sharing the same end-to-end UUID from an inter-company bank transfer) to be matched against another company's bank transaction, pulling foreign tax lines into the wrong company's journal entry. Fix by adding the same parent-path company check between the bank statement line and the payment. Forward-Port-Of: odoo/enterprise#113279
This update fixes an issue where invoices incorrectly showed as 'Paid' after a check was voided. The change ensures that the invoice payment state reverts to 'not_paid' when a check is voided, preventing incorrect payment reporting. This improves the accuracy of financial records.
Original PR description
Steps to reproduce: 1- Install l10n_ar and l10n_latam_check modules 2- Switch company to (AR) Responsable Inscripto 3- Go to [Accounting -> Configuration -> Journals -> Bank] and make sure 'outstanding payments account' is set in outgoing payments for own checks and manual payment 4- Go to [Accounting -> Vendors -> Bills] and create a new bill 5- Create an own check payment for the full amount 6- Go to the check and void it Description of issue: When you view the invoice after voiding the check, it's payment state will be shown as 'Paid' Expected behavior: Invoice payment state should go back to 'not_paid' Why this happens: When the check is voided, it's `amount_residual` attribute becomes 0. This causes `pay.is_matched` to be True, and as a result `all_payments_matched` attribute is also True. This turns the invoice payment state to paid. opw-6016394 Forward-Port-Of: odoo/odoo#256118
This update fixes an issue where stock quantities weren't always correctly reflected in purchase and sales orders. It now ensures quantities match the original order unit of measure and creates pickings for partial orders, improving order fulfillment accuracy. Additionally, it corrects a demo stock imbalance to prevent negative stock levels in demo data, ensuring consistent reporting.
Original PR description
Make sure that the quantity received is in the unit of measure of the purchase order line. Also, when installing stock, create pickings for partial and empty sale/purchase orders. Finally, since creating we're creating more pickings, we need to raise the demo stock of product_product_12 to not be in negative stock for other modules demo data. task 5431550 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
A minor bug preventing the generation of EC sales return reports was resolved. This fix stemmed from a typographical error introduced during a recent update to the ec sales list report. This ensures accurate reporting of returns for online sales.
Original PR description
With the rework of the ec sales list report(https://github.com/odoo/enterprise/commit/4096c1fcbd7f31f70153058d2e3f9eab6d82e356#diff-2f90e40d6e7b35681a4af03037e8e5ee0fddab2ba0876d9f148bf79786a91c29), the return generation of this type became generic but a small bug appeared. It was not generating anymore because of a typo.
This update fixes a confusing error message that appeared when employees changed their work schedules while existing holiday periods were in place. The fix now includes the original error traceback, making it easier for support teams to diagnose and resolve the issue quickly. This improves the overall user experience and reduces troubleshooting time.
Original PR description
A validation error is raised if changing employee's contract with a new working schedule on a period with leaves and the new working schedule changes the duration of these leaves in such a way that the employee no longer has the required allocation for them. This adds to the error message the original error traceback for debuggig purposes. Task: 6105516 Forward-Port-Of: odoo/odoo#258280
This update corrects a bug in the self-ordering point-of-sale system that caused incorrect pricing when customers ordered multiple units of combo products. The fix ensures that free item quantities are properly scaled with the parent order, preventing miscalculations and ensuring accurate pricing for larger purchases. This improves the reliability of combo pricing.
Original PR description
When buying more than one unit of a combo product, the free-item quota (qty_free) was not scaled by the parent quantity, causing child lines with qty > 1 to be partially mis-classified as extra. This meant the same line was processed by both the free and extra loops, with the extra loop overwriting the correct price. Additionally, the proportional price_unit for free child lines used the unscaled original_total (which already includes the parent qty factor) against a per-unit parent_lst_price, resulting in a price that was too low by exactly the parent qty factor. opw-6045562 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258753
This update resolves an error that occurred when users attempted to access ticket links after an attendee was removed from an event. The fix prevents a technical error (IndexError) by gracefully handling empty attendee lists, ensuring a smoother user experience.
Original PR description
Currently, an error occurs when accessing the ticket link after the related attendee has been deleted. **Steps to Reproduce:** - Install the **Events** module. - Create a new event. - Create an attendee with a valid email ID. - Make sure the email is sent successfully. - Delete the attendee for the event. - From the received email, try to click on the **"View Tickets"** link. **Error:** `IndexError - tuple index out of range` **Cause:** The controller filters registrations using the provided `registration_ids`, but when the attendee is deleted, the resulting recordset becomes empty. It raises an error when trying to access the first element of an empty recordset. **Fix:** This commit handles empty recordsets by returning early when no registrations are found. sentry-7357927405 Forward-Port-Of: odoo/odoo#256310
This update resolves a performance issue that caused slowdowns and crashes when working with many2many fields containing a large number of records. The change replaces a slow search method with a faster one, ensuring smoother operation and preventing UI freezes when handling large datasets.
Original PR description
### Issue before this commit: When handling many2many fields with a large number of records (e.g., 20k+), the client-side performance degraded significantly. In extreme cases, the browser became…
### Issue before this commit: When handling many2many fields with a large number of records (e.g., 20k+), the client-side performance degraded significantly. In extreme cases, the browser became unresponsive or crashed when triggering onchange or compute logic. ### Steps to Reproduce: Create a computed many2many field. Add it to a form view (can be invisible). Populate the related model with a large dataset (20k+ records). Trigger an onchange that recomputes the field. ### Cause of the Issue: In _applyCommands (LINK case), the system checks for existing record IDs using Array.includes(), which has O(n) time complexity. When handling thousands of records, repeated ID lookups using includes() result in O(n²) complexity. ### With This Commit: Replaced Array.includes() with a Set (Set.has()), reducing lookup time to O(1). The set is updated incrementally as new IDs are added, improving overall complexity to O(n) and preventing UI freezes for large datasets. opw-6122024 Forward-Port-Of: odoo/odoo#260993
This update fixes an error in how holiday leave time off is calculated. Previously, public holidays were incorrectly included in the time off duration, leading to inaccurate 'Approved Time Off' values. The fix ensures that time off is calculated correctly, aligning with the 'Ignore Public Holidays' option.
Original PR description
# Setup You'll need a User with : - An active contract (for easiness of testing, a contract that started long ago with 8hrs/day) # How to reproduce - Create a new Time Off type with "Ignore Public…
# Setup
You'll need a User with :
- An active contract (for easiness of testing, a contract that started long ago with 8hrs/day)
# How to reproduce
- Create a new Time Off type with "Ignore Public Holidays" enabled
- Create a Public Holiday for Period X
- Create A Time Off request for the User for a Period Y that contains Period X
- Go to the Time Off Ledger
- Remove the Missing Hours filter and search for the dates in Period Y
Exemple of periods :
- Period X => Feb 10 2026 - Feb 10 2026
- Period Y => Feb 9 2026 - Feb 11 2026
# The problem
The "Approved Time Off" and "Difference" values are wrong.
With the given exemples, we'll see Feb 9 and Feb 11 with "Approved Time Off" values of 12hrs, which is wrong since the employee is supposed to work 8hrs a day, so he should have a time off of also 8hrs.
# Cause
The calculation for "Approved Time Off" is the following :
Divide the `number_of_hours` of a hr_leave
By the number of working days during the period of the leave
Using our exemple, we get :
`number_of_hours` = 24hrs
number of working days = 2
Approved Time Off = 24hrs / 2 => 12hrs, but we expect 8hrs
The `number_of_hours` is correct since we checked "Ignore Public Holidays" (which actually means : include the public holidays in the number of hours of a leave)
The problem is that the aggregation for the number of working days excludes automatically
public holidays, without paying attention to the value of "Ignore Public Holidays" :
https://github.com/odoo/odoo/blob/5e623af55fba64e812db6bcaf06d8f7c5d08f055/addons/hr_holidays_attendance/report/hr_leave_attendance_report.py#L193-L202
Explanation for this part of the query : we only keep days where there is no record in
resource_calendar_leaves (`WHERE rcl2.id IS NULL`) that contains that day
and that are considered public (`AND rcl2.resource_id IS NULL`)
# Proposed Solution
We add a `JOIN hr_leave_type` to be able to get the value for
`include_public_holidays_in_duration` ("Ignore Public Holidays").
Then, we make it so we exclude the Public Holidays only if that value is
false (`AND NOT lvt.include_public_holidays_in_duration`)
opw-6082422
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#258963This update resolves an issue where attachment downloads from the Odoo chatter were failing in Odoo 18.4+. The fix ensures that absolute URLs for attachments are correctly handled by the mobile apps, preventing errors and restoring reliable download functionality. This change was made on the JavaScript side to avoid requiring an update to the Android app.
Original PR description
In Odoo 18.4+, downloading attachments from the chatter is broken.
See: https://github.com/odoo/odoo/pull/200099
The `onClickDownload` function now passes an absolute URL to `downloadFile`.
The download function is implemented natively in the mobile apps.
The Android implementation always prefixes the provided URL with the
database origin (i.e.: `https://example.odoo.com`).
`download({url: "https://example.odoo.com/web/content"})` will try to
download `https://example.odoo.comhttps://example.odoo.com/web/content`.
This results in an UnknownHostException.
We can remove the origin from the url before calling the native method.
By doing this on the JS side, there is no need to update the Android app.
opw-6033150
Forward-Port-Of: odoo/enterprise#114832This update ensures that signed documents attached to project tasks or projects are automatically saved to the project's designated Documents folder, mirroring the behavior of regular attachments. Previously, signed documents defaulted to 'My Drive,' creating confusion and inconsistent document organization. This change improves workflow and simplifies document management within projects.
Original PR description
Steps to Reproduce --- - Request a signature from a project task or project and complete the signing process. - In the chatter, click "Add to Documents" on the signed attachment. Issue --- Signed documents attached to projects or tasks default to "My Drive" when added to Documents, instead of using the project's configured Documents folder. Current Behaviour --- - Regular task/project attachments correctly preselect the project Documents folder. - Signed attachments fall back to "My Drive". Expected Behaviour --- Signed documents linked to projects or tasks should preselect the project's Documents folder, consistent with regular attachments. Fix --- Extend get_documents_operation_add_destination to handle sign.request attachments linked to project.task or project.project, resolving to the corresponding project Documents folder. task - 5226770 Forward-Port-Of: odoo/enterprise#105600
This update fixes a technical issue related to how our system processes data sent through Peppol, a key European payment network. By adding a new field to track the movement state, we ensure accurate reporting and future-proof our integration with Peppol's evolving response types. This enhances the reliability of our Peppol transactions.
Original PR description
With the addition of new peppol_move_state for the Application Responses in Peppol, some checks to know wether the move was sent through Peppol were not updated. This commit does that by adding a common field for it. This is usefull as we might add some extra peppol_move_state values in the near future (Peppol supports more response types than we currently offer to our users). Forward-Port-Of: odoo/odoo#258598
This update resolves a visual inconsistency where styling applied to images (like rounded corners or shadows) was incorrectly carried over when users switched to using icons instead. Now, when an image is replaced with an icon, the styling classes are automatically removed, ensuring a cleaner and more consistent look across the To-do app and other areas of Odoo.
Original PR description
### Steps to Reproduce: - Go to the To-do app and create a new task. - Upload an image. - Apply shape styling to the image (e.g., rounded, shadow, img-thumbnail). - Replace the image with an icon. ### Description of the issue/feature this PR addresses: - When an image had shape applied (such as rounded, rounded-circle, shadow, or img-thumbnail) and was replaced with an icon, those classes were carried over to the icon. ### Desired behavior after PR is merged: - Since these classes are specific to image shape styling, they are now removed when an image is replaced with an icon. task-6007631 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#259611 Forward-Port-Of: odoo/odoo#258060
This update fixes an issue where employees assigned to the 'Administration' department weren't automatically added to relevant discussion channels. The change ensures that the channel subscription is triggered immediately when the employee's department is updated, streamlining team communication and ensuring accurate channel membership.
Original PR description
**Steps to reproduce:** navigate to 'Discuss' > 'Channels' create a new channel and set 'Auto Subscribe Departments' to 'Administration' create a new user and a corresponding employee record go to 'Employees' > locate the employee set the employee's department to 'Administration' **Current behavior before PR:** The user is not automatically added to the channel. This occurs because the auto-subscription logic is triggered before the department change is committed to the database. **Desired behavior after PR is merged:** The user is correctly auto-subscribed to the channel once the department update is saved. task-5448649 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261110 Forward-Port-Of: odoo/odoo#241617
This update ensures that the AI chat window now opens in full-screen mode, regardless of how it's initiated – through the system tray or command palette. Previously, the chat would open in a background window, which has now been resolved for a smoother and more convenient user experience.
Original PR description
Prior to this commit, when opening the chat with an agent from the systray button, the chat window was opened in the background. This commit fixes the issue by adding a call to `channel.open` which opens the chat when in full-screen mode. This commit also fixes an issue where the chat window wasn't properly opened when done from the command palette. task-5172978 Forward-Port-Of: odoo/enterprise#114598
This update fixes an issue where MTSO procurements incorrectly calculated available stock quantities, leading to inaccurate purchase order quantities. The change ensures that stock availability is accurately considered across multiple BOM levels during procurement creation, preventing overestimation of required components.
Original PR description
When creating a procurement through mtso, if the product has a muti level bom with the same component at multiple levels, it will consider the available quantity multiple times. Steps to reproduce:…
When creating a procurement through mtso, if the product has a muti level bom with the same component at multiple levels, it will consider the available quantity multiple times. Steps to reproduce: ------------------- * Enable MTO and change supply method to: "Take From Stock, if unavailable, Trigger Another Rule" * Create three products : final, semi, component - final: mtso, manufacture - semi: mtso, manufacture - component: mtso, buy, on hand quantity to 4 * Create a bom for final: - 10 components - 1 semi * Create a bom for semi: - 10 components * Create and confirm a MO for 1 "final" -> Issue the purchase order is only for 12 components and not 16. Observation: ------------- When confirming our MO, it will create a manufacture procurement for the products. The procurement will recursively create procurements and stock moves for each of its components. https://github.com/odoo/odoo/blob/b0b8a102153eaa9231321524ec5140cc6d754502/addons/stock/models/stock_move.py#L1563-L1571 Since its a MTSO, it will first check the products if there is available products in stock (free_qty) and create the procurement for the missing quantity: https://github.com/odoo/odoo/blob/b0b8a102153eaa9231321524ec5140cc6d754502/addons/stock/models/stock_move.py#L1646-L1647 https://github.com/odoo/odoo/blob/b0b8a102153eaa9231321524ec5140cc6d754502/addons/stock/models/stock_move.py#L1657-L1663 And each procurement, if it is of the manufacture type, will create corresponding procurements for their components. Once all the procurements and stock moves have been created, the stock move will confirmed and assigned. https://github.com/odoo/odoo/blob/942cbbbf243ff28f84fdaa40ed73b6572e0032a6/addons/stock/models/stock_move.py#L1627-L1629 -> The issue arise because the free_qty will only be updated when the stock moves are assigned which happen after all the procurement quantity are calculated for all the levels. opw-5514788 Forward-Port-Of: odoo/odoo#253958
This update fixes an issue where IoT events were missed due to a failure in the longpolling fallback mechanism. Now, if longpolling requests fail, the system automatically switches to using the more reliable WebSocket connection, preventing disruptions like failed Worldline payments. This ensures consistent event delivery.
Original PR description
Community PR: https://github.com/odoo/odoo/pull/260931 Before this commit, if `onMessage` in `iot_http_service` was called directly, it would fail to fallback to websocket if the longpolling request failed, causing events to be missed. One symptom of this is Worldline payments failing to confirm when using websocket. After this commit, the `_longpolling` method will now throw an error in this case, causing the fallback mechanism to attempt websocket instead. Forward-Port-Of: odoo/enterprise#114779
This update fixes a problem where payment reminder emails for subscriptions were missing the subscription's end date. The fix ensures that all payment reminder emails, regardless of how they're sent (automatically or manually), accurately display the subscription's closing date. This improves the clarity and accuracy of payment notifications.
Original PR description
### Issue before this commit: When sending a payment reminder email for a subscription using the email composer, the template was not correctly populated with the expected dynamic values. In…
### Issue before this commit: When sending a payment reminder email for a subscription using the email composer, the template was not correctly populated with the expected dynamic values. In particular, fields such as the subscription closing date and the subscription code were missing. ### Steps to reproduce the issue: 1. Install subscription and go to that app 2. Open one subscription 3. Send message > Load template: "Subscription: Payment Reminder" 4. Sentence is incomplete: missing end date of the subscription ### Cause of the issue: The issue was caused by the absence of a proper context injection when rendering the email template from the mail.compose.message wizard. The template relied on context variables like date_close, but these values were not being computed nor passed during manual email composition. Unlike automated flows, the composer did not provide the subscription-specific context required by the template. ### Reason to introduce the fix: The fix makes the payment reminder and closing templates self-sufficient by replacing context-based values with fields and helper methods directly available on the subscription record. A dedicated method is introduced to compute the subscription close date consistently, so the templates render the expected values both in automated flows and when manually loaded from the email composer. opw-6031613 Forward-Port-Of: odoo/enterprise#111801
This update fixes a minor issue in the website editor where the round corners option would disappear when the border width was set to zero. The change ensures the round corners option remains visible regardless of border settings, improving the user experience and allowing for consistent design choices.
Original PR description
Steps to reproduce: - Open the website editor. - Select a block with the border configurator and round corners enabled. - Set the border width to 0 px. => The Round Corners option is hidden. Before this commit, the change introduced by [1] hid the option when no border was set. This restriction was not needed because a block can use a border radius without a visible border. After this commit, the option remains visible when round corners are supported, even without a border. [1]: 97e8cc8d664e66ba62e8282a67f069805682ae41 task-6089515 Forward-Port-Of: odoo/odoo#260633
4 changes
Resolved issues and error corrections
This update resolves an issue where the 'Review' button was hidden in the bank reconciliation widget. The change removed a technical restriction (a 't-if' condition) that was preventing the button from appearing. This ensures users can properly review and reconcile bank transactions.
Original PR description
This commit 34014dd6aed2872e102b54dbf0880cf4c842782f removed a condition on the BankRecButtonList t-if, leading to a non-display of the review button in the bank rec widget. This commit fix the t-if so the button is visible again. opw-5502730
This update fixes an error in how tax returns are calculated for companies with multiple branches. Previously, rounding adjustments were incorrectly applied, leading to inaccurate closing entries. The fix ensures accurate tax return calculations by isolating company-specific rounding data.
Original PR description
Some countries lile Estonia, Nederlands or France apply a rounding from the tax report by adding a line to the end of the query results representing the sum of the roundings on each line of the tax…
Some countries lile Estonia, Nederlands or France apply a rounding from the tax report by adding a line to the end of the query results representing the sum of the roundings on each line of the tax report. When having a company with branches, the rounding is applying in each closing move (one per company/branch) but the value is coming from the aggregated report lines, this leads to wrong computation of the closing entries. Cause: In `_generate_tax_closing_entries` we loop over each company, therefore `_compute_tax_closing_entry` is called one time for each company, but it uses the report options containing all companies Fix: Use options with only the current company in `_compute_tax_closing_entry` Steps: - Install FR localisation - Select FR company and create two branches - Create, for last month: - 1 bill for parent company (100 with tax 20% G) - 1 invoice per branch (200 and 300 with tax 20% G) - Create a tax return with opining date at the beginning of the current month - Submit the last return and go to the created closing entries -> See that closing entries are wrong opw-5976359 Forward-Port-Of: odoo/enterprise#110652
This update fixes a security issue where unauthorized users could access asset information within invoices. Now, access to assets is restricted to specific user groups within the accounting module, preventing potential data breaches and ensuring data integrity. This change enhances the security of our invoicing process.
Original PR description
Only groups `account.group_account_readonly`, `account.group_account_invoice` or higher have access to model `account.asset`, therefore if an user goes to see an invoice with assets and they are not on either group, they will receive an error and won't be able to access said invoice. How to reproduce: - Create a vendor bill - Create an account.asset and link it to said account.move - Go to the form view with an user that it's on group "Purchase: User" for example --> They get a traceback --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/enterprise#113858 Forward-Port-Of: odoo/enterprise#112890
This update resolves an issue where the DIAN web service was incorrectly overwriting customer contact information (names and emails) with fiscal data, leading to data loss and incorrect invoice delivery. The fix now intelligently handles email differences, creating a new contact if needed and giving users control over their existing data.
Original PR description
The DIAN web service was overwriting partner names and emails with fiscal data, causing data loss for CRM contacts. The fiscal email often differs from the commercial one, and the overwrite broke the sales flow by sending invoices to the wrong address. Users had no standard workaround short of manually re-entering emails after every invoice generation. Instead of blindly overwriting, only update empty fields and create a child invoicing contact when the DIAN email differs from the existing one. Also remove the automatic onchange and periodic re-fetch triggers to leave existing data under user control. task-5912005 Forward-Port-Of: odoo/enterprise#114017
11 changes
Resolved issues and error corrections
This update resolves an issue where the 'Returns' button and Return Period options were missing when viewing variant reports (like RCE Purchase 8.5). The fix ensures these features now correctly display based on the report's root type, addressing a discrepancy in how variant reports handle return data.
Original PR description
Since the Accounting Returns refactor https://github.com/odoo/enterprise/pull/81569 the “Returns” button and the Return-Period date mode only appear when the current `account.report` carries at least…
Since the Accounting Returns refactor https://github.com/odoo/enterprise/pull/81569 the “Returns” button and the Return-Period date mode only appear when the current `account.report` carries at least one return type (i.e., `self.return_type_ids` is non-empty). Localization modules (e.g., PE) attach `account.return.type` to the filing (root) VAT report, while ledger/variant reports (e.g., VAT Report (RCE Purchase 8.5) (PE)) are presentation variants and usually do not repeat that configuration. As a result, opening a variant report yields: No Returns button, because _init_options_buttons() checks only `self.return_type_ids`. No Return Period chip and wrong/no return-period boundaries, because the date initializers also check/use only `self.return_type_ids`. Even if the button is shown by a downstream customization, `action_open_returns() would still open an empty list because it filters on `self.return_type_ids.ids`. Why the issue happens: Variant reports (like RCE 8.5) have `self.root_report_id` pointing to their root VAT report, which does carry `return_type_ids`. But the in odoo we checks/uses only the current report’s`return_type_ids`, which is empty on variants. Hence: missing Returns button, missing Return Period, and wrong/empty return filtering. Fix: Adopt the reporting engine’s existing “inherit from root when on a variant” pattern and its already used elsewhere for `variants_source_id`, custom handlers ... Introduce a tiny helper: Prefer explicit types on the current report if present; otherwise fall back to the root’s types. Replace direct uses of self.return_type_ids by the effective types in: _init_options_buttons: show Returns on variants too. _init_options_return_periodicity: enable Return Period on variants when the root has exactly one type. _init_options_date(return-period branch): compute correct boundaries from effective types. _get_shifted_dates_period(return-period branch): shift using effective types. _get_date_bounds_info(..., 'previous_return_period'): validate count and compute previous period from effective types. action_open_returns: filter the list view by the types of variants if present or the root instead if the variant’s empty. Before this commit: On VAT Report (RCE Purchase 8.5) (PE): no Returns button is shown when you are in variant. After this commit: Returns button appears. Return Period mode works Open Returns action lists the correct returns (filtered by the effective type). Steps to reproduce: Install PE_reporting module make sure dev move is on Accounting -> Reporting -> tax reports Click on reports and switch from `Report: Group by: Account > Tax` to `RCE Purchase 8.4` Return Button is not there any more :( [opw-4973204](https://www.odoo.com/odoo/my-tasks/4973204)
This update resolves an issue that prevented the Payroll module from upgrading correctly after a specific configuration change (deleting a 'Worker' structure type). The fix restricts user deletion of structure types, preventing a ParseError and ensuring smooth module upgrades. This improves overall system stability.
Original PR description
Currently, a ParseError is arising when the user upgrades the `hr_payroll` module after deleting the `Worker` in Structure Types. Steps to Reproduce: --- - Install `Payroll` module (without demo…
Currently, a ParseError is arising when the user upgrades the `hr_payroll` module after deleting the `Worker` in Structure Types.
Steps to Reproduce:
---
- Install `Payroll` module (without demo data).
- Payroll > Configuration > Structures > Delete `Worker Pay`
- Configuration > Structure Types > Delete 'Worker'
- Now upgrade the `Payroll` module
Traceback:
---
```py
ValueError: External ID not found in the system: hr.structure_type_worker
ParseError: while parsing /home/odoo/src/enterprise/saas-18.4/hr_payroll/data/hr_payroll_structure_data.xml:15, somewhere inside <record id="structure_worker_001" model="hr.payroll.structure">
<field name="name">Worker Pay</field>
<field name="type_id" ref="hr.structure_type_worker"/>
```
At [1], we reference the ID of the `Worker` record. After deletion, that record no longer exists, which results in a ParseError.
Solution:
---
Users are restricted from deleting the Structure Type.
[1]- https://github.com/odoo/enterprise/blob/92ad37e25deeb1f9f1f24f85b085b575e70c0a5d/hr_payroll/data/hr_payroll_structure_data.xml#L15-L20
sentry-6377659355This update fixes an error where kit-based sales orders were incorrectly calculating costs. Previously, the system multiplied kit quantities by batch sizes, leading to inflated prices. The fix ensures accurate cost calculations for kits, aligning with expected inventory valuation methods.
Original PR description
### Issue: When a kit BoM has `product_qty` > 1 (e.g. 12 Kit X = 12 Comp A + 12 Comp B), the SO line cost after confirmation is multiplied by the batch size. Selling 1 Kit X shows a cost of 360…
### Issue: When a kit BoM has `product_qty` > 1 (e.g. 12 Kit X = 12 Comp A + 12 Comp B), the SO line cost after confirmation is multiplied by the batch size. Selling 1 Kit X shows a cost of 360 instead of 30. ### Cause: The method `_compute_average_price` uses `bom.explode(self, 1)`, which returns raw BoM line quantities for one full batch. It accumulates the total batch cost but returns it without dividing by `bom.product_qty`. ### Steps to Reproduce: - Costing Method = AVCO, Inventory Valuation = Automated - Comp A (cost 10), Comp B (cost 20), Kit X (cost 0) - Kit BoM: 12 Kit X = 12 x Comp A + 12 x Comp B - Create and confirm a SO for 1 x Kit X - Expected SO line cost: 30 - Actual SO line cost: 360 Solution: This fix mirrors the normalization already done in `_compute_bom_price`, which correctly divides by `bom.product_qty` and converts UoMs. opw-5969310 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#253948 Forward-Port-Of: odoo/odoo#253406
This update fixes an issue where upgrade scripts within Odoo modules weren't properly organized, leading to potential logging and warning problems. Now, these scripts are correctly associated with the core upgrade package, ensuring smoother and more reliable updates and reducing potential errors.
Original PR description
The resulting modules should be bound to the `odoo.upgrade` package. Side effects: - the loggers created inside the upgrade scripts are now in the `odoo.upgrade` namespace. - warnings raised by bad usages in upgrade scripts are now correctly filtered. Forward-Port-Of: odoo/odoo#261050 Forward-Port-Of: odoo/odoo#258025
This update fixes an issue where deferred invoice moves weren't consistently linked to the correct customer partner. The change ensures that the `partner_id` is always taken from the original invoice line, maintaining accurate data and preventing discrepancies in financial reporting. This improves data integrity for deferred accounting processes.
Original PR description
When creating deferred move lines, the `partner_id` could be incorrectly influenced by the `default_partner_id` context key (e.g., when generating an invoice from a Sales Order). This led to inconsistencies where the deferred move lines did not match the partner on the original invoice line. This commit ensures the `partner_id` is explicitly taken from the source invoice line, guaranteeing data integrity across all deferred move lines. Steps: - Create a sale order for partner X, receive and confirm it - Create the invoice from the SO - Change partner to Y but keep X as delivery partner (not essential to reproduce bthough) - Set a deferred start date and a deferred end date on the invoice line, covering two full months - Confirm the invoice and open deferred moves via the smart button -> Note that one deferred move's lines get the partner id from the SO instead of the invoice opw-6095711 Forward-Port-Of: odoo/enterprise#114439
This update allows administrators to override the automatic resetting of subscription users. Previously, this process was difficult to manage, and this change provides greater control over subscription user management within the Odoo Enterprise system. This improves flexibility and aligns with evolving business needs.
Original PR description
After this commit, the auto resetting of subscription user is overridable. Doing business logic in CRUD methods makes them impossible to bypass, by encapsulating the logic in another method, it would be easily overridable. Forward-Port-Of: odoo/enterprise#114202 Forward-Port-Of: odoo/enterprise#114055
This update fixes a mobile issue where swiping between settings would sometimes cause a blank page. The change ensures the settings page fully loads before transitioning, resulting in a smoother and more reliable user experience.
Original PR description
Before this commit, swiping between settings for different apps on mobile devices would often result in a blank page. This occurred because the swipe method did not wait for the target page to render completely before completing the transition. This commit ensures the swipe action waits for the rendering process, preventing the blank state during app navigation. Forward-Port-Of: odoo/odoo#260737 Forward-Port-Of: odoo/odoo#260563
This update corrects a visual issue where adding a new shift sometimes resulted in duplicate employee names appearing in Gantt views. The fix ensures that when employee data changes (like adding a new shift), the display updates correctly, preventing the duplication of employee names. This improves the user experience and data accuracy within the Gantt view.
Original PR description
Sometimes, when adding a new shift (with an employee) in a gantt view that uses `PlanningEmployeeAvatar`, we can have twice the same employee. It can happens on groupby/filtering/reordering/etc.. An…
Sometimes, when adding a new shift (with an employee) in a gantt view that uses `PlanningEmployeeAvatar`, we can have twice the same employee. It can happens on groupby/filtering/reordering/etc.. An exemple could be to have a gantt view with Shift1 User1 we have: ``` +--------------+ | Shift1 User1 | +--------------+ ``` Add another shift (Shift 2) with User2. We'll have: ``` +--------------+ | Shift1 User1 | +--------------+ | Shift2 User1 | +--------------+ ``` instead of ``` +--------------+ | Shift1 User1 | +--------------+ | Shift2 User2 | +--------------+ ``` Because in this case, when we add Shift2, the view will append Shift1 and after it will rename the old Shift1 to Shift2, but in our case, the renaming is not done and so, it retains the old value. This is because in the `PlanningAvatarAction` setup we use `setupDisplayName`. The purpose of this function is to split the displayName contained in a `span` into two `span` elements using a `useEffect`. For example, `<span>Employee (Department)</span>` will be replaced by ```html <span>Employee</span><span class="..">(Department)</span> ``` in order to apply a “muted” style to the department. But to do this, the function will replace the original first span and overwrite it, ```xml <span t-if=“props.displayName” class="text-truncate flex-grow-1" t-esc=“props.displayName”/> ``` since it contains a `t-esc`, which allows Owl to remain “subscribed” to this element and notify components when to update if the displayName ever changes; however, by overwriting it, Owl is no longer aware of the change. Therefore, whenever a component's value changes (in our case, Shift1 becomes Shift2), it is never updated. In fact, manually manipulating the DOM in a useEffect, as `setupDisplayName` does, is not a good solution. To fix this flow, this commit adds a new `t-key` attribute to the original span with a value of `this.props.displayName`, which ensures that when the `t-key` changes value because `displayName` is updated, Owl will recognize that a change has occurred and will re-render. opw-6128168
This update fixes a bug where users received duplicate notifications when submitting the email reminder form for events. The form is now correctly embedded within the event page's HTML, preventing unwanted redirects and ensuring a smoother user experience. This resolves a display issue and improves overall event registration efficiency.
Original PR description
This PR fixes the email reminder form with multiple commits: - Commit 1 fixes the notifications displayed when the email form is submitted as the messages of those notifications are redundant. - Commit 2 inserts the form inside the HTML body instead of the interaction's HTML since the surrounding HTML of this last one may cause display issues as with the <a> tag redirecting the users on the talks page when they click on the form which should not happen. Task-5347538
This update ensures that menu links correctly point to newly created pages, even when the menu URL contains spaces. Previously, URLs with spaces would cause a 404 error. A warning is now displayed in the menu editor to alert users about potential issues with spaceful URLs, preventing confusion.
Original PR description
When a menu item URL contains a space and has no leading slash (e.g., "some url"), creating a page from its 404 screen does not link the menu to the newly created page. The menu keeps pointing to a…
When a menu item URL contains a space and has no leading slash (e.g., "some url"), creating a page from its 404 screen does not link the menu to the newly created page. The menu keeps pointing to a 404. **Steps to reproduce**: 1. Create a menu item with a URL containing spaces and no leading slash (e.g., "some url"). 2. Click the menu item -> a 404 page is displayed (expected). 3. Click "Create Page" -> the page is created and saved. 4. Click the menu item again -> it still returns a 404 (unexpected). **Issue**: During page creation, the path is slugified (e.g., "some url" -> "/some-url"). The controller then tries to link the menu to the new page by setting `page_id`. However, `pagenew()` only searches for menu URLs with a leading slash, so a menu saved as "some url" is not found when searching for "/some url". As a result, `page_id` is never set, and `_clean_url()` keeps resolving the menu to "/some url" instead of the page's actual URL "/some-url". Menus without spaces (e.g., "mypage") have the same issue where `page_id` is not set, but since `_clean_url()` prepends "/" and renders "/mypage", which matches the new page URL, the menu still resolves correctly. **Fix**: Match both URL formats (with and without leading slash) when linking a menu to a newly created page. Additionally, a warning is now shown in the menu editor when a URL contains spaces, since spaces are slugified during page creation, which could cause confusion. (Note: this is only a warning - URLs with spaces are still allowed.) task-[5095646](https://www.odoo.com/odoo/project/974/tasks/5095646) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#260726 Forward-Port-Of: odoo/odoo#248967
This update addresses a technical detail related to our integration with Peppol, a key European payment network. By adding a new field to track the status of Peppol transactions, we ensure accurate processing and future-proof our system for evolving Peppol standards. This enhances the reliability of our international payments.
Original PR description
With the addition of new peppol_move_state for the Application Responses in Peppol, some checks to know wether the move was sent through Peppol were not updated. This commit does that by adding a common field for it. This is usefull as we might add some extra peppol_move_state values in the near future (Peppol supports more response types than we currently offer to our users). Forward-Port-Of: odoo/odoo#258598
3 changes
Resolved issues and error corrections
This update resolves an issue where the 'In a Budget' filter wasn't accurately displaying budget records. The fix ensures the filter correctly checks for a valid budget analytic ID, improving the accuracy of budget reporting. This ensures users see all relevant budget data.
Original PR description
"In a budget" Filter is expected to show records with a related budget i.e. `'budget_analytic_id' != False`. Forward-Port-Of: odoo/enterprise#112872
This update fixes a data inconsistency in how deferred invoice moves are created. Previously, the partner ID could be incorrectly set, leading to mismatches between the original invoice and the deferred move lines. This change ensures the correct partner ID is always used, maintaining data accuracy and reliability for financial reporting.
Original PR description
When creating deferred move lines, the `partner_id` could be incorrectly influenced by the `default_partner_id` context key (e.g., when generating an invoice from a Sales Order). This led to inconsistencies where the deferred move lines did not match the partner on the original invoice line. This commit ensures the `partner_id` is explicitly taken from the source invoice line, guaranteeing data integrity across all deferred move lines. Steps: - Create a sale order for partner X, receive and confirm it - Create the invoice from the SO - Change partner to Y but keep X as delivery partner (not essential to reproduce bthough) - Set a deferred start date and a deferred end date on the invoice line, covering two full months - Confirm the invoice and open deferred moves via the smart button -> Note that one deferred move's lines get the partner id from the SO instead of the invoice opw-6095711 Forward-Port-Of: odoo/enterprise#114439
This update fixes a problem where opening the same restaurant order on multiple devices would cause errors with the Fiskaly payment system. The fix ensures that transaction details are properly shared between devices, preventing duplicate transaction attempts and associated API errors. This improves the reliability of the restaurant POS experience.
Original PR description
In a restaurant POS, when an order with an active Fiskaly transaction is opened on a second device, `transactionState` and `tx_revision` were not available (uiState is not persisted to the server), causing the new device to attempt creating a duplicate transaction with a stale revision, which resulted in a Fiskaly API error. opw-6147654 Forward-Port-Of: odoo/enterprise#114599
8 changes
Resolved issues and error corrections
This update addresses a temporary issue where mail query counters were inflated due to a change in how messages are accessed. The team temporarily bypassed cached values to improve browsing speed, resulting in higher counter counts. This fix ensures more accurate performance metrics moving forward.
This update corrects a calculation error by excluding company executives (JC999) from the ONSS Base Salary figures reported on payslips. This ensures accurate reporting to the Belgian National Social Security Institute (ONSS) and aligns with regulatory requirements. The change improves payroll accuracy and compliance.
Original PR description
This commit excludes company executives (Joint Committee 999) from the computation of Total ONSS Base Salary (With Previous Payslips) on their payslips. TaskID-6124693
This update fixes inaccuracies in how signed documents are displayed and communicated, particularly when using 'Sign Now'. Now, certificates clearly show who signed on behalf of whom, and confirmation emails accurately reflect the signing process, improving transparency and trust.
Original PR description
Before: When a document template is signed using "Sign Now" on behalf of another user, the certificate should show the line “Connected as ” for internal and portal users. Previously, the Email…
Before: When a document template is signed using "Sign Now" on behalf of another user, the certificate should show the line “Connected as ” for internal and portal users. Previously, the Email verification note under Participants could appear even when no email verification was actually done, for example when using "Sign Now". Additionally, the signature confirmation email did not clearly reflect when the document was signed locally on behalf of others. After: When a document is signed using Sign Now on behalf of another user, the certificate now shows the line "Connected as <LoggedUser>" for all users. The Email verification note under Participants is shown only when email verification actually happens Otherwise show `Document was signed locally for all signers using UserName's account` - The signature confirmation mail is updated for local sign cases `..., while connected as <LoggedUser>`. Impact: - Clearly shows in the certificate when a document is signed by user for another user. - Avoids showing Email verification information when it did not happen and displays the correct message instead. - Improves clarity and accuracy of signature confirmation emails. taskid-5343749
This update simplifies how the system processes XML data for Slovak reports, reducing unnecessary complexity and improving performance. By using the standard XML parsing library, we've eliminated a custom configuration that was adding overhead. This change ensures more efficient report generation and maintenance.
Original PR description
Removes the custom XMLParser configuration in favor of the default etree parser. This reduces unnecessary overhead and ensures we are using the standard library's recommended defaults for processing XML content. Forward-Port-Of: odoo/enterprise#114828
This update resolves a minor typographical error within the Odoo Enterprise codebase. The word 'occured' was incorrectly spelled and has been corrected to 'occurred'. This ensures consistent and professional terminology across various Odoo modules, improving the overall user experience and maintaining code quality.
Original PR description
Community: https://github.com/odoo/odoo/pull/261023
This update fixes a minor issue where users were unable to retry payment attempts after a failure. Now, the system automatically resets the loading state, allowing users to easily re-attempt the payment without needing to refresh the page. This enhances the user experience and reduces frustration.
Original PR description
Currently, if the call to Odoofin fails, we properly show the error to the user but we never manage to reset the isFetching state of the button This means that the only way for the user to try again is to first refresh the page This commit addresses that No task ID
This update corrects a labeling inconsistency within the l10_be_hr_payroll module. Previously, similar labels were used for two insurance fields on employee payroll forms, causing confusion. The update now uses distinct labels, improving clarity and accuracy for payroll reporting.
Original PR description
Step to reproduce: install l10_be_hr_payroll and go on employee form, payroll tab, check one of the two insurance field Cause: same string for both labels Solution: update the label string Task: 6094807
This update enhances data privacy within the Helpdesk module by restricting access to reporting menus (Ticket Analysis & SLA Status Analysis) to manager users only. Previously, non-admin users could access these reports; this change removes complex security overrides and directly restricts access, improving data security and user experience.
Original PR description
Before this commit: Currently, the `Ticket Analysis` and `SLA Status Analysis` reporting menus from the helpdesk module are accessible to non-admin users. To manage data privacy and ensure users only see their own ticket data, custom Python overrides `(specifically _load_menus_blacklist in ir.ui.menu.py)` and complex record rules `(ir.rule in helpdesk_security.xml)` were maintained to filter report data. After this commit: helpdesk: Hide the reporting menus directly by restricting the `Ticket Analysis` and `SLA Status Analysis` menu items to the manager group. Removed the custom ` _load_menus_blacklist `Python override from ir.ui.menu.py since conditionally hiding the menus in Python is no longer necessary. Removed the obsolete `ir.rule` data filters for standard users in `helpdesk_security.xml`. Revoked base read access in the `ir.model.access.csv`file for standard users to prevent direct access to the reports via URL. task-5119293
5 changes
Resolved issues and error corrections
The company logo on the journal report PDF was appearing too large, obscuring the report content. This fix adjusts the logo's maximum height specifically for the journal report PDF, ensuring a properly formatted and readable report. This improves the user experience for generating and viewing financial reports.
Original PR description
Steps to reproduce: ------------------- 1. Upload a logo on the company (Settings > Companies) 2. Go to Accounting > Review > Control > Journal Audit 3. Select a period having journal entries 4.…
Steps to reproduce:
-------------------
1. Upload a logo on the company (Settings > Companies)
2. Go to Accounting > Review > Control > Journal Audit
3. Select a period having journal entries
4. Export the PDF
-> The company logo appears huge, taking almost the entire cover page, which shrinks the report content and makes it hard to read.
Why the bug
-----------
In e8d2084369d the logo was added to the `company_information` template with a global css rule `.o_company_logo { max-height: 4rem }`, so the size was correct on every pdf using this template, including the journal report pdf.
Later, 684f741120e scoped that rule under `.o_content`. From that point, the rule only applies when the pdf wrapper has the `o_content` class, which is not the case for the journal report, which wraps its content with `journal_report_pdf` instead.
The fix
-------
Add the same max-height rule directly under `.journal_report_pdf`. That way, we keep the changes minimal and well targeted for the journal report, to not risk breaking any other styles.
opw-6102598This update fixes a reporting issue related to Hong Kong's IRD (IRD56B/F/G) salary reports. It adds adjustments for global reimbursements and deductions, ensuring that taxable income totals are accurately calculated. This improves the reliability of financial reporting for Hong Kong businesses using Odoo.
Original PR description
Added GLOBAL_REIMBURSEMENT and GLOBAL_DEDUCTION to the AmtOfSalary calculation for IR56B/F/G reports. This ensures adjustments are properly reflected in taxable income totals. task-6126661
This update resolves a crash that occurred when opening salary adjustments on mobile devices. The fix addresses a missing delete action in the mobile view and added a basic kanban view to ensure proper functionality. This improves the user experience for mobile users managing employee salaries.
Original PR description
Steps to reproduce ================== - Install hr_payroll - Use a mobile viewport - Go to Employees - Open a record - Switch to the Salary Adjustments notebook tab => TypeError: undefined is not an…
Steps to reproduce ================== - Install hr_payroll - Use a mobile viewport - Go to Employees - Open a record - Switch to the Salary Adjustments notebook tab => TypeError: undefined is not an object (evaluating 'props.activeActions.onDelete=this.onDelete.bind(this)' Cause of the issue ================== The SalaryAttachment2ManyField widget overrides the rendererProps to handle the delete action, but this isn't defined on mobile (because a kanban view is used) See https://github.com/odoo/odoo/blob/9f93f22ed5f6d5dbbafeb0a8c6fababdc2a65d45/addons/web/static/src/views/fields/x2many/x2many_field.js#L196-L212 Solution ======== Since there is no delete action on the kanban view, there is no need for an override. While we are at it, there was no kanban view defined. Thus a default view was used https://github.com/odoo/odoo/blob/138fad6d54a0b59885b1e5c712beb8f581c9555c/odoo/addons/base/models/ir_ui_view.py#L2835-L2846 It only contained the field description. Since that one is optional, records without a description were almost invisible.. Thus we also add a basic kanban view opw-6047295
This update resolves a technical issue that was limiting the efficiency of WhatsApp marketing automation. Previously, the system processed only a portion of related messages, now all relevant messages are processed, improving the speed and scalability of the automation workflow. This ensures a smoother and more reliable experience for users.
This update resolves an issue where attachments couldn't be downloaded from the Odoo mobile app (versions 18.4+). The fix ensures that absolute URLs are handled correctly, preventing errors and restoring the ability to download files from chatter. This improvement impacts mobile users' ability to access and share attachments.
Original PR description
In Odoo 18.4+, downloading attachments from the chatter is broken.
See: https://github.com/odoo/odoo/pull/200099
The `onClickDownload` function now passes an absolute URL to `downloadFile`.
The download function is implemented natively in the mobile apps.
The Android implementation always prefixes the provided URL with the
database origin (i.e.: `https://example.odoo.com`).
`download({url: "https://example.odoo.com/web/content"})` will try to
download `https://example.odoo.comhttps://example.odoo.com/web/content`.
This results in an UnknownHostException.
We can remove the origin from the url before calling the native method.
By doing this on the JS side, there is no need to update the Android app.
opw-6033150
Forward-Port-Of: odoo/enterprise#11483220 changes
Resolved issues and error corrections
This update resolves a bug that prevented users from saving reports after removing elements from the report view. The fix ensures the system doesn't attempt to access non-existent elements, preventing an 'IndexError' and ensuring report saving functionality remains stable. This improves the user experience and prevents data loss.
Original PR description
Currently an error occurs we try to save a report after deleting an element from the view. Steps to reproduce: - Install `sale_management` and `web_studio`. - Turn on studio mode and go to `Sales > reports`. - Now open any of the report. - Delete the subtotal block from the report view and save. (Please refer to [this](https://drive.google.com/file/d/12SbqHooLBFlbpBgdeCCzkkU8yKw93LAF/view?usp=sharing) video.) Error: `IndexError: list index out of range` The error occurs as the element with the xpath [1] no longer exists and thus returns an empty list and when we try to access the element at 0th index causes the error. [1] - https://github.com/odoo/enterprise/blob/de7be49fc3b4e7c6e1fb4685310b2dfe6175f1ba/web_studio/controllers/report.py#L101 This commit solves this issue by only accessing the element if it exists. sentry-4906237156
This update resolves an issue where the Document Editor would throw an error when users entered local file URLs. The fix ensures that invalid URLs are handled gracefully, preventing errors and improving the user experience when adding documents to website content. This improves stability and usability for website editors.
Original PR description
Currently, an error occurs when entering a URL for the Document on the website. Steps to Reproduce: - Install the `Website` module. - Go to the `Website` and click `Edit`. - Insert an `image` block.…
Currently, an error occurs when entering a URL for the Document on the website. Steps to Reproduce: - Install the `Website` module. - Go to the `Website` and click `Edit`. - Insert an `image` block. - Double-click on the image > `Documents` > enter this URL: `file:///C:/Users/sagar/Downloads/op.webp` `InvalidSchema: No connection adapters were found for 'file:///C:/Users/sagar/Downloads/op.webp'` This error occurs when the user enters a URL that does not point to a valid document or does not follow a valid schema. This caused an exception in the HEAD request during header retrieval [1]. [1] https://github.com/odoo/odoo/blob/07626050bd0104fecd8799b56d30245d00da3f27/addons/html_editor/controllers/main.py#L255 This commit ensures that the URL is evaluated safely during the HEAD request. If the user enters a document URL with a invalid schema, a UserError is raised. sentry-6726490037 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a bug that caused Odoo to crash when processing records with invalid UTF-8 characters, often found in image attachments. The fix automatically handles these characters during JSON serialization, ensuring data integrity and preventing system errors. This improves stability and reliability.
Original PR description
The system would crash when attempting to open the `data` of a record containing `invalid UTF-8` bytes (e.g., binary fields such as images or file attachments). **Steps to produce:-** - Activate the `developer mode`. - `Settings > Technical > Database Structure > Attchments`. - Click on `New` and upload any `image`. - Click on the `bug icon` and click on `data`. **Error:-** `UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc9 in position 5: invalid continuation byte` **Solution:-** - The fix updates `json_default` to decode bytes using `errors='ignore'`, preventing crashes from invalid UTF-8 during JSON serialization. **Sentry - 6644599805** I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a crash that occurred when users uploaded certificate files in unsupported formats. The system now validates certificate formats to ensure they are either .der, .pkcs12, or .pem, preventing errors and maintaining data integrity. This ensures smooth operation of DIAN configuration.
Original PR description
The system crashes with the error because a certificate record exists (cert_sudo is not None), but the pem_certificate field is False. This is because of a user uploaded invalid format certificate.…
The system crashes with the error because a certificate record exists (cert_sudo is not None), but the pem_certificate field is False. This is because of a user uploaded invalid format certificate.
**Steps to Produce:-**
1. Install `l10n_co_edi` then change the company to `co company`.
2. `Settings > Certificates and Keys > Manage Your Certificates > Certificates`.
3. Add a new certificate using an invalid file (`other than .der, .pkcs12, or .pem content format`)and fill in the other required details.
4. Open any journal of type Sales or Purchase.
5. Go to `Advanced Settings` and click the `Reload DIAN Configuration` button.
**Traceback:-**
```py
File "/home/odoo/odoo18/community/odoo/http.py", line 2554, in __call__
response = request._serve_db()
File "/home/odoo/odoo18/community/odoo/http.py", line 2081, in _serve_db
return self._transactioning(
File "/home/odoo/odoo18/community/odoo/http.py", line 2144, in _transactioning
return service_model.retrying(func, env=self.env)
File "/home/odoo/odoo18/community/odoo/service/model.py", line 156, in retrying
result = func()
File "/home/odoo/odoo18/community/odoo/http.py", line 2111, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
File "/home/odoo/odoo18/community/odoo/http.py", line 2359, in dispatch
result = self.request.registry['ir.http']._dispatch(endpoint)
File "/home/odoo/odoo18/community/odoo/addons/base/models/ir_http.py", line 333, in _dispatch
result = endpoint(**request.params)
File "/home/odoo/odoo18/community/odoo/http.py", line 754, in route_wrapper
result = endpoint(self, *args, **params_ok)
File "/home/odoo/odoo18/community/addons/web/controllers/dataset.py", line 42, in call_button
action = call_kw(request.env[model], method, args, kwargs)
File "/home/odoo/odoo18/community/odoo/api.py", line 535, in call_kw
result = getattr(recs, name)(*args, **kwargs)
File "/home/odoo/odoo18/enterprise/l10n_co_dian/models/account_journal.py", line 129, in button_l10n_co_dian_fetch_numbering_range
response = xml_utils._build_and_send_request(
File "/home/odoo/odoo18/enterprise/l10n_co_dian/xml_utils.py", line 133, in _build_and_send_request
'binary_security_token': cert_sudo._get_der_certificate_bytes(formatting='base64').decode(),
File "/home/odoo/odoo18/community/addons/certificate/models/certificate.py", line 282, in _get_der_certificate_bytes
cert = x509.load_pem_x509_certificate(base64.b64decode(self.with_context(bin_size=False).pem_certificate))
File "/usr/lib/python3.10/base64.py", line 80, in b64decode
s = _bytes_from_decode_data(s)
File "/usr/lib/python3.10/base64.py", line 45, in _bytes_from_decode_data
raise TypeError("argument should be a bytes-like object or ASCII "
TypeError: argument should be a bytes-like object or ASCII string, not 'bool'
```
**Solution:-**
- We added a constraint method to ensure that the `content_format` of a certificate is one of the allowed types: `'der', 'pkcs12', or 'pem'`. This helps prevent saving records with unsupported or invalid certificate formats.
**Sentry - 6373511231,6842736554,6851901831**
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update resolves a critical error that prevented users from accessing newly created model pages on the website. The issue stemmed from a system crash when a model parameter was missing, leading to a `KeyError`. The fix ensures stable website functionality by correctly handling model access.
Original PR description
When accessing a model page through a website route, the system crashes with a `KeyError` if the model parameter is missing. This issue arises because the code attempts to access `request.env[False]`, which is not a valid model name. **Steps to Reproduce:-** 1. Install the `Website` and `Studio` modules. 2. Navigate to `Sales` and, using Studio, create a `new model page` for the sale order model. 3. The new page will now be visible on the website. 4. Uninstall the `Sale` module from the Apps. 5. Attempt to access the page from the website. **Error:-** `KeyError: False` **Solution:-** - When module is installed we need to also unlink the related `website.controller.page`. **Sentry - 6311722475** I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where Google Reserve appointments incorrectly displayed resources as available due to a lack of leave status checks. Additionally, a redundant offset from the frontend was removed, streamlining the process. This ensures accurate availability and a better user experience for booking appointments.
Original PR description
Resources on leave were still showing as available in BatchAvailabilityLookup responses because unavailabilities were not checked. Also remove the min_schedule_hours offset copied from the frontend logic. It is not relevant for Google Reserve as slots are pre-built in the feeds. Task-6150788
This update replaces a broken video snippet used on the website with a new, publicly available version. Previously, the original video was no longer accessible, causing a display issue. This change ensures the website's video content is consistently available to users.
Original PR description
Specification: - The previously embedded video used by the "s_video" snippet (id=G8b4UZIcTfg) is no longer publicly available. After this commit: - This commit replaces the default video with a new publicly available one (id=nbso3NVz3p8). task-6034987 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#253874
This update fixes an issue where flexible calendar hour calculations were inaccurate due to how time boundaries were handled. The fix ensures 'out of contract' hours are calculated correctly, regardless of user timezone, leading to more precise worked-time reporting. This impacts payroll accuracy for employees on flexible schedules.
Original PR description
Flexible calendar intervals are computed with date-only boundaries, which can shift the range used for worked time calculations. ### **Steps to reproduce:** 1) Install hr_payroll 2) Create a flexible…
Flexible calendar intervals are computed with date-only boundaries, which can shift the range used for worked time calculations. ### **Steps to reproduce:** 1) Install hr_payroll 2) Create a flexible working schedule with 56 hr per week and 8hrs avg per day 3) Create an employee with this working schedule and joined from `16th Feb 2026`. 4) Create a payslip for this employee for the February period. ### **Observed Behavior:** "out of contract" working hours are 120:59hr <img width="1213" height="406" alt="image" src="https://github.com/user-attachments/assets/3f7104fb-3a59-48e3-aaf6-052dcf18c0c0" /> ### **Expected Behavior:** "out of contract" working hours should be 120hr <img width="1225" height="429" alt="image" src="https://github.com/user-attachments/assets/98898b16-4e36-4a30-9460-633f32c53ec3" /> ### **Root Cause:** The flexible calendar interval computation trims the interval boundaries by converting them to dates at [1], and assumes `end_datetime` is always midnight at [2]. This ignores timezone effects, depending on the user timezone, `end_datetime_adjusted`, may still fall on the same day, so an extra day can be included in the computation. This produces incorrect worked-hours totals for flexible calendars. [1]- https://github.com/odoo/odoo/blob/a9a63976372d3b5411fd798a48cc5302c2de8af0/addons/resource/models/resource_calendar.py#L387-L389 [2]- https://github.com/odoo/odoo/blob/e49536031f61b90212eb6f0d1a8a3e15927e723d/addons/resource/models/resource_calendar.py#L402 ### **Fix:** Keep the full datetime values when computing flexible calendar intervals. Related Enterprise PR https://github.com/odoo/enterprise/pull/113119 **opw-6017569**
This update fixes an issue where out-of-contract hours were being incorrectly calculated for flexible work schedules. The change adds a test case to ensure accurate hour calculations when payslips cover periods starting or ending mid-day, preventing overpayment for employees on flexible contracts. This improves payroll accuracy and reduces potential financial discrepancies.
Original PR description
Currently, out-of-contract worked hours are overestimated for flexible calendars When the payslip period starts or ends in the middle of a day. ### **Steps to reproduce:** 1) Install hr_payroll 2) Create a flexible working schedule with 56 hr per week and 8hrs avg per day 3) Create an employee with this working schedule and joined from `16th Feb 2026`. 4) Create a payslip for this employee for the February period. This commit adds a test case for PR https://github.com/odoo/odoo/pull/257824 to ensure the worked hours for `out of contract` period. **opw-6017569**
This update resolves a problem that occurred when uninstalling the Repair module, specifically related to data cleanup. The issue stemmed from lingering inventory data interfering with the deletion of a selection field, causing an error. The fix ensures that related data is properly removed during module uninstallation.
Original PR description
This error occurs when Repair Module is uninstalled but the Inventory module still has the master data (some stock rules), so this results into the selection field value `repair_operation` not being able to get deleted, even with having an ondelete attribute defined in field definition. Steps to replicate: - Install `Repairs` & `Inventory`, uninstall `Repairs`. - Open `Inventory > Configuration > Operation Types` and click on any of the records other than `Repairs`. - Under the `General` page, change Type of Operation to `Repairs` and watch the error occur. `ValueError: Wrong value for stock.picking.type.code: 'repair_operation'` Solution: - To solve this error, added `ondelete='cascade'` to safely unlink all the `stock.rule` that interrupt the deletion of selection value `repair_operation`. sentry-6562294139 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a problem where a key save operation wasn't triggered within the Web Studio interface when the view's visibility changed. The fix ensures the save function is called correctly under these circumstances, preventing a test case failure and maintaining the stability of the Web Studio feature. This ensures consistent behavior and reliable operation.
Original PR description
This commit [1], avoided the save on form view when studio activated and `visibilitychange` event is called. But after the fix [2], the save is not called on `visibilitychange` event unless the form is dirty and this caused the testcase to fail. [1]: https://github.com/odoo/enterprise/pull/69474/commits/87b0ad3c3b89a3a6daeb6f50b96c23c1228d56d7 [2]: https://github.com/odoo/odoo/pull/223702 sentry-6831823426
This update resolves an issue where closing a tab with a new, unsaved record would trigger duplicate save attempts, leading to errors. The fix ensures that the browser's tab closing events are handled correctly, preventing these duplicate saves and improving data consistency. This improves the user experience when creating new records.
Original PR description
Currently, an error occurs when closing a tab with a new (unsaved) record. **Steps to replicate Error- 1:** - Install `hr`. - Open Employees and click new. - Give a name and close the tab (without…
Currently, an error occurs when closing a tab with a new (unsaved) record. **Steps to replicate Error- 1:** - Install `hr`. - Open Employees and click new. - Give a name and close the tab (without saving). **Error:** `KeyError: 'name'` ---- **Steps to replicate Error- 2:** - Install the `Time Off` module. - Go to `Time Off > Management > Time Off`. - Click on New and select an employee and close the tab. **Error:** `KeyError: None` --- **Cause:** - When closing the tab, the browser triggers both `visibilitychange` [1] and `beforeunload` [2]. - Both attempted to save, resulting in duplicate create calls — one with a valid payload and the other empty which leads to error at line [3]. **Solution:** - Skip the `beforeunload` urgent save if the record has no `resId`. This ensures that only existing records are saved at tab close. - Because `beforeunload` is called after `visibilitychange` so we let `visibililitychange` handle the save for new records. [1]: https://github.com/odoo/odoo/blob/6e6f2a0bc8b6b1dc3ef5f203530c6fb82a67132a/addons/web/static/src/views/form/form_controller.js#L467-L471 [2]: https://github.com/odoo/odoo/blob/6e6f2a0bc8b6b1dc3ef5f203530c6fb82a67132a/addons/web/static/src/views/form/form_controller.js#L482-L488 [3]: https://github.com/odoo/odoo/blob/6e6f2a0bc8b6b1dc3ef5f203530c6fb82a67132a/addons/hr/models/hr_employee.py#L476 sentry-6691540890,6234873849 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where users could trigger an error when entering an incorrect model name in the snailmail letter creation process. The fix adds a check to ensure the specified model exists, improving stability and preventing data entry failures. This ensures users can consistently create snailmail letters without encountering errors.
Original PR description
Currently, an error occurs when user writes an invalid model name in snailmail. Steps to replicate: - Install mail and open snailmail letters. - Type `test` in the model field, add a recipient and…
Currently, an error occurs when user writes an invalid model name in snailmail. Steps to replicate: - Install mail and open snailmail letters. - Type `test` in the model field, add a recipient and save. Error: `KeyError: 'test'` Cause: - As the model name was given as `test` the [line] throws error as no model with the name 'test' exists in the environment. Solution: - Added a function to check if the model exists in the environment, along with an existence check for the document ID. - Also added a compatibility check to ensure the model works with snailmail. Note: - In this scenario where the `create()` method is overridden and the error occurs before the `super()` call, we cannot add a python constraint as the constrains are called by the `_create()` in the orm. [1] -> [2] [2] -> [3] [3] -> [4] [1]: https://github.com/odoo/odoo/blob/9d965abb992d558ea4235ef5f87a7654c6f1ceae/odoo/orm/models.py#L4705-L4706 [2]: https://github.com/odoo/odoo/blob/d088dbad84492234ae792b76545497c6cd62e4f4/odoo/orm/models.py#L4943-L4944 [3]: https://github.com/odoo/odoo/blob/d088dbad84492234ae792b76545497c6cd62e4f4/odoo/orm/models.py#L1253-L1258 [4]: https://github.com/odoo/odoo/blob/d088dbad84492234ae792b76545497c6cd62e4f4/odoo/orm/models.py#L518-L520 [line]: https://github.com/odoo/odoo/blob/e8a41b5b50ac71974d98c18fa9d47e37e0f7763f/addons/snailmail/models/snailmail_letter.py#L92 sentry-7151105998 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects a technical issue causing a misleading warning about the Construction Industry Scheme (CIS) for certain vendor bills. The fix ensures that CIS checks are applied correctly only to purchase-related documents, preventing unnecessary alerts when using the Cash Basis accounting method. This improves the user experience and data accuracy.
Original PR description
Currently, journal entries may be flagged for the CIS inactive partner check, causing unnecessary warning. Steps to reproduce: - Install l10n_uk_reports_cis. - Accounting > Configuration > Settings, enable "Cash Basis" - Open "20% CIS" Purchase tax - Set "Tax Exigibility" to "Based on Payment" and add a Cash Basis Transition Account - Set Outstanding account on the Bank journal - Create a partner and enable (Accounting tab) Construction Industry Scheme" - Create a vendor bill for this partner with a the 20% CIS tax - Register payment to the Bank journal - Open the created CABA entry Issue: Warning will be shown "Construction Industry Scheme hasn't been enabled for this vendor." Analysis: The warning flag is incorrectly triggered because the CABA entry has `invoice_line_ids` field set. However entries should be excluded by this check as it should only apply to purchase-related documents. opw-5942603
This update removes unnecessary complexity in how Odoo handles electronic invoices from Belgium (BE). Previously, the system was switching between different invoice formats, which is no longer needed as the standard 0208 format is now used. This simplifies the system and ensures consistent invoice processing.
Original PR description
When adding peppol, we didn't know if we needed to use the 9925:BE or 0208. Therefore, we switched between them if the endpoint was not found. This has no more use today as we use 0208. opw-5976574 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#260473 Forward-Port-Of: odoo/odoo#258297
This update corrects a formatting issue in the e-waybill document date field. Previously, the date displayed included the time, which is not the required format. This change ensures consistent and accurate date display for e-waybill documents.
Original PR description
The `document_date` field in e-waybill form view previously included both date and time, which is not as per the expected format. This fix ensures that only the date is shown, hiding the time component. Forward-Port-Of: odoo/odoo#259656
This update ensures that the barcode app validates the destination of products before confirming a receipt, even when a destination is forced. This prevents issues where users couldn't validate receipts if they hadn't scanned a destination, improving the reliability of the barcode picking process.
Original PR description
### Steps to reproduce: - In the settings: Enable "Storage Locations" - Inventory > Configuration > Warehouse Management > Operation Types - On receipts, in the Barcode App tab enable: "Force a…
### Steps to reproduce: - In the settings: Enable "Storage Locations" - Inventory > Configuration > Warehouse Management > Operation Types - On receipts, in the Barcode App tab enable: "Force a destination on all products" - Open the barcode app, create a new receipt - Scan a product > Validate #### > You are not blocked by the fact that you did not scan any destination even just to validate the default one ### Cause of the issue: The `barcode_validation_after_dest_location` operation type setting is not used at any point in the barcode app. ### Note: Line in the barcode app are always created a with a `location_dest_id`: https://github.com/odoo/enterprise/blob/a220fc61d9076decdb987421df9330a1c2c20546/stock_barcode/static/src/models/barcode_picking_model.js#L1310-L1322 In particular, even if the setting says: Force a destination on all products. It should rather be interpreted as force a destination scan before validation. Note that a destination scan will not necessarily update a single line but rather all concerned lines at once: https://github.com/odoo/enterprise/blob/a220fc61d9076decdb987421df9330a1c2c20546/stock_barcode/static/src/models/barcode_picking_model.js#L1558-L1576 It is therefore a valid call to check if a location dest was scanned to determine if the a destination was set on each product before validation of the picking, even if it is just to confirm the default destination. ### Note 2: We modify the `_get_barcode_config` to only provide a `barcode_validation_after_dest_location` if locations re enabled otherwise users enabling the option without the ability to scan locations would be soft lock and unable to validate their picking. That same logic already being applied to the `restrict_scan_dest_location` config parameter: https://github.com/odoo/enterprise/blob/6afe02e3e836df2822d7cae8aebbd5bdde6b34cc/stock_barcode/models/stock_picking_type.py#L109 opw-6110690
This update fixes a bug where users could falsely validate signatures in draw mode using Firefox and similar browsers. Now, the system requires a visible signature drawing before validation, ensuring signatures are legitimate and preventing fraudulent confirmations.
Original PR description
On Firefox and similar browsers, it was possible in some cases to validate a signature field in draw mode without actually drawing a signature, allowing the document signature to be confirmed with an empty signature. This change ensures that a signature field in draw mode can only be validated when the signer has effectively drawn a visible signature. task-6117312 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
This update addresses a technical issue related to Odoo's integration with Peppol, a European network for electronic invoicing. By adding a new field to track the status of Peppol moves, the system can now accurately determine if invoices were sent through Peppol. This change enhances future flexibility as Peppol continues to evolve and support new response types.
Original PR description
With the addition of new peppol_move_state for the Application Responses in Peppol, some checks to know wether the move was sent through Peppol were not updated. This commit does that by adding a common field for it. This is usefull as we might add some extra peppol_move_state values in the near future (Peppol supports more response types than we currently offer to our users).
This update corrects a mismatch in how transaction IDs are reported in financial export files (FAIA). Previously, the system used different identifiers for invoices and purchase invoices, leading to potential reporting errors. This change ensures all transaction IDs align, improving the accuracy and reliability of financial reports.
Original PR description
The Invoice/TransactionID element in SourceDocuments/SalesInvoices and SourceDocuments/PurchaseInvoices must match the corresponding Transaction/TransactionID in the GeneralLedgerEntries section. As the latter uses the entry name since PR odoo#58728, the former should too. opw-6111343, opw-542729
11 changes
Resolved issues and error corrections
This update fixes an error that occurred when importing SAF-T files into the accounting module. The issue stemmed from a missing element in the SAF-T XML, which caused a system error. This change ensures the import process completes successfully, allowing users to accurately import their financial data.
Original PR description
Currently, an error occurs when importing the SAF-T file into accounting. Steps to Reproduce: - Install the `account_saft_import` and `accountant` modules. - Create a `new company` with the country…
Currently, an error occurs when importing the SAF-T file into accounting. Steps to Reproduce: - Install the `account_saft_import` and `accountant` modules. - Create a `new company` with the country set to `Denmark`, and `switch` to this company. - Go to `Settings` > `Accounting`, and click `Import` under Accounting Import. - Click `Import SAF-T`, enable Import account opening balances, and upload [this file](https://drive.google.com/file/d/177zf_w3B8m3g2VlJkbDB-Zp61TbZuV5r/view) `AttributeError: 'NoneType' object has no attribute 'update'` This error occurs when importing the SAF-T file in accounting. The SAF-T XML does not include any <saft:Account> entries, so map_accounts is empty [1]. As a result, based on map_accounts here [2], it got None in data['account.move'], which causes the error in [3]. [1] https://github.com/odoo/enterprise/blob/2f59dc2443833b0308fcd774a8008b8ebdce48fd/account_saft_import/wizard/import_wizard.py#L436 [2] https://github.com/odoo/enterprise/blob/2f59dc2443833b0308fcd774a8008b8ebdce48fd/account_saft_import/wizard/import_wizard.py#L447 [3] https://github.com/odoo/enterprise/blob/2f59dc2443833b0308fcd774a8008b8ebdce48fd/account_saft_import/wizard/import_wizard.py#L467 This commit ensures that it uses an empty object if it gets None. sentry-6714182871
This update resolves an error that occurred when an invoice was deleted after being sent via post. The system now checks if the invoice exists before attempting to attach the snailmail letter, preventing a 'Record does not exist' error. This ensures the Snailmail process continues to function smoothly.
Original PR description
Currently, an error occurs when the `Snailmail: process letters queue` scheduled action is triggered. Steps to reproduce: - Install the `website` and `account` modules. - Create a `Invoice` >…
Currently, an error occurs when the `Snailmail: process letters queue` scheduled action is triggered. Steps to reproduce: - Install the `website` and `account` modules. - Create a `Invoice` > `Confirm` > `Send` > check the `By Post` checkbox. - `Reset to Draft` newly created invoice and delete it. - Run the `Snailmail: process letters queue` scheduled action. `MissingError: Record does not exist or has been deleted. (Record: account.move(27,), User: 1)` This error occurs when the user sends the invoice by post, which creates a Snailmail letter record related to the invoice. If the invoice is subsequently deleted, the Snailmail: Process Letters Queue scheduled action run and attempt to fetch the attachment of related snailmail letter and invoice[1] but the invoice is not exists [2] and raise a MissingError. [1] https://github.com/odoo/odoo/blob/cc368d553cd94bee8b09d4981cb8f1dbc27a34b3/addons/snailmail/models/snailmail_letter.py#L149 [2] https://github.com/odoo/odoo/blob/420765c787b33f79ee8814f799de721508858319/addons/account/models/account_move.py#L3605 This commit ensures that the system evaluates the attachment only if the invoice also exists. sentry-6635629791 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a technical issue where the OAuth sign-in process would display a generic error message when required information was missing. Now, a more standard error is raised, making it easier to identify and resolve issues during the sign-in flow. This improves the overall user experience and stability of the authentication process.
Original PR description
When required parameters are missing from the OAuth sign-in request to the /auth_oauth/signin route, a generic Exception with the message "invalid_request" is raised. This behavior does not align with standard error handling practices. `Exception: invalid_request` This commit ensures that a ValidationError is raised instead of a generic Exception when the request is invalid. Sentry-6400398175 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where the OAuth sign-in process would fail if the 'state' parameter was missing. The change ensures the system safely retrieves this parameter, and raises an error if it's missing or empty, preventing disruptions to user authentication.
Original PR description
The OAuth sign-in route `/auth_oauth/signin` raises a `KeyError` when the `state` parameter is missing from the request.
KeyError: 'state'
This commit ensures the sign-in method uses `kw.get('state', '{}')` to safely retrieve the state parameter. It raises a BadRequest if the state is not present or is empty after parsing.
Sentry-6521782565
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update simplifies the process for creating Unsplash attachments within Odoo. Previously, overly broad access rights were required, but this fix now restricts sudo permissions to only setting the attachment URL, reducing complexity and potential security risks. This change ensures employees can upload Unsplash images efficiently.
Original PR description
Only grant `sudo` to set the attachment `url` rather than applying sudo on the whole `.create` dict The purpose of the previous `_can_bypass_rights_on_media_dialog` was to allow employees uploading unsplash images to be able to create an attachment with an `url` while being a `type='binary'`, for the images to be able to be served with the URL `/unsplash/...`. Just applying `sudo` at the right needed spot rather than on the whole `create` requires less code to achieve the same goal.
This update fixes a discrepancy in the sale details report by accurately reflecting cash rounding adjustments. Now, the report displays the total cash rounding applied during a session, aligning with how payments are recorded and providing a clearer picture of the transaction total. This ensures greater accuracy and transparency in sales reporting.
Original PR description
The sale details report total_paid was computed from sum(order.amount_total), which does not include the cash rounding adjustment. This caused a discrepancy between the displayed total and the sum of individual payment lines when cash rounding is enabled. Use the sum of actual payment amounts instead, which naturally includes cash rounding since payments are recorded with their rounded values. opw-5253018
This update resolves an issue where the quick create feature for product variants within Bills of Materials was incorrectly creating unrelated product templates. To ensure correct variant creation, the system now requires users to create the variant directly on the product template, providing a more reliable process.
Original PR description
Steps to produce: --- - Install `mrp`. - Go to Manufacturing > Products > Bills of Materials. - Click Create, select a product. - In the Product Variant field, type any value and click "Create".…
Steps to produce: --- - Install `mrp`. - Go to Manufacturing > Products > Bills of Materials. - Click Create, select a product. - In the Product Variant field, type any value and click "Create". Issue: --- Using quick create on the Product Variant field does not create a variant of the selected product template. Instead, it creates a completely new, unrelated `product.template`. This is because the `create()` method on `product.product` is overridden to call super() with context `create_product_product=False`, which suppresses direct variant creation and forces creation through `product.template` instead, see [1]. **Why passing `default_product_tmpl_id` does not help:** One might expect that passing `default_product_tmpl_id` in the field context would cause the newly quick-created `product.product` to be linked to the already-selected `product.template`. However, because of the `create()` override above (introduced in [commit]), the variant creation is always redirected to `product.template`, ignoring any `default_product_tmpl_id` passed in context. It is therefore not possible in any case to quick-create a `product.product` that is correctly and directly linked to the currently selected `product.template`. Fix: --- Disable the "Create" and "Create and Edit" options. Since there is no way to quick-create a `product.product` that is correctly linked to the currently selected `product.template`, the user must create the variant directly on the product template first. [1]https://github.com/odoo/odoo/blob/f04d79d44873d0f1c35303a1a892f3a3a394ea17/addons/product/models/product_product.py#L364-L368 [commit]: https://github.com/odoo/odoo/commit/7389345696720255a9d3c72ca1d9c2f4e4ecd7b8 opw-6127738 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update adjusts the sales subscription module to align with recent changes in the Odoo community. Specifically, it removes a reference to a removed signature tab in the Sales Order view, ensuring the template continues to function correctly after the community update. This ensures consistent PDF generation for sales subscriptions.
Original PR description
In a https://github.com/odoo/odoo/pull/261288, we removed the customer's signature of all generated Quotation/SO's PDF except from the one they actually signed. We also removed the "Customer Signature" tab from the Sales order view. This tab was referenced to extend the template in the `sale_subscription` module. In this commit, we remove this reference and replace it for a reference to the tab before the removed one. task-5421716 opw-6159170 Back port of https://github.com/odoo/enterprise/pull/107529
This update adds a new unit test to identify and correct a rounding error in the calculation of Arabic withholding taxes. The test specifically checks a scenario where a base amount of 391683 with a 4.5% tax rate should result in a withholding amount of 17625.74. Fixing this issue will ensure accurate tax calculations.
Original PR description
Add test test_07_invoice_and_payment_with_3_decimals_withholding_amount, the base amount is 391683, the percentage applied is 4.5%, the withholding amount must be 17625.74 . Check that this test fails on 18 on this pr https://github.com/odoo/odoo/pull/232893 and will be successful if the bug reported on https://www.odoo.com/es_ES/my/tasks/5154585 (#230641) is fixed. Task Adhoc side: 59222 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where the minimum IS (Insurance Savings) amount was incorrectly calculated in the Swiss payroll module. The change ensures accurate reporting of IS contributions for Swiss employees, aligning with local tax regulations. This update improves the reliability of payroll data for our Swiss clients.
Original PR description
opw 6133391
This update ensures that when reserving stock for packaged products, the system correctly considers the available quantity of full packages. Previously, a large stock level would override the 'reserve only full packages' setting. This change now accurately reflects the available stock, preventing over-reservation and ensuring accurate order fulfillment.
Original PR description
Issue ----- Forced full packaging reservation setting is ignored when there is a big quant in stock. Steps to reproduce ----- - Enable packagings - Create a product category "Super Category" -…
Issue
-----
Forced full packaging reservation setting is ignored when there is a big quant in stock.
Steps to reproduce
-----
- Enable packagings
- Create a product category "Super Category"
- Reserve Packagings: Reserve Only Full Packagings
- Create a stored product "AAA"
- Product Category: Super Category
- 50 units on hand
- Packaging: 6-Pack (6 units)
- Create a delivery for 15 units of AAA
> Reservation is made for 15 units
Cause
-----
The rounding to a multiple of the packaging quantity takes the stock quant into account. For our example case, we have 8 full 6-Packs on hand, so the `available_quantity` gets set to 48 when doing
https://github.com/odoo/odoo/blob/5e458236ca2ff2ab92c4893495e7a721be902c40/addons/stock/models/stock_quant.py#L923-L925
This leads to the reservation quantity being min(15, 48) = 15
https://github.com/odoo/odoo/blob/5e458236ca2ff2ab92c4893495e7a721be902c40/addons/stock/models/stock_quant.py#L927
-----
Ticket:
opw-5974333