Daily updates from Odoo
Thursday, April 16, 2026
103 changes
24 changes
Enhancements to existing features
This update enhances the Point of Sale system by adding sound feedback during barcode scans. A pleasant beep confirms successful product identification, while a distinct error sound alerts staff to scanning failures. This improves user experience and reduces potential errors during transactions.
Original PR description
Play a beep sound when a barcode scan successfully finds a product, partner, or GS1 barcode. Play a distinct error sound when the scan fails to match any record. task-id: 5969010 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#250434
This update improves the Odoo Gantt view by displaying progress bars for all employees, not just those on leave. This provides a more complete and accurate representation of employee work hours, enhancing visibility and reporting.
Original PR description
…hose without leaves Previously, the gantt view only showed the progress bars (the number of worked hours) for employees who had leaves. Now, this PR shows the progress bars for all employees, even those without leaves. Task-5999717
Resolved issues and error corrections
This update ensures that users on MacOS can correctly post and edit messages in Odoo Chatter using the CMD-Enter key shortcut. Previously, the system displayed the outdated CTRL-Enter hint. This change improves the user experience for MacOS users and aligns the shortcut with the composer's functionality.
Original PR description
Recent commit changed the shortcut in MacOS for posting and editing message to CMD-Enter, instead of CTRL-Enter [1]. The hint was changed in the composer to post message, but the hint when editing message was still showing "CTRL-Enter" instead of "CMD-Enter", which this commit fixes. [1]: https://github.com/odoo/odoo/pull/248862 Task-6124496 Before / After <img width="904" height="116" alt="Screenshot 2026-04-15 at 14 04 34" src="https://github.com/user-attachments/assets/a7ad0450-f110-45b1-82c8-d6d251625ca1" /> <img width="894" height="119" alt="Screenshot 2026-04-15 at 14 03 53" src="https://github.com/user-attachments/assets/770b13b9-d882-4ea8-9fe3-f4b334de78ba" />
This update corrects a technical issue preventing Odoo from correctly identifying Swedish bank accounts. The fix adds a necessary decorator to the method used by the bank account widget, ensuring proper communication with banks. This resolves a potential error that could have impacted users in Sweden.
Original PR description
The override of `retrieve_account_type` was missing `@api.model`. (the same as Argentinian and Australian overrides) Since this method is called through RPC from the bank account widget, Odoo expected a model method signature. Without the decorator, the call could fail with a missing `acc_number` argument. Add the missing decorator so Swedish account number detection works properly. opw-6002770
This update fixes an issue where changing tax groups could cause errors due to account updates. The change prevents unnecessary account updates during tax group modifications, ensuring data consistency and preventing potential constraints. This improves stability and reduces the risk of errors when managing tax groups.
Original PR description
Upon chart reload, accounts will not be updated (except for tax_ids), but tax groups are. If a tax group was changed to relate to a different account and this account was re-purposed (e.g.…
Upon chart reload, accounts will not be updated (except for tax_ids), but tax groups are. If a tax group was changed to relate to a different account and this account was re-purposed (e.g. account_type changed from an incompatible to a compatible type, the fact that the account is not updated will trigger constraints in the tax group when it is written. IOW, if the purpose of an account is not changed, its use should not be changed either. E.g.: 1f4710deb206736cd71580d8fd95552d9b7c8014 changed the value of `tax_payable_account_id` on tax group `tax_group_cofins_incl_goods` to `account_template_202011005` and the same commit changed the value of `account_type` on `account_template_202011005` from `liability_non_current` to `liability_payable`, triggering `_constrains_payable_receivable_account` (in 19.2: https://github.com/odoo/odoo/blob/e00dd21880c3c4e5c22d65567c700e02541f7259/addons/account/models/account_tax.py#L68). So here, we skip the update of relations to accounts on tax groups, if the account already exists. Forward-Port-Of: odoo/odoo#259160
This update resolves a technical issue that prevented demo mode from functioning correctly after the addition of Peppol and Nemhandel response data. The fix ensures demo flows run smoothly by adapting the mock data, preventing errors and improving the demo experience.
Original PR description
With the recent addition of responses in Peppol and Nemhandel, we forgot to adapt the mocking data for demo flows, which resulted in tracebacks in demo mode. Forward-Port-Of: odoo/odoo#258655
This update resolves a bug that caused the Time Off dashboard to crash when a new company or localization was created with no existing time off records. The fix prevents the system from attempting to fetch data when no data is available, avoiding a critical error.
Original PR description
Steps to reproduce: 1. Create a new company or install a localization (resulting in 0 time off records). 2. Open the Time Off overview (defaults to the Dashboard Gantt view). -> OwlError: Cannot…
Steps to reproduce: 1. Create a new company or install a localization (resulting in 0 time off records). 2. Open the Time Off overview (defaults to the Dashboard Gantt view). -> OwlError: Cannot destructure property 'type' of 'fields[fieldName]' as it is undefined. Cause: Following the recent work entries refactoring, the JS function `_fetchUserFavoritesWorkEntries` was added to the base `HrHolidaysGanttModel` to fetch data from the `hr.leave` model. When the Dashboard (`hr.leave.report.calendar`) has 0 records, the frontend `SampleServer` is activated to generate fake background data. It builds its schema based on the Dashboard view. When the JS unconditionally fires the cross-model RPC call to `hr.leave` (grouping by `work_entry_type_id`), the `SampleServer` intercepts it. Because it doesn't have `work_entry_type_id` in its Dashboard schema, it fails to evaluate the field type and crashes the Owl lifecycle. Solution: Restrict the `_fetchUserFavoritesWorkEntries` call in `_fetchData` so it only runs when not using sample data (`!this.useSampleModel`). This prevents the `SampleServer` from intercepting unsupported cross-model queries to `hr.leave` when loading empty views on fresh databases. task-5969290
This update resolves an issue preventing users from generating session reports in the CO company setting. The fix addresses a technical error related to accessing sale details, ensuring the report generation process now functions correctly. This improves the usability of the point-of-sale system for CO businesses.
Original PR description
Currently when trying to generate the session report a traceback appears. Steps to reproduce: ------------------- * Install l10n_co_edi_pos * Switch to CO company * Open pos session * Make a sale * Close register * Generate session report > Traceback Why the fix: ------------ We get the sale details with: https://github.com/odoo/odoo/blob/0ce5baf2918960591284eb494d82dfef07043af0/addons/point_of_sale/models/report_sale_details.py#L429-L430 Where the config ids given to `get_sale_details` are given here https://github.com/odoo/odoo/blob/0ce5baf2918960591284eb494d82dfef07043af0/addons/point_of_sale/models/report_sale_details.py#L413-L414 From there we can't access any field from a list of number. opw-6049484 Forward-Port-Of: odoo/enterprise#111627
This update resolves a bug where the state of a date field in forms was incorrectly being reset after saving. Typing a date into the field and saving would sometimes revert to a previous value. The fix ensures the date field's state is correctly updated immediately after the datepicker is closed, preventing data inconsistencies.
Original PR description
Step to reproduce: - Go on view form with a date field - Set the date with the input by typing the date with day and month (mm/dd or dd/mm), then press enter - Save the record - Redo the second step by with a different date - Save the record The assignation of the state.value done when closing the datepicker is useless and can put old a value in the state. The datepicker hasn't finished to update of the record that the assignation put back the old value of the record back in the state. The reason why it happens only after a save is still unknown. task-6095467 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258111
This update fixes an issue where the 'My department' filter in holiday reporting was incorrectly showing employees with past versions of their department assignments. The change now only considers current department assignments, ensuring accurate holiday reporting for all employees. This improves the reliability of time-off data.
Original PR description
Reproduce the issue: - Create an employee linked to a user with department A - Create a second employee with 2 versions: - a past one with department A - a current one with department B - create a leave for both employees - go to Time Off > Overview, keep the group by employee and select the filter "My department" - both employee appear Before this commit, the search on "member_of_department" was looking for all versions with a similar department (same or child of) regardless of the version validity. This commit limits that search to current versions only task-6076014 Forward-Port-Of: odoo/odoo#256388
This update resolves an issue preventing accurate filtering of partner commission data within reports. The fix ensures that reports now correctly display commission information based on specified criteria, improving the reliability of sales and financial reporting. This change enhances data accuracy for business users.
This update corrects a technical issue within the phone dashboard's data configuration. The previous revision ID was incorrect, preventing the dashboard from functioning properly. This fix ensures the dashboard accurately reflects the latest phone system information.
Original PR description
`revisionId` should be `START_REVISION`. Commit f56e6431ea1e2f66610a833bd3d76107171a6e61 updates phone dashboard but with a wrong revisionId. Task: 0
This update resolves a technical problem preventing the Worldline feature from working correctly when used with virtual IoT. The system was incorrectly searching for necessary files, and this change ensures those files are properly created, allowing the Worldline functionality to operate as intended.
Original PR description
This PR fixes the paths for worldline when used with virtual iot. Currently we are looking for the .dll libraries in "ctep" folder but it's never created. opw-6102627
This update fixes a minor issue where users couldn't fully expand options for social media sharing links. The change allows users to unfold options for both the original shared item and any parent items, providing a more complete and user-friendly experience when sharing content.
Original PR description
Commit 10e87773afb92c67ee126460bb899b358869345e added the possibility to unfold the options of an ancestor of the target (in addition to the target's options). This commit adds that behavior to unfold the `s_share` snippet's options when the user clicks on one of the icon inside. task-5999383
This update fixes an issue where action buttons in email notifications (like 'View Quotation') were not consistently translated for recipients in different languages. The change ensures the correct language context is used when preparing email content, resulting in fully translated buttons for all users.
Original PR description
When sending a quotation or sales order via email to a follower, the action button in the notification (e.g., "View Quotation") was appearing partially translated in the recipient's language. The issue came from the document description being explicitly evaluated using the sender's language context usually English) during the email composition phase, so it could not be correctly re-translated by the mail engine when rendering the final layout for a recipient using a different language. This commit allows the language context to be dynamic when preparing the document description for the email composer, ensuring the action button is fully and accurately translated. --- opw-5976084 Forward-Port-Of: odoo/odoo#257349 Forward-Port-Of: odoo/odoo#256077
A visual bug causing grey overlays on published course cards with descriptions has been resolved. This change ensures that published courses with buttons or other elements in their descriptions no longer display the overlay. The fix corrects a selector issue that incorrectly targeted all course cards.
Original PR description
Steps to reproduce: ================= 1. Go to eLearning > Courses and create a published course 2. In the Description tab, add a button with a link and save 3. Go to /slides on the website 4. The…
Steps to reproduce: ================= 1. Go to eLearning > Courses and create a published course 2. In the Description tab, add a button with a link and save 3. Go to /slides on the website 4. The course card appears with a grey overlay (0.5 opacity) => Published course cards with a button in the description show a grey overlay => Only unpublished course cards should have the grey overlay Cause: ====== In [1], the opacity for unpublished courses was moved from `.o_wslides_course_unpublished` to its container using a `:has()` selector. However, the selector `div:has(> .card + .card-body, ...)` was too broad: it matched any container whose `.card` child had a sibling `.card-body`, regardless of whether the course was unpublished. When a course description contains a button (or any block-level element), the browser renders the button outside the `.card` element. This creates the structure `div > .card + .card-body` that the selector matches, applying a 0.5 opacity grey overlay to fully published courses. Solution: ======== The fix restricts the first selector arm to only match when `.o_wslides_course_unpublished` is the sibling, ensuring published courses with buttons in their descriptions are not affected. [1]: https://github.com/odoo/odoo/pull/249969 opw-5900287 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258700
This update ensures the 'send by Peppol' option in the accounting system is only available for companies that are actually registered on the Peppol network. Previously, it was incorrectly enabled, leading to potential confusion. This change improves accuracy and aligns the system with registration requirements.
Original PR description
Previously, the send wizard would automatically enable the send "by Peppol" option whenever Peppol was available for the company's country. This behavior was misleading, as it didn't check whether the company was actually registered on Peppol. This commit ensures the option is only enabled for companies that are registered on Peppol. task-6044073 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258731 Forward-Port-Of: odoo/odoo#254671
This update corrects a bug in Odoo's stock accounting calculations (AVCO) that occurred when products lacked stock movements. The fix prevents a system error, ensuring the accurate processing of inventory data. This improves overall system stability and reliability.
Original PR description
PR [247625](https://github.com/odoo/odoo/pull/247625) improved performance of the AVCO computation with `_run_average_batch()`. However, it's currently possible that the method returns an empty dictionary if a product does not have any stock move associated with it. It then raises a traceback in `_run_avco()` because we expect the dictionary to always hold the product id keys. Ticket: opw-5951133 Forward-Port-Of: odoo/odoo#249735
This update fixes a discrepancy in the 'To Pay' dashboard by ensuring it now accurately reflects all outstanding payments, including receipts, in addition to invoices and refunds. Previously, the dashboard metrics didn't match the details visible in the action view, leading to potential confusion for users. This change ensures a more reliable view of outstanding payments.
Original PR description
- The "To Pay" section in the purchase/sales dashboard was only considering invoices(`in_invoice` and out_invoice) and refunds(`in_refund` and `out_refund`) when computing the number and amounts to pay. - However, the corresponding action view includes receipts (`in_receipt` and `out_receipt`), leading to an inconsistency where the dashboard count and amount did not match the records shown after clicking. - This commit updates the dashboard query to also include receipts, ensuring consistency between the displayed metrics of the coreesponding purchase/sales dashboard and the action view. Related PR: https://github.com/odoo/enterprise/pull/111142 taskID-6040828 Forward-Port-Of: odoo/odoo#259245 Forward-Port-Of: odoo/odoo#254295
This update resolves an issue where the font size displayed in the toolbar for nested lists wasn't correctly reflecting the parent list's custom font size. The fix ensures that sub-items always use the intended default font size, improving consistency and usability of the HTML editor.
Original PR description
Problem: When using nested lists where a parent list item has a custom font size, the child list does not display the default font size in the toolbar. Cause: `getFontSizeDisplayValue` does not treat `.o_default_font_size` as a boundary element. It continues searching up the DOM and may retrieve a font size from a parent element outside the intended default font size scope. Solution: Stop the font-size lookup when reaching `.o_default_font_size`, since this class defines the default font size boundary. Steps to reproduce: - Go to a "To do" note. - Insert a bullet list with sub-items. - Select the top list item and set its font size to 72. - Select a sub-item. - Observe the toolbar does not show the default font size. task-6105581 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258027
This update corrects a bug where scrap items weren't properly removed when discarding insufficient quantities in the inventory adjustments process. The fix ensures that scrap moves are only unlinked during the specific 'scrap' action, preventing unintended data changes. This improves data accuracy and stability within the inventory management system.
Original PR description
**Steps to Reproduce:** - Install Inventory with demo data. - Inventory > Operations > Adjustments > Scrap. - Create a new scrap with product 'Large Cabinet' and quantity 1000. - Click Confirm > (In the warning wizard) Click Discard> Click Confirm. **Error:** `ValueError - Expected singleton: stock.move()` Before 19.2; Since https://github.com/odoo/odoo/commit/c361c3778ef4755b4760039a4fd8f9ed88294b64, in the Shop Floor flow (`button_scrap`), the scrap is created first, and discarding an insufficient warning will unlink the scrap order. However, when using the scrap form view (via adjustments), the scrap was not unlinked on discard. Later https://github.com/odoo/odoo/commit/1c7d80a10b5d7db1c4163166bf52b3f3c77044ba, the condition was removed during refactoring, causing the scrap move is to be unlinked in all flows. Fix: This commit adds a context key to ensure that the scrap move is only unlinked in the `action_scrap` flow. sentry-7336640883
This update corrects a problem where product images weren't consistently being removed from the website. The change ensures the image is fully loaded in the browser before the removal button is clicked, preventing display issues. This improves the user experience for product browsing.
Original PR description
With this commit, we fix tours: - website_sale.remove_main_product_image_with_variant - website_sale.add_and_remove_main_product_image_no_variant where we want to remove the product image. This fix add a step to ensure the image is in DOM before clicking on the remove button. error-runbot-id~237766 Forward-Port-Of: odoo/odoo#259121 Forward-Port-Of: odoo/odoo#244544
This update corrects a bug where the builder range input's value increased by only 1 when adjusting with the number input. The fix ensures the builder range's specified 'step' value is correctly applied, providing accurate control over builder range settings. This improves the overall usability and precision of the builder tool.
Original PR description
The props "withNumberInput" for builder range added a number input next to the slider, to fine tune the value. However, the min / max / step props were not given. Therefore if the user pressed arrow up in the number input, the value would increase by 1, instead of the value of step given to the builder range input. This commit fixes the issue by giving the correct props to the builder number input. Forward-Port-Of: odoo/odoo#247198
This update resolves a visual glitch on the Odoo shop page where product images would overlap with popup content when popups were positioned with 'sticky' styling. The fix prevents popups from being placed within elements with 'sticky' positioning, ensuring proper display and a consistent user experience.
Original PR description
If an popup is dropped within an element with the property "position" set to "sticky", there would visual issues with the modal. For example, if the user drop a popup below the filters in the /shop page, the images of the product would appear over the popup content when the popup is opened. Since there shouldn't be cases where "position" is setted to sticky without having the specific class, this commit fixes the issue by adding the selector ".position-sticky" as a forbidden ancestor for popups. task-5411329 Forward-Port-Of: odoo/odoo#240545
19 changes
Enhancements to existing features
This update enhances the Point of Sale system by providing audible feedback during barcode scans. A pleasant beep confirms successful product identification, while a distinct error sound alerts users to scanning failures. This improves the user experience and reduces potential errors during transactions.
Original PR description
Play a beep sound when a barcode scan successfully finds a product, partner, or GS1 barcode. Play a distinct error sound when the scan fails to match any record. task-id: 5969010 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#250434
Resolved issues and error corrections
This update corrects a flaw in how Odoo calculates the available capacity for appointments booked through Google Reserve. Previously, the system reserved the entire party size, leading to potential overbooking. The fix ensures accurate capacity allocation, preventing scheduling conflicts and improving the booking experience for users.
Original PR description
The current logic inside the appointment google reserve controller to compute reserved and used capacity per resource was incorrect. It was reserving the full party size for each resource instead of properly computing how much spots we are reserving for each. The code was fixed and a test was adapted for proper coverage. Task-6120016 Forward-Port-Of: odoo/enterprise#113908 Forward-Port-Of: odoo/enterprise#113805
This update ensures that transaction dates pulled from iap are always within the correct 'lock date' range. Previously, transactions could be retrieved with dates before the lock date, which was an error. Now, the system uses the maximum of the lock date and the last statement date to guarantee accurate data retrieval.
Original PR description
To fetch transactions from iap, we have to give a date from. Before this commit, it was possible to have a date from prior the lock date which is not supposed to happen. This commit will do the max between the lock date the last date of either the statement or the statement line. task-6019584 Forward-Port-Of: odoo/enterprise#110010
This update corrects a visual issue where clickable scorecards in the spreadsheet module were displaying a default arrow cursor instead of a pointer on hover. Now, scorecards that function as buttons in the dashboard view correctly show a pointer cursor when hovered over, improving user experience and clarity. This resolves a minor usability problem.
Original PR description
## Description of the issue/feature this PR addresses: Current behavior before PR: - The scorecard case was missed when replacing hasOdooMenu with hasOdooLink. - Clickable scorecards were showing the default arrow cursor instead of a pointer on hover. Desired behavior after PR is merged: - Scorecards now correctly use hasOdooLink to determine if they are clickable. - The pointer cursor is displayed on hover when the scorecard acts as a button in dashboard view. Task: [6116584](https://www.odoo.com/odoo/2328/tasks/6116584) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a bug where the state of a date field in forms was incorrectly being reset after saving. Specifically, closing the date picker would sometimes revert the date back to an older value. This issue has been fixed to ensure accurate date tracking and prevent data inconsistencies.
Original PR description
Step to reproduce: - Go on view form with a date field - Set the date with the input by typing the date with day and month (mm/dd or dd/mm), then press enter - Save the record - Redo the second step by with a different date - Save the record The assignation of the state.value done when closing the datepicker is useless and can put old a value in the state. The datepicker hasn't finished to update of the record that the assignation put back the old value of the record back in the state. The reason why it happens only after a save is still unknown. task-6095467 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258111
This update fixes an issue where Arabic text on invoices was incorrectly formatted in the generated PDF. The change ensures parentheses surrounding Arabic characters are positioned correctly, improving readability for invoices in English. This resolves a display problem for international invoices.
Original PR description
**Problem:** When printing an invoice in English (LTR report) with a product whose name contains Arabic text and parentheses (e.g., لوحة توزيع كهربائية 100 أمبير (شنايدر )), the brackets appear in…
**Problem:** When printing an invoice in English (LTR report) with a product whose name contains Arabic text and parentheses (e.g., لوحة توزيع كهربائية 100 أمبير (شنايدر )), the brackets appear in the wrong position in the generated PDF. **Steps to reproduce:** 1. Create a product named: لوحة توزيع كهربائية 100 أمبير (شنايدر ) 2. Create an invoice with that product 3. Print the invoice PDF in English 4. Observe the brackets are misplaced in the description column **Current behavior:** Parentheses appear detached from the Arabic word they enclose, floating at the wrong end of the text. **Expected behavior:** Parentheses correctly wrap the enclosed Arabic text. **Cause of the issue:** Odoo's report CSS sets `direction: ltr` on elements that are ancestors of the line description span. When CSS `direction: ltr` targets the same element as `dir="auto"`, wkhtmltopdf's WebKit engine lets the CSS rule win, keeping the paragraph base direction as LTR. The Unicode BiDi algorithm then resolves parentheses (neutral characters) using LTR as the base direction, misplacing them. **Fix:** Placing `dir="auto"` directly on the `<span>` that renders the line description — rather than the parent `<td>` — avoids the CSS override. wkhtmltopdf then detects the first strong character (Arabic) and uses RTL as the base direction for that span, allowing the BiDi algorithm to correctly position the brackets. opw-5884712 Forward-Port-Of: odoo/odoo#258521 Forward-Port-Of: odoo/odoo#251190
This update resolves an issue where published course cards with buttons in their descriptions were displaying a grey overlay. The fix accurately targets only unpublished courses, ensuring a consistent and correct visual presentation of all course cards on the website. This improves the user experience and visual consistency.
Original PR description
Steps to reproduce: ================= 1. Go to eLearning > Courses and create a published course 2. In the Description tab, add a button with a link and save 3. Go to /slides on the website 4. The…
Steps to reproduce: ================= 1. Go to eLearning > Courses and create a published course 2. In the Description tab, add a button with a link and save 3. Go to /slides on the website 4. The course card appears with a grey overlay (0.5 opacity) => Published course cards with a button in the description show a grey overlay => Only unpublished course cards should have the grey overlay Cause: ====== In [1], the opacity for unpublished courses was moved from `.o_wslides_course_unpublished` to its container using a `:has()` selector. However, the selector `div:has(> .card + .card-body, ...)` was too broad: it matched any container whose `.card` child had a sibling `.card-body`, regardless of whether the course was unpublished. When a course description contains a button (or any block-level element), the browser renders the button outside the `.card` element. This creates the structure `div > .card + .card-body` that the selector matches, applying a 0.5 opacity grey overlay to fully published courses. Solution: ======== The fix restricts the first selector arm to only match when `.o_wslides_course_unpublished` is the sibling, ensuring published courses with buttons in their descriptions are not affected. [1]: https://github.com/odoo/odoo/pull/249969 opw-5900287 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258700
This update resolves an issue where double-clicking on a message action menu in Odoo kept displaying the same menu. Now, a second right-click on the message will trigger the browser's standard context menu, providing users with more flexibility and control over actions. This improves usability and caters to user workflows.
Original PR description
Before this commit, when message actions are displayed from right-click, triggering a right-click on the message again would keep displaying the message actions. Right-click on message to show the actions is useful in many cases, but sometimes the user wants to trigger the browser context menu. Currently browser context menu is shown on links and when there are some text selection, but there might be some other potential cases where seeing the browser context menu is desirable. In practice users could trigger it through SHIFT + right-click but they are not necessarily aware of it. This commit let double right-click on same message open the browser context menu, so that if users really want to have the browser context menu then doing it twice will show it. Before  After 
This update ensures the Peppol sending option in the account system is only available for companies that are actually registered on the Peppol network. Previously, it automatically enabled this option, which was misleading and inaccurate. This change improves data accuracy and ensures compliance.
Original PR description
Previously, the send wizard would automatically enable the send "by Peppol" option whenever Peppol was available for the company's country. This behavior was misleading, as it didn't check whether the company was actually registered on Peppol. This commit ensures the option is only enabled for companies that are registered on Peppol. task-6044073 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258731 Forward-Port-Of: odoo/odoo#254671
This update fixes an issue where users couldn't sort sale orders by delivery date. A recent change made the delivery date field un-sortable. This change adds the 'promised delivery' date back to the list view, allowing users to sort sale orders by delivery date as before.
Original PR description
Version: --- 19.1+ Issue: --- it's not possible to sort sale order list using `delivery date` anymore. After 30b895e3bd93ab3f0c0a86c3fcfd0fc0c3b6fb89, a `delivery_field` field is introduced, and `commitment_date`'s string is renamed to `promised delivery`. The new `delivery_date` is a compute field, hence it isn't sortable. The propostion here is to add `commitment_date` to the list view, in case users want to sort the list using `Promised delivery date`. opw-6112037
This update fixes an issue where web pages could incorrectly access data due to cached records. Specifically, when users edit relationships between records, the system now ensures that only accessible data is used, preventing errors and improving data reliability. This enhances the overall stability and accuracy of the Odoo platform.
Original PR description
**Description of the issue/feature this PR addresses**: web_read on x2many fields can reuse cached ids after write/web_save. Some of these cached ids may be inaccessible with the current record…
**Description of the issue/feature this PR addresses**:
web_read on x2many fields can reuse cached ids after write/web_save. Some of these cached ids may be inaccessible with the current record rules/context (cache pollution).
**Example**:
- **Context**:
- Two companies exist: Company A and Company B.
- Two users exist: User A and User B.
- User A can only access Company A (company_ids=[A], company_id=A).
- User B is linked to both companies (company_ids=[A, B], company_id=A).
- The "res.company" record rule is the standard one: [('id', 'in', company_ids)] (company_ids comes from allowed_company_ids).
- User A edits User B and saves the form.
- **Steps**:
- User A performs a web_read to load User B: company_ids contains only Company A.
- User A performs web_save (write + internal web_read in the same request): cached ids [A, B] are reused and the code attempts to read Company B.
**Current behavior before PR (without fix)**:
After saving a form with an x2many field, web_save calls write and then web_read. In this flow, web_read can include inaccessible x2many ids from cache and raise an AccessError.
**Desired behavior after PR is merged**:
x2many records are re-filtered with current read rules before formatting, and inaccessible ids are removed from values_list.
Forward-Port-Of: odoo/odoo#257517
Forward-Port-Of: odoo/odoo#250904This update fixes a minor issue where images on the website weren't loading correctly when accessed from deeper pages within the application. The fix adds missing forward slashes to image source URLs, ensuring the browser correctly interprets the image locations. This improves the overall user experience and ensures all website content displays properly.
Original PR description
This commit fixes two missing leading slashes in the "src" attribute of two "img" tags in `s_cta_mockups`. The browser resolves links differently based on leading slashes. Before this commit, the lack of leading slahses caused the snippet to not display properly on deeper pages (for example, "/shop/product-name"). task-6103616 Forward-Port-Of: odoo/odoo#259138 Forward-Port-Of: odoo/odoo#258879
This update resolves a technical issue that caused payroll processing to crash when employee bank account information was incomplete. The change safely handles missing data, ensuring payroll calculations continue without errors and preventing invalid data from being sent to tax authorities.
Original PR description
Accessing the employee bank accounts using index [0] raised an IndexError when no accounts were defined. Additionally, computing the CLABE flag using len() caused a TypeError when the account number was missing. This change uses a safe recordset slice to avoid accessing empty records and guards the length check to only evaluate when a value is present. It prevents crashes while keeping the original behavior unchanged and avoids sending invalid empty values in the CFDI. Forward-Port-Of: odoo/enterprise#113987
This update fixes a discrepancy in the 'To Pay' dashboard by including receipts in the calculations. Previously, the dashboard only considered invoices and refunds, leading to an inaccurate count and amount. Now, the dashboard metrics align with the records visible when viewing receipts, ensuring a more reliable view of outstanding payments.
Original PR description
- The "To Pay" section in the purchase/sales dashboard was only considering invoices(`in_invoice` and out_invoice) and refunds(`in_refund` and `out_refund`) when computing the number and amounts to pay. - However, the corresponding action view includes receipts (`in_receipt` and `out_receipt`), leading to an inconsistency where the dashboard count and amount did not match the records shown after clicking. - This commit updates the dashboard query to also include receipts, ensuring consistency between the displayed metrics of the coreesponding purchase/sales dashboard and the action view. Related PR: https://github.com/odoo/enterprise/pull/111142 taskID-6040828 Forward-Port-Of: odoo/odoo#259245 Forward-Port-Of: odoo/odoo#254295
This update resolves an issue that prevented users from assigning recruiters to job positions when the HR payroll module wasn't active. The fix ensures the system correctly identifies the company context, allowing for proper recruiter assignment functionality. This improves the user experience and prevents a frustrating error.
Original PR description
**Steps to Reproduce:** 1. Ensure hr_payroll module is NOT installed 2. Open a Job Position in hr_recruitment app 3. Click on "Assign Recruiter" button for a position without a recruiter 4. Observe error: "Name 'company_id' is not defined" **Bug Cause:** The interviewer_ids field used a string-based domain that referenced 'company_id' as a variable which is evaluation in client-side lacking access to Python record context, causing it to fail when hr_payroll module is not installed. **Solution:** Replace the string domain with a lambda function that evaluates server-side, providing access to self.company_id context. **Task:** 6106143 --- 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 font size in the toolbar didn't correctly reflect the font size of sub-items within nested lists. The fix ensures that the default font size is consistently displayed, regardless of the parent list item's custom font size setting. This improves the user experience when working with complex lists.
Original PR description
Problem: When using nested lists where a parent list item has a custom font size, the child list does not display the default font size in the toolbar. Cause: `getFontSizeDisplayValue` does not treat `.o_default_font_size` as a boundary element. It continues searching up the DOM and may retrieve a font size from a parent element outside the intended default font size scope. Solution: Stop the font-size lookup when reaching `.o_default_font_size`, since this class defines the default font size boundary. Steps to reproduce: - Go to a "To do" note. - Insert a bullet list with sub-items. - Select the top list item and set its font size to 72. - Select a sub-item. - Observe the toolbar does not show the default font size. task-6105581 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258027
This update resolves a visual glitch on the Odoo shop page where product images would overlap with popup content when popups were positioned with 'sticky' styling. The fix prevents popups from being placed within elements with 'sticky' positioning, ensuring proper popup display and a consistent user experience.
Original PR description
If an popup is dropped within an element with the property "position" set to "sticky", there would visual issues with the modal. For example, if the user drop a popup below the filters in the /shop page, the images of the product would appear over the popup content when the popup is opened. Since there shouldn't be cases where "position" is setted to sticky without having the specific class, this commit fixes the issue by adding the selector ".position-sticky" as a forbidden ancestor for popups. task-5411329 Forward-Port-Of: odoo/odoo#240545
This update prevents issues caused by updating tax groups when associated accounts are modified. Specifically, it avoids constraint errors related to account types, ensuring smoother operation during chart updates. This improves the stability and reliability of tax group management.
Original PR description
Upon chart reload, accounts will not be updated (except for tax_ids), but tax groups are. If a tax group was changed to relate to a different account and this account was re-purposed (e.g.…
Upon chart reload, accounts will not be updated (except for tax_ids), but tax groups are. If a tax group was changed to relate to a different account and this account was re-purposed (e.g. account_type changed from an incompatible to a compatible type, the fact that the account is not updated will trigger constraints in the tax group when it is written. IOW, if the purpose of an account is not changed, its use should not be changed either. E.g.: 1f4710deb206736cd71580d8fd95552d9b7c8014 changed the value of `tax_payable_account_id` on tax group `tax_group_cofins_incl_goods` to `account_template_202011005` and the same commit changed the value of `account_type` on `account_template_202011005` from `liability_non_current` to `liability_payable`, triggering `_constrains_payable_receivable_account` (in 19.2: https://github.com/odoo/odoo/blob/e00dd21880c3c4e5c22d65567c700e02541f7259/addons/account/models/account_tax.py#L68). So here, we skip the update of relations to accounts on tax groups, if the account already exists. Forward-Port-Of: odoo/odoo#259160
This update resolves a technical issue that prevented demo flows from working correctly after the addition of Peppol and Nemhandel response data. The fix ensures demo mode functions as expected, providing a reliable demonstration of the new features. This improves the quality and usability of our demo environment.
Original PR description
With the recent addition of responses in Peppol and Nemhandel, we forgot to adapt the mocking data for demo flows, which resulted in tracebacks in demo mode. Forward-Port-Of: odoo/odoo#258655
5 changes
Resolved issues and error corrections
This update resolves a technical problem within the AI composer patch that was causing crashes. The fix ensures the focus event is correctly passed to the base handler, maintaining stability and preventing errors when the AI composer is used. This improves the overall reliability of the AI composer functionality.
Original PR description
**Purpose of this PR:** The AI composer patch overrides `Composer.onFocusin()` but did not forward the focus event to the base handler. This used to be harmless while the base mail composer focus handler did not use the event. Since odoo/odoo#258974, the mail composer now uses the event to stop `focusin` propagation, so dropping it makes the base handler crash when AI composer focus is triggered. This commit fixes the AI composer patch by forwarding the focus event to the base handler, preserving the expected handler contract. Related: odoo/odoo#258974 Task-5954657 Forward-Port-Of: odoo/enterprise#113763
This update ensures that transaction data pulled from iap uses the correct date range. Previously, incorrect date ranges could occur, leading to inaccurate reporting. This fix now uses the latest statement or statement line date, guaranteeing accurate data retrieval.
Original PR description
To fetch transactions from iap, we have to give a date from. Before this commit, it was possible to have a date from prior the lock date which is not supposed to happen. This commit will do the max between the lock date the last date of either the statement or the statement line. task-6019584 Forward-Port-Of: odoo/enterprise#110010
This update resolves an issue preventing users from generating session reports in the CO company setting. The fix corrects a technical error related to accessing sale details, ensuring the report generation process now functions correctly. This improves the usability of the POS system for CO company users.
Original PR description
Currently when trying to generate the session report a traceback appears. Steps to reproduce: ------------------- * Install l10n_co_edi_pos * Switch to CO company * Open pos session * Make a sale * Close register * Generate session report > Traceback Why the fix: ------------ We get the sale details with: https://github.com/odoo/odoo/blob/0ce5baf2918960591284eb494d82dfef07043af0/addons/point_of_sale/models/report_sale_details.py#L429-L430 Where the config ids given to `get_sale_details` are given here https://github.com/odoo/odoo/blob/0ce5baf2918960591284eb494d82dfef07043af0/addons/point_of_sale/models/report_sale_details.py#L413-L414 From there we can't access any field from a list of number. opw-6049484 Forward-Port-Of: odoo/enterprise#111627
This update fixes a potential issue where the year for payroll reports was defaulting to the current year, causing test failures. The change ensures the correct year is always referenced, preventing future errors and maintaining accurate reporting. This improves the reliability of payroll calculations.
Original PR description
Making sure we set the reference year when exporting the sd_worx report as if not stated it will call the current year and this will cause the test failing in future builds runbot-242148 Forward-Port-Of: odoo/enterprise#112325
This update resolves an issue where POS users with limited access rights were unable to fully close their Fiskaly VAT resolution sessions, requiring administrator privileges. The fix simplifies the process by removing unnecessary checks for API credentials, ensuring a smoother user experience for POS users handling Fiskaly transactions. This improves the reliability of the POS system for German customers using Fiskaly.
Original PR description
In German location with Fiskaly setup. POS users hit an AccessError on read when closing the session from the frontend, then had to finish closing in the backend with admin (base.group_erp_manager)…
In German location with Fiskaly setup. POS users hit an AccessError on read when closing the session from the frontend, then had to finish closing in the backend with admin (base.group_erp_manager) rights. Steps to reproduce: ------------------- * Enable Germany + Fiskaly POS (l10n_de_pos_cert), with a company registered for Fiskaly * Use a user with POS rights only (no Access Rights) * Open POS, sell, then close the session from the POS UI > Observation: A warning redirects to the back end; manual close shows: insufficient rights to read l10n_de_fiskaly_api_secret on res.company (operation read). Why the fix: ------------ The guard only needs to know whether the company is in the Germany + Fiskaly flow; that is already expressed by l10n_de_is_germany_and_fiskaly(), without reading API credentials. Fiskaly RPC helpers on res.company continue to use sudo() where secrets are required; this change fixes unnecessary reads of protected fields in the tax helper, not the security model of the credentials themselves. opw-6074960 Forward-Port-Of: odoo/enterprise#112618
11 changes
Resolved issues and error corrections
This update resolves an error that occurred when users tried 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 ticket links always work correctly.
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
This update simplifies the process of reloading your chart of accounts. Previously, a confusing error message prompted users to update the localization app. Now, a clear warning directs users directly to the relevant apps, making the process easier and more intuitive.
Original PR description
Previously, when new taxes with new tax tags were introduced, reloading the chart of accounts would raise a generic UserError suggesting to update the localization app. This could be confusing for users, as it did not indicate which app needed to be updated. With this commit, the UserError is replaced by a RedirectWarning that guides users directly to the Apps menu with the relevant localization modules, making the resolution clearer and more user-friendly. Forward-Port-Of: odoo/odoo#259398 Forward-Port-Of: odoo/odoo#257515
This update resolves a technical issue that prevented demo flows from running correctly when new Peppol and Nemhandel response data was added. The team corrected a missing key in the demo utility files, ensuring demo mode now functions without errors. This improves the reliability of our demo environment.
Original PR description
With the recent addition of responses in Peppol and Nemhandel, we forgot to adapt the mocking data for demo flows, which resulted in tracebacks in demo mode. Forward-Port-Of: odoo/odoo#258655
This update fixes an issue where floors were incorrectly displayed in the restaurant's point-of-sale system. Previously, floors were loaded through indirect processes, leading to inaccurate floor selections. Now, the system correctly uses the configured floor IDs for each POS configuration, ensuring accurate floor selection for restaurant orders.
Original PR description
Floors loaded indirectly (e.g. via recursive loading of paid orders) could appear in the floor selector even if they belonged to a different PoS config. The selector was iterating over the full in-memory model store instead of the floors explicitly assigned to the current config. opw-6025172 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258178 Forward-Port-Of: odoo/odoo#257113
This update removes a confusing tooltip from the calendar popover for boolean fields. The tooltip was displaying unnecessary HTML content, creating a poor user experience. This change simplifies the calendar interface and improves usability.
Original PR description
Before this commit, the tooltip of a boolean field in calendar popover shows html content when the user hovers the boolean field. This commit removes the tooltip of boolean field in calendar popover since the information inside that tooltip is not really useful for the user. Issue found during the development of task-5994205 Forward-Port-Of: odoo/odoo#259069 Forward-Port-Of: odoo/odoo#259011
This update resolves an issue where images on the website weren't displaying correctly on deeper pages. The fix adds missing forward slashes to image source URLs, ensuring the browser correctly interprets them. This ensures all website images, including those on product pages, display properly.
Original PR description
This commit fixes two missing leading slashes in the "src" attribute of two "img" tags in `s_cta_mockups`. The browser resolves links differently based on leading slashes. Before this commit, the lack of leading slahses caused the snippet to not display properly on deeper pages (for example, "/shop/product-name"). task-6103616 Forward-Port-Of: odoo/odoo#258879
This update resolves a technical error that prevented users from selecting a store when the store's address information (city or street) was incomplete. The fix ensures the system correctly handles missing address details, improving the reliability of the Click & Collect feature. This prevents errors and ensures a smoother shopping experience for customers.
Original PR description
Issue: --- An owl error is raised in select store if the store's company location lacks city or street. Steps to reproduce: 1- Enable Click and Collect. 2- In pickup locations, set a company with an address with empty street or city. 3- Go to the shop. 4- Enable debug mode. 5- Select store. An owl error is raised due to not city and street not being string. opw-6050137 Forward-Port-Of: odoo/odoo#259164
This update fixes a potential issue where the SD Worx payroll report was defaulting to the current year, leading to test failures. The change ensures the correct year is always referenced, preventing future problems and ensuring accurate reporting. This improves the reliability of payroll data.
Original PR description
Making sure we set the reference year when exporting the sd_worx report as if not stated it will call the current year and this will cause the test failing in future builds runbot-242148 Forward-Port-Of: odoo/enterprise#112325
This update resolves a visual inconsistency where styling applied to images (like rounded corners or shadows) was incorrectly carried over when users replaced images with icons in the To-do app. Now, the system automatically removes these styling classes, ensuring icons appear with their intended, clean design. This improves the overall user experience and consistency of the application.
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#258060
This update resolves an issue where all employees were loaded into POS sessions, regardless of employee type. Now, the system only loads employees based on the POS configuration, improving performance and reducing unnecessary data loading. This change ensures a smoother and more efficient POS experience.
Original PR description
Before this commit, when some employee was assigned to advanced or minimal employee, all of the employees were loaded in the POS session, because there was no basic employee assigned to the POS config. opw-5898068 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a recent issue where generated invoice PDFs weren't displaying company information correctly. The change reverses the order of the issuer and receiver addresses, resolving customer complaints. Switching to a simpler internal layout ensures the document clearly identifies it as an Odoo-generated invoice.
Original PR description
When an invoice is received through Peppol, it may not contain an embed PDF. If no, we create one. However, due to several complaints, this commit exchange the place of the issuer and receiver addresses and information. Company information were rendered in the header of the document through the external_layout. Switching to the internal layer avoid doing so. opw-5980655 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#254693
2 changes
Resolved issues and error corrections
This update resolves an issue where barcode quantities were displayed with slight rounding errors due to how JavaScript handles decimal numbers. The fix ensures accurate quantity representation in the barcode interface, preventing discrepancies in inventory tracking. This improves data reliability for warehouse operations.
Original PR description
**Steps to reproduce:** * Install `stock` module. * Go to Settings and enable: * Storage Locations (Warehouse). * Batch, Wave & Cluster Transfers. * Create a Product and set its on-hand quantity to…
**Steps to reproduce:**
* Install `stock` module.
* Go to Settings and enable:
* Storage Locations (Warehouse).
* Batch, Wave & Cluster Transfers.
* Create a Product and set its on-hand quantity to 60.
* Go to Inventory → Configuration → Operation Types and create a new operation type:
* Set Type of Operation to Internal Transfer.
* In the Barcode App tab, enable Group batch lines.
* Go to Inventory → Operations → Internal Transfers and create a new transfer:
* Select the newly created Operation Type.
* Add the created Product with quantity 4.4.
* Mark the transfer as To Do.
* Create another Internal Transfer with the same configuration:
* Select the same Operation Type.
* Add the same Product with quantity 48.8.
* Mark the transfer as To Do.
* Open the Internal Transfers list view.
* Select both created transfers.
* Click Action → Add to Wave Transfer.
* Choose A new Wave Transfer and confirm.
* In the popup, select both transfers and add them to the wave.
* Open the Barcode application.
* Open the created operation and select the Batch on the right side
to open the wave transfer in the barcode interface.
**Observed behavior:**
- The grouped line quantity is displayed as 53.99999996 instead of
the expected value(53.2).
**Cause:**
- When the Barcode app loads data,` _createState()` is executed,
which calls `groupLines()`.
- Inside this method, quantities are aggregated using standard
JavaScript floating-point addition:
https://github.com/odoo/enterprise/blob/08d0a7f480046bb489ca69e7b3535e99cb20eee5/stock_barcode_picking_batch/static/src/models/barcode_picking_batch_model.js#L204-L205
- Since JavaScript stores numbers as binary floating-point values,
decimals like 4.4 and 48.8 cannot be represented exactly.
Repeated additions accumulate precision errors, producing results
like 53.99999996 instead of 53.2.
**Fix:**
- Aggregate quantities using `formatFloat` with the barcode precision
before converting them back to floats
- `formatFloat` rounds the value according to the configured precision
of the barcode model, ensuring the intermediate result is normalized
after each addition. Converting the formatted value back with
`parseFloat` guarantees the stored number respects the expected
decimal precision and prevents floating-point accumulation errors.
---
opw-5932329
Forward-Port-Of: odoo/enterprise#110241This update fixes a potential issue where the year for payroll reports was defaulting to the current year, causing test failures. The change ensures the correct year is always referenced, preventing future problems and maintaining accurate reporting. This improves the reliability of payroll calculations.
Original PR description
Making sure we set the reference year when exporting the sd_worx report as if not stated it will call the current year and this will cause the test failing in future builds runbot-242148 Forward-Port-Of: odoo/enterprise#112325
1 change
Resolved issues and error corrections
This update fixes a misleading error message displayed to users regarding the POS rounding method. The message has been corrected to accurately reflect the required setting of 0.05 and 'HALF-UP', aligning with official Odoo documentation. Additionally, translation files have been updated to support localization in French and Dutch.
Original PR description
The message `"The rounding method must be set to 0.5 and HALF-UP"` was wrong in `pos_blackbox_be/models/pos_config.py`
```py
def _check_cash_rounding(self):
if not self.cash_rounding:
raise ValidationError(_("Cash rounding must be enabled"))
if (
self.rounding_method.rounding != 0.05
or self.rounding_method.rounding_method != "HALF-UP"
):
raise ValidationError(
_("The rounding method must be set to 0.05 and HALF-UP")
)
```
It should be `"The rounding method must be set to 0.05 and HALF-UP"` as indicated in that documentation :
https://www.odoo.com/documentation/17.0/applications/finance/fiscal_localizations/belgium.html?highlight=blackbox#certified-pos-system
It's the same for 18.0
I also added the field for translation into `pos_blackbox_be.pot`
opw-4862967
Forward-Port-Of: odoo/enterprise#89789
Forward-Port-Of: odoo/enterprise#8749620 changes
New functionality added to Odoo
This update adds integration with the ZKTeco BioTime attendance system, automatically syncing employee attendance records. The system prioritizes matching new check-ins with existing attendance data and flags any unmatched transactions for HR review. Old attendance records are automatically deleted after 30 days.
Original PR description
Add integration with ZKTeco BioTime attendance system. Introduce two new models: - zkteco.terminal: represents physical attendance devices synced from the BioTime server - zkteco.transactions: stores raw punch records fetched via the BioTime API and processes them into hr.attendance records Check-out transactions are matched in priority order: 1. Existing open attendance (no check-out) within a configurable lookback period (default 2 days) 2. A check-in from the current processing batch (FIFO) 3. If no match is found, the transaction is left unprocessed and an activity is created for the HR manager to review Processed transaction records are automatically cleaned up after 30 days. Task-4521436
Enhancements to existing features
This update improves the Gantt view by displaying progress bars for all employees, regardless of whether they have scheduled leave. Previously, the Gantt only showed progress for employees with leaves. This enhancement provides a more complete and accurate view of employee work hours.
Original PR description
…hose without leaves Previously, the gantt view only showed the progress bars (the number of worked hours) for employees who had leaves. Now, this PR shows the progress bars for all employees, even those without leaves. Task-5999717
This update enhances the self-order point-of-sale system by adding a country prefix selector for phone numbers. This simplifies the process for customers entering their contact information, improving the user experience and reducing potential errors. The change aligns with recent community updates for a consistent user flow.
Original PR description
In this commit we adapt a tour such that it follows the changes done in the corresponding community commit. Task: 5913205
This update simplifies the holiday scheduling view within the Enterprise module. The outdated custom popover has been replaced with the standard dialog used in other views, creating a more consistent and user-friendly experience. This change improves usability for HR staff managing employee time off.
Original PR description
- removed the custom popover for the timeoff gantt view and replaced it with the same dialog that appears in other views task-id: 5473334
This update enhances the reliability of tests within Odoo's enterprise modules by ensuring consistent handling of company environments. The changes address a limitation where simply specifying the company wasn't enough to filter tests correctly, leading to inconsistent results. This improves the overall stability and accuracy of the testing process.
Original PR description
More information on the related community commits.
This update clarifies the capacity settings within the appointment scheduling feature. The changes involve updating labels for both users and resources, making the system easier to understand and use. Additionally, a minor simplification was made to the timezone settings, improving code efficiency.
Original PR description
This commit improves and clarifies the capacity feature on the form view of the appointment type model by changing some labels for both users and resources. Also takes the opportunity to simplify the syntax of the timezone setting in the controller by removing unnecessary code. task-5173341
Resolved issues and error corrections
This pull request corrects a minor typo in the Odoo Enterprise settings related to company information for several payroll localizations (BE, IN, LT, LU, MA). The change ensures consistent and accurate wording within the application, improving the user experience. This fix addresses a visual inconsistency that could have caused confusion.
Original PR description
To reproduce the issue: 1. Install either BE,IN,LT,LU,MA payroll localization 2. Open settings view 3. "Offical Company Information" Should be "Official Company Information"
This update ensures the 'Load Order' button remains hidden across all screen sizes for Grab/GoFood orders. Previously, resizing the window would briefly show this button, which was replaced with 'Set Food Ready' to prevent manual order changes. This change improves the user experience and data integrity for these orders.
Original PR description
For Grab/GoFood orders, the "Load Order" button is replaced by "Set Food Ready" to prevent manual edits. Previously, resizing or minimizing the window caused the hidden "Load Order" button to reappear due to responsive layout overrides (e.g., mobile view CSS classes). This commit updates the visibility logic to ensure the button remains strictly hidden across all screen sizes for external delivery orders. opw-6044176 Forward-Port-Of: odoo/enterprise#111222
This update fixes an issue where appointment bookings were incorrectly reserving full party sizes for resources. The change ensures that resources are accurately allocated, preventing overbooking and improving the scheduling process. A new test has been added to verify the fix.
Original PR description
The current logic inside the appointment google reserve controller to compute reserved and used capacity per resource was incorrect. It was reserving the full party size for each resource instead of properly computing how much spots we are reserving for each. The code was fixed and a test was adapted for proper coverage. Task-6120016 Forward-Port-Of: odoo/enterprise#113908 Forward-Port-Of: odoo/enterprise#113805
This update resolves an issue where the 'Time Off Type' dropdown was empty when creating time off entries via the Gantt view. The fix ensures the dropdown correctly displays available time off types by properly filtering the database search. This improves the usability of the time off management feature.
Original PR description
**Steps to Reproduce:**
1. Open Time Off App->Management->Time Off->Gantt View
2. Highlight multiple dates/cells to trigger the multi-create popover, then click "Set".
3. Open the "Time Off Type" dropdown.
Result: The dropdown is completely empty.
**Bug Cause:**
The Gantt multi-create popover skips `_loadNewRecord`, meaning `work_entry_type_filter_domain` never computes and evaluates to an empty list. This hardcodes `('id', 'in', [])` into the search, forcing the database to return 0 records.
**Solution:**
Remove the broken computed `('id', 'in', [])` domain from the `work_entry_type_id` field in `hr_leave_gantt_multi_create_view`. Add the `context="{'gantt_multi_create_company_filter': True}"` flag to the field to trigger the country-filtering logic implemented in the `_search` method.
**Task:** 6109569This update corrects a technical issue impacting Envia delivery in Colombia. Previously, the system incorrectly formatted zip codes, leading to inaccurate data sent to Envia. Now, the system uses Envia's geocoding to ensure correct data formatting, improving delivery reliability and reducing potential delays.
Original PR description
For Colombia, Envia expects the municipality/DANE-style code in the address payload, not the raw postal code. When `l10n_co_edi` was not installed, the Envia integration fell back to the partner zip code and padded it locally before sending it as both `postalCode` and `city`. This produced incorrect values such as turning the Ibagué zip code `730001` into `73000100`, while Envia geocodes resolves that zip code to `73001000`. Use Envia geocodes to resolve the Colombia zip fallback and retrieve the `stat_8digit` code expected by Envia instead of deriving it locally. opw-6083181 Forward-Port-Of: odoo/enterprise#112838
This update resolves an issue preventing the generation of the session report in the CO company setting. The fix addresses a technical problem with accessing sale details, ensuring users can now successfully generate and utilize this important report. This improves the functionality of the point-of-sale system.
Original PR description
Currently when trying to generate the session report a traceback appears. Steps to reproduce: ------------------- * Install l10n_co_edi_pos * Switch to CO company * Open pos session * Make a sale * Close register * Generate session report > Traceback Why the fix: ------------ We get the sale details with: https://github.com/odoo/odoo/blob/0ce5baf2918960591284eb494d82dfef07043af0/addons/point_of_sale/models/report_sale_details.py#L429-L430 Where the config ids given to `get_sale_details` are given here https://github.com/odoo/odoo/blob/0ce5baf2918960591284eb494d82dfef07043af0/addons/point_of_sale/models/report_sale_details.py#L413-L414 From there we can't access any field from a list of number. opw-6049484 Forward-Port-Of: odoo/enterprise#111627
This update resolves a test failure in the WhatsApp module related to how archived user IM statuses are handled. The test case was incorrectly designed, failing because the partner wasn't linked to a user. The fix ensures the test accurately reflects the system's behavior by properly linking the partner to a user.
Original PR description
Purpose of this PR: compute_im_status returns false when main_user_id is not set. The testcase was failing because the partner was not linked to a user. Updated the testcase by linking the partner to a user to match the expected behavior. task-4797343
This update ensures that waiting payslips (draft payslips with calculated amounts) are automatically recalculated whenever employee information or payroll settings are modified. This guarantees that the payslip data remains accurate and reflects the latest changes, improving payroll reporting reliability. This change addresses a potential discrepancy between the payslip and the underlying data.
Original PR description
This commit makes waiting payslips recomputes whenever inputs are changed to make sure the sheet is up to date with inputs -waiting payslip: a payslip in draft with computed lines Task#5439146
This update resolves a potential issue where timesheet rules could cause access errors due to mismatched company restrictions on linked projects. By adding a company ID to the timesheet rule, we ensure that projects linked to the rule adhere to the same company, preventing these access problems and improving user experience.
Original PR description
This commit's purpose is to prevent potential access rigths error with aw.rule. Currently it is possible to set a project/task that is restricted to a specific company to an aw.rule. This can lead to a user using that aw.rule having access rights error because he does not have access to that project. To fix this issue, we add a company_id to the aw.rule model and ensure that the project/task linked to it follow the same company as the aw.rule it is set on task-6116548
This update fixes a bug where changes to embedding settings caused sources to incorrectly show as 'processing'. The fix ensures that updates are properly processed and sources are updated correctly, preventing delays and inaccurate status displays. This improves the reliability of the AI embedding feature.
Original PR description
### Issue: In ai.agent, any update to any field causes the sources to be shown as processing. ### Fix In `ai.agent.write()`, the provider change detection was comparing the provider object directly against the stored provider name string. Also, `_cron_generate_embedding` returned early when no missing embeddings were found, skipping the `_update_sources_status` call and leaving sources stuck in processing status. task-id-6121579
This update corrects a technical issue that was preventing users from properly accessing returns reports. The change ensures that the reporting module functions correctly after a recent update to the main account kanban view. This resolves a traceback error and maintains the reliability of the returns reporting process.
Original PR description
After a recent IMP in account return kanban view in #113292 , the overall styling of kanban view was improved, but the inherited view in this module was unchanged which caused traceback. This commit fixes that issue.
This update addresses a crash that occurred when users cleared the 'Today' date filter or selected 'All time' in the global filters. The fix ensures the system remains stable and prevents unexpected errors, improving the user experience. This resolves a technical issue impacting spreadsheet edition functionality.
Original PR description
traceback when deleting the current value of a date filter Task: [6019061](https://www.odoo.com/odoo/2328/tasks/6019061)
Code cleanup and technical improvements
This update standardizes how date ranges are handled in Odoo's Enterprise module's user interfaces. Previously, relative filters (like 'last week' or 'last month') were implemented inconsistently, leading to errors. This change ensures correct date filtering when users select date ranges, resolving a previous 'Invalid Daterange' issue and improving the overall user experience.
Original PR description
Currently, preset relative filter in view architectures (last week, last month ...) are all written differently. Sometimes they include today, sometimes not, some used 7d + 1d ... We rewrite them to be compatible with the smart dates. WHY: When oponing these arch filter in the filter dialog, we now have the correct smart date instead of `Invalid Daterange` Community PR: odoo/odoo#252484 task#5959944
This update streamlines how work entries are tracked by removing a redundant selection field. It replaces it with a simple boolean flag, making the system more efficient and easier to manage. This change improves the accuracy of time-based calculations related to attendance and schedules.
Original PR description
As of now, the work_entry_source field is a Selection field that is defined in hr_work_entry with only 1 option (Time Off) and then overridden in hr_work_entry_attendance to add another option…
As of now, the work_entry_source field is a Selection field that is defined in hr_work_entry with only 1 option (Time Off) and then overridden in hr_work_entry_attendance to add another option (Attendance). This doesn't make sense anymore, because: 1) Time Off is always considered, that option makes it so that the time is based on the working schedule. 2) There are at most 2 options, so it doesn't need to be a selection. For these reasons we remove the field and substitute it with a Boolean field attendance_based. This field will be defined in hr_work_entry_attendance and, since in the code work_entry_source was sometimes referenced even without the attendance module installed, we change those references to instead use a function result. In other words, anything in hr_work_entry_attendance or that depends on it can directly use the attendance_based field, while if we need to use code that is not dependant on it, we instead call a new _get_work_entry_source function that by defualt returns 'calendar' (the name of the Time Off option in the selection, but is then overridden in hr_work_entry_attendance to return 'attendance' if the attendance_based field is checked. Task: 6050497 Community PR: https://github.com/odoo/odoo/pull/254900
8 changes
Enhancements to existing features
This update enhances the process of updating German Point of Sale certification transactions by ensuring order updates are processed sequentially. Additionally, unnecessary ZIP and address validation checks on the user interface have been removed, streamlining the user experience. This change improves order consistency and reduces complexity.
Original PR description
In this commit: ------------------- - We have added logic to execute API calls using a mutex for order updates (such as line updates and removals). This ensures that each update is processed (sequentially), allowing us to properly track and maintain order consistency. - We removed the ZIP and address validation on the UI since the backend already assigns default values if they are missing. So, there’s no need to restrict the user on the UI. task:5941742 Forward-Port-Of: odoo/enterprise#113809 Forward-Port-Of: odoo/enterprise#108694
Resolved issues and error corrections
This update resolves an issue where lunchtime shifts were incorrectly calculated when an employee's time zone differed from the calendar time zone. The fix ensures accurate lunch time tracking and corrects the reset of work entries when time zone discrepancies exist, improving the reliability of employee time data.
Original PR description
- Correct lunch time shift if employee tz differs from calendar tz - Correct reset of WE if employee tz differs from calendar tz Task: 6072325
This update ensures that transaction dates pulled from Codabox are always within the correct timeframe. Previously, incorrect date ranges could occur, but this fix now uses the latest statement or statement line date, guaranteeing accurate reporting. This improves the reliability of financial data.
Original PR description
To fetch transactions from iap, we have to give a date from. Before this commit, it was possible to have a date from prior the lock date which is not supposed to happen. This commit will do the max between the lock date the last date of either the statement or the statement line. task-6019584 Forward-Port-Of: odoo/enterprise#110010
This update fixes an error in how Odoo calculates the available capacity for appointments booked through Google Reserve. Previously, the system reserved the full party size for each resource, leading to overbooking. This change ensures accurate capacity allocation, preventing scheduling conflicts and improving appointment management.
Original PR description
The current logic inside the appointment google reserve controller to compute reserved and used capacity per resource was incorrect. It was reserving the full party size for each resource instead of properly computing how much spots we are reserving for each. The code was fixed and a test was adapted for proper coverage. Task-6120016 Forward-Port-Of: odoo/enterprise#113908 Forward-Port-Of: odoo/enterprise#113805
This update resolves an issue preventing the generation of session reports in the CO company setting. Previously, generating the report would result in an error. The fix corrects a data access problem, allowing users to successfully generate and review their POS session reports.
Original PR description
Currently when trying to generate the session report a traceback appears. Steps to reproduce: ------------------- * Install l10n_co_edi_pos * Switch to CO company * Open pos session * Make a sale * Close register * Generate session report > Traceback Why the fix: ------------ We get the sale details with: https://github.com/odoo/odoo/blob/0ce5baf2918960591284eb494d82dfef07043af0/addons/point_of_sale/models/report_sale_details.py#L429-L430 Where the config ids given to `get_sale_details` are given here https://github.com/odoo/odoo/blob/0ce5baf2918960591284eb494d82dfef07043af0/addons/point_of_sale/models/report_sale_details.py#L413-L414 From there we can't access any field from a list of number. opw-6049484 Forward-Port-Of: odoo/enterprise#111627
This update resolves an issue where the 'Create a Payslip' button was unresponsive when no payslips existed in the W2 report. The fix corrects a technical error in the system's code that prevented the button from functioning properly. This ensures users can consistently generate W2 reports.
Original PR description
1.Install l10n_us_hr_payroll 2 Navigate to Payroll>Reporting>W2 Report. 3.Open/Create W2 form and try to add payslip by clicking "Add a line". 4."Create a payslip" button appears if their are no valid payslips. 5.Click it, it won't work! Root cause: - `onAdd` bind was missing in the controller - Renderer applied an additional `.bind(...)`, breaking the callback Fix: - Pass a dedicated `createNewPayslip` action from controller - Remove double binding in renderer - Forward callback directly to helper component task-[5928770](https://www.odoo.com/odoo/project/1251/tasks/5928770) Forward-Port-Of: odoo/enterprise#111735
This update resolves an issue that prevented Odoo from importing LinkedIn accounts when the LinkedIn image data was missing a key field. The change ensures the import process doesn't crash and successfully connects more LinkedIn accounts by gracefully handling missing image URLs.
Original PR description
When importing a LinkedIn account, Odoo fetches the image metadata of the organization page and expects each returned image to contain `downloadUrl`. For some LinkedIn accounts this key is missing from the image response, which makes the callback crash with `KeyError: 'downloadUrl'` and prevents the account from being connected. LinkedIn's current Images API documentation describes `downloadUrl` as an optional field, so the import flow should not assume it is always present. This patch skips image entries without `downloadUrl` instead of crashing. opw-6099244
This update resolves a previous issue where invoice settlement would fail if the commercial partner information wasn't fully loaded. The change streamlines the process by directly using the partner ID from the invoice data, preventing errors and ensuring smooth invoice settlement. This improves the reliability of the Point of Sale module.
Original PR description
Before this commit, it was possible that commercial_partner_id was not loaded, which caused an error when settling an invoice. This commit fixes the issue by avoiding the need to load the full partner record. Since only the partner ID is required to load the account move, it is now read directly from the raw data, which already includes the ID. opw-6023150 Forward-Port-Of: odoo/enterprise#111957
6 changes
Resolved issues and error corrections
This update fixes a potential issue where the 'sd_worx' report incorrectly used the current year, leading to test failures. The change ensures the correct year is always referenced, preventing future errors and maintaining accurate payroll reporting. This improves the reliability of the report data.
Original PR description
Making sure we set the reference year when exporting the sd_worx report as if not stated it will call the current year and this will cause the test failing in future builds runbot-242148 Forward-Port-Of: odoo/enterprise#112325
This update resolves a bug that prevented users from saving appointments when removing the organizer. The fix avoids a technical error related to data context, ensuring appointments can be created and managed correctly. This improves the reliability of the appointment scheduling feature.
Original PR description
Currently an error is generated when the user tries to save an appointment as follows: - Install the appointment_google_calendar module without demo data - Create a new appointment as below: - Remove…
Currently an error is generated when the user tries to save an
appointment as follows:
- Install the appointment_google_calendar module without demo data
- Create a new appointment as below:
- Remove Organizer (user_id)
- Set the Google Meet link inside VideocallURL, e.g., https://meet.google.com/aaa-aaa-aaa
- An error occurs in the log and a message is shown to the user when save the record
- Also, an error occurs when trying to preview `Appointment: Attendee Invitation`
after creating appointment as follows:
- Set the Google Meet link inside Videocall URL > save
- Remove Organizer (user_id)
Error:
```
test odoo.addons.mail.models.mail_render_mixin: Failed to render QWeb template for Mail Template: 'Appointment: Appointment Booked' (ID: 12) - Context language:en_US
Target Model: calendar.event
Error: Error while render the template
ValueError: Expected singleton: res.users()
```
This is because the method `is_google_calendar_synced` expected a single
record, but since we removed `user_id` from the event (appointment),
it will generate a singleton error.
This commit will fix the above issue by not calling `is_google_calendar_synced`
when the event does not have `user_id`.
sentry-7393595716This update fixes a minor issue in the rental order testing process. The change avoids creating unnecessary products during each test, streamlining the testing procedure. This aligns the tests with upcoming changes in version 19.0, ensuring consistent and reliable testing.
Original PR description
Avoid creating a product at each call. Fix and alignment with the test in 19.0. See #104764
This update ensures that invoices sent via email templates use the correctly configured 'Printed Report Name' for dynamic report attachments. Previously, attachments defaulted to a generic naming pattern. The fix corrects a flow difference between sales and invoice email sending, guaranteeing consistent and accurate report filenames.
Original PR description
When sending an invoice by email template, dynamic report attachments do not use their configured Printed Report Name. Instead, they fall back to a default naming pattern (e.g. report name + invoice…
When sending an invoice by email template, dynamic report attachments do not use their configured Printed Report Name. Instead, they fall back to a default naming pattern (e.g. report name + invoice number). This is due to a difference in flow: sales use the standard mail.compose.message wizard, which correctly applies each report’s print_report_name, while invoices use the dedicated account.move.send flow. In this flow, dynamic report filenames are not computed from the report itself. To fix this, the send flow is updated so _get_placeholder_mail_template_dynamic_attachments_data computes the filename from each dynamic report. When a print_report_name is defined, it is used. Otherwise, the previous fallback behavior is preserved. The fix will ensure extra dynamic reports follow their configured printed name. Steps to reproduce: 1. Go to Settings > Technical > Reporting > Reports and duplicate the standard Invoice report. 2. In the duplicated report, set a custom value in Printed Report Name (e.g. 'CUSTOM_NAME_TEST'). 3. Go to Settings > Technical > Email > Templates and open “Invoice: Sending”. 4. Add the duplicated report under Dynamic Reports. 5. Create a customer invoice and confirm it. 3. Click Send (or Send & Print) to open the email preview. Related Ticket: opw-6058716
This update resolves an issue where lingering Point of Sale sessions caused confusion for users. The change ensures that sessions are properly closed when a user navigates away, streamlining the user experience and preventing unexpected behavior. This improves overall system stability.
Original PR description
When the user closes the browser tab or navigates away after a session in opening_control, the session is not deleted and it causes confusion. opw-6114420 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue causing inconsistent results in icon tests within the HTML editor module. The fix addresses a potential problem with how text content is set, ensuring test reliability. This improves the stability of the HTML editor functionality.
Original PR description
My last desperate fix attempt did not fix the issue so here is yet another desperate fix attempt. I have seen issues related to the use of `setContent` just to set the selection in the past so I hope it might be that. It's the only noticeable change between this test and the others, be it icon tests or color selector ones. runbot-242333
4 changes
Resolved issues and error corrections
This update resolves a test failure related to the calculation of holiday pay for Belgian employees. The fix removes tracking from a specific field, ensuring it's only computed when needed and preventing incorrect initial values from being set. This ensures accurate holiday pay calculations moving forward.
Original PR description
…ield The computed, non-stored field `l10n_be_holiday_pay_recovered_n1` had tracking enabled. When writing to any field on the employee, the `write` method calls `_track_prepare` for tracked fields if `mail_notrack` is not set in the context. `_track_prepare` reads the current value of tracked fields to store initial values. Because `l10n_be_holiday_pay_recovered_n1` is non-stored with no dependencies, this triggered a computation at the very beginning of the test, before payslips existed. Later, when payslips were created, the field was never recomputed, causing incorrect values and test failures. Previously, the `tracking_disable` context prevented early computation. The fix removes the tracking attribute entirely, so the field is only computed when accessed, avoiding premature reads and fixing the tests. task: 6095445
This update corrects and streamlines translations for the account asset and reports modules in French (fr_BE, fr_CA, and nl_BE). Outdated or incorrect translation overrides have been removed, ensuring consistent and accurate language across Odoo. This improves the user experience for French-speaking customers.
Original PR description
There were some translation overrides for `fr_BE` and `fr_CA` that were incorrect or unnecessary. We are deleting these files so they use the correct translations in `fr` instead. In the `nl_BE` translation, we are fixing a menu item so it is shorter, but still correct. task-5921458
This update corrects a rounding issue that caused slight discrepancies in product prices including taxes, particularly when setting prices to exact tax-inclusive amounts. The fix ensures that displayed prices are consistently accurate, improving the reliability of product pricing and financial reporting. This resolves a previous UI display problem.
Original PR description
### Issue before this commit: When setting a product price intended to result in a clean tax-included amount (e.g., 24€ with a 21% tax), the computed “price including taxes” displayed in the UI was…
### Issue before this commit: When setting a product price intended to result in a clean tax-included amount (e.g., 24€ with a 21% tax), the computed “price including taxes” displayed in the UI was slightly off due to rounding issues. Instead of returning exactly 24.00, the system would display values such as 23.99 or 24.01. ### Steps to reproduce the issue: 1. Download l10n_be and switch to the BE company 2. Create a new product and be sure the tax is setted on 21% 3. Try to insert a price =24/1.21 4. The computed price Incl. taxes inside the brackets is never 24.0 but or 23.99 or 24.01 ### Cause of the issue: When the base_round was not setted to False the calculation was taking t he currency precision to round the number from the start of the calculations even if the number of digits setted was higher. This way the rounding will be computed only at the end of the calculations instead of being already setted from the start. ### Reason to introduce the fix: Be able to represent all the numbers as the final price for one product. opw-6024520 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a misleading error message that appeared when accessing archived records. Previously, the system incorrectly reported all access rules as failing, even when a specific rule was blocking access. Now, the system accurately identifies the specific rule causing the access error, improving user experience and troubleshooting.
Original PR description
When accessing an archived record directly, if access is prevented by a record rule other than a multi-company global rule, the error message incorrectly reports that all rules are failing, suggesting a company issue even though it is not the actual cause. The problem is that when access is denied, the diagnostic method `_get_failing` is used to determine which rules are failing. This method performs several count queries with different rule domains. However, `active_test` is True by default, excluding archived records from the count, causing the rule evaluation to miss some records and incorrectly mark rules as failing. With this commit, `_get_failing` evaluates rules with `active_test=False`, ensuring that only actually failing rules are reported.