Daily updates from Odoo
Tuesday, February 10, 2026
46 changes · saas-19.1
Resolved issues and error corrections
This update fixes an issue where TDS report amounts were incorrectly displayed as negative values in version 19.1. The fix adds a necessary negative sign prefix to the report formulas, ensuring TDS amounts are shown accurately as positive values, aligning with previous versions.
Original PR description
**Steps to reproduce:** * Install the **l10n_in** module. * Create vendor bills with applicable **TDS taxes** (e.g. Section **194C**, **194A**, **195**). * Post the bills. * Go to **Accounting → Reporting → TDS Report**. **Observed behavior:** * TDS amounts are displayed as **negative values** across all sections (192, 193, 194A–Q, 195, etc.). * This differs from versions up to **18.3**, where TDS amounts were shown as positive. **Cause:** * In v19, the automatic **+/− sign handling** was removed from the tax grid logic. [REF](https://github.com/odoo/odoo/commit/17a6117ed88c29b5bc4db0c872bcdbc109a7d98b) * TDS report formulas were missing an explicit **negative sign prefix**, causing amounts to appear inverted. **Fix:** * Add the required **negative sign prefix** to all TDS section formulas in `account_tax_report_tds_data.xml`. * Ensures TDS amounts are displayed as **positive values**. * Applies to all TDS sections. opw-5502385 Forward-Port-Of: odoo/odoo#247123
This update resolves an issue preventing users with restricted company access from successfully reloading translations. The fix bypasses a privilege check on static data retrieval, allowing the translation reload process to continue. This ensures a smoother experience for all users, regardless of their company access permissions.
Original PR description
When a user doesn't have access to all companies, he couldn't reload the translation terms. However, the exception occurs in the call to _get_chart_template_data, which doesn't especially require privileges, because it is static data. With this commit, we bypass the lack of company access to retrieve this data, and let the user continue the language reloading process. Task-id: [5916490](https://www.odoo.com/odoo/project.task/5916490) Forward-Port-Of: odoo/odoo#247602 Forward-Port-Of: odoo/odoo#247540
This update resolves an error that occurred when disabling a module (like 'Snailmail') and sending an invoice. The issue stemmed from how Odoo stores company-dependent selection values in its database. The fix ensures accurate comparisons during module removal, preventing the error and allowing invoices to be sent correctly.
Original PR description
Currently, an error occurs when a company-dependent selection field (e.g. invoice sending method) keeps a value after the related module is uninstalled. **Steps to Reproduce:** 1. Install the…
Currently, an error occurs when a company-dependent selection field (e.g. invoice sending method) keeps a value after the related module is uninstalled. **Steps to Reproduce:** 1. Install the Accounting app. 2. Disable 'Snailmail' from settings. 3. Send any invoice, make sure wizard Print & Send has selected "by Post" option. 4. Click on the Send button. **Error:** `AssertionError` **Cause:** Fields defined with `company_dependent=True` are stored as property fields rather than regular values. In PostgreSQL, these fields are stored as **JSONB** values keyed by company id. When a selection value is removed (e.g. during module uninstallation), it attempts to compare the JSONB column directly with a string value, resulting in an invalid comparison and triggering the error. - [1] **Fix:** Update the SQL query to extract the value for the active company using JSON operators (->>), ensuring correct comparison with the expected selection value. [1] - https://github.com/odoo/odoo/blob/92a9f6b19670685dfe9fb1714bf01449768e5f62/odoo/addons/base/models/ir_model.py#L1812-L1815 sentry-6970900918 Forward-Port-Of: odoo/odoo#246671 Forward-Port-Of: odoo/odoo#241248
This update resolves a technical issue preventing the correct Open Graph description from being generated for card campaigns when previewing or sharing. The fix ensures that campaign details are properly displayed on social media platforms, improving campaign visibility and user experience. The problem stemmed from a discrepancy in how campaign data was passed to the template.
Original PR description
**Current Behavior:** description is not available for the Crowler <img width="1159" height="802" alt="image" src="https://github.com/user-attachments/assets/2979f413-6487-4f44-993c-b9a806e0d0ef" />…
**Current Behavior:** description is not available for the Crowler <img width="1159" height="802" alt="image" src="https://github.com/user-attachments/assets/2979f413-6487-4f44-993c-b9a806e0d0ef" /> **Steps to reproduce:** 1. Install `marketing_card` 2. Create a card campaign 3. Set Recipient, Post Link and Post Suggestion 4. Save and Preview 5. Copy the URL and replace `preview` with `redirect` 6. To reproduce in locale, in the `contoller` make the marketing_card.card_campaign_crawler template the only return 7. Now paste that URL in the browser **Issue** - The `<meta property="og:description">` tag is empty in inspect. It does not contain any content **Cause:** - The controller `card_campaign_redirect` passes the campaign's suggestion text to the view using the key `post_text`. However, the template `card_campaign_crawler` attempts to access `post_suggestion`, which is not present in the rendering context. **Solution:** - Update the controller to pass `post_suggestion` opw-5351041 Forward-Port-Of: odoo/odoo#238534
This update fixes an issue where the value of inventory movements wasn't correctly reflecting the cost of the lot when adding quantities through the physical inventory process. The fix ensures that the move's value now accurately uses the lot's standard price, leading to more precise inventory tracking and cost calculations. This improves the reliability of stock valuation.
Original PR description
**Problem:** when adding quantities to a lot via the physical inventory the move created, uses the standard_price of the product and not the standard_price from the lot even if the product is valued…
**Problem:** when adding quantities to a lot via the physical inventory the move created, uses the standard_price of the product and not the standard_price from the lot even if the product is valued by lot. **Steps to reproduce:** - create an avco perpetual product, tracked and valued by lot - confirm a PO for a quantity of 1 and a price of 10 - on the picking set the lot as 'lot1' and validate the picking - confirm a PO for a quantity of 1 and a price of 16 - on the picking set the lot as 'lot2' and validate the picking - open "Inventory/ Operations/ Adjustments/ Physical Inventory" - on the quant line of the lot1 change the quantity from 1 to 2 and apply - open the product form **Current behavior:** the move created has a value of 13 (the standard price of the product), so : 1) the standard price of the product is still at 13 2) if you select the smart button for lots/serial number and select lot1 you can see that the new cost is 11.5 **Expected behavior:** the move created should have a value of 10 because we added a quantity without specifying a cost in a lot which has a value of 10, so: 1) the standard price of the product should now be 12 2) the cost of the lot should stay 10 **Cause of the issue:** when calling _get_value_data on the move, and that we use _get_value_from_std_price (because there is remaining_qty after previous steps), https://github.com/odoo/odoo/blob/555df96ac87a51405767c32f0396f762d458fd29/addons/stock_account/models/stock_move.py#L382-L384 inside _get_value_from_std_price, we use the standard price of the product https://github.com/odoo/odoo/blob/555df96ac87a51405767c32f0396f762d458fd29/addons/stock_account/models/stock_move.py#L450-L452 But if : - the product is valued by lots, - we're not in the case where we want to call _get_standard_price_at_date (when the product is standard_price and at_date is set) in this case we should use the standard_price of the lot **fix** in case there is multiple lots on the move, we stay with the standard_price of the product because it's not clear that a weighted average would be better opw-5898837 Forward-Port-Of: odoo/odoo#247437
This update resolves a technical problem with the invoice report's HTML generation, specifically related to how payment terms were displayed. The fix ensures the report renders correctly and avoids potential errors. A new structure was also added to allow for future customization of the invoice terms.
Original PR description
This commit fixes an issue from report_invoice_document. In the “show_payment_term_details” t-if, there was a single td containing the `invoice_payment_term_id`. In another module,…
This commit fixes an issue from report_invoice_document. In the “show_payment_term_details” t-if, there was a single td containing the `invoice_payment_term_id`. In another module, `l10n_gcc_invoice`, we use this td in the following xpath: ```xml <xpath expr="//div[@id='total_payment_term_details_table']//td" position="before"> ``` The problem is that a td cannot be used outside of a table, which will cause incorrect HTML to be generated and therefore prevent Studio from working on it. One solution would be to replace the incorrect td with div, add a class `early_payment_discount` to it, and create a new customization that would target this time ```xml <xpath expr="//div[@id='total_payment_term_details_table']//div[@id='early_payment_discount']" position="before"> ``` In order not to break the current customization targeting the old incorrect td, we keep it but this time in a correct `table/tbody/tr/` and we do not display it in the final report. This will be removed in master. A new `oe_structure` has also been added below the Terms to allow people who want to add a field below to do so, as this is currently not possible. The only way to do this is to add a modification to the terms, which will only be displayed if this field is not empty because it is in a t-if. opw-5248145 opw-5879285 opw-5410727 opw-5476981 opw-5381578 opw-5369618 opw-5485437 opw-5498946 opw-5331519 Forward-Port-Of: odoo/odoo#235969
This update resolves security issues related to copying spreadsheets and dashboards. It simplifies the process by removing unnecessary security checks, allowing users to copy documents without requiring excessive permissions. This enhances usability and reduces potential security risks.
Original PR description
In order to be able to copy a spreadsheet or a dashboard on which the user has access to, without requiring a bunch of extra security rights, this fix removes the need to - when copying a dashboard, the copy of the field 'main_data_model_ids' that is only used on standard dashboards, would require the read right on ir_model for no good reasons - when copying any spreadsheety document (spreadsheet, dashboard, etc.) the remove the field spreadsheet_revision_ids from the data sent by the client, so the field security won't be triggered on an empty field 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#236542
This update resolves a stability issue in the CRM's autocomplete feature, specifically when using the 'Partner Autocomplete' service. The fix prevents a crash caused by attempting to scroll to a non-existent element when the autocomplete data is loading asynchronously, ensuring a smoother user experience.
Original PR description
Steps to reproduce: 1. Ensure you have a good amount of contacts set up in your database 2. Ensure that you have an IAP Account setup for the service "Partner Autocomplete" 3. Zoom in on your browser…
Steps to reproduce: 1. Ensure you have a good amount of contacts set up in your database 2. Ensure that you have an IAP Account setup for the service "Partner Autocomplete" 3. Zoom in on your browser to at least 150% AND/OR make your browser window incredibly short 4. Go to the CRM app 5. Go into the form view of an opportunity 6. Type 3 characters or more into the 'Contact' field 7. Observe the error An Unhandled Promise error could occur if, after typing more than 3 characters in an autocomplete field, the dropdown is scrollable, and Partner Autocomplete finishes loading before the normal autocomplete does. In this scenario, normal autocomplete is still loading and has not rendered it's options. This causes a `null` element to be passed [`scrollTo()`](https://github.com/odoo/odoo/blob/555df96ac87a51405767c32f0396f762d458fd29/addons/web/static/src/core/utils/scrolling.js#L80), which causes an error when it tries to access `element.parentElement`. This change ensures that this scenario is properly handled and does not cause the database to crash. opw-5491270 Forward-Port-Of: odoo/odoo#247270
This update adds support for commodity codes (Intrastat, UNSPSC, and CPV) within the account_edi_ubl_cii module. This is crucial for accurate reporting and compliance with international trade regulations when generating export invoices. It ensures our system can correctly classify goods for customs and statistical purposes.
Original PR description
task-5890887 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247499 Forward-Port-Of: odoo/odoo#247025
This update resolves an issue where downpayment invoices generated through POS weren't correctly linked to final invoices, causing errors in invoice printing. The fix ensures accurate referencing of downpayment invoices and proper invoice type codes, improving the accuracy of financial reporting for POS transactions.
Original PR description
Description of the issue/feature this PR addresses: This PR addressed two issues, one related to pos_sale, and the other related to l10n_gcc_invoice that was found during testing. the first and main…
Description of the issue/feature this PR addresses: This PR addressed two issues, one related to pos_sale, and the other related to l10n_gcc_invoice that was found during testing. the first and main issue this PR addresses is that _get_downpayment_lines and _is_downpayment don't work properly on downpayment and final invoices generated in POS since there is no link formed between them through the sale order. the second issue occurs during when printing downpayment invoices that were made through POS. since there is no line.name for the downpayment line. an error pops up due to the dual language logic in place. To reproduce the issue: - install pos_sale & l10n_sa_edi_pos. - configure downpayment product on pos.config - generate an SO and confirm it in the backend - create a downpayment for that SO through POS - settle the SO on the POS or through the backend. - you'll find that the final invoice generated doesn't reference the downpayment invoice - you'll also find that the downpayment invoice doesn't have the correct invoice type code indicating that it's a downpayment. - printing the invoice will also give an error when l10n_gcc_invoice is installed (for the downpayment invoice) Current behavior before PR: xml documents generated from l10n_sa_edi don't carry the correct reference to the downpayment invoice when it's the final invoice. they also don't have the correct invoice type code when it's a downpayment invoice if generated through POS Desired behavior after PR is merged: the methods _get_downpayment_lines and _is_downpayment now correctly identify the downpayment lines & if it's a downpayment respectively. the dual language product name now shows on the invoice pdf without raising an error if line.name is undefined. Task-5135918 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247388 Forward-Port-Of: odoo/odoo#244443
This update fixes unreliable tests related to generating invoices for Malaysian and Taiwanese EDI systems. By explicitly defining tax calculations during invoice creation, the system now produces consistent and accurate invoices, resolving previous test failures.
Original PR description
[FIX] l10n_my_edi: more precise tests Improve reliability of Malaysian EDI module which work with xml files and bills by ensuring that we precise the tax we expect to see in the file when creating the invoice. issue-[237946](https://runbot.odoo.com/odoo/runbot.build.error/237946) related-odoo/odoo#227111 --- [FIX] l10n_tw_edi_ecpay: flaky tests not applying default taxes Improve reliability of Taiwanese EDI module by explicitly declaring taxes on invoice creation. We do this instead of relying on the default taxes to apply as they've caused flaky tests to fail. issue-[238485](https://runbot.odoo.com/odoo/runbot.build.error/238485) related-odoo/odoo#227111 --- runbot-[437842](https://runbot.odoo.com/runbot/bundle/master-l10n-my-edi-fix-tax-tests-437842) Forward-Port-Of: odoo/odoo#247716
This update resolves a bug where breadcrumb traceability was missing when opening projects from sale orders linked to multiple projects after migrating to version 19.1. The change sets the correct action target to 'current', ensuring proper breadcrumb behavior and aligning with standard Odoo record navigation.
Original PR description
Steps to reproduce: 1. Create a db with having 'sale' & 'project' installed in version 16. 2. Create a sale order having linkage to more than single project. 3. Migrate the db to version 19. 4. When…
Steps to reproduce:
1. Create a db with having 'sale' & 'project' installed in version 16.
2. Create a sale order having linkage to more than single project.
3. Migrate the db to version 19.
4. When clicking on the project stat button the breadcrumb traceability will not be there.
Issue:
-> In v16.4 the target defined for the action `project.open_view_project_all` is removed from [here](odoo/odoo@a92d686)
When migrating a database from v16 to v19 and opening projects from a sale order linked to multiple projects, the stat button triggers `action_view_project_ids`, which in turn calls
`project.open_view_project_all` for records having len('projects_ids') > 1 from [here]
(https://github.com/odoo/odoo/blame/19.0/addons/sale_project/models/sale_order.py#L220) Because the persisted target is `main`, breadcrumb traceability will be lost. The issue will arise in the DBs coming from version 16 or lesser. Therefore, it would be necessary to address this immediately and set correct target for window_action for databases >= v17
This commit explicitly sets the action target to `current` to restore proper breadcrumb behavior and align it with standard odoo record.
OPW-5448916
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#244245This update corrects a visual issue with the mega menu on the website, specifically the alignment of toggle elements in desktop views. The fix ensures the mega menu appears correctly when using the 'Hamburger' template, resolving a misalignment that was present in mobile views. This improves the overall user experience for website visitors.
Original PR description
The PR [1] updated the templates for many headers to adapt the nav-item positions in desktop/mobile views. However, the hamburger menu was not updated correctly. In the desktop view, the mega menu toggle elements were not aligned properly (unlike in the mobile view). This commit fixes the PR by adding the necessary <xpath>. Steps to reproduce the issue: - Go to Website - Add a Mega Menu (edit menu) - Click on the header - Set the template to "Hamburger" - Set the text alignment to center for the desktop view => The mega menu toggle is not centered. task-5416632 --------------------------------------------- [1]: https://github.com/odoo/odoo/pull/225672 Forward-Port-Of: odoo/odoo#242475
This update resolves a display issue in the Point of Sale (PoS) system where users entering tip amounts with a comma as a decimal separator would see 'NaN' instead of the correct value. The fix ensures consistent handling of decimal separators during input and display, improving the user experience across different locales.
Original PR description
Steps to reproduce: 1. Set the decimal separator to ',' in Settings. 2. Open PoS, click Add Tip, and type a number followed by a comma. 3. Observe the input field displays NaN.00. Cause: A mismatch exists in how the tip value is handled between display and confirmation: - Display: NumberBuffer provides a localized string (e.g., '0,'). PaymentScreen passes this raw string directly to formatCurrency, which expects a standard numeric value. The internal cast fails on the localized separator, resulting in NaN. - Confirmation: onNewTip correctly uses Odoo's localized parseFloat utility, which handles the separator properly. Solution: Update the formatDisplayedValue callback in PaymentScreen to parse the buffer string using the localized parseFloat before passing it to formatCurrency. opw-5895622
This update fixes an issue where the quantity delivered on sale orders wasn't accurately updated after a partial refund with a 'Ship Later' option. Previously, the system incorrectly reported zero delivered quantities. The fix ensures that delivered quantities are correctly calculated, including those associated with refunded orders, to provide accurate inventory tracking.
Original PR description
The qty_delivered on sale.order.line was not correctly computed when the original order was refunded with a ship later. Steps to reproduce: ------------------- * Create a sale order for 5 quantities of any product * Confirm the sale order * Settle the order in the PoS * At this point the qty_delivered on the sale order line is 5 * Now go back to the PoS and refund partially the order for 3 quantities and use the "Ship Later" option > Observation: The qty_delivered is 0 instead of 2 Why the fix: ------------ We group the pos.order.line by procurement group and then check if all pickings related to these lines are done before adding the qty to the qty_delivered. We also make sure to include the refund lines in the computation opw-5059560 Forward-Port-Of: odoo/odoo#247251 Forward-Port-Of: odoo/odoo#240945
This update simplifies the sales order reporting experience for subscription customers. The 'remaining hours' field, which could be misleading due to recurring delivery cycles, has been hidden when a sales order is linked to a subscription. This ensures a cleaner, more intuitive interface for our subscribers.
Original PR description
This change hides the remaining_hours_so field when the sales order line is linked to a subscription. Unlike standard service or time-based sales orders, where this field reflects the difference…
This change hides the remaining_hours_so field when the sales order line is linked to a subscription. Unlike standard service or time-based sales orders, where this field reflects the difference between the quantity ordered and the quantity delivered, the concept does not translate well to subscription logic. In the context of a subscription, the service is delivered on a recurring period (monthly, yearly, etc.). Delivery quantities continuously accumulate over time, and because the subscription renews indefinitely until cancellation, the “remaining hours” calculation quickly becomes misleading. In many cases it can drift into negative values, giving the impression of an error or over-consumption when, in reality, the subscription is simply following its recurring delivery cycle. To avoid confusing end-users and to maintain a clean, intuitive interface, we hide this field whenever the line is part of a subscription. opw-5246238 Forward-Port-Of: odoo/odoo#247694 Forward-Port-Of: odoo/odoo#241099
This update fixes an issue where the color picker for custom links in Email Marketing was hidden behind the link popover. The change adjusts a sequence number to ensure the color picker always appears above other overlays, allowing users to easily customize link colors. This improves the user experience for creating email campaigns.
Original PR description
Problem: In Email Marketing, the color picker for custom links is hidden under the link popover, making it unusable. Cause: Overlays added in mass mailing use a default sequence of 1050, while the color picker uses the default sequence (50). As a result, the link popover overlays the color picker. Solution: Force the color picker sequence to 1051 (mass mailing default + 1) so it always appears above other overlays, including the link popover. Steps to reproduce: - Open Email Marketing. - Add a link. - Change its type to custom to enable text and fill color options. - Open the color picker to change the text color. - Observe that the color picker is hidden by the link popover. opw-5866997 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246080
This update allows users to switch between Invoice and Credit Note types on already processed accounting documents without needing to export and re-import. Previously, this process was blocked, requiring a cumbersome workaround. This change streamlines the accounting workflow and reduces user frustration.
Original PR description
Previously, switching an Invoice to a Credit Note (or vice versa) on a posted in_()/out_() move raised a blocking error. This forced users to export, delete, and re-import the document with the correct move type. This **PR** relaxes the restriction for posted moves whose sequence has been manually cleared, allowing the `Switch Invoice/Credit Note` action to proceed in that specific case. **task**-5905206 Forward-Port-Of: odoo/odoo#247729 Forward-Port-Of: odoo/odoo#247349
This update fixes an error where tax amounts were incorrectly identified as discounts in the MyInvois XML generated from POS orders. The fix ensures that tax amounts are accurately represented as taxes, aligning with Peppol Malaysia e-invoice specifications. This ensures proper compliance with e-invoice requirements.
Original PR description
The _add_consolidated_invoice_base_lines_vals method computed the gross subtotal using `price_unit * quantity`. When taxes are configured as "Included in Price", `price_unit` contains the…
The _add_consolidated_invoice_base_lines_vals method computed the gross subtotal using `price_unit * quantity`. When taxes are configured as "Included in Price", `price_unit` contains the tax-included amount, but `total_excluded` (used for the discounted amount) is tax-excluded.
This caused the tax amount to be incorrectly reported as an AllowanceCharge (discount) in the MyInvois XML, because:
discount_amount = price_unit * qty - total_excluded
= tax_included - tax_excluded
= TAX AMOUNT (not a discount!)
Example: Product priced at 110 MYR with 10% tax included:
- price_unit = 110 (tax-included)
- total_excluded = 100 (tax-excluded: 110 / 1.10)
- discount_amount = 110 - 100 = 10 ← incorrectly reported as discount
refs:
The cac:AllowanceCharge element in UBL is specifically for discounts and surcharges, NOT for taxes. According to the Peppol Malaysia e-Invoice specification:
https://docs.peppol.eu/poac/my/pint-my-sb/bis/#_allowances_and_charges
https://docs.peppol.eu/poacc/billing/3.0/codelist/UNCL5189/ (For this case we are interested in code 95)
Steps to Reproduce:
1. Configure a tax as "Included in Price" with Malaysia tax type
2. Create a product with that tax.
3. Create POS orders without any discount
4. Generate consolidated invoice and XML
5. XML incorrectly shows <cac:AllowanceCharge> with tax amount as discount
The fix uses `raw_total_excluded / discount_factor` (always tax-excluded) instead of `price_unit * quantity` (may be tax-included), consistent with the parent method:
https://github.com/odoo/odoo/blob/d645361a95037ac580d55e80bcb61d1eeb293efd/addons/account_edi_ubl_cii/models/account_edi_xml_ubl_20.py#L1846-L1876
Ticket [link](https://www.odoo.com/odoo/project.task/5476526)
opw-5476526
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#247267
Forward-Port-Of: odoo/odoo#245535This update fixes a logging issue within the account_edi_ubl_cii module, ensuring that account numbers are now correctly recorded instead of attempting to recreate them. This enhancement improves data accuracy and traceability for financial transactions processed through UBL invoices, contributing to better financial reporting.
Original PR description
--- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247693
A recent change prevented portal users from accessing notifications for other users, causing channel loading errors. This update restores the intended access, ensuring portal users can view notifications as expected. This resolves a functional issue impacting portal user experience.
Original PR description
Since #236998, a sudo access to mail notifications has been removed, which was not intended. Without sudo, if a portal user tries to read some messages containing notifications for other users, it crashes with an access error to `mail.notification`. This change restores that access. Steps to reproduce: - Mention a non portal user in a public channel. - Open that channel as a portal user. - The channel does not load due to an access error to `mail.notification`.
Previously, when a video stream was active during a call within the chat window, call cards would overlap. This commit corrects this issue by ensuring call cards maintain a 16:9 aspect ratio when a video stream is present, improving the visual clarity of the call window. This enhancement ensures a better user experience for calls with video.
Original PR description
Before this commit, when in a call in a chat window and someone in call stream video, the cards were overlapping. This happens because [1] removed the `w-100` on `<video>` which let them have bigger width than imposed by `arrangeTiles`. This change was motivated because the card has aspect ratio of 1 in chat window and this was too small. However the correct fix was to impose the 16:9 ratio on cards when there's at least 1 video stream, which is what this commit does. Task-5917628 [1]: https://github.com/odoo/odoo/pull/241924 Before / After <img width="387" height="607" alt="Screenshot 2026-02-06 at 16 58 51" src="https://github.com/user-attachments/assets/39569572-4eea-4d58-a383-27f9c69e4bb5" /> <img width="386" height="600" alt="Screenshot 2026-02-06 at 16 58 29" src="https://github.com/user-attachments/assets/f9b60e9a-6980-4708-b475-14f9d5a77a36" />
This update resolves a minor calculation error in the Spanish tax (l10n_es) module related to 'Mod 390'. Specifically, it adjusts how balances from certain accounts are incorporated into the tax calculation, ensuring accurate reporting for Spanish businesses. This change was part of a larger effort to improve tax compliance.
Original PR description
In this commit: Fixing 390 computation: - Add balance from 27, 29, 649 and 31 to casilla 33. - Add balance from 28, 30, 650 and 32 to casilla 34. Related PR : https://github.com/odoo/enterprise/pull/105597 task-5732679 Forward-Port-Of: odoo/odoo#247823 Forward-Port-Of: odoo/odoo#245828
This update allows for seamless payment matching between parent and child companies within Odoo. Previously, matching was limited to purchase orders; now, it extends to bills, streamlining financial reconciliation across company structures. This enhancement improves efficiency and accuracy in managing intercompany transactions.
Original PR description
On bills, the `purchase_vendor_bill_id` field already allows matching with cross-company purchase orders. This commit extends this behavior to payment matching. Steps to reproduce: - Create a child company from a parent company. - Create a purchase order in the child company. - Create a bill in the parent company. - In the bill’s payment matching, the child company’s purchase order should be available. opw-5416947 Forward-Port-Of: odoo/odoo#244973
This update resolves an issue where users with the 'account_manager' group were encountering an Access Error when confirming invoices with auto-post enabled. The fix aligns access controls within the system, ensuring these users can properly manage invoice auto-posting functionality. This improves usability for a key user group.
Original PR description
When a user with `group_account_manager` only tries to confirm an invoice with auto post set, he gets an Access Error Steps: - Install only account - Create an invoice, set auto post to 'monthly' for example - Confirm -> AccessError Fix: In the `_check_user_access` method, we align with what we do in the `write` method to set the `is_user_able_to_review` variable opw-5886542
This update fixes a bug where overtime hours weren't accurately calculated for leave allocations. Previously, the system didn't correctly reflect available overtime when creating or modifying leave allocations. Now, the system accurately tracks and adjusts overtime based on the allocation, ensuring accurate overtime deductions.
Original PR description
Issue : - After commit odoo/odoo@6d7f4012cfa06b35089e7557522fcbf658978b37, the `employee_overtime` field in `hr_holidays_attendance` was converted to a computed field on `hr.leave` model to use the…
Issue : - After commit odoo/odoo@6d7f4012cfa06b35089e7557522fcbf658978b37, the `employee_overtime` field in `hr_holidays_attendance` was converted to a computed field on `hr.leave` model to use the new overtime deduction logic. However, the same change was not applied to `hr.leave.allocation` model. Steps to Reproduce: - 1. Create a Leave Allocation for an employee who has extra overtime hours. 2. Set the allocation less than the available extra hours. 3. In 19.0, when saving the allocation and creating a new allocation for the same employee: - The `employee_overtime` value did not update. - Even though the actual extra hours were reduced, the field still showed the old value. Fix: - After this fix, the `employee_overtime` field in `hr.leave.allocation` is computed correctly, reflecting the actual available overtime hours. This commit updates `hr.leave.allocation` by: - Converting `employee_overtime` to a computed field. - Computing its value using `_get_deductible_employee_overtime`. This aligns the overtime computation between leave requests (`hr.leave`) and leave allocations (`hr.leave.allocation`). Before Fix: - <img width="1898" height="659" alt="before_fix" src="https://github.com/user-attachments/assets/e4797a17-1031-4ba7-81c8-9ab09494134d" /> After Fix: - <img width="1902" height="623" alt="after_fix" src="https://github.com/user-attachments/assets/9d592795-20f6-40ce-bf42-a157769589a5" /> opw-5479200 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#245881
This update resolves an issue where clicking on a URL field in a form view unexpectedly opened a modal window. The fix ensures that clicking on the URL itself opens the link directly, without the unwanted modal display. This improves the user experience and prevents unnecessary distractions.
Original PR description
This commit fixes the obtrusive opening of the record's modal when middle clicking on a x2many's url field, in a form view. It applies the same logic as the one used for regular click (letting the url be opened, but not the modal). Note: originally spotted in the Runbot build error's form view (Builds page or Error content...). _Note to reviewers : doesn't look to apply to small screens, but not sure why... Feedback requested :pray:_ Forward-Port-Of: odoo/odoo#247815
This update resolves an issue where the website's 'Click & Collect' functionality didn't consistently show full store opening hours. The change allows users to set opening hours as 'Full Day' for their pickup locations, ensuring accurate availability information is displayed to customers. This improves the customer experience and prevents confusion regarding store operating times.
Original PR description
## Versions 19.0+ ## Issue The website's pick-up in store dialog doesn't show up full opening days. ## Steps to reproduce *Ensure "Click & Collect" is enabled in the Settings* - Go to "Delivery…
## Versions
19.0+
## Issue
The website's pick-up in store dialog doesn't show up full opening days.
## Steps to reproduce
*Ensure "Click & Collect" is enabled in the Settings*
- Go to "Delivery Methods" and edit "Pick up in store":
- Click on the warehouse under the "Stores" tab:
- Change the "Opening Hours" values (set one if needed) by clicking on the internal link:
- Under the "Working Hours" tab, change or add a line with its "Day Period" set to "Full Day" and save.
- Save.
- Ensure the method is "Published".
- Go to the website's shop:
- Look for a product that can be retrieved from the store (e.g. "Chair floor protection");
- Go to checkout and fill forms in until you arrive on the delivery form where you can select a store location:
- Select the warehouse you changed:
- Check the opening hours not displaying the full day's data.
## Cause
`full_day` has been introduced in the calendar via commit 77f860f5d3757e5a56861ac1de95b9ad29ea0dff but its retrieval in `website_sale_collect` was skipped du to `day_period` restrictions. These restrictions exist because we don't want to consider breaks in the opening hours
opw-5904377
Forward-Port-Of: odoo/odoo#247840This update resolves an issue where page options were incorrectly overwritten with default values when website elements (like headers or footers) weren't initially visible on the page. The fix ensures that page options are only saved when the related element is present in the website's display, maintaining user customizations. This prevents unexpected behavior and ensures consistent website designs.
Original PR description
### Issue: When saving a page while elements that use page options are not present in the DOM, the related page options are still saved. This ends up overriding the previously saved values with…
### Issue: When saving a page while elements that use page options are not present in the DOM, the related page options are still saved. This ends up overriding the previously saved values with defaults. ### Steps to reproduce (for the header): 1. Open any website page and enter edit mode. 2. Make sure both the header and footer are visible. 3. Set the header position to 'Hidden'. 4. From the 'Theme' tab, hide the header using the 'Show Header' option under 'Advanced'. 5. Select the footer and hide it using the 'Page Visibility' option. 6. Click on 'Save'. 7. Show the header again from the 'Theme' tab. A similar issue can be reproduced when the breadcrumb is not present on the page. ### Reason: When the relevant element is not present in the DOM, the `getVisibilityItem` method falls back to 'regular'. This fallback value overrides the previously saved option, even though the element was not available to compute its real state. ### Fix: Only compute and save page options related to an element when that element exists in the DOM. task-[5135925](https://www.odoo.com/odoo/action-4043/5135925) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#240065
This change resolves a database error during the KSeF (Polish e-invoice) integration neutralization process. The issue stemmed from a missing column in the 'res_company' table, which has now been corrected by creating a dedicated column for the session key. This ensures smoother database updates and avoids errors during the standard neutralization process.
Original PR description
### Issue: Due to recent [commit] (https://github.com/odoo/odoo/commit/06ff5d42e66b800a7e09a52e9abd51b7fb759cc3) , neutralization of the database is hampered and following error is encountered.…
### Issue:
Due to recent [commit]
(https://github.com/odoo/odoo/commit/06ff5d42e66b800a7e09a52e9abd51b7fb759cc3) , neutralization of the database is hampered and following error is encountered.
Traceback on neutralizing:
```py
odoo.sql_db: bad query: b"-- disable_l10n_pl_edi_integration\n\n-- clear KSeF Credentials\nUPDATE res_company\n SET l10n_pl_edi_certificate = NULL,\n l10n_pl_edi_access_token = NULL,\n l10n_pl_edi_refresh_token = NULL,\n l10n_pl_edi_session_id = NULL,\n l10n_pl_edi_session_key = NULL,\n l10n_pl_edi_session_iv = NULL\n;\n\n-- set test environment parameter\n INSERT INTO ir_config_parameter (key, value, create_date, write_date)\n VALUES ('l10n_pl_edi_ksef.mode', 'test', NOW(), NOW())\n ON CONFLICT (key)\n DO UPDATE SET value = 'test',\n write_date = NOW()\n;"
ERROR: column "l10n_pl_edi_session_key" of relation "res_company" does not exist
LINE 9: l10n_pl_edi_session_key = NULL,
```
Before this commit:
```sql
test_18_pl=> SELECT column_name
FROM information_schema.columns
WHERE table_name = 'res_company'
AND column_name LIKE 'l10n_pl_edi%';
column_name
---------------------------
l10n_pl_edi_certificate
l10n_pl_edi_access_token
l10n_pl_edi_refresh_token
l10n_pl_edi_session_id
(4 rows)
```
After this commit:
```sql
test_18_pl=> SELECT column_name
FROM information_schema.columns
WHERE table_name = 'res_company'
AND column_name LIKE 'l10n_pl_edi%';
column_name
---------------------------
l10n_pl_edi_certificate
l10n_pl_edi_session_iv
l10n_pl_edi_session_key
l10n_pl_edi_access_token
l10n_pl_edi_refresh_token
l10n_pl_edi_session_id
(6 rows)
```
### Solution:
Set attachment=False for the fields `l10n_pl_edi_session_key` and `l10n_pl_edi_session_iv`, ensuring that their columns are created directly on the res.company model instead of being stored as attachments. Eventually, during [neutralizing]
(https://github.com/odoo/odoo/blob/18.0/addons/l10n_pl_edi/data/neutralize.sql#L4-#L10) there won't be any column missing error.
Ticket [link](https://www.odoo.com/odoo/project.task/5751411)
opw-5751411
Forward-Port-Of: odoo/odoo#247130This update resolves an issue where images linked within flex containers (like carousels) would shift left. The fix ensures that image alignment classes are correctly applied to linked images, maintaining their intended positioning. This improves the visual consistency of pages using flex layouts.
Original PR description
Steps to reproduce: - Add an image to a page and align it center or right via options. - Use the link option to wrap the image in a link. - In a flex container (e.g., carousel), the image alignment is lost. Before this commit, the alignment classes stayed on the image while the link wrapper was missing them, so linked images in flex layouts shifted left. After this commit, the link mirrors the image alignment classes when linking or changing alignment, keeping linked images positioned correctly. task-5187840 Forward-Port-Of: odoo/odoo#241721
This update fixes an issue where the XML export for VAT listings in the accounting module was incomplete, only showing the first batch of partners. The change ensures that all partners, regardless of the 'Load More' setting, are included in the generated XML file, improving reporting accuracy.
Original PR description
# Steps to reproduce: * Install **Accounting** and **l10n_be_reports**. * Enable **debug mode**. * Go to **Accounting → Reporting → Belgium → Partner VAT Listing**. * Create invoices with invoice…
# Steps to reproduce: * Install **Accounting** and **l10n_be_reports**. * Enable **debug mode**. * Go to **Accounting → Reporting → Belgium → Partner VAT Listing**. * Create invoices with invoice lines with no product set on it, just a label, so that **more than 10 Belgian partners** appear in the report and ensure each partner has a **VAT number**. * Open the report **Options** tab and set **Load More Limit** to **5**. * Click **Load More** until all partners are visible. * Click **Returns** and create a return for the month you have created invoices for, and submit it. * Download the generated XML. # Observed behavior: * The XML file contains only the first batch of partners. * Partners shown after clicking **Load More** are missing from the export. # Cause: * In v17, the XML export button was defined as: https://github.com/odoo/enterprise/blob/42ef1fe589fc4e7fe4b611736253251c44506578/l10n_be_reports/models/partner_vat_listing.py#L53-L59 * This meant clicking the button would go through the [export_file](https://github.com/odoo/enterprise/blob/42ef1fe589fc4e7fe4b611736253251c44506578/account_reports/models/account_report.py#L4927) method, which sets `options['export_mode'] = 'file'` before calling the export function. The test in v17 explicitly sets `export_mode = 'file'` to simulate what `export_file` does in production. * In v19, the architecture changed: - The XML export is now triggered via the account.return workflow and a submission wizard [1.](https://github.com/odoo/enterprise/blob/19.0/l10n_be_reports/wizard/vat_listing_submission_wizard.py) - The wizard's `print_xml` method calls [_get_closing_report_options()](https://github.com/odoo/enterprise/blob/19.0/account_reports/models/account_return.py#L1601) which does NOT set `export_mode = 'file'`. - The controller then calls `dispatch_report_action(options, file_generator)` directly, bypassing `export_file`. * Why the test changed: - In v17 test: `export_mode = 'file'` was set to mimic the `export_file` → `partner_vat_listing_export_to_xml` flow. - In v19 test: `export_mode = 'file'` should NOT be needed in the test because the fix is to set `export_mode = 'file'` inside `partner_vat_listing_export_to_xml` itself. # Fix: * Enable **export mode** when generating the XML. * Ensures all partners are included regardless of the load limit. opw-5494247 Forward-Port-Of: odoo/enterprise#106134
This update resolves an error that prevented non-employee users from creating expenses from documents. The issue stemmed from a required field (employee_id) not being properly populated when the user wasn't linked to an employee record. The fix now displays a user-friendly error message instead of crashing the system.
Original PR description
Currently an exception is generated when the non-employee user tries
to generate expenses from the documents.
Steps to produce an error:
- Install the `documents_hr_expense` module without demo data
- Delete employee `Administrator`
- Upload any PDF/image file inside the company's `Internal` folder
- Click on the uploaded document and click on the `Create an Expense` button
Error: `ValueError: NotNullViolation('null value in column "employee_id" of ...`
This error occurs because `employee_id` is required when creating an
expense. Since the current user is not linked to an employee record,
`employee_id is` set to false, which causes the issue.
This commit resolves the issue by raising a `UserError` when the current
user is not linked to an employee.
sentry-7192984733
Forward-Port-Of: odoo/enterprise#106649
Forward-Port-Of: odoo/enterprise#104762This update resolves a bug preventing users from installing modules after setting up the SEPA accounting module in Odoo Enterprise. The issue stemmed from a failure to automatically refresh the system's module registry, delaying the actual installation process. This ensures modules install correctly after SEPA configuration.
Original PR description
Encountered this bug while trying to reproduce a bug from one of my ticket. **STEP TO REPRODUCE** On a fresh db with module account_accountant. 1. Create a new company with country set to Belgium. After l10n_modules are install, and the chart template loaded: 2. Try installing a module, and notice you can't. **CAUSE** button_install() doesn't reload the registry, so the sepa modules states are set to `to install` but are not install until the registry is reloaded, which doesn't happen on its own. button_immediate_install() does the same as button_install(), and reload the registry which trigger the actual installation process. Forward-Port-Of: odoo/enterprise#106033
This update resolves a test failure caused by a recent change to the _is_downpayment method. The commit simply adds the necessary update to the test suite to account for this new method extension, ensuring the system continues to function correctly.
Original PR description
The PR odoo/odoo#244443 introduces a new extension to the method _is_downpayment hence the test fails since it is not patched. This commit adds the new extension to the patched list. task-5135918 Forward-Port-Of: odoo/enterprise#106618 Forward-Port-Of: odoo/enterprise#105165
This update resolves an issue where accents in legal names were being removed, preventing proper recognition by Mexican tax authorities (SAT). The fix restores the correct handling of accented characters, ensuring accurate data submission for Mexican e-invoices. This ensures compliance with Mexican tax regulations.
Original PR description
Previus commit (odoo#95207) removed accents for names including character ë which indeed its recognized for SAT opw-5897333 Forward-Port-Of: odoo/enterprise#106557
This update corrects a bug in the salary configurator where the fuel card benefit would incorrectly appear enabled if no company car was chosen. The fix ensures the field is properly initialized and remains disabled until a car is selected, preventing inconsistencies and ensuring accurate reporting.
Original PR description
On first load of the salary configurator, the fuel-card benefit could appear enabled even when no company car was selected. The dependency logic reacted to in-page changes but did not initialize the field correctly on page load. Initialize the fuel-card field from the current car selection and keep it non-selectable until a car is chosen to prevent inconsistent packages. task-5156562 Forward-Port-Of: odoo/enterprise#105037
This update adjusts the taxonomy used for Dutch tax reports to align with the latest NT20 standard. This change ensures continued compliance with Dutch tax regulations and maintains compatibility with older versions of the reporting system. No new functionality was added.
Original PR description
The taxonomy for the Dutch tax reports was updated from NT19 to NT20. There were only changes in the namespaces. Olders versions of the XBRL template are kept for backwards compatibility. task-4568359 Forward-Port-Of: odoo/enterprise#106732
This update resolves an issue where the yearly employer cost calculations in the HR contract salary module were inaccurate. The fix re-introduced a previously reverted change that correctly included representation fees, ensuring accurate cost projections. This improves the reliability of financial reporting.
Original PR description
This PR converted fields/benefits into properties: https://github.com/odoo/enterprise/pull/96385 Then, this PR reverted the changes: https://github.com/odoo/enterprise/pull/101672 But the representation fees benefits was forgotten. This was causing the yearly employer cost to be computed without the representation fees.
This update simplifies the sales order reporting for subscription customers. The 'remaining hours' field, which could be misleading due to the recurring nature of subscriptions, has been hidden when a line is linked to a subscription. This ensures a cleaner, more intuitive experience for our customers.
Original PR description
This change hides the `remaining_hours_so` field when the sales order line is linked to a subscription. Unlike standard service or time-based sales orders, where this field reflects the difference…
This change hides the `remaining_hours_so` field when the sales order line is linked to a subscription. Unlike standard service or time-based sales orders, where this field reflects the difference between the quantity ordered and the quantity delivered, the concept does not translate well to subscription logic. In the context of a subscription, the service is delivered on a recurring period (monthly, yearly, etc.). Delivery quantities continuously accumulate over time, and because the subscription renews indefinitely until cancellation, the “remaining hours” calculation quickly becomes misleading. In many cases it can drift into negative values, giving the impression of an error or over-consumption when, in reality, the subscription is simply following its recurring delivery cycle. To avoid confusing end-users and to maintain a clean, intuitive interface, we hide this field whenever the line is part of a subscription. opw-5246238 Forward-Port-Of: odoo/enterprise#106807 Forward-Port-Of: odoo/enterprise#99813
This update resolves an issue where invoices with note or section lines at the top would cause export errors. The fix filters out these lines during currency rate calculations, ensuring invoices are correctly generated and sent for export. This prevents disruptions in invoice processing and reporting.
Original PR description
Before this commit: Steps 1) Create an invoice with a section or note line as the first line 2) Try to send or download the invoice => A traceback error is raised with the message: File "/home/odoo/src/enterprise/17.0/l10n_cl_edi_exports/models/account_move.py", line 68, in _get_inverse_currency_rate return float_round(abs(self.line_ids[0].balance / self.line_ids[0].amount_currency), 2) ZeroDivisionError: float division by zero This occurs because the `_get_inverse_currency_rate()` method is dividing over self.line_ids[0].amount_currency which is always equal to 0 in case of section or note line is added as a first line in the invoice. After this commit: Filtering out section and note lines in _get_inverse_currency_rate() to correctly calculation the inverse currency rate opw-5488417 Forward-Port-Of: odoo/enterprise#105774
This update fixes a reporting issue related to withholding taxes for Spanish businesses (l10n_es_reports). It ensures that specific tax types (347) are correctly handled in accounting moves, improving the accuracy of financial reports. This change addresses a technical detail impacting Spanish tax compliance.
Original PR description
- Moves that use withholding taxes should have the `type for 347` unselected and left blank. Related PR : https://github.com/odoo/odoo/pull/245828 task-5732679 Forward-Port-Of: odoo/enterprise#106889 Forward-Port-Of: odoo/enterprise#105597
This update resolves a potential instability issue in the document search functionality. The team corrected a programming error that could have resulted in missing context information, leading to errors. This change ensures a more reliable search experience.
Original PR description
**Before this commit** We were accessing the context on the `DocumentsSearchModel` object by using `_context`. This is incorrect because this property is private, and we can't guarantee its structure. In some cases, `_context` can be `null`, causing later issues when we try to access properties from the context. This was likely just a programming error, rather than intentional. **After this commit** We'll use the public API to get the context by accessing `context` on the `DocumentsSearchModel` object. The internals of that getter method can speak for themselves, but they are useful because they will give us a non-`null` context to work with. opw-5903535 Forward-Port-Of: odoo/enterprise#106751
This update simplifies the salary configuration process by hiding temporary offers created by the salary simulator from the user interface. These offers are automatically removed after a month by a scheduled task, so this change only improves clarity and prevents user confusion.
Original PR description
The salary simulator creates temporary offers to compute salary configurations. These offers must still exist for backend computations, as the configurator relies on them when updating results. Simulation offers are already cleaned up by a cron job after one month, so this change simply hides them from the list view to avoid user confusion. task: 5498873 Forward-Port-Of: odoo/enterprise#104493
This update fixes an issue where the system incorrectly calculated employee expenses when both a private and company car were declared as part of the same occupation. The change ensures accurate expense reporting by properly accounting for both vehicle types, improving payroll accuracy and compliance.
Original PR description
…occupation Forward-Port-Of: odoo/enterprise#106865
This update ensures that screenshots taken during the trial mode of Odoo Enterprise capture the correct end-result data. Previously, the system lacked the database URL needed to fetch this data. Now, the database URL is forwarded, allowing for accurate and complete trial mode screenshots.
Original PR description
During the trial flow, we don't know the db url when making the ws request. To still be able to take screenshots of the end result in trial mode, we forward the db_url when getting the result back.