Daily updates from Odoo
Monday, March 16, 2026
127 changes
17 changes
Resolved issues and error corrections
This update resolves an issue where non-admin users accessing the Accounting Dashboard from a child company with a currency-set journal would encounter an access error. The fix bypasses specific record rules when a currency is present, allowing the dashboard to function correctly for all users and journal types.
Original PR description
Issue before this commit: Opening the Accounting Dashboard from a child company as a non-admin user raises an Access Error when the journal has a currency_id set. The error occurs with journal items which currency id is set Steps to Reproduce ([video](https://drive.google.com/file/d/1Spt5zruNAVAvSdQYk-RuifzynyIfBOLK/view?usp=drive_link )): - Install the account module. - Create child company - Create journal journal with a currency set - Log in as a non-admin user. - Select only the child company - Open Accounting (Dashboard) Cause of the Issue: When the journal does not have currency_id, the system reads company data using sudo(), so no access issue occurs. When the journal has currency_id, sudo() is not used, and reading the company name triggers an Access Error. With This Commit: Bypass record rules when reading the company name if the journal has a currency_id. opw-6017296 Forward-Port-Of: odoo/odoo#253844
This update fixes a technical issue within the Odoo Studio's form editor that previously caused crashes when interacting with certain fields. The change ensures the sidebar correctly displays information, preventing errors and improving the user experience. This resolves a bug impacting form editing functionality.
Original PR description
In studio, form editor: click on a field and check the sidebr is correct Click on another field, one that has the widget many2many_tags. Before this commit, there was a crash because the internals of the sidebar were computed with the wrong props (the old ones instead of the new ones) After this commit, there is no crash opw-6004776 Forward-Port-Of: odoo/enterprise#110391 Forward-Port-Of: odoo/enterprise#110284
This update addresses a critical issue where switching tabs in the mass mailing editor would lose user changes due to delays in updating the email HTML. The fix introduces a new strategy to ensure changes are saved promptly, preventing data loss and improving the editor's responsiveness. Additionally, the code was optimized to eliminate flickering during HTML conversion and improve the overall stability of the mass mailing workflow.
Original PR description
Main issue: Prior to this commit, updateValue would guarantee that `body_arch` and `body_html` were always updated in sync (to avoid an inconsistent state where the user thinks they updated the…
Main issue:
Prior to this commit, updateValue would guarantee that `body_arch` and
`body_html` were always updated in sync (to avoid an inconsistent state where
the user thinks they updated the mailing, and they see the new html in the
editor, but the email html is obsolete and would be sent as is).
However this caused another issue, that the user would lose their work when
switching tab in the Notebook, because computing the `body_html` may be slower
than the view patch to switch tab (`updateValue` is interrupted). In such a
case, neither `body_arch` nor `body_html` was updated on the record, and when
the user comes back to edit them, they see that all changes were lost.
To prevent this, a new strategy is adopted:
- `body_arch` is now updated as soon as possible to save the latest user
changes
- `body_html` is set to an empty string to avoid inconsistencies, and in order
to trigger `convert_inline` automatically the next time the
`mass_mailing_html_field` is instanced without any user action.
- after `convert_inline`, if `updateValue` was not aborted, the record is
updated again with the new value for `body_html`
Minor issues:
1) Prior to this commit, the iframe would flicker during `convert_inline`
because it was done inside that very iframe, and the `convert_inline` needs a
specific width (1320px) for it to work properly, meaning that if the iframe was
not at that specific dimension, it was resized temporarily for that process.
This commit introduces hooks to execute the `convert_inline` process in a
separate iframe, outside of the user view, which removes this flickering.
2) Prior to this commit, assets for readonly/basic editor/builder were all
loaded inside the iframe, and then toggled on/off depending on which were
needed. Since the `convert_inline` process is moved in another iframe, it's as
good time as any to deprecate this toggling (as it could be a bit unreliable and
could cause some flickering when unloading/reloading the style). There is now a
separate asset bundle for the 3 use case, and only one of them is loaded per
iframe depending on the needs.
3) Prior to this commit, `body_html` was hard-coded as a dependency of the
`mass_mailing_html_field`, and that dependency lacked the `required` attribute,
which should depend on the value of `body_arch`. The dependency is now added in
the related views, and the field is now generic. This also prevents the user
from leaving the view if `convert_inline` could not be completed successfully.
4) Prior to this commit, switching to another view through `doAction` could
throw an error if the field was dirty, as the `form view` would be destroyed
before `commitChanges` had the time to be completed. Now, `commitChanges`
promise is properly awaited by the `action_service` if the field is dirty before
`doAction` (unless `forceLeave` is true).
5) Prior to this commit, the record was updated through a `blur` event on the
iframe window. However, it means that every time the iframe looses focus when
the users interacts with the builder, a popover or the form status indicator,
that blur event would fire, triggering the `convert_inline` process. This commit
reduces the amount of such updates by only triggering the update outside of
these elements, as we don't need to update the record value while the user is
still actively editing the mailing.
Blur handlers/props are deprecated with this commit and will be removed further
down the line.
6) Ensure that in the rare case where a `html_field` value is exactly the same
on different records, the `html_field` state key is updated (triggers a
wysiwyg/mass_mailing_iframe reset).
7) Remove an erroneous part in `onWillUpdateProps` of `mass_mailing_html_field`
which could display the theme selector again on the same record just after
selecting a theme if props were updated.
8) Ensure `withBuilder` getter of `mass_mailing_html_field` properly reads the
state activeTheme every time it is used (if it does not, it could cause issues
with the reactivity, since reading on the state is required for a property
subscription).
9) Remove a useless `onWillUpdateProps` of `mass_mailing_iframe` which was never
used because when `props.showCodeView` changes, the iframe is always destroyed,
so there is no need to update its state.
10) Deprecate usage of `<meta http-equiv="X-UA-Compatible" content="IE=edge"/>`,
to be removed further down the line, as it is useless in the modern web.
11) Ignore errors during a builder "Operation" that was not finished before the
editor was destroyed. In `mass_mailing`, the editor is expected to be
destroyable synchronously to work inside an Odoo view, unlike in `website`.
What's already in the DOM just before destruction will be updated on the
`record`, and the rest of the operation will be lost. However, an attempt is
made to wait for ongoing operations at the start of the
`HtmlField.commitChanges`.
12) Ensure correct visibility option state
Prior to this commit, the `dataAttributeChangeAction` selected item depended on
the domain value computed during the last template rendering, compared to the
current edited element value. The issue is that when an edited element receives
a new `data-filter-domain`, the selected options are evaluated before the
component can register the new domain in its state, so the wrong values are
compared. In this particular case, since we only need 2 values (on/off), an
acceptable trade-off is to choose the selected item ("always visible" vs
"conditionally") based on the Boolean value of the attribute.
13) Remove deprecated assets toggle test
The toggle assets feature was deprecated in a prior [commit1].
The test is removed as its outcome is non-deterministic, because it depends on
the `target` property of `event` returned as a promise resolution value by
`loadBundle`, however the browser can set that target to `null` after the event
was dispatched, so relying on the target value to keep track of the inserted
link is not reliable.
Since that `toggle` feature is not used anymore, it is not needed to run a test
for it. The feature will be removed in the latest `dev` branch.
[commit1]: https://github.com/odoo/odoo/commit/a0aa581636e257894c6c7e87c3793edebecad303
14) Prevent crash on commitChanges if editor is not ready
Prior to this commit, various checks in `commitChanges` did not take into
account that the editor could be instanced but not ready yet (meaning that
plugins are not available, and it is not possible to extract the editable
content).
This commit ensures that `commitChanges` can not crash if called when the editor
is not ready.
15) Properly keep track of dirtiness
mass_mailing changes related to [commit2], which added a way to keep track of a
specific change handled during one `commitChanges` call. The field should stay
dirty if it received changes during a `commitChanges` execution.
In mass_mailing specifically, there were 2 other situations with invalid
tracking of dirtiness:
a) A new record with no change could not be discarded as it was incorrectly
marked as dirty since the `inlineField` value is "".
After this commit, the field is marked as dirty only if the edited field value
is not "" while the `inlineField` value is "", which is the problematic
situation where both values are desynchronized. A new record with both values at
"" is not marked as dirty anymore.
b) Setting a new theme in mass_mailing did not communicate properly with the
relational model about dirtiness.
After this commit, using `setThemeHTML` triggers `onChange`, and the record
update properly tracks that change to communicate with the
`FormStatusIndicator`. The field `isDirty` property stays at `true` though,
because it still needs to execute `convertToEmailHtml` to compute the
`inlineField` value, and it needs the `editor` for that. A `commitChanges`
occurs `onEditorReady` to execute this computation, at the end of which the
field is finally set as not dirty.
[commit2]: https://github.com/odoo/odoo/commit/378580735c785bdcf8b184342834d2b3ddaaaedd
16) Prevent crash with null selection
`document.getSelection()` returns `null` when the selection is not in the
document. However the selection plugin `isSelectionInEditable` function only
support a selection object or `undefined` as an argument, and will crash with
`null`.
This commit ensures that a valid value is provided to the plugin function to
prevent crashes where the selection is moved outside of the `mass_mailing`
iframe before `normalize_handlers` execution.
task-5976348
Forward-Port-Of: odoo/odoo#252571
Forward-Port-Of: odoo/odoo#250883This update fixes a technical issue related to email field requirements in the marketing automation module. The system now correctly determines if an email body is required based on its content, ensuring data integrity. Additionally, a minor adjustment was made to tours to ensure form views are properly cleared during automated testing.
Original PR description
Prior to this commit, `body_html` was hard-coded as a dependency of the `mass_mailing_html_field`, and that dependency lacked the `required` attribute, which should depend on the value of `body_arch`. The dependency is now added in the related views, and the field is now generic. As HtmlField now mark the record `dirty` `onChange`, some tours should ensure that the form view is properly discarded before finishing. task-5976348 Forward-Port-Of: odoo/enterprise#109874 Forward-Port-Of: odoo/enterprise#109091
This update resolves a bug where icons within the HTML editor weren't correctly padded with special characters (feffs). This ensured icons displayed properly after content was added or the page was reloaded. The fix improves the visual consistency of the editor.
Original PR description
Problem: When content is added to the editor, icons are not surrounded by `feff`s. Cause: The selector used to pad elements with `feff`s relies on `o-paragraph`, which is added during normalization.…
Problem: When content is added to the editor, icons are not surrounded by `feff`s. Cause: The selector used to pad elements with `feff`s relies on `o-paragraph`, which is added during normalization. However, `BaseContainerPlugin.normalize_handlers` runs last, so when `FeffPlugin.normalize_handlers` executes, it cannot find icons through `selectors_for_feff_providers` because the expected paragraph-related parent is not yet in place. Solution: Execute `FeffPlugin.normalize_handlers` immediately after `BaseContainerPlugin.normalize_handlers`, ensuring the DOM structure is ready before attempting to add surrounding `feff`s. Steps to reproduce: - Add an icon. - Reload the page. - Do not make any changes (so normalization is not triggered again). - Inspect the icon and observe that it does not have surrounding `feff`s. task-5960097 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#252278 Forward-Port-Of: odoo/odoo#250855
This update resolves a problem preventing Odoo from correctly handling signed invoices submitted by Italian Public Administration (IAP). The issue stemmed from incorrect data types being used when updating invoice attachments, leading to errors and duplicate submission attempts. This ensures proper invoice processing for IAP clients.
Original PR description
Currently, if we try to update the existing `l10n_it_edi_attachment_file` with the signed data received during the submission of an invoice (Invoices for Italian Public Administration businesses must…
Currently, if we try to update the existing `l10n_it_edi_attachment_file` with the signed data received during the submission of an invoice (Invoices for Italian Public Administration businesses must be signed, handled on the IAP side), it fails. The problem is that in this specific flow, the 'attachment' variable contains a binary rather than attachment_data. Unfortunately, I could not find a complete flow to reproduce the issue, as there is no flow that sends an invoice to SdI while the l10n_it_edi_attachment_file variable is already set in the move, except maybe via manual import of an attachment into the invoice. Expected flow: - User creates a move with `l10n_it_edi_attachment_file` (unspecified how) - User sends the move to SdI for a Public Administration partner - IAP signs the attachment and sends it back to Odoo - Odoo raises an error because it tries to use dictionary features on a binary field - Odoo does not save the transaction ID, and if the user tries to resend the move, a Duplicate Error occurs from the SdI side. Ticket [link](https://www.odoo.com/odoo/project.task/5954645) opw-5954645 Forward-Port-Of: odoo/odoo#253459 Forward-Port-Of: odoo/odoo#252966
This update fixes a problem where temporary files used during report generation weren't being properly deleted after tests, leading to potential disk space issues. The fix ensures these files are cleaned up immediately, preventing accumulation and improving system stability. This resolves a minor technical issue with no direct impact on users.
Original PR description
Investigated after finding `/tmp/report.*` left over after running tests. #186547 left some temporal holes in the cleanup which are apparently sufficient to not correctly clean the files in some cases? Since `mkstemp` already creates the files, don't wait to have written stuff inside to record the file for deletion, do it immediately *then* write content to the file. An even better solution would be to use `NamedTemporaryFile(delete_on_close=False)`, however that's only available from 3.12, and it does not log deletion errors (although I'm not convinced that's useful in the first place). Forward-Port-Of: odoo/odoo#253816 Forward-Port-Of: odoo/odoo#253053
This update fixes an inconsistency in the website editor's parallax preview animation across different browsers (Firefox and Chrome). The change ensures a more reliable and predictable preview experience by using a standard root height measurement instead of a browser-specific one.
Original PR description
Steps to reproduce: - Open the website editor. - Open the snippet dialog. - Scroll through a parallax snippet preview in Firefox and Chrome. => The preview animation does not move the same way. Before this commit, the parallax preview used `body.clientHeight` inside the scaled snippet preview iframe. Firefox and Chrome can return different values there, so the preview animation was inconsistent. After this commit, the preview reads `document.documentElement.clientHeight` instead, which gives a stable iframe viewport height across browsers. Forward-Port-Of: odoo/odoo#253541
This update fixes a display issue where the mega menu in mobile view was taking up too much space when the menu size was set to 'Narrow'. The change ensures the mega menu's width is correctly controlled, preventing it from overflowing the mobile navigation bar. This improves the user experience on smaller screens.
Original PR description
The property "max-width" of the mega menu in mobile view was set with the class o_mega_menu_is_offcanvas of its ancestor. However, when the user set the mega menu template size to "Narrow", new CSS rules were added to change the mega menu size based on the screen size. The first rule was overridden, resulting in the mega menu being larger than the mobile navbar width. This commit sets the property "max-width" as "important" to prevent this issue from occurring. task-5972284 Forward-Port-Of: odoo/odoo#250690
This update fixes a bug that prevented dropdown menus from properly activating elements on screen. The change allows dropdowns to function as expected, resolving an issue impacting the VoIP (enterprise) counter and also improving the mobile 'bottom sheet' functionality. This ensures consistent and reliable user interaction.
Original PR description
`Popover` instances have an option for them to be active element once opened: `setActiveElement`. `Dropdown` is a specialized `Popover` class but was forced to use `setActiveElement: false`. This commit allows the option for `Dropdown`, allowing to fix a bug in the voip (enterprise) counter-part of this commit. It also allows the same the mobile specific "dropdown": "bottom sheet". task-5999452
This update fixes a bug where users could successfully cancel subscriptions that already had invoices generated. The change adds a check to ensure subscriptions with active invoices cannot be cancelled after they've been closed, preventing potential revenue discrepancies. This improves data accuracy and subscription management.
Original PR description
Steps to reproduce: -------------------------------- 1. Install Subscription module 2. Create a new subscription quotation and confirm it 3. Generate an invoice for the subscription 4. Attempt to…
Steps to reproduce: -------------------------------- 1. Install Subscription module 2. Create a new subscription quotation and confirm it 3. Generate an invoice for the subscription 4. Attempt to cancel the subscription * A ValidationError is correctly raised 5. Close the subscription by selecting any close (churn) reason 6. Attempt to cancel the same closed subscription again Observation: -------------------------------- The subscription is successfully cancelled even though it already has invoices Issue: -------------------------------- In the following code: https://github.com/odoo/enterprise/blob/9e39b4b85fcb9f6ed5b21b942796b76b8a6eefdb/sale_subscription/models/sale_order.py#L741-L742 The cancellation logic does not check whether a subscription is already churned and still has active invoices Solution: -------------------------------- Added an additional condition to prevent cancelling churned subscriptions that still have active invoices opw-5479719 Forward-Port-Of: odoo/enterprise#109755 Forward-Port-Of: odoo/enterprise#106596
This update fixes a critical issue where image uploads would fail and cause a poor user experience. Now, uploads can be safely aborted, preventing unexpected behavior and ensuring a cleaner, more reliable image upload process for users. The fix ensures files are no longer uploaded after the 'Discard' button is clicked.
Original PR description
Steps to Reproduce: 1. Open the website module. 2. Open the media upload dialog to upload an image by either double-clicking the logo or replacing the existing image. 3. Upload a large file. 4. Abort…
Steps to Reproduce: 1. Open the website module. 2. Open the media upload dialog to upload an image by either double-clicking the logo or replacing the existing image. 3. Upload a large file. 4. Abort the upload before it finishes by clicking the 'Discard' button in the media dialog box. After performing these steps, a traceback is observed. Before this commit: - Image upload failures would throw uncaught exceptions. - These exceptions would interrupt the flow and result in a poor user experience with no clear feedback. - Even after clicking the discard button the image was still getting uploaded. After this commit: - Uploads can be safely aborted when the media dialog is discarded. - Ongoing XHR requests and RPC calls are properly cancelled. - The upload loop stops immediately when an abort is triggered with no traceback. - Users get a predictable and clean exit instead of a broken state. - Files are no longer uploaded after clicking Discard. ### task-4752497 Forward-Port-Of: odoo/odoo#250065 Forward-Port-Of: odoo/odoo#219081
This update resolves an issue where changing the 'Kitchen Note' on a food item after a quantity update would cause an error. The fix ensures that the note field can be updated successfully without triggering a technical problem, improving the reliability of the POS system for restaurant operations.
Original PR description
**Steps to Reproduce:** - Install `pos_restaurant_preparation_display`. - Open Register for POS "**Restaurant**" Shop. - Choose table > select food-item > send the order. - Update food-item quantity > send the updated order. - Update food-item '**Kitchen Note**' > send the note. **Error:** `TypeError - 'NoneType' object is not subscriptable` **Cause:** When the food quantity is updated, a new preparation entry is created for the increased quantity. During the first iteration, the display and order quantities are already merged correctly. However, in a subsequent iteration, the original key no longer exists in `quantity_data`. As a result, accessing a None value leads to a traceback. **Fix:** This commit skips the merge step when the original quantity entry has already been merged. sentry-7197024946 Forward-Port-Of: odoo/enterprise#110184 Forward-Port-Of: odoo/enterprise#104889
This update ensures that the employee assigned to a Point of Sale (PoS) configuration is correctly linked to the PoS company. Previously, users without HR access could encounter access errors if the assigned employee was from a different company. The fix automatically filters employees to match the PoS company or defaults to a user in the 'pos_manager' group.
Original PR description
When writing to a PoS config, it will automatically set an `advanced_employee_ids` if none is set. But it will take any employee that is part of `point_of_sale.group_pos_manager`. If the employee…
When writing to a PoS config, it will automatically set an `advanced_employee_ids` if none is set. But it will take any employee that is part of `point_of_sale.group_pos_manager`. If the employee selected is not part of the same company as the PoS config, and the current user doesn't have HR employee access it will trigger an ir.rule that block the user from opening the settings. Steps to reproduce: ------------------- * Create a new company * Create a new user that only have access to this company and no HR access * Create a PoS in the new company * Login as the new user * Try to open the settings > Observation: You will get an access error because the employee set in `advanced_employee_ids` is from the other company Why the fix: ------------ We make sure that when automatically setting the advanced_employee_ids we filter out the ones that are not from the correct company. If no employee exist that satisfies the requirements, we take a user from the `group_pos_manager` and create an employee for him. opw-5885417 Forward-Port-Of: odoo/odoo#253687 Forward-Port-Of: odoo/odoo#252402
This update resolves an issue where a specific cash move type in the German Point of Sale (POS) module was incorrectly formatted, leading to an error with the Fiskaly accounting system. The fix ensures the correct type casing is used, preventing the error and allowing proper cash move processing.
Original PR description
When creating a cash move of type "Cash Supplement", the type sent was "Zuschussecht" instead of "ZuschussEcht", which caused is not an allowed type. Steps to reproduce: ------------------- * Setup a PoS with a TSS for a German localization * Start a session and open the cash control popup * Create a cash move of type "Cash Supplement" * Close the session > Observation: You get an error from Fiskaly that the type is not allowed Why the fix: ------------ When doing `.capitalize()` on a string it would make the first letter uppercase and the rest lowercase. In this case "ZuschussEcht" would become "Zuschussecht", which is not the correct type expected by Fiskaly We now keep the original casing for all the type. opw-5462364 Forward-Port-Of: odoo/enterprise#110270 Forward-Port-Of: odoo/enterprise#109235
This update resolves several issues related to integrating Field Service with planning, particularly in the portal interface. Key changes include improved access to intervention portals, enhanced reporting capabilities, and streamlined workflows for scheduling and communication.
Original PR description
[FIX] planning_field_service: fix follow-up (round 4) This commit continues to fix the various issues found due to the refactoring of Field Service feature to integrate it into planning instead of…
[FIX] planning_field_service: fix follow-up (round 4) This commit continues to fix the various issues found due to the refactoring of Field Service feature to integrate it into planning instead of being an extension of project. This commit will: - fix 'Print' action and ticket to intervention portal access - always display in range mode for planned dates in planning.slot view - update billable and non-billable filters to take into account `under_warranty` field - review search view of planning.slot, some filters have been renamed and moved. - use employees instead of resources in portal list (no need to display the material resource in the portal views in other words) - add "Send mail", "Send SMS", "Send Report" and "Add/Remove followers" buttons in cog menu of list and kanban views of planning.slot model. - remove helper in ticket button since it does not bring useful information. - add ticket description on related shift, when the user plans an intervention from a helpdesk ticket, the new shift created from that action, will have the description of the related ticket inside Note field (name field) - fix display_name, to avoid displaying the field used in the group by in the display name since it is a bit redundant - take into account worksheet set in product as default - fix some labels, visibility conditions, dates format, group_expand - add default company of the slot when the user creates a resource from the form view of planning.slot model - show customer preview stat button once the intervention is completed and a report is available for that intervention - update tooltip for employee product to bring more context to explain how that new field works. - make sure the SOL for timesheet is not generated when we complete an intervention if the project linked is non billable - add icon on stat button of timesheet - make sure the user can only create service product in product field in employee - show "X Products" button to non sale user in the form view of planning.slot - make project billable and timesheetable by default when the user wants to create a new project from the project_id field inside the form view of planning.slot model - hide schedule stat button in the form view of project.task if the task is a template or linked to a project template - update visibility condition of sign in in calendar, to make visible for planning manager when the slot is published even if the shift is not assigned to that user and the slot is in the past. task-6009593
This update resolves an issue where users without HR officer permissions would encounter an error when trying to open user forms. The team removed unnecessary PIN information from the main user view, streamlining the process for authorized users to manage user accounts. This ensures a smoother experience for all users with appropriate access.
Original PR description
If a person having rights to edit users is not HR officer, he gets a traceback when he tries to open the user form. As the information of PIN is not really related to the user, we left it on the employee and the "Preference" view, but remove it from the main user view --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251787
17 changes
Resolved issues and error corrections
This update resolves a failing test within the Odoo Enterprise platform's order processing system. The issue stemmed from a new requirement for a kitchen printer, which wasn't available in the test environment, causing disruptions in the order flow. This fix ensures the test now runs correctly.
Original PR description
This commit fixes the failing `test_platform_order_flow` test, specifically within the `test_platform_order_reject_flow` tour at the `.ticket-screen` step. Explanation: The root cause of this issue is that the system is now expecting a kitchen printer to be present to process the order flow. However, the unit test environment does not have a kitchen printer configured, which causes the flow to halt or behave unexpectedly when the system tries to interact with it. Reference: Breaking PR: odoo/odoo#226447 build_error-241246 Forward-Port-Of: odoo/enterprise#110249
A test was failing due to an issue with how the system calculates dates and time zones. This fix corrects a calculation error that resulted in an incorrect date being generated, ensuring the planning module's tests run successfully. This resolves a potential disruption to the planning functionality.
Original PR description
__ ## Error description The test fails when it is launched at 23h. We obtain an assertion error: `AssertionError: datetime.datetime(2026, 2, 26, 11, 0) != datetime.datetime(2026, 2, 25, 11, 0)` ##…
__ ## Error description The test fails when it is launched at 23h. We obtain an assertion error: `AssertionError: datetime.datetime(2026, 2, 26, 11, 0) != datetime.datetime(2026, 2, 25, 11, 0)` ## Origin of the issue In the `_default_start_datetime()` method of planning, we return `return datetime.combine(fields.Date.context_today(self), time.min)`. So, we call context_today. which is implemented this way: https://github.com/odoo/odoo/blob/f3ec2aa4514c03874aae96ae975e2617e8260c72/odoo/orm/fields_temporal.py#L154-L158 Let's say the hour of the test is 23h50 in GMT+0. The slot will be created at 23h50 in GMT+0. But if the time zone of the environment is set at GMT+1, at the moment of the `_compute_datetime`, we will call this piece of code, where we will translate 23h50 to GMT+1, we will obtain 00h50, then only return the day, which offsets the result of one day in the future. X-original-commit: d91c53869842f65a60088ffa101f67404af6e58e note: backport of https://github.com/odoo/enterprise/pull/108891 Forward-Port-Of: odoo/enterprise#110126
This update resolves an issue where users couldn't type spaces into 'Add to cart' buttons within the website editor. The fix involves a technical adjustment to the button's structure, ensuring spaces are correctly inserted as intended. This improves the user experience when customizing website product pages.
Original PR description
Problem: After https://github.com/odoo/odoo/commit/e809b492c1b138c1af7bb1d4aa61b39d87686df9 typing spaces inside an "Add to cart" button label in the website editor triggers the button click instead…
Problem: After https://github.com/odoo/odoo/commit/e809b492c1b138c1af7bb1d4aa61b39d87686df9 typing spaces inside an "Add to cart" button label in the website editor triggers the button click instead of inserting a space character. Cause: Browsers natively intercept the space key on `button[contenteditable="true"]` elements and fire a click event instead of inserting the character, making it impossible to type spaces in the button label. Solution: Introduce an `EditableButtonPlugin` that moves the `contenteditable` attribute from the button up to a wrapping `<span>`. This preserves full text editing capability (including spaces) without triggering the button's click handler. Steps to reproduce: * Go to a product page on the website. * Open the editor. * Try to add a space in the "Add to cart" button label. * Observe that the button is triggered instead of inserting a space. opw-5994828 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a bug that caused product imports to create redundant records when importing multiple products with the same attribute values. By using a 'set' instead of a 'list', the system now ensures unique values are created, preventing inconsistencies and maintaining product variant usability. This improves import reliability and data accuracy.
Original PR description
Product imports were creating redundant `product.attribute.value` records because batch values were stored in a list without uniqueness checks. This fix ensures that: - Unique values are identified before creation. - Product variants remain usable and consistent. Issue: 5918366 Fixes the issue where importing 200 products with the same attribute value created 200 identical records.
This update fixes a performance issue in our testing process. Previously, asset bundles were repeatedly regenerated during tests, slowing down runtimes. Now, bundles are pregenerated once and reused, significantly improving test execution speed and stability.
Original PR description
The commit [^1] introducing binary asset bundle support overlooked the pregeneration of said bundles for the tests runs. This leads to hot-regeneration of those bundles during tests runs on the runbot (multiple hundreds of times) instead of only once and reusing them. This commit adds support for those binary bundles during pregeneration. [^1]: odoo/odoo@a5c02da5c24bfc85b3bbb7d1410d489d3c7185b8
This update fixes a performance issue in the Web Studio module by ensuring binary asset bundles are pregenerated during testing. Previously, tests repeatedly regenerated these bundles, slowing down the testing process. Now, bundles are created once and reused, significantly improving test run times.
Original PR description
The commit odoo/odoo@a5c02da5c24bfc85b3bbb7d1410d489d3c7185b8 introducing binary asset bundle support overlooked the pregeneration of said bundles for the tests runs. This leads to hot-regeneration of those bundles during tests runs on the runbot (multiple hundreds of times) instead of only once and reusing them. This commit adds support for those binary bundles during pregeneration.
This update fixes a bug where employee skills weren't automatically added to appraisals created by the system's automated scheduling process. The fix ensures that all appraisals, regardless of their creation method, correctly display the employee's skills in the Skills tab. This improves data accuracy and usability.
Original PR description
Steps to reproduce: ------------------------------------- 1. Install `hr_appraisal_skills` module 2. Create a new employee and assign at least one skill to the employee 3. Set the Next Appraisal Date…
Steps to reproduce: ------------------------------------- 1. Install `hr_appraisal_skills` module 2. Create a new employee and assign at least one skill to the employee 3. Set the Next Appraisal Date to today 4. Go to Scheduled Actions > Appraisal: Run employee appraisal > Run Manually 5. Open the newly created appraisal for the employee Observation: ------------------------------------- In the Skills tab, the employee's skills are not populated even though the appraisal is already in the confirmed stage Issue: ------------------------------------- When the cron `_run_employee_appraisal_plans` creates an appraisal, it is created directly in `pending` state via `create()`. The skill-copying logic only lived in the `write()` override, which triggers on state transitions from 'new' to 'pending'. Since `create()` bypasses `write()`, Employee skills were never copied to cron-created appraisals https://github.com/odoo/enterprise/blob/451dce92a087086fc3d5d5f610626312f32bcd13/hr_appraisal_skills/models/hr_skills.py#L12-L15 Solution: ------------------------------------- Add a `create()` override to call `_copy_skills_when_confirmed` when an appraisal is created directly in the `pending` state, ensuring employee skills are properly copied. opw-5491433 Forward-Port-Of: odoo/enterprise#110414 Forward-Port-Of: odoo/enterprise#107760
This update fixes a bug where journal entries could be posted even when using inactive analytic accounts. The change adds a validation step during posting to ensure all referenced accounts are active, preventing incorrect financial postings. This improves data accuracy and reliability.
Original PR description
**Steps to produce:** - Install the `Accounting` module. - Enable analytic accounting in settings. - Create an analytic account (e.g., "test"). - Create a journal entry and assign the analytic…
**Steps to produce:** - Install the `Accounting` module. - Enable analytic accounting in settings. - Create an analytic account (e.g., "test"). - Create a journal entry and assign the analytic account in the analytic distribution. - Post the entry and export it(Make sure `journal items/account` and `journal items/analytic distribution` are also included). - `Archive` the analytic account. - Import the exported entry `OR` Duplicate the previous created entry. - Try to post the imported entry. **Issue:** - The entry is posted even if the analytic account used in the analytic distribution is inactive. **Root cause:** - The `analytic_distribution` field is stored as JSON. - At [1], the `_str_to_json` method only attempts `json.loads(value)`, and if parsing fails, it raises an error. **Solution:** - Add a validation when posting journal entries to ensure that all analytic accounts referenced in the analytic distribution are active. [1]: https://github.com/odoo/odoo/blob/13e8b462e74f144e085492857bfaa7b0d1f88f93/odoo/addons/base/models/ir_fields.py#L196-L202 opw-5350980 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244231 Forward-Port-Of: odoo/odoo#239988
This update resolves an issue where rental income was incorrectly included in the Total Income batch calculation for Hong Kong payroll. The fix removes these rental amounts, ensuring more accurate reporting of income for tax purposes. This improves the reliability of financial data within the Odoo Enterprise system.
Original PR description
. Removing any rental amounts in calculating Total Income batch task-6006636 Forward-Port-Of: odoo/enterprise#109919
This update resolves an issue where parallax preview animations appeared differently in Firefox and Chrome due to inconsistent iframe height measurements. The fix now uses a standard root height measurement, ensuring a consistent and reliable preview experience across all browsers. This improves the overall user experience for website editors.
Original PR description
Steps to reproduce: - Open the website editor. - Open the snippet dialog. - Scroll through a parallax snippet preview in Firefox and Chrome. => The preview animation does not move the same way. Before this commit, the parallax preview used `body.clientHeight` inside the scaled snippet preview iframe. Firefox and Chrome can return different values there, so the preview animation was inconsistent. After this commit, the preview reads `document.documentElement.clientHeight` instead, which gives a stable iframe viewport height across browsers. Forward-Port-Of: odoo/odoo#253541
This update fixes a display issue where the mega menu in mobile view was taking up too much space when the menu size was set to 'Narrow'. The change ensures the mega menu's maximum width is correctly defined, preventing it from overflowing the mobile navigation bar. This improves the user experience on smaller screens.
Original PR description
The property "max-width" of the mega menu in mobile view was set with the class o_mega_menu_is_offcanvas of its ancestor. However, when the user set the mega menu template size to "Narrow", new CSS rules were added to change the mega menu size based on the screen size. The first rule was overridden, resulting in the mega menu being larger than the mobile navbar width. This commit sets the property "max-width" as "important" to prevent this issue from occurring. task-5972284 Forward-Port-Of: odoo/odoo#250690
This update resolves an issue where users with HR access rights would receive an error when trying to view other users' profiles. The change restricted access to the 'pin' field, which was previously incorrectly exposed. This ensures HR staff can properly access user information.
Original PR description
The field `res_users.pin` is restricted to members of `hr.group_hr_user` but is added to the form view, so if a user with HR access rights tries to view another user, it will trigger an access error:…
The field `res_users.pin` is restricted to members of `hr.group_hr_user` but is added to the form view, so if a user with HR access rights tries to view another user, it will trigger an access error: ``` odoo.exceptions.AccessError: You do not have enough rights to access the field "pin" on Employee (hr.employee). Please contact your system administrator. ``` To reproduce: - With `hr` installed, remove its access rights from the admin and try to view another user. This error is related to recent changes[^1] in the access of employee fields, it might be possible to have a different approach to this error. It will break while trying to access the employee field for which the user doesn't have access: https://github.com/odoo/odoo/blob/012f510e70d7d0afd226e4198b2e1759db3ca18d/addons/hr/models/res_users.py#L29-L36 In earlier versions, the field was not accessed directly. It was just automatically hidden from the view if the user didn't have the right group. [^1]:https://github.com/odoo/odoo/commit/012f510e70d7d0afd226e4198b2e1759db3ca18d
This update resolves a problem where the website's promotional tour occasionally failed to run correctly. The fix was identified through automated testing and ensures the tour consistently functions as intended for users. This improves the user experience and prevents potential frustration.
Original PR description
See https://runbot.odoo.com/odoo/runbot.build.error/234533
This update ensures that quality checks are only performed on tracked products when a lot or serial number is assigned. Previously, users could initiate quality checks without this information, leading to errors. Now, a clear error message prompts users to assign lot/serial numbers, improving data accuracy and preventing incorrect quality assessments.
Original PR description
This commit fixes the behavior when the user tries to do quality checks for tracked products without setting their lot/sn on the picking. Before this commit: Nothing happens if the user tries to do quality checks if lots are not set on the tracked products. After this commit: A User Error is raised telling the user to assign lots/sn to the tracked products. Additional improvement: Before this commit, when having quality checks and user click on `Quality Checks` button, all quality checks appear regardless of whether all moves are picked or only some of them are picked. After this commit, clicking on `Quality Checks` button will only show quality checks related to picked move lines if at least one move line is picked, otherwise it will show all quality checks. Task-5730239 Forward-Port-Of: odoo/enterprise#104945
This update fixes a bug where users could successfully cancel subscriptions that already had invoices generated. The change adds a check to ensure subscriptions with active invoices cannot be cancelled after they've been closed, preventing potential revenue discrepancies. This ensures accurate subscription management and billing.
Original PR description
Steps to reproduce: -------------------------------- 1. Install Subscription module 2. Create a new subscription quotation and confirm it 3. Generate an invoice for the subscription 4. Attempt to…
Steps to reproduce: -------------------------------- 1. Install Subscription module 2. Create a new subscription quotation and confirm it 3. Generate an invoice for the subscription 4. Attempt to cancel the subscription * A ValidationError is correctly raised 5. Close the subscription by selecting any close (churn) reason 6. Attempt to cancel the same closed subscription again Observation: -------------------------------- The subscription is successfully cancelled even though it already has invoices Issue: -------------------------------- In the following code: https://github.com/odoo/enterprise/blob/9e39b4b85fcb9f6ed5b21b942796b76b8a6eefdb/sale_subscription/models/sale_order.py#L741-L742 The cancellation logic does not check whether a subscription is already churned and still has active invoices Solution: -------------------------------- Added an additional condition to prevent cancelling churned subscriptions that still have active invoices opw-5479719 Forward-Port-Of: odoo/enterprise#109755 Forward-Port-Of: odoo/enterprise#106596
This update clarifies error messages for declined payments related to international vendors. Previously, users saw a generic "Country not allowed" message when payments were refused due to vendor location discrepancies. Now, the system incorporates payment data to provide more specific and helpful error messages, improving the user experience.
Original PR description
A company in belgium creates a card, it's "allowed countries" is set to Belgium by default. If said card is used to pay online on a website ending with .be, it is understandable that the user believes the vendor to be located in Belgium If it is not the case (the vendor is actually in Luxembourg), the payment is refused but the message on the refused expense is unclear "Country not allowed" The change adds the data received to make the decision in the error message task: 5478443 Forward-Port-Of: odoo/enterprise#103974
A crash in the DIN 5008 report layout preview was resolved. The issue stemmed from an attempt to access company data within the QWeb template that wasn't always present. The fix adds a check to ensure the company record exists before attempting to retrieve its name, preventing the error.
Original PR description
**Steps to reproduce** - Settings -> Configure Document Layout - Set layout to DIN 5008, save - Click Preview Document **Error** `MissingError: Record does not exist or has been deleted.(Record: res.company(X,), User: 2)` Raised in l10n_din5008.external_layout_din5008 because of this line: `<span t-elif="'name' in o" t-field="o.name"/>` **Cause** The "Preview Document" button renders web.preview_externalreport, which passes a res.company record as the QWeb variable o. When the template then tried to render t-field="o.name" (the title line), where o is a missing res.company(2) (not in the database), QWeb raised the MissingError. **Fix** Guard the title block with `if o and o.exists()` to check if the record exists, so it's safe to access `o.name`. opw-5951003 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
3 changes
Resolved issues and error corrections
This update fixes an issue where cancelled vendor bills were incorrectly included in the Sweden accounting SIE export file. The fix ensures that cancelled transactions are properly excluded, aligning the export data with the general ledger. This prevents inaccurate reporting and maintains data integrity.
Original PR description
Steps to reproduce: - Install l10n_se (Sweden - Accounting). - Create a Vendor Bill with a line using Account 4000 (Cost of goods) for any amount (e.g., 10,000 SEK). - Confirm/Post the bill. - Cancel the bill. - Go to Accounting > Reporting > SIE Export and generate the export for the current year. - Open the downloaded .se file and locate the #RES line for Account 4000. Expected: The balance should be 0.00 (cancelled entries must be ignored, matching the GL). Actual: The cancelled amount (10,000) is incorrectly summed into the exported balance. opw-5901999 Forward-Port-Of: odoo/enterprise#108767
This update resolves an issue where rental income was incorrectly included in the Total Income batch calculation for Hong Kong payroll. The fix removes any rental amounts during this calculation, ensuring accurate reporting of employee income as required by Hong Kong tax regulations. This improves the reliability of payroll data.
Original PR description
. Removing any rental amounts in calculating Total Income batch task-6006636 Forward-Port-Of: odoo/enterprise#109919
This update resolves issues with the formatting of Dutch SBR and ICP reports, specifically correcting VAT tag values and date formats within the exported XML files. A cleanup helper has been added to improve the readability of these files for internal use.
Original PR description
Descriptions of the issues this commit addresses: The xbrli:identifier tags in the exported sbr and sbr icp files are wrong. They should always contain the company's vat without country code . The DateTimeCreation tag currently shows a date in a wrong format. It it YYYYMMDDhhmm but should be YYYY-MM-DDThh:mm:ss. Also the outputted xml is weirdly indented with many whitespaces and it makes it hard to read for no reason. --- Desired behavior after the commit is merged: This commit changes the values in the exported file to address those issues and adds the use of a cleanup helper to make the file human readable. --- task-5998939 Forward-Port-Of: odoo/enterprise#109359
2 changes
Resolved issues and error corrections
This update fixes an issue where changing the lot number of a combo product in Point of Sale (POS) would reset the order total price. The fix ensures that the price remains consistent with the combo product's defined price, regardless of lot changes. This improves the accuracy of POS transactions.
Original PR description
Step to reproduce: - have a lot tracked product, product 1 (price = 10) - create a combo product with product 1, with price (100) - start a pos, add combo product in order, - notice total price is 100 - change lot number of product 1, - notice order price reset to 10. Cause: - When the lot number is changed, `set_quantity_by_lot` is triggered. - This calls `set_quantity`, which resets the price and loses the combo pricing. Fix: - use `keep_price` = true parameter when calling `set_quantity` if orderline has combo_parent_id opw-5495409 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251460 Forward-Port-Of: odoo/odoo#246252
This update resolves an issue that was causing errors during upgrades related to fetching archived warehouse picking types in the Point of Sale system. The fix ensures that only active warehouse types are considered, preventing conflicts and improving system stability. This was triggered by an upgrade process and avoids unnecessary data retrieval.
Original PR description
revert the commit as when we fetch archived warehouse's pos type it will raise error for other source or destination loction for newly created stock operation type like even functinally also there is…
revert the commit
as when we fetch archived warehouse's pos type
it will raise error for other source or destination loction for newly created stock operation type like
even functinally also there is no need to fetch
archived warehouse's operation type.
```
quality Control
cross Dock,
Storage type
```
we got this error during upgrade :
```
File "/home/odoo/src/odoo/saas-17.4/odoo/sql_db.py", line 347, in execute
res = self._obj.execute(query, params)
psycopg2.errors.NotNullViolation: null value in column "default_location_src_id" of relation "stock_picking_type" violates not-null constraint
DETAIL: Failing row contains (33, 0, 28, 56, null, null, null, 4, null, null, 1, 1, 1, QC, internal, at_confirm, FBAQC, ask, {"en_US": "Quality Control"}, null, f, f, t, null, f, null, 2024-10-16 05:14:53.18448, 2024-10-16 05:14:53.18448, optional, optional, no, optional, null, null, t, null, null, 2x7xprice, 4x12_lots, pdf, null, null, null, null, null, null, null, null, null, t, null).
```
due to this two fix:
https://github.com/odoo/odoo/pull/151719/commits
https://github.com/odoo/odoo/pull/175838/files
so we need to avoid to fetch archived warehouse's picking type.
ref:
odoo/upgrade#6631
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#191652
Forward-Port-Of: odoo/odoo#1852449 changes
Resolved issues and error corrections
This update ensures that follow-up emails for invoices send the correct PDF attachment. Previously, emails used the main attachment, which could be any uploaded PDF. Now, the system uses the invoice's specific PDF report to guarantee accurate invoice information is sent to customers.
Original PR description
Before, the followup emails used the Invoice's main attachment. This is not correct because a user might have uploaded an arb PDF. Only the actual PDF should be sent. Use `invoice_pdf_report_id` instead of `message_main_attachment_id`. opw-5126420 Forward-Port-Of: odoo/enterprise#98820
This update ensures that tax calculations in reports related to Indian GST (GSTR) are accurate. Previously, the system incorrectly applied taxes to invoices even when they were not fully posted. This change now only applies taxes to invoices that have been finalized, improving the reliability of financial reporting.
Original PR description
if bill is not available then we also create new bill without line so we check taxes only on posted one Forward-Port-Of: odoo/enterprise#110461
This update resolves a recurring issue where the Italian POS printer would generate errors when the system was offline. The fix adds a safety mechanism to gracefully handle network disruptions during receipt printing, preventing errors and improving the user experience for Italian retail customers. It ensures the POS system functions correctly even without an internet connection.
Original PR description
When loosing internet connexion a lot of tracebacks appear is the pos if we use the italian fiscal printer. Steps to reproduce: ------------------- * Setup italian fiscal printer for a shop * Open shop * Turn wi-fi off * Add items to cart * Go to payment screen > Traceback * Add a payment and validate > Traceback Why the fix: ------------ Don't try to reach the printer if we're offline regarding the price to pay. We add a try catch block around the call for printing the receipt. If the try block fails when the network is offline we assume it's just because of the offline mode. If it failed while online we raise the error. opw-5432090 Forward-Port-Of: odoo/enterprise#105515
This update fixes an issue where cancelled vendor bills were incorrectly included in the Sweden (l10n_se) SIE export file. The fix ensures that cancelled transactions are excluded, aligning the export with the general ledger and providing accurate financial reporting. This prevents discrepancies in reporting.
Original PR description
Steps to reproduce: - Install l10n_se (Sweden - Accounting). - Create a Vendor Bill with a line using Account 4000 (Cost of goods) for any amount (e.g., 10,000 SEK). - Confirm/Post the bill. - Cancel the bill. - Go to Accounting > Reporting > SIE Export and generate the export for the current year. - Open the downloaded .se file and locate the #RES line for Account 4000. Expected: The balance should be 0.00 (cancelled entries must be ignored, matching the GL). Actual: The cancelled amount (10,000) is incorrectly summed into the exported balance. opw-5901999 Forward-Port-Of: odoo/enterprise#108767
This update resolves an issue where rental income was incorrectly included in the Total Income batch calculation for Hong Kong payroll. The fix removes these rental amounts, ensuring more accurate reporting of employee income as required by Hong Kong tax regulations. This improves the reliability of payroll data.
Original PR description
. Removing any rental amounts in calculating Total Income batch task-6006636 Forward-Port-Of: odoo/enterprise#109919
This update resolves a critical issue where users could cancel documents after all parties had signed, potentially compromising legal records. Now, the cancel button disappears automatically after signing is complete, and backend cancellations are blocked to ensure documents remain permanently secure and reliable. This strengthens the integrity of our document signing process.
Original PR description
Before this commit, users could cancel documents after everyone had signed. This weakened legal records and proof of agreement. After this commit, the cancel button disappears once signing is complete. We also blocked backend cancellations to keep finished documents permanent and secure. task-5980337 Forward-Port-Of: odoo/enterprise#109353
This update fixes a usability issue on mobile devices where a key button for loan calculations was hidden within a dropdown. The change ensures the button is always accessible, streamlining the loan creation process for mobile users. This improves the overall user experience and efficiency.
Original PR description
Forward-Port-Of: odoo/enterprise#110120
This update resolves an issue where GS1 barcode filtering would fail due to an error when a barcode was interpreted as a date. The fix prevents this error from blocking the filtering process, ensuring that products can be correctly identified and filtered by their barcodes. This improves the reliability of internal transfer operations.
Original PR description
Steps to reproduce: - Activate the GS1 nomenclature - Create a product "P1" with the barcode: 15099590225865 - Create an internal transfer with one unit of P1 - Go to Barcode > Operations > Internal…
Steps to reproduce: - Activate the GS1 nomenclature - Create a product "P1" with the barcode: 15099590225865 - Create an internal transfer with one unit of P1 - Go to Barcode > Operations > Internal Transfers - Scan the barcode: 15099590225865 to filter transfers by this product barcode Problem: An validation error is raised: A ValidationError is raised: "A GS1 barcode nomenclature pattern was matched. However, the barcode failed to be converted to a valid date." Explanation: GS1 barcodes must follow a strict nomenclature based on well-defined rules. For example, a GS1 product barcode should start with the Application Identifier 01 followed by 14 digits. The GS1 parser processes the barcode rule by rule and applies the first matching rule. In this case, the barcode 15099590483921 is interpreted as a date because it starts with "15", which corresponds to a GS1 Application Identifier for a date. As a result, the parser attempts to convert the first six digits into a date and raises a ValidationError. Solution: Catch the ValidationError raised during GS1 date parsing in filter_on_barcode and explicitly reset parsed_results to False, allowing the normal filter on product resolution logic to continue. This prevents GS1 parsing errors from blocking valid barcodes and ensures that product is correctly filtered opw-5929064 Forward-Port-Of: odoo/enterprise#110636
This update resolves an issue where generating financial reports (FAIA) for Luxembourg companies using multi-currency transactions resulted in errors. The fix ensures the necessary currency information is included in the report template, preventing rendering problems and ensuring accurate financial reporting.
Original PR description
Steps to reproduce 1/ setup a LU company. The default company currency will be EUR. 2/ create a vendor bill in another currecy (e.g. USD) 3/ take note of the bill date and accounting date (ideally set them in the past, like 1 month) 4/ generate the FAIA report for the period containing the created bill => error while rendering the qweb template The core of the error is when rendering the l10n_lu saft template. Sales invoices and purchase invoices reuse the standard `account_saft.tax_information` report, which expects to find `currency_code` in the object's fields. This commit explicitly re-adds it when creating the document's tax summary. opw-5216057 Forward-Port-Of: odoo/enterprise#110373 Forward-Port-Of: odoo/enterprise#106902
6 changes
Resolved issues and error corrections
This update fixes a technical issue in the Odoo Studio view editor that previously caused crashes when interacting with certain fields. The fix ensures the sidebar correctly displays information, resolving a bug related to incorrect property computations. This improves the stability and usability of the Studio interface.
Original PR description
In studio, form editor: click on a field and check the sidebr is correct Click on another field, one that has the widget many2many_tags. Before this commit, there was a crash because the internals of the sidebar were computed with the wrong props (the old ones instead of the new ones) After this commit, there is no crash opw-6004776 Forward-Port-Of: odoo/enterprise#110391 Forward-Port-Of: odoo/enterprise#110284
This update resolves an issue preventing users from successfully creating events via the Quick Create feature within the Gantt view for Dental Care appointments. The fix ensures that users can now accurately schedule events when using this common workflow. This improves the usability of the appointment scheduling process.
Original PR description
Steps to reproduce: - Go to Appointments - Dental Care -> Gantt - Quick Create an event => bug task-6037337
A recent update to the payruns module has broken the generation of demo payslips in the HK payroll system. This pull request addresses this issue, restoring the ability to create these test payslips for verification and reporting. This ensures continued functionality for testing and demonstration purposes.
Original PR description
Following recent changes on payruns, the generation of demo payslips is no longer functioning, so we need to fix it.
This update reorganizes the testing for our SEPA payment module (hr_payroll_account_iso20022) to better align with its dependencies. Previously, a test needed to rely on the Accounting module, which has now been resolved by moving the test to a new, dedicated test module dependent on Accounting. This improves the module's structure and reduces unnecessary dependencies.
Original PR description
hr_payroll_account_iso20022, which is the module supporting SEPA payments, shouldn't be dependent on Accounting, but only on Invoicing. To solve a runbot error related to a test in this module, the dependency was changed to be Accounting instead of Invoicing. After more consideration, it is instead the test that should be moved to a new test module which depends on Accounting, leaving the original module only dependent on Invoicing. Task: 5979666
This update resolves a technical issue preventing certain Odoo modules (AI, HR Payroll, MRP Workorder, etc.) from functioning correctly. The fix involved correcting a flawed validation schema, ensuring proper data handling and preventing disruptions to core features. This improves overall system stability and reliability.
Original PR description
* ai,hr_payroll,mrp_workorder,stock_barcode,voip,web_gantt This commit corrects wrong props validation schema that could not work.
This update reverts a recent change to the spreadsheet edition's testing framework. The previous update introduced issues with tests related to a style refactor. This reversion ensures the spreadsheet edition's testing remains stable and reliable.
Original PR description
This reverts commit 8f22766dac4028ce7c726a036a9ba6f7c2df2c26.
6 changes
Resolved issues and error corrections
This update fixes a performance issue with the budget report, ensuring it runs efficiently when the account_budget_purchase module is installed. Previously, a change bypassed a key optimization, leading to slow report generation times. The fix restores the original performance improvement.
Original PR description
The performance optimization introduced in account_budget (see PR #99096) pushes the budget_line_ids filter down to the underlying SQL queries of budget.report to avoid building the full UNION result before applying the filter. account_budget_purchase fully overrides budget.report._compute_all() and its table_query, thereby bypassing the optimized implementation introduced in PR #99096. As a result, the budget_line_ids filter was not pushed down to the SQL level, causing large UNION queries to be executed without filtering and leading to degraded performance. Apply the same optimization in this module to restore the expected performance improvement when account_budget_purchase is installed. | Scenario | Execution Time | | :--- | :--- | | **Before this Commit** | **passed virtual time limit** | **After this Commit** | **1.25 seconds** opw-5930127
This update fixes an issue where timesheet descriptions were being duplicated when updating values in the grid view. The fix ensures that new timesheet lines created from updated values retain the original description, maintaining accurate reporting and data consistency. This improves the usability of the timesheet feature.
Original PR description
To reproduce: ============= - on timesheet group by Project > Task > Description - on a line with a description, update a 0:00 cell to an other value - refresh or change view to list and back to grid - a new line with description '/' is created with the updated value Problem: ======== when creating the new timesheet it's by default given the name '/' which for the grid view is not in same group as the original line with the description. Solution: ========= when creating the new timesheet, we give it the same description as the original line. opw-5909249 Forward-Port-Of: odoo/enterprise#108894
This update resolves an issue where rental income was incorrectly included in the Total Income batch calculation for Hong Kong payroll. The fix removes these rental amounts, ensuring more accurate reporting and compliance with local tax regulations. This improves the reliability of payroll data.
Original PR description
. Removing any rental amounts in calculating Total Income batch task-6006636 Forward-Port-Of: odoo/enterprise#109919
This update resolves an issue where custom snippets created in the website builder wouldn't display their dynamic content in the preview. The fix ensures that dynamic content is correctly reflected when a custom snippet is saved and previewed, addressing a visual discrepancy impacting user experience. This was caused by a change in the website builder's architecture.
Original PR description
The interaction for filling the dynamic content of dynamic snippets did not run inside the iframe to preview the snippet to add. This is not an issue for the initial dynamic snippet, as they are…
The interaction for filling the dynamic content of dynamic snippets did not run inside the iframe to preview the snippet to add. This is not an issue for the initial dynamic snippet, as they are filled with fake content. But when saving a custom snippet, the dynamic content is cleared, and they seem empty when previewed. This is the case since the [website builder refactor] as the previous builder re-used the preview of the initial snippet. This commit adds the interaction to fill dynamic content in the preview iframe, and changes the interaction to avoid emptying the fake content from initial dynamic snippets during preview. Steps to reproduce: - Open website builder - Add a dynamic snippet (for example "Events") - Save the snippet as a custom snippet - Click on "Custom" snippet category - Bug: The preview for the custom snippet does not have the dynamic part (there is no event, just the title) [website builder refactor]: 9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 task-5427353 Forward-Port-Of: odoo/enterprise#108912
This update resolves an issue where text fields in Odoo Sign PDFs were incorrectly displayed as checkmarks. The fix ensures that text field values are accurately rendered, preventing misinterpretation of standard text fields as checkboxes during the PDF flattening process. This improves the accuracy and reliability of digital signatures.
Original PR description
Create an interactive PDF form in Adobe Acrobat containing a standard Text Field (/FT /Tx). - Fill the text field with a value (e.g., "John Doe") and save the PDF. - (Note: Adobe Acrobat will often…
Create an interactive PDF form in Adobe Acrobat containing a standard Text Field (/FT /Tx). - Fill the text field with a value (e.g., "John Doe") and save the PDF. - (Note: Adobe Acrobat will often automatically assign an Appearance State (/AS /N) to this text field). - Upload this PDF to the Sign app. **Current behavior:** The text field's string value is ignored and replaced with a checkmark (✓). **Expected behavior:** The text field should correctly render the string value that the user entered. **Cause of the issue:** In the _draw_field_value function, the parser checks if an /AS (Appearance State) tag exists and is not set to /Off. If true, it assumes the field is a checked box and draws a chr(0x2713). However, it fails to check the Field Type (/FT) first. Because Adobe Acrobat sometimes assigns /AS tags to standard Text Fields (/FT /Tx), we misinterprets these populated text fields as checked buttons. **Solution:** This PR fixes the issue safely for stable versions across two commits: [REF]: Extracts the value extraction logic into a dedicated _get_field_value helper method to allow isolated unit testing without requiring a canvas or physical PDF files. No behavioral changes in this commit. [FIX]: Wraps the /AS check within an if field_type == "/Btn": condition. This ensures only actual Checkboxes and Radio Buttons render as checkmarks, allowing Text Fields to fall through and properly return their /V string values. Task: 6018260
This update resolves issues with physical card processing in the UK, specifically around missing ETA information and incorrect currency handling. It also adds comprehensive testing for physical cards and improves logging for easier debugging, ensuring smoother expense reporting.
25 changes
Resolved issues and error corrections
This update streamlines the handling of discount calculations within the Point of Sale system. The logic for retrieving discount lines has been moved to the dedicated `pos_discount` module, improving organization and efficiency. This change ensures more accurate and reliable discount application during sales transactions.
Original PR description
Previously, the logic for retrieving discount lines was implemented in the `point_of_sale` module, while the `discount_product_id` was managed in the `pos_discount` module. This commit fixes the logic by moving the `_get_discount_lines` method into the `pos_discount` module. task-5875158
This update resolves an issue where users couldn't edit quantities within the pickup list view of the industry_fsm_stock module. By enabling multi-editing, users can now efficiently update multiple pickup records simultaneously, streamlining the picking process and improving operational efficiency.
Original PR description
Steps to reproduce: Steps to reproduce: - Install `industry_fsm_stock` - Create a task and add a product - Click on the Sale Order button - Add another product with the Invoicing Policy set to Delivered quantities - Click on the To Pickup button Issue: User is not able to edit fields in the list view. Fix: Enable `multi_edit` on the list view to allow editing multiple records. Task-5969303
This update fixes an issue where consolidated POS invoices were incorrectly showing a zero payable amount due to pre-payment mapping. To comply with MyInvois requirements, the update now ensures the Total Amount Payable accurately reflects the invoice's total amount, regardless of prior payments. This ensures proper data transmission to the MyInvois tax officer.
Original PR description
For POS consolidated invoices, the PrePayment Amount was mapped to the payment linked to the document. This incorrectly decreased the Total Amount Payable to 0, since POS orders are already paid at the counter. MyInvois tax officer and helpdesk requires that the Total Amount Payable (cbc:PayableAmount) to reflect the total amount of the issued e-document , regardless of prior payments. This commit forces the PaidAmount to 0 for consolidated documents, ensuring the PayableAmount correctly matches the TaxInclusiveAmount as expected by the MyInvois API. task-[6021698](https://www.odoo.com/odoo/all-tasks/6021698)
This update resolves errors in the Guatemalan e-invoicing system (l10n_gt_edi) related to 'Timbre de prensa' taxes. The fix ensures that the tax amount is correctly calculated and formatted when sending invoices to the SAT, preventing reporting issues.
Original PR description
**Steps to reproduce:** - Install accountant and l10n_gt_edi - Switch to a Guatemalan company (e.g. GT Company) - In Accounting settings, set "Web Services" of Guatemala Localization to "Test" or…
**Steps to reproduce:**
- Install accountant and l10n_gt_edi
- Switch to a Guatemalan company (e.g. GT Company)
- In Accounting settings, set "Web Services" of Guatemala Localization to "Test" or "Production" ("Demo" mode doesn't trigger any error)
- Set "Infile Credentials" (real credentials are required)
- Create a "Timbre de prensa" tax:
* Tax Name: [anything]
* Tax Computation: Percentage
* Amount: 0.5000 %
* Included in Price: Tax Excluded
* GT Taxable Unit Code: 1
* GT Tax Short Name: TIMBRE DE PRENSA
- Create an invoice:
* Customer: [a Guatemalan customer] (e.g. Empresa Guatemalteca S. A.)
* GT Document Type: FACT - Factura Electrónica
* Invoice Lines:
- Taxes: [the default 12% IVA tax (incl) and "Timbre de prensa" (excl)]
- Confirm the invoice
- Send the invoice to SAT
**Issue:**
Several errors are returned by the SAT service:
- "FEL-GUI-24 | 2.7 | 2.7.1 | No. 2 | Error - Monto Gravable calculado incorrectamente para el impuesto [IVA]. Cod. Unidad Gravable [1] (Detalle linea No. 1)."
- "FEL-GUI-37 | 2.11 | 2.11.1 | No. 2 | Error - Monto Gravable calculado incorrectamente para el impuesto [TIMBRE DE PRENSA]. (Detalle linea No. 1)."
**Cause 1:**
In the XML sent to the SAT, the amount of the "Timbre de prensa" is included in the unit price, but it should not.
**Cause 2:**
Depending on the sequence of the taxes, the "Timbre de prensa" tax can be declared before the IVA tax in the XML, which seems to also raise this error.
**Solution 1:**
If there is a "Timbre de prensa" tax, its amount is excluded from the gross unit price that is computed.
**Solution 2:**
Order the IVA taxes first.
opw-5208714This update corrects a potential customer misunderstanding in the Spanish translation of the 'No Tax Breakdown' checkbox within the Mexican e-commerce invoicing process. The original translation was causing confusion, and this change ensures clearer communication regarding tax breakdown options for Mexican customers. This improves the user experience and compliance.
Original PR description
**Steps to reproduce:** - Install l10n_mx_edi_website_sale - Activate "Spanish (Latin America)" language - Go to "Website / Configuration / Settings" - Configure the website: * Company: [a Spanish company] * Languages: [English, Spanish (Latin America)] - With a public user, go the the ecommerce page - Add a product to the cart - Proceed to checkout - Enter an address in Mexico - Continue checkout - When asked for an invoice, select "Yes" - A "No Tax Breakdown" checkbox should appear - Change the language to "Spanish (Latin America)" **Issue:** The Spanish translation of "No Tax Breakdown" is "No sujeto de desglose". Apparently, it can be misunderstood by customers. opw-4302562
This pull request resolves several issues identified during testing of the Sale PDF Quote Builder module. The changes focus on correcting errors in the test suite, ensuring the module functions as intended and improving overall stability. This update doesn't impact the core functionality of the module but strengthens its reliability.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue preventing users from creating valid batch payments to US contacts. The fix ensures the necessary ABA routing number is included in the generated XML files, which is required for successful payment processing. This improves compatibility with US banking systems.
Original PR description
**PROBLEM** Users can't create a valid batch payment to US contacts. The ABA routing number is not included in the created xml. **STEP TO REPRODUCE** 1. Create a us contact, setting up its bank account with an ABA number. 2. Create a batch payment to this contact. 3. Open the xml, and notice it doesn't include the ABA number (should be included in <ClrSySMmbId><MmbId>. this fix backport https://github.com/odoo/enterprise/pull/90378 opw-5727613
This update resolves an issue where ticket buttons in the Helpdesk module were incorrectly identified as links, preventing them from functioning properly. The change ensures buttons are correctly recognized by the editor, improving the user experience when editing ticket details.
Original PR description
Without the `btn` class, buttons are identified as links by the editor. This commit adjusts the buttons inside the mail templates so that they are properly handled by the editor. Steps to reproduce: - Have demo data - Turn on developer mode - Go to Helpdesk > Customer Care - Open ticket "Where can I download a catalog?" - In the debug menu, go to Messages - Open the first template - Click on the "View Ticket" button - Edit the link => The link popover recognized it as a link instead of a button. As of saas-18.2, the style is replaced by a plain link style when changing the URL. task-5948539
A technical issue in the composer was causing errors when users selected mentions. This update corrects a renaming of an internal attribute that was causing the problem, ensuring mentions now function correctly. This improves the user experience when using the composer.
Original PR description
Problem: Opening the composer, typing "@" and selecting any item causes a traceback. Cause: After 8c99b17fcc3a612fd897da9ee29e2f53254d5933, the attribute `channel` was renamed to `thread`. Some code still referenced the old `channel` attribute, leading to errors when selecting mentions. Steps to reproduce: - Open the composer. - Type "@" to trigger mentions. - Select any item from the suggestions. - Observe a traceback. opw-6030307 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where night shift slots (e.g., 20PM - 4AM) weren't correctly displayed in the weekly planning view. The change adjusts how the system interprets multi-day slots, ensuring all scheduled shifts, including those outside standard hours, are accurately shown. This improves the usability of the planning tool for employees with flexible schedules.
Original PR description
**Steps to reproduce** 1. Have an employee using a flexible schedule 2. Create a slot from e.g. 20PM to 4AM for this employee. Make sure this is the only slot that week for the employee. 3. Publish…
**Steps to reproduce** 1. Have an employee using a flexible schedule 2. Create a slot from e.g. 20PM to 4AM for this employee. Make sure this is the only slot that week for the employee. 3. Publish the Schedule and send it to the employee. Open the outgoing mail to access the link to the planning view. Issue: the slot is not visible in the week view. **Cause** https://github.com/odoo/enterprise/blob/04a885dbb6eed96297cb5ce9a155ebf8e169427c/planning/controllers/main.py#L193-L194 The `event_hour_min` and `event_hour_max` returned by `planning_get` and used to control the min/max hours displayed in the week view, didn't account for slots over multiple days. For a slot between 20pm and 4am, the `event_hour_max` should be the end of the day, and the `event_hour_min` should be the start of the day. **Solution** - we change the `event_hour_min` and `event_hour_max` for multi-day slots to display the full days in the week view - the previous point has the drawback of displaying the full days for non-flexible employees even when not necessary. This is because `slots_start_datetime` and `slots_end_datetime` contained the `planning.slot` start and end. Instead, we can look at the actual slot values displayed (by `_get_slots_vals`). For example, a 5 day slot for a non-flexible employee may contain actual slot values corresponding to a typical 8-17 working day. opw-5245985
This update fixes an issue where the Field Service onboarding tour would stop after redirects within the portal. The change ensures the tour state is preserved in the user's session, allowing the tour to resume seamlessly when returning to the Field Service app. This enhances the user experience for new Field Service users.
Original PR description
**Steps to reproduce:**
1. Go to Field Service app.
2. Check the worksheet template in settings and start the onboarding tour
of Field Service.
**Issue:**
The backend tour is not resuming on the frontend side.
**Fix:**
This commit ensures the tour is enabled and the current tour is added to the frontend session. When the tour resumes, it will fetch the tour enabled and current tour details from the session.
**Technical:**
In the tour service, the tour resumes only if the mode is set to "auto" or toursEnabled is present in the session. To handle this, we added the tour details to the session.
tour_service.js
``` js
if (tourState.getCurrentConfig().mode === "auto" || toursEnabled) {
resumeTour();
}
````
task-4489657This pull request resolves a minor issue preventing users from correctly accessing a guided tour within the industry_fsm_report module. The fix ensures the tour functionality is properly enabled and accessible, improving the user onboarding experience. This change addresses a reported usability problem.
Original PR description
task-4489657
This update resolves an issue where cancelled vendor bills were incorrectly included in the Sweden (l10n_se) SIE export file. The fix ensures that cancelled transactions are accurately reflected in the General Ledger, aligning the export with the accounting records. This prevents discrepancies in reporting.
Original PR description
Steps to reproduce: - Install l10n_se (Sweden - Accounting). - Create a Vendor Bill with a line using Account 4000 (Cost of goods) for any amount (e.g., 10,000 SEK). - Confirm/Post the bill. - Cancel the bill. - Go to Accounting > Reporting > SIE Export and generate the export for the current year. - Open the downloaded .se file and locate the #RES line for Account 4000. Expected: The balance should be 0.00 (cancelled entries must be ignored, matching the GL). Actual: The cancelled amount (10,000) is incorrectly summed into the exported balance. opw-5901999 Forward-Port-Of: odoo/enterprise#108767
This update fixes an issue where multiple email addresses associated with a contact were being overwritten when creating a helpdesk ticket. The change ensures that all email addresses linked to a contact are correctly captured, improving the reliability of ticket creation and communication. This resolves a potential data loss scenario.
Original PR description
Prerequisites: ------------------------------ 1. Set up incoming mail server with Create a New Record set to Helpdesk Ticket 2. From Settings, create one Alias Domain Steps to reproduce:…
Prerequisites: ------------------------------ 1. Set up incoming mail server with Create a New Record set to Helpdesk Ticket 2. From Settings, create one Alias Domain Steps to reproduce: ------------------------------ 1. Install Helpdesk module 2. Open Helpdesk Team > Settings 3. Inside Channels, Set the mail used for the incoming server and the alias created 4. Set Accept Emails From to Everyone 5. Create a new contact with multiple emails (eg: `a@b.com`, `c@d.com`) 6. From Fiest mail (eg: `a@b.com`), Send one mail to mail set in the helpdesk team alias mail. 7. Open Incoming mail sever > Click on Fetch Now 8. Open Created Contact Observation: ------------------------------ The contact's email field is overwritten. The second email address (e.g. `c@d.com`) is lost Issue: ------------------------------ After `create`, since `partner_email` was stored with a value that differs from `partner_id.email`, the inverse method `_inverse_partner_email` kicks in. This is where `_get_partner_email_update()` is called. In `_get_partner_email_update()` `tools.email_normalize()` only handles a single email. When the partner has multiple email, the normalization keeps both, while the ticket email normalizes to just have one mail. The strict `!=` comparison fails, triggering the unwanted update. https://github.com/odoo/enterprise/blob/7c23efafe368787c858db31cec075f642ae6715b/helpdesk/models/helpdesk_ticket.py#L363-L369 Solution: ------------------------------ Instead of comparing the full normalized strings, we should check whether the ticket's normalized email is contained within the set of the partner's normalized emails Note for reviewer ----------------------------- After discussion with the PO (LNA), his opinion is that having multiple email addresses in a single field is not a good practice. This use case is only semi-supported in Odoo, it may work in some cases, but it is not reliable. The recommended approach is to create separate contacts for each email address. That said, we should also avoid automatically clearing or altering the existing value in the field. Based on this, I have implemented a minimal fix that prevents altering the existing value in the field. I am leaving it up to the review to decide whether this fix is worth keeping from a technical standpoint. opw-5478067
This update fixes an issue where the cost of kits was incorrectly calculated in sales orders. Previously, when a kit contained multiple components, the cost was multiplied by the batch size, leading to inaccurate pricing. This change ensures the correct cost is applied, resolving a discrepancy between expected and actual costs.
Original PR description
### Issue: When a kit BoM has `product_qty` > 1 (e.g. 12 Kit X = 12 Comp A + 12 Comp B), the SO line cost after confirmation is multiplied by the batch size. Selling 1 Kit X shows a cost of 360…
### Issue: When a kit BoM has `product_qty` > 1 (e.g. 12 Kit X = 12 Comp A + 12 Comp B), the SO line cost after confirmation is multiplied by the batch size. Selling 1 Kit X shows a cost of 360 instead of 30. ### Cause: The method `_compute_average_price` uses `bom.explode(self, 1)`, which returns raw BoM line quantities for one full batch. It accumulates the total batch cost but returns it without dividing by `bom.product_qty`. ### Steps to Reproduce: - Costing Method = AVCO, Inventory Valuation = Automated - Comp A (cost 10), Comp B (cost 20), Kit X (cost 0) - Kit BoM: 12 Kit X = 12 x Comp A + 12 x Comp B - Create and confirm a SO for 1 x Kit X - Expected SO line cost: 30 - Actual SO line cost: 360 Solution: This fix mirrors the normalization already done in `_compute_bom_price`, which correctly divides by `bom.product_qty` and converts UoMs. opw-5969310 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#253406
This update fixes a persistent problem where Chrome was creating unnecessary temporary files, leading to potential performance issues. By directing Chrome to use its temporary directory as its data directory, we now automatically clean up these files during testing, ensuring a smoother and more reliable testing environment. This resolves a technical issue that could impact test stability.
Original PR description
It's unclear since when or under what configuration exactly, but Chrome(ium?) seems prone to creating directories called `org.chromium.Chromium.*` (or some variant thereof) in the temp dir (some people report them to be prefixed by a `.`) and never clean them. By telling chromium that its tempdir is its data dir, it creates its litter in there, and we remove the entire thing during cleanup, solving the littering. Forward-Port-Of: odoo/odoo#253350
This update fixes an issue where presence notifications were sometimes inaccurate due to stale data. Now, notifications are only sent after a user's presence is fully removed, ensuring the correct 'offline' status is broadcast. This improves the reliability of presence information.
Original PR description
Before this commit, presence channel notifications for unlinked records were sent before the records were actually removed from the database. This caused `im_status` to be calculated using stale data, occasionally resulting in statuses other than "offline" being broadcast. This commit ensures notifications are sent only after the presences have been unlinked, guaranteeing an accurate status. Forward-Port-Of: odoo/odoo#249314
This update resolves an issue where long tax amounts on invoices were causing display problems. The fix ensures tax tables are correctly rendered, regardless of the size of the numbers, improving invoice clarity for users. This enhancement ensures accurate reporting and a better user experience.
Original PR description
This commit aims to: Fix Display issue when the amount is long. task-5162891 Forward-Port-Of: odoo/enterprise#100319
This update fixes an issue where manually adjusted lot quantities during manufacturing order production weren't accurately reflected. The change ensures that the specified quantity on the move line is correctly consumed from the lot, preventing discrepancies in stock levels. This improves the reliability of production tracking.
Original PR description
**Issue** Lots manually indicated on stock move lines can be overridden when producing a Manufacturing Order. **Steps to reproduce** - Create a storable product P tracked by lot - Create two lots for…
**Issue** Lots manually indicated on stock move lines can be overridden when producing a Manufacturing Order. **Steps to reproduce** - Create a storable product P tracked by lot - Create two lots for product P with 2 units each - Create a MO for a product consuming two units P and confirm it - On the raw move, manually set 1 unit for each lot - Click on "Produce All" - Check the move line associated to the product P -> 2 units associated to the first lot consumed instead of 1 unit each **Cause** While producing: https://github.com/odoo/odoo/blob/0fe2023dc57b6cc02bd399d3c8fc5d6c8ed6e833/addons/mrp/models/mrp_production.py#L2109-L2110 It sets the quantities: https://github.com/odoo/odoo/blob/0fe2023dc57b6cc02bd399d3c8fc5d6c8ed6e833/addons/mrp/models/mrp_production.py#L2246 This calls `_set_quantity_done_prepare_vals` with a qty of 2: https://github.com/odoo/odoo/blob/0fe2023dc57b6cc02bd399d3c8fc5d6c8ed6e833/addons/stock/models/stock_move.py#L2264 which will, for each move line: - Take the quantity indicated by move line: https://github.com/odoo/odoo/blob/0fe2023dc57b6cc02bd399d3c8fc5d6c8ed6e833/addons/stock/models/stock_move.py#L2274 https://github.com/odoo/odoo/blob/0fe2023dc57b6cc02bd399d3c8fc5d6c8ed6e833/addons/stock/models/stock_move.py#L2296-L2297 - Then take all the available quantity left for the lot associated to the move line: https://github.com/odoo/odoo/blob/0fe2023dc57b6cc02bd399d3c8fc5d6c8ed6e833/addons/stock/models/stock_move.py#L2302-L2309 https://github.com/odoo/odoo/blob/0fe2023dc57b6cc02bd399d3c8fc5d6c8ed6e833/addons/stock/models/stock_move.py#L2326-L2327 Instead of first taking all the quantity indicated by the move line, before checking available quantity **Solution** Assume that move lines being created in mrp without changing the producing quantity are manually created opw-[5946439](https://www.odoo.com/web#id=5946439&view_type=form&model=project.task)
This update fixes an issue where manually adjusted lot quantities during manufacturing order production were not accurately reflected. The change ensures that the specified lot quantity is correctly consumed first, resolving discrepancies in product tracking. This improves the reliability of inventory management within the manufacturing process.
Original PR description
**Issue** Lots manually indicated on stock move lines can be overridden when producing a Manufacturing Order. **Steps to reproduce** - Create a storable product P tracked by lot - Create two lots for…
**Issue** Lots manually indicated on stock move lines can be overridden when producing a Manufacturing Order. **Steps to reproduce** - Create a storable product P tracked by lot - Create two lots for product P with 2 units each - Create a MO for a product consuming two units P and confirm it - On the raw move, manually set 1 unit for each lot - Click on "Produce All" - Check the move line associated to the product P -> 2 units associated to the first lot consumed instead of 1 unit each **Cause** While producing: https://github.com/odoo/odoo/blob/0fe2023dc57b6cc02bd399d3c8fc5d6c8ed6e833/addons/mrp/models/mrp_production.py#L2109-L2110 It sets the quantities: https://github.com/odoo/odoo/blob/0fe2023dc57b6cc02bd399d3c8fc5d6c8ed6e833/addons/mrp/models/mrp_production.py#L2246 This calls `_set_quantity_done_prepare_vals` with a qty of 2: https://github.com/odoo/odoo/blob/0fe2023dc57b6cc02bd399d3c8fc5d6c8ed6e833/addons/stock/models/stock_move.py#L2264 which will, for each move line: - Take the quantity indicated by move line: https://github.com/odoo/odoo/blob/0fe2023dc57b6cc02bd399d3c8fc5d6c8ed6e833/addons/stock/models/stock_move.py#L2274 https://github.com/odoo/odoo/blob/0fe2023dc57b6cc02bd399d3c8fc5d6c8ed6e833/addons/stock/models/stock_move.py#L2296-L2297 - Then take all the available quantity left for the lot associated to the move line: https://github.com/odoo/odoo/blob/0fe2023dc57b6cc02bd399d3c8fc5d6c8ed6e833/addons/stock/models/stock_move.py#L2302-L2309 https://github.com/odoo/odoo/blob/0fe2023dc57b6cc02bd399d3c8fc5d6c8ed6e833/addons/stock/models/stock_move.py#L2326-L2327 Instead of first taking all the quantity indicated by the move line, before checking available quantity **Solution** Assume that move lines being created in mrp without changing the producing quantity are manually created opw-[5946439](https://www.odoo.com/web#id=5946439&view_type=form&model=project.task)
This update resolves a technical error that prevented users from placing lunch orders with vendors when a 'Until date' was set. The fix ensures the system correctly handles date comparisons, preventing a traceback and allowing users to successfully create orders. This improves order processing reliability.
Original PR description
Steps to reproduce: ------------------------------ 1. Install Lunch module 2. Lunch > configurations > Vendors 3. Open any vendor and set Until date to any near future date 4. Go to My Lunch > New Order 5. Click on Any product with above vendor > Add to Cart 6. Click on Order Now Observation: ------------------------------ Traceback Occurs: ``` return not (self.recurrency_end_date and date.date() >= self.recurrency_end_date) and self[fieldname] ^^^^^^^^^ AttributeError: 'datetime.date' object has no attribute 'date' ``` Issue: ------------------------------ `_available_on_date` calls `date.date()` unconditionally, which fails when passed a `datetime.date` object (from `lunch.order`) since date objects lack the `date()` method. Solution: ------------------------------ Check instance type before calling `date()` to handle both `datetime.datetime` and `datetime.date` objects correctly. opw-5948688
This update resolves duplicate notification popups and a critical error preventing push notification subscriptions. By updating Firebase configurations and ensuring proper service worker setup, the system now reliably delivers push notifications across browsers, enhancing the user experience.
Original PR description
When the user sends a push notification through Social Marketing, the application displays two notification popups because: 1. The Firebase SDK automatically displays a notification popup if the…
When the user sends a push notification through Social Marketing, the application displays two notification popups because: 1. The Firebase SDK automatically displays a notification popup if the request made to Firebase includes a `notification` field. 2. Our service worker displays a notification popup when receiving a background message from Firebase. To prevent duplicate notifications, we will remove the custom event listeners in the service worker and update the request made to Firebase so that the Firebase SDK opens a notification for us. Furthermore, this PR fixes the error `Failed to execute 'subscribe' on 'PushManager': Subscription failed - no active Service Worker` occurring when the user accepts the push notifications. To fix that issue, we will: 1. Ensure that the service worker reaches the `ready` state before communicating with it. 2. Set the service worker's scope to `/` so it controls all pages on the origin, ensuring push subscriptions succeed and the worker can communicate with any page. Finally, we will use the legacy `importScripts` syntax to load Firebase dependencies because the ECMAScript module syntax is not supported for service workers in Firefox. This approach improves push notification compatibility across browsers. Task-5124645 Forward-Port-Of: odoo/enterprise#96029
This update fixes errors in the Dutch SBR report exports, specifically correcting VAT identifiers and date formats. It also cleans up the XML formatting for improved readability, ensuring accurate and easily understandable reports.
Original PR description
Descriptions of the issues this commit addresses: The xbrli:identifier tags in the exported sbr and sbr icp files are wrong. They should always contain the company's vat without country code . The DateTimeCreation tag currently shows a date in a wrong format. It it YYYYMMDDhhmm but should be YYYY-MM-DDThh:mm:ss. Also the outputted xml is weirdly indented with many whitespaces and it makes it hard to read for no reason. --- Desired behavior after the commit is merged: This commit changes the values in the exported file to address those issues and adds the use of a cleanup helper to make the file human readable. --- task-5998939 Forward-Port-Of: odoo/enterprise#109359
This update ensures that the 'File' constructor in Odoo correctly identifies the MIME type of uploaded files, aligning with modern web standards. This change, prompted by a Chrome update, improves compatibility and prevents potential issues with file handling across different browsers.
Original PR description
The `type` option passed to the `File` constructor should be a string representing the MIME type of the content that will be put into the file. Chrome 146 actually follows the Fetch Standard and preserve the data URL MIME type parameter. This commit fixes the malformed MIME types passed to the `File` constructor to ensure proper compatibility with pre/post Chrome version 146 (and actually follow the spec). References: - https://chromestatus.com/feature/4874471565557760 - https://developer.mozilla.org/en-US/docs/Web/API/File/File#type runbot-241901 Forward-Port-Of: odoo/odoo#253631
This update ensures Odoo correctly handles file uploads, particularly in older versions of Chrome. The change fixes a technical issue related to MIME types, aligning with web standards and improving compatibility across different browsers. This ensures files are processed correctly and prevents potential display or functionality problems.
Original PR description
The `type` option passed to the `File` constructor should be a string representing the MIME type of the content that will be put into the file. Chrome 146 actually follows the Fetch Standard and preserve the data URL MIME type parameter. This commit fixes the malformed MIME types passed to the `File` constructor to ensure proper compatibility with pre/post Chrome version 146 (and actually follow the spec). References: - https://chromestatus.com/feature/4874471565557760 - https://developer.mozilla.org/en-US/docs/Web/API/File/File#type runbot-241901 Forward-Port-Of: odoo/enterprise#110496
15 changes
Resolved issues and error corrections
This update resolves an issue that occurred when merging customer contacts in the 'l10n_in' module for Russia. Previously, attempting to remove a customer during a merge operation would cause a system error. This fix ensures that the contact merge process functions correctly, regardless of multiple customers being involved, improving data integrity and preventing disruptions to invoicing workflows.
Original PR description
When we select multiple customers and attempt to merge their contacts by removing one of the customers, this error occurs. Steps to reproduce: - Install the 'l10n_in' module - Switch to 'IN company' - Invoicing > Customers >Customers - Go to list view > Select all Customers > Actions > Merge - Click on 'Deco Addict', now come back and remove it - Click on 'Merge Contacts' Traceback:ValueError Expected singleton: res.partner(50, 46, 43, 36) This error occurred at [1] because multiple values are getting in self. This commit will fix the above error by adding it to the loop. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update ensures shift emails are automatically sent in the employee's preferred language, rather than the user's. Previously, the system defaulted to the current user's language, causing confusion. This change improves communication and user experience for employees receiving shift notifications.
Original PR description
Steps to reproduce: ------------------------- 1. Install Planning and Contacts. 2. Install any language other than English (e.g., Arabic). 3. Change an employee's contact language to that language.…
Steps to reproduce: ------------------------- 1. Install Planning and Contacts. 2. Install any language other than English (e.g., Arabic). 3. Change an employee's contact language to that language. 4. Create a shift for that employee and click "Send". 5. Check the message in Settings > Technical > Discuss > Messages. Issue: --------- The email is sent in the language of the current user rather than the language of the employee receiving the shift. Cause: --------- The mail template rendering logic ([_render_lang](https://github.com/odoo/odoo/blob/0dbfa8b99d5c28a7d84e781a7f23b226fd964e95/addons/mail/models/mail_render_mixin.py#L549-L566)) fails to determine a valid language on the planning slot record because it is not directly linked to a `partner_id`. As a result, it falls back to the current user's language. Solution: ------------ Explicitly pass the employee partner's language in the mail context so that the email is sent in the correct language. opw-5928676
This update resolves a bug that prevented users from successfully merging contacts when removing one of the associated customers. The fix ensures the system handles multi-customer contact merging more reliably, preventing data errors and improving the customer management process.
Original PR description
When we select multiple customers and attempt to merge their contacts by removing one of the customers, this error occurs. Steps to reproduce: - Install the l10n_in module - Switch to IN company - Invoicing > Customers >Customers - Go to list view > Select all Customers > Actions > Merge - Click on Deco Addict, now come back and remove it - Click on Merge Contacts -> Traceback: ValueError: Expected singleton ...
This update fixes a vulnerability where email bots were incorrectly triggering meeting cancellations due to links that initiated actions when visited. We've changed the email format to use buttons with post requests, which email bots cannot interact with, ensuring meetings are only cancelled by users.
Original PR description
Mails are sent to users containing an acceptation and cancellation link that accepts GET requests but performs an action on visit Some mail defender software analyzes urls in links by actually visiting the URL. This leads to both actions being triggered without user input. Instead we now send buttons with a neutralizing parameter in the mail. Recipients may then visit the url and click a form button to "accept" or "decline". As these are post requests, the email bots should avoid clicking them. task-4555579
This update fixes a potential issue where Mail Defender services could inadvertently cancel appointments through automated email interactions. A new form has been implemented to replace the original 'cancel/reschedule' link, preventing bots and automated systems from triggering cancellations. This ensures appointments are handled correctly and reliably.
Original PR description
…ointments Mail defender services may click URLs in emails to verify their contents. Additionally they may sometimes interact with the page and visit related pages. For this reason URLs sent in emails should not trigger any action directly nor contain any simple link that could trigger an action. The "cancel/reschedule" anchor URL is replaced with a form which bots should not click. We also port the fix done in appointment to the view in appointment as it replaces the original view in this module. task-4555579
This update ensures that the 'File' constructor in Odoo correctly identifies the MIME type of uploaded files. This change aligns with Chrome's latest standards, improving compatibility and preventing potential issues with file handling across different browser versions. It's a minor fix that enhances the reliability of file uploads.
Original PR description
The `type` option passed to the `File` constructor should be a string representing the MIME type of the content that will be put into the file. Chrome 146 actually follows the Fetch Standard and preserve the data URL MIME type parameter. This commit fixes the malformed MIME types passed to the `File` constructor to ensure proper compatibility with pre/post Chrome version 146 (and actually follow the spec). References: - https://chromestatus.com/feature/4874471565557760 - https://developer.mozilla.org/en-US/docs/Web/API/File/File#type runbot-241901
This update ensures that files created within the Odoo Enterprise system correctly identify their file type (MIME type) when used with older versions of Chrome. The change aligns with modern web standards, improving compatibility and preventing potential issues with file handling in different browsers.
Original PR description
The `type` option passed to the `File` constructor should be a string representing the MIME type of the content that will be put into the file. Chrome 146 actually follows the Fetch Standard and preserve the data URL MIME type parameter. This commit fixes the malformed MIME types passed to the `File` constructor to ensure proper compatibility with pre/post Chrome version 146 (and actually follow the spec). References: - https://chromestatus.com/feature/4874471565557760 - https://developer.mozilla.org/en-US/docs/Web/API/File/File#type runbot-241901
This update fixes a bug preventing the partner autocomplete feature from correctly recognizing valid Non-Resident (NRI) GSTINs. The issue stemmed from an outdated validation rule within the module. The fix ensures that a wider range of valid NRI GSTINs are now accepted, improving data accuracy for users.
Original PR description
Currently, certain `valid GSTINs` for Non-Resident taxpayers are not recognized by the partner `autocomplete` feature. **Steps to reproduce:** - Install the `l10n_in` and `partner_autocomplete`…
Currently, certain `valid GSTINs` for Non-Resident taxpayers are not recognized by the partner `autocomplete` feature. **Steps to reproduce:** - Install the `l10n_in` and `partner_autocomplete` modules. - Navigate to Settings > Users & Companies > Companies. - Click `New` and set `Tax ID` to `9922JPN29001OSU`. - Wait for 5–10 seconds. **Observation:** The partner autocomplete does not trigger, although it is valid and verifiable on the official GST portal: https://services.gst.gov.in/services/searchtp **Root Cause:** The issue was already fixed in core validation by PR [1], but the GSTIN validation logic used in partner autocomplete was not updated. At [2], the GSTIN validation regex for NRI taxpayers only supports formats ending with `NRX` (X = any alphanumeric character). However, certain valid GSTINs follow a revised structure and therefore are not matched by the existing regex. **Fix**: This commit ensures that valid NRI GSTIN formats are accepted during validation by applying a fix similar to [1] to the partner autocomplete GSTIN validation at [2]. Related IAP PR: https://github.com/odoo/iap-apps/pull/1491 [1]: https://github.com/odoo/odoo/pull/251760 [2]: https://github.com/odoo/odoo/blob/3016c08a7aa8701ec9b0092b5aafc282b16dd9f3/addons/partner_autocomplete/static/src/js/partner_autocomplete_core.js#L36-L52
This update fixes a persistent problem where Chrome was creating unnecessary temporary files, leading to potential performance issues. By directing Chrome to use its temporary directory as its data directory, we now automatically clean up these files during testing, ensuring a cleaner and more stable testing environment. This resolves a technical issue that could impact test stability.
Original PR description
It's unclear since when or under what configuration exactly, but Chrome(ium?) seems prone to creating directories called `org.chromium.Chromium.*` (or some variant thereof) in the temp dir (some people report them to be prefixed by a `.`) and never clean them. By telling chromium that its tempdir is its data dir, it creates its litter in there, and we remove the entire thing during cleanup, solving the littering. Forward-Port-Of: odoo/odoo#253350
This update resolves a problem where tours on the website were failing to load translations correctly, particularly with recent Chrome versions. The change introduces a temporary step to ensure translations load before the tour begins, preventing delays and ensuring a smoother user experience.
Original PR description
This commit adds an intermediary step ensuring the proper page has been reached before actually doing the checks and avoiding to let startup requests (like the loading of the translations) pending at the end of the tour (and the eventual stop of the runner browser). Note: this is most likely due to a timing (indeterministic by nature) change, emphasised by recent Chrome versions (like v145). runbot-239128
This update resolves a problem where the website's onboarding tour wasn't loading translations correctly, particularly for tour requests. The change ensures translations load promptly, preventing delays and improving the user experience. This fix addresses an intermittent issue related to timing differences in Chrome browsers.
Original PR description
This commit adds an intermediary step ensuring the proper page has been reached before actually doing the checks and avoiding to let startup requests (like the loading of the translations) pending at the end of the tour (and the eventual stop of the runner browser). Note: this is most likely due to a timing (indeterministic by nature) change, emphasised by recent Chrome versions (like v145). runbot-239128
This update fixes an issue where invoices with exchange differences booked as write-offs were incorrectly fully reconciled even when the user chose to keep the invoice open for partial payment. The change ensures that the system accurately reflects the partial payment and exchange difference, preventing incorrect reconciliation and improving financial reporting.
Original PR description
Currently, if a user selects an exchange difference account as a write-off but then decides to keep the invoice open, the system still fully reconciles the invoice. Steps to reproduce: - Create an invoice in foreign currency - Click 'Register Payment' - Select company currency - Change the amount to a lower one - Select 'Mark as fully paid' - Add the exchange difference loss/gain account as write off account - Select 'Keep open' - Click 'Create payment' Issue: Even though the user selected the option to create a partial payment and keep the invoice open, it is totally reconciled with a difference booked in the selected exchange account. Analysis: This occurs because the use of the exchange account as write off account trigger a specific flow used in localization where a writeoff is not allowed. Once the payment registration process is ongoing, the system does not check that user kept the same choice on how to handle the payment difference. opw-5468052
This update resolves an issue causing duplicate push notification popups and a subscription error. By optimizing Firebase integration and ensuring the service worker is properly configured, the application now reliably delivers push notifications across browsers, enhancing the user experience.
Original PR description
When the user sends a push notification through Social Marketing, the application displays two notification popups because: 1. The Firebase SDK automatically displays a notification popup if the…
When the user sends a push notification through Social Marketing, the application displays two notification popups because: 1. The Firebase SDK automatically displays a notification popup if the request made to Firebase includes a `notification` field. 2. Our service worker displays a notification popup when receiving a background message from Firebase. To prevent duplicate notifications, we will remove the custom event listeners in the service worker and update the request made to Firebase so that the Firebase SDK opens a notification for us. Furthermore, this PR fixes the error `Failed to execute 'subscribe' on 'PushManager': Subscription failed - no active Service Worker` occurring when the user accepts the push notifications. To fix that issue, we will: 1. Ensure that the service worker reaches the `ready` state before communicating with it. 2. Set the service worker's scope to `/` so it controls all pages on the origin, ensuring push subscriptions succeed and the worker can communicate with any page. Finally, we will use the legacy `importScripts` syntax to load Firebase dependencies because the ECMAScript module syntax is not supported for service workers in Firefox. This approach improves push notification compatibility across browsers. Task-5124645 Forward-Port-Of: odoo/enterprise#96029
This update resolves a memory issue that occurred when filtering CRM leads, specifically when searching by email. The change disables prefetching of large fields like descriptions, preventing excessive data retrieval and potential 'MemoryError' crashes. This ensures smoother CRM performance, especially with large lead databases.
Original PR description
Use `with_context(prefetch_fields=False)` when evaluating `filtered('email_normalized')` to prevent the ORM from prefetching a large group of fields. This avoids fetching heavy fields such as…
Use `with_context(prefetch_fields=False)` when evaluating `filtered('email_normalized')` to prevent the ORM from prefetching a large group of fields. This avoids fetching heavy fields such as `description` for the whole batch, as by default all the stored fields share the same prefetch group.
which could lead to excessive memory usage and `MemoryError` during recomputation.
```sql
apan_3928644=> select pg_size_pretty(sum(pg_column_size(description))) from crm_lead where description is not null;
pg_size_pretty
----------------
18 GB
(1 row)
```
MemoryError faced with target db:
```py
File "/home/odoo/src/odoo/17.0/addons/crm/models/crm_lead.py", line 465, in _compute_email_domain_criterion
for lead in self.filtered('email_normalized'):
File "/home/odoo/src/odoo/17.0/odoo/models.py", line 6166, in filtered
return self.browse([rec.id for rec in self if func(rec)])
File "/home/odoo/src/odoo/17.0/odoo/models.py", line 6166, in <listcomp>
return self.browse([rec.id for rec in self if func(rec)])
File "/home/odoo/src/odoo/17.0/odoo/models.py", line 6165, in <lambda>
func = lambda rec: any(rec.mapped(name))
File "/home/odoo/src/odoo/17.0/odoo/models.py", line 6142, in mapped
recs = recs._fields[name].mapped(recs)
File "/home/odoo/src/odoo/17.0/odoo/fields.py", line 1293, in mapped
self.__get__(first(remaining), type(remaining))
File "/home/odoo/src/odoo/17.0/odoo/fields.py", line 1182, in __get__
recs._fetch_field(self)
File "/home/odoo/src/odoo/17.0/odoo/models.py", line 3824, in _fetch_field
self.fetch(fnames)
File "/home/odoo/src/odoo/17.0/odoo/models.py", line 3874, in fetch
fetched = self._fetch_query(query, fields_to_fetch)
File "/home/odoo/src/odoo/17.0/odoo/models.py", line 3967, in _fetch_query
rows = self.env.cr.fetchall()
MemoryError
```
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update ensures our Ecuadorian accounting software accurately reflects the latest withholding tax regulations (Resolución N.º NAC-DGERCGC26-00000009) issued by the Ecuadorian government. The changes involve updating unit tests to use the correct withholding percentages for 2026, ensuring accurate reporting and compliance.
Original PR description
In accordance with the implementation of the new withholding tax percentages according to "Resolución N.º NAC-DGERCGC26-00000009" for Ecuador, following internal implementation guidelines by TRESCLOUD. Unit tests are updated to be based on the new withholding percentages. BP #110343