Thursday, April 23, 2026
30 changes · 19.0
New functionality added to Odoo
This update adds the ability to export Slovak VAT reports in XML format, aligning with government requirements. This ensures accurate reporting for Slovak businesses using Odoo Enterprise, improving compliance and data accuracy. The change was backported from a recent Odoo release.
Original PR description
Backported the XML export for Slovak VAT report introduced in saas-19.1 (commit https://github.com/odoo/enterprise/commit/ab6ec9b8bc568e9c88de4556c685b721f001680c7) Related: https://github.com/odoo/odoo/pull/260337 task-6139318
Resolved issues and error corrections
The recruitment refusal wizard now avoids automatically selecting email templates that have been archived. This prevents users from accidentally relying on outdated or disabled templates when refusing applicants.
Original PR description
Pre-requisites: --------------- 1. Create or duplicate any `hr.applicant` email template. 2. Archive the newly created template. 3. Archive the email template linked to a refuse reason. Steps to…
Pre-requisites: --------------- 1. Create or duplicate any `hr.applicant` email template. 2. Archive the newly created template. 3. Archive the email template linked to a refuse reason. Steps to reproduce: ------------------------- 1. Install hr_recruitment. 4. Go to Recruitment > Applications > All Applications and open an applicant. 5. Click on the "Refuse" button to open the refuse wizard. 6. Click on the "Email Template" and click on 'Search More' 7. Observe available templates Issue: ------- If a refuse reason is linked to an archived email template, the wizard automatically pre-fills that archived template Cause: ---------- The `_compute_template_id` method automatically assigns the template from the refuse reason without checking whether the template is active, which allows archived templates to be pre-filled in the wizard. https://github.com/odoo/odoo/blob/aa2a7c0e5a5de970cdb8f6a7ba9f02ad75cf5078/addons/hr_recruitment/wizard/applicant_refuse_reason.py#L91-L96 Solution: ----------- - Update `_compute_template_id` to ensure only active templates are automatically assigned. opw-5974244 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#257580 Forward-Port-Of: odoo/odoo#251186
Updates internal test checks so they correctly handle new Python 3.14 class metadata. This helps keep Odoo's automated test suite reliable as the platform prepares for newer Python versions.
Original PR description
Since Python 3.14 (PEP 649), class annotations are evaluated lazily. This introduces two new internal attributes to the class namespace: - `__annotate_func__`: The function that computes the annotations. - `__annotations_cache__`: The cache for the computed annotations. This commit adds these attributes to the TransactionCase's ignored internal attributes checker. Note: this PR is a follow-up of https://github.com/odoo/odoo/pull/247151 Reference: - https://peps.python.org/pep-0649/ Forward-Port-Of: odoo/odoo#260573
Mobile sales order forms now prevent users from selecting combo products in a way that skips the required setup flow. This avoids incorrect zero-price order lines and missing combo details, helping keep sales orders accurate.
Original PR description
Combo products bypasses the configurator in mobile view, resulting in a 0-price line with no child lines. Exclude them via domain on the field. opw-5999935 Forward-Port-Of: odoo/odoo#260056 Forward-Port-Of: odoo/odoo#256790
Project and task chatter will no longer automatically record status changes from linked sales orders. This keeps project discussions cleaner and focused on project-relevant updates, reducing unnecessary notifications for users.
Original PR description
Before this commit: - The chatter on the Project record tracked and logged changes to the linked Sales Order's status. After this commit: - Explicitly set `tracking=False` on the related `sale_order_state` field in `project.project`, `project.task` models. - Status updates to linked SOs will no longer automatically post tracking messages in chatter. task-6079809 Forward-Port-Of: odoo/odoo#258549
The unused color setting for CRM and Project stages is now hidden because stage colors are handled through the existing stage widget. This reduces confusion for users by removing a field that no longer affects how stages appear.
Original PR description
We used the rotting widget in the stage field, so the stage color field is unused, as explained below in the commit. https://github.com/odoo/odoo/commit/cd9ed578803605550135cb6fd6d4c267b433abbc task-5485507
Activity notes once again support adding checklists through the slash command or keyboard shortcut. This restores expected behavior for internal notes while keeping checklist options disabled in outgoing email composers where they do not work correctly.
Original PR description
[FIX] mail: re-enable checklist command in activity notes The html_mail field widget is used both by internal inputs like the activity note and by outgoing-email editors such as the mail composer.…
[FIX] mail: re-enable checklist command in activity notes The html_mail field widget is used both by internal inputs like the activity note and by outgoing-email editors such as the mail composer. Commit https://github.com/odoo/odoo/commit/f94f695ca9fc9a894a837640df2e4160e561f1ab set allowChecklist = false on that shared widget to hide the checklist command in mass_mailing and the mail composer, where checklists are not inlined in the sent email. Activity notes inherited the same opt-out even though they are internal and never sent by email, so their /checklist slash command and Ctrl+Shift+9 shortcut silently stopped inserting a checkbox in 19.0. Move the opt-out to html_composer_message, which is the widget actually used by the mail composer (https://github.com/odoo/odoo/blob/19.0/addons/mail/wizard/mail_compose_message_views.xml). mass_mailing already disables the checklist in its own html_field extension, so no change is needed there. html_mail now keeps the checklist enabled by default, restoring the 18.0 / 18.4 behaviour for activity notes and every other internal consumer of the widget. Steps to reproduce: 1. Open any record with a chatter (e.g. a CRM lead). 2. Click Activity to open the Schedule Activity dialog. 3. Click inside the Log a note field and type / then che. => Checklist appears as the first suggestion and pressing Enter inserts a checklist. Ticket [link](https://www.odoo.com/odoo/project.task/6139971) opw-6139971
The mailing editor now applies the selected content background color consistently, including around rounded text blocks. This prevents unwanted white corners from appearing and keeps email designs aligned with the user's chosen branding.
Original PR description
The `o_mail_wrapper_td` element in the `ThemeWrapper` template had a hardcoded `bg-white` class. The intent was for the wrapper background to default to white, but doing it this way meant the color…
The `o_mail_wrapper_td` element in the `ThemeWrapper` template had a hardcoded `bg-white` class. The intent was for the wrapper background to default to white, but doing it this way meant the color didn't participate in the CSS variable system. Whenever a user set a custom Content Background color and a border-radius on a text block, the corners would reveal white underneath instead of the actual Content Background color. Removed the `bg-white` class from the template and set white as the proper default for the `--wrapper-background-color` variable instead, so the wrapper is still white by default but correctly responds to the Content Background color picker. Steps to reproduce: 1. Create a new Mailing 2. Set the Content Background color to something other than white 3. Add a Text block 4. Set a border-radius value on the block => white shows behind the rounded corners instead of the Content Background Ticket [link](https://www.odoo.com/odoo/project.task/5868955) opw-5868955 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Odoo no longer rejects an empty add-ons path when starting a new project. This helps teams and AI-assisted coding tools begin creating new Odoo modules in a fresh repository without being blocked by a startup error.
Original PR description
Initialize a new empty git repository where you are going to vide-code some new Odoo modules. Because the repository is empty (no addon yet) the CLI fails with an "option --addons-path: the path <path> is not a valid addons directory". This makes vide-coder sad, and bigrams want vide-coders to be happy, so drop the sanity-check and also accept empty addons. Forward-Port-Of: odoo/odoo#259007 Forward-Port-Of: odoo/odoo#256913
This change fixes an unstable automated test for mail activities that could fail unpredictably when background mail data loading interfered. It improves confidence in the release process without changing user-facing behavior.
Original PR description
The `@mail/activity/activity/activity updates are shared between tabs` fails in a non-deterministic fashion. It occurs because the `/mail/data` route can interfere with the test. runbot-242616 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#260529 Forward-Port-Of: odoo/odoo#260265
Sale order PDFs now update product line descriptions when a customer's language is changed after the order line was created. This ensures quotations and sale orders are printed in the customer's selected language, reducing confusion and manual corrections.
Original PR description
The description of an order line in the pdf generated for a sale order does not use partner's language if it has been changed after the order line creation Steps to reproduce: 1. Install Sales 2. Go to Settings > Translations > Languages and activate language "French/Français" 3. Go to Sales and create a new quotation for partner "Acme Corporation" with product "Acoustic Bloc Screens" 4. Open the customer's form and change the language to "French/Français" 5. Go back to the quotation and print the quotation 6. The description of the order line is still in English Solution: Add a dependency to the partner's language on sale order line's name. This makes sure we recompute the order line name when the partner's language is modified Issue: The order line name is computed at its creation. Therefore, modifying the partner's name after the order line creation doesn't change the order line name to respect the partner's language opw-6085804
Call layout buttons now show a clearer visual difference when users hover over them. This small fix makes it easier to see which call display option is being selected without affecting unrelated menu items.
Original PR description
Recent commit fixes an issue where items like Fullscreen in call menu had reduced opacity when this should only affect layout buttons in call view [1]. To do so it limits the opacity to the layout…
Recent commit fixes an issue where items like Fullscreen in call menu had reduced opacity when this should only affect layout buttons in call view [1]. To do so it limits the opacity to the layout actions, but the style was not applied because ActionList has more CSS specificity that requires using `--o-mail-ActionList-Button-opacity` variable for the non-hover opacity value. Since this was not defined, this default to opacity 100%, thus not applying the reduced opacity when not mouse-hovering. This commit fixes the issue with `--o-mail-ActionList-Button-opacity` of `.75`, so that opacity is slightly reduced when no mouse-hovering. [1]: https://github.com/odoo/odoo/pull/259866 Before / After (mouse-hover on "Picture-in-Picture", see lack of visual distinction) <img width="58" height="32" alt="Screenshot 2026-04-22 at 11 21 47" src="https://github.com/user-attachments/assets/e04b0f8c-c754-4ea4-8870-752610418587" /> <img width="57" height="28" alt="Screenshot 2026-04-22 at 11 21 25" src="https://github.com/user-attachments/assets/a5aa9987-ddaf-45f8-9e2a-260fd04dcfb9" />
This fixes a small typo where a time label incorrectly used “am” instead of “pm” in website-related snippet content. The change helps avoid confusion for users viewing opening hours or marketing content.
Original PR description
am to pm Forward-Port-Of: odoo/odoo#260579
The kiosk online payment page now shows its payment instructions, including the QR code prompt, in the configured language. This improves the customer checkout experience for businesses using self-order kiosks in non-English languages.
Original PR description
Currently if you use an online payment with the kiosk, the payment page with the QR code is not translated. Steps to reproduce: ------------------- * Create an online payment method with demo * Install any language, you don't need to switch * Open kiosk configurations * Set the online pm in the available payment methods * Set the language istalled as the default language * Make an order, go to payment page > "Scan the QR code to pay" is written in english no matter the language opw-6074194 Forward-Port-Of: odoo/odoo#259895
Resetting a cropped image now restores the original image link instead of generating a new embedded copy. This avoids unnecessary duplicate attachments when saving documents and preserves images that originally came from existing files or external URLs.
Original PR description
When a user crops an image and reset the transformation using the right panel, the system does not restore the original image's src (from `data-image-src`). Instead, it replaces it with a base 64 encoded version of the original image without any transformation. Later, when the user saves the document, the system converts this base 64 image into a new attachment, even though the original attachment already exists or the image is loaded from an external url. Steps to reproduce: 1. Open Mass Mailing 2. Drag and drop a snippet containing a croppable image 3. Click on the image 4. Crop the image 5. Click on the "Reset" button from the right panel => The image is encoded in base 64 instead of reusing the original image src. To fix this issue, we will modify the `resetCropAction` so that it restores the image's src (stored in `data-original-src`) instead of calling the method to process the image and convert it to base 64, etc. Task-6140227
When Odoo cannot reach an IoT box during polling, connected device listeners are now notified instead of failing silently. This helps businesses detect unreachable devices sooner and respond to connectivity issues more reliably.
Original PR description
Enterprise PR: https://github.com/odoo/enterprise/pull/114779
Before this commit, if a longpolling listener failed to send the polling request to the IoT box, it would silently fail without calling any listener callback.
After this commit, the callback is called with `{ status: "unreachable" }` for each device listener associated with the IoT box.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prFixes an accounting issue where taxes configured to replace themselves could be incorrectly hidden from account moves. This ensures the relevant tax remains visible and selectable, helping invoices and accounting entries reflect the intended tax setup.
Original PR description
If a tax replaces itself, it's not redundant and must appear on account moves. This commit solves this issue by including self-replacing taxes in the name_search. task-6147767
Point of Sale users can now load sale orders even when those orders include products that were later archived. This prevents an error and helps staff continue serving customers without needing to reactivate old products.
Original PR description
Before this commit, loading a sale order from pos would raise an error if the order contained a product that had been archived. opw-6116760 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents leave allocations from being approved more than once when generating multiple allocations. It avoids unnecessary repeated approval actions and helps keep employee time-off allocation records consistent.
Original PR description
Cause: In this commit https://github.com/odoo/odoo/pull/258520/changes/1b6f3a1335302ca029ab62a25c7bcff0953b99be we accidently added a line to approve allocation which might already be approved. Fix: Remove this line and move the accrual filter right before the first action approve opw-5888023
The shared project timesheet view now highlights negative Time Remaining values in red, matching the label. This makes overruns easier to spot at a glance and avoids confusion for users reviewing task time status.
Original PR description
**Steps to reproduce:** - Open project shared form view. - Go to the Timesheets tab. - Observe the Time Remaining value. **Issue:** - The Time Remaining label is red properly but its value does not becomes red even when the value is negative. **Fix:** - Adjusted the logic to ensure the Time Remaining value is highlighted in red when value is negative **Task-id: 5404009** Forward-Port-Of: odoo/odoo#240489
Helpdesk tickets will no longer automatically record chatter messages when the linked Sales Order status changes. This reduces unnecessary activity in ticket conversations and keeps the discussion focused on support-related updates.
Original PR description
Before this commit: - The chatter on Helpdesk Tickets tracked and logged changes to the linked Sales Order's status. After this commit: - Explicitly set `tracking=False` on the related `sale_order_state` field in `helpdesk.ticket`. - Status updates to linked SOs will no longer automatically post tracking messages in chatter. task-6079809 Forward-Port-Of: odoo/enterprise#114078
This change hides unused stage options in Helpdesk and Project screens so users see only the settings that still apply. It also removes an unclear Helpdesk stage field from the kanban view, making the interface easier to understand.
Original PR description
We used the rotting widget in the stage field, so the stage color field is unused, as explained below in the commit- https://github.com/odoo/odoo/commit/cd9ed578803605550135cb6fd6d4c267b433abbc **Commit 2:** in helpdesk , hide Days to rot in helpdesk stage kanban view Currently, only the “Days to rot” number is displayed, so users cannot understand what the number represents. In this commit, it hide from the helpdesk stage kanban view. task-5485507
This update prevents subscriptions from being automatically reopened after manual closure by a salesperson. Previously, approvals or payments could trigger reopening, leading to confusion and errors. This change ensures subscriptions remain closed as intended, streamlining the sales process.
Original PR description
Before this commit, when a subscription was closed manually by the salesperson, it could be reopened when a transaction was approved or an invoice paid. It could cause issue. In this case, we should not reopen automatically. task-5900481 Forward-Port-Of: odoo/enterprise#113026 Forward-Port-Of: odoo/enterprise#106487
This update fixes a bug where payment reminder emails for subscriptions were missing the subscription's closing date. The fix ensures that all payment reminder emails, regardless of how they're generated (automated or manually through the email composer), accurately display the subscription's end date. This improves the clarity and accuracy of payment notifications for subscription customers.
Original PR description
### Issue before this commit: When sending a payment reminder email for a subscription using the email composer, the template was not correctly populated with the expected dynamic values. In…
### Issue before this commit: When sending a payment reminder email for a subscription using the email composer, the template was not correctly populated with the expected dynamic values. In particular, fields such as the subscription closing date and the subscription code were missing. ### Steps to reproduce the issue: 1. Install subscription and go to that app 2. Open one subscription 3. Send message > Load template: "Subscription: Payment Reminder" 4. Sentence is incomplete: missing end date of the subscription ### Cause of the issue: The issue was caused by the absence of a proper context injection when rendering the email template from the mail.compose.message wizard. The template relied on context variables like date_close, but these values were not being computed nor passed during manual email composition. Unlike automated flows, the composer did not provide the subscription-specific context required by the template. ### Reason to introduce the fix: The fix makes the payment reminder and closing templates self-sufficient by replacing context-based values with fields and helper methods directly available on the subscription record. A dedicated method is introduced to compute the subscription close date consistently, so the templates render the expected values both in automated flows and when manually loaded from the email composer. opw-6031613
This update fixes an issue where employees were incorrectly receiving 80% pay for rest days when on sick leave. The change ensures that employees are paid their full wage on rest days, aligning with the definition of a sickness day and standard payroll practices. This corrects a potential overpayment issue and ensures accurate payroll calculations.
Original PR description
Currently, if a sick leave is spread over a weekend, the work entry type set on the saturday and sunday will be the sick leave type. If an employee is entitled sickness allowance (which is paid 80%), it means that we will be paying them 80% for their rest days as well. However, as per the definition, a sickness day is a day on which an employee is absent from work by reason of being unfit due to injury or sickness. If an employee is not expected to be at work (rest day), that day cannot be considered a sickness day. If this rest day is paid (which is done by default in our module), we should thus pay the full wage on that day and not a reduced 80%. task-6079736
This update clarifies the Helpdesk stage Kanban view by removing the "Days to rot" number, which was confusing to users. This change improves clarity and usability for Helpdesk staff, ensuring they can easily understand the status of tickets.
Original PR description
Currently, only the “Days to rot” number is displayed, so users cannot understand what the number represents. In this commit, it hide from the helpdesk stage kanban view. task-5485507
This update corrects a minor issue in the journal audit report export template. Previously, the company logo wasn't appearing correctly due to a missing styling class. This fix ensures the logo is displayed as intended, maintaining a consistent and professional look for financial reports.
Original PR description
before this commit, the export template of the journal audit was missing the o_content and so the company logo class was not applied opw-6128819
This update resolves a technical issue that prevented a key test from consistently failing, ensuring the stability of our reporting features. The change ensures tests are properly configured, preventing errors and improving the reliability of the account reports module. This contributes to more dependable financial reporting.
Original PR description
This test, when run alone, raised an error telling assigning directly self.env.companies was not the right way of doing this, and it was better to create a new env. For some reason, it didn't raise when run together with other tests ; so, runbot didn't see the issue. This commit aims at soothing the ire of Odoo's mighty tests spirits \o/
This update corrects a visual inconsistency in the project timesheet display. Previously, the 'Time Remaining' value wasn't highlighted in red when negative, leading to a confusing user experience. The fix ensures that negative time remaining values are correctly displayed with a red color, improving clarity and accuracy.
Original PR description
**Steps to reproduce:** - Open project shared form view. - Go to the Timesheets tab. - Observe the Time Remaining value. **Issue:** - The Time Remaining label is red properly but its value does not becomes red even when the value is negative. **Fix:** In hr_timesheet, the remaining_hours field has a decoration-danger applied In sale_timesheet_enterprise, this field is overridden as portal_remaining_hours So, Added the corresponding decoration-danger on portal_remaining_hours. task-5404009 Forward-Port-Of: odoo/enterprise#113632
This update resolves a bug where users with limited permissions were encountering errors when modifying subscription timesheet lines. The fix involves simplifying data fetching to prevent privilege-related access issues, ensuring smoother operation for all users.
Original PR description
The change in e75bc6a1fac056d72fe9e73513635f9e0ba7db22 may cause some access errors when the user don't have the proper privileges. STR: 1. Having a user (demo) with minimal permissions: sales own documents, timesheets and project user 2. Having a sales order for customer that demo user can read with services in it. 3. Having that customer a task with a sale that the demo user can't read. 4. When the user tries to change the line to one that he can actually read, an error raises. The display_name function tries to fetch data from the lines related order. Let's just sudo that fetch to avoid these kind of issues. A demo video: https://www.loom.com/share/ddd02d72bcea4652b79549aba47d5334 opw-5969767 cc @moduon MT-14483 Forward-Port-Of: odoo/enterprise#113996