Daily updates from Odoo
Thursday, August 28, 2025
40 changes · saas-18.4
Resolved issues and error corrections
Dutch Peppol invoice XML files now use the correct identifier type when a company ID is 20 characters long. This helps ensure NLCIUS electronic invoices meet Dutch Peppol requirements and reduces the risk of rejected or non-compliant invoice files.
Original PR description
## Short functional explanation of the error For Dutch companies, when downloading the NLCIUS file of an invoice, the schemeID of the companyID in the XML isn't correct. ## Reproduction Steps 1. Make…
## Short functional explanation of the error For Dutch companies, when downloading the NLCIUS file of an invoice, the schemeID of the companyID in the XML isn't correct. ## Reproduction Steps 1. Make sure you use a dutch company: in apps, download the 'l10n_nl' and 'account_edi_ubl_cii' modules. Then, click on your company and select the NL Company. 2. Go to settings and type Peppol. Under Customer Invoices, check the Peppo format. Then, setup a Peppol Endpoint. Hit save. 3. Go to the Accounting app and click on the customers tab, then invoices. Click on new. 4. Select a customer. Make sure that the customer is from the Netherlands, has an email address, and in the accounting tab, an account number. Still in the accounting tab, under Electronic Invoicing, set the format at NLCIUS, set a Peppol e-address and a Peppol Endpoint that is 20 characters long. 5. Add a product, click confirm then Send & Print. Make sure that NLCIUS is well checked and click again Send & Print. 6. In the bottom right corner of the page, just under the Amount Due, there's a paper clip icon. Click on it and you'll see the XML. Download it. ### Expected behavior As the CompanyID is 20 characters long, the schemeID next to the CompanyID should have the value of 0190. ### Unexpected behavior If you scroll a bit, you'll see that the SchemeID next to the CompanyID has a number of 0106. ## Origin of the issue In the code, the SchemeID will have a value of 0190 if the CompanyID is 9 characters long. __ opw-4943262 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#219771 Forward-Port-Of: odoo/odoo#219424
This fixes a case where unbuilding a completed manufacturing order could be incorrectly blocked if component products were later changed to require lot or serial tracking. Businesses can now reverse eligible manufacturing orders without unnecessary errors, while existing lot tracking rules remain in place for components that were tracked at the time of production.
Original PR description
**Description of the issue/feature this PR addresses:** This PR fixes a regression when using the _Unbuild_ feature on a previously completed `mrp.production` whose components did not originally…
**Description of the issue/feature this PR addresses:** This PR fixes a regression when using the _Unbuild_ feature on a previously completed `mrp.production` whose components did not originally require tracking (no lot/serial), but have been updated later to require it. When unbuilding such a product, `stock.move.line._action_done` currently raises a UserError requiring a lot/serial number, because the component moves created by `mrp.unbuild`: - do not have a picking_type_id, - are not inventory moves, - are not scrap moves, - and lack lot/serial information. However, in this context, the lot requirement is misleading, as the original `mrp.production` did not generate tracked components. It is valid to restore untracked components even if they are now tracked. **Current behavior before PR:** - Create an `mrp.production` for a product with untracked components. - Complete the production. - Later, enable lot tracking on one or more of the original components. - Attempt to unbuild the production. - ❌ Error is raised: “You need to supply a Lot/Serial Number for product…” **Desired behavior after PR is merged:** - The unbuild operation proceeds without error. - The untracked components are restored correctly. - Behavior remains unchanged for tracked components that did require lot info during the original MO. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222612 Forward-Port-Of: odoo/odoo#217282
This fixes an error that could occur when a live chat guest was connected to more than one discussion channel and then changed their display name. Users can now update guest names without interrupting the chat experience or causing a system traceback.
Original PR description
Guests linked to more than one discuss channel cause a traceback when their name is updated. Steps to reproduce the error: - Install ``website_livechat`` module with demo data - Login in as…
Guests linked to more than one discuss channel cause a traceback when their name is updated. Steps to reproduce the error: - Install ``website_livechat`` module with demo data - Login in as ``Mitchell Admin`` in one tab - Open Incognito Tab, start a conversation via the ``livechat`` button twice. - Switch back to Mitchell Admin Tab > Open that latest discuss channel > Invite People > Copy Link > paste the link into the same incognito tab - Edit the guest name (top-right corner) Traceback: ``AssertionError: channel should be empty or should be a single record: discuss.channel(5, 7)`` When the guest starts two separate conversations, two discuss.channel records are created. https://github.com/odoo/odoo/blob/f4bd509a8c828596db5aacd42099224ad9f54007/addons/mail/models/discuss/mail_guest.py#L81 During the guest name update, ``self.channel_ids`` contains multiple channels. This triggers an error from the below line. https://github.com/odoo/odoo/blob/f4bd509a8c828596db5aacd42099224ad9f54007/addons/mail/tools/discuss.py#L298-L300 sentry-6803396766 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update stabilizes an automated test for website editor keyboard shortcuts that was failing intermittently. It helps keep quality checks dependable so website-related changes can be validated without false alarms.
Original PR description
The test "Hotkeys on Theme and Blocks tab" started failing often, probably because it sometimes didn't wait enough time between the hotkey press and the `expect` check. runbot-231360
The Italian localization now uses the updated €100 threshold for the VP7 line in monthly tax reports, replacing the previous €25.82 amount. This keeps Italian tax reporting aligned with the latest requirements and helps avoid incorrect report values.
Original PR description
While implementing the modulo tag of the tax report xml export, it came to light that the vp7 line of that report which previously used a 25,82€ threshold has been changed for one at 100,00€. This commit adapts the amount across the module. --- Enterprise PR: https://github.com/odoo/enterprise/pull/86642 task-4826511 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#224190 Forward-Port-Of: odoo/odoo#216887
Creating a discussion channel with guest members no longer fails when saving. This prevents an error that blocked users from setting up channels involving guests, making collaboration setup smoother.
Original PR description
Currently, an error occurs when creating a channel that includes guest members. Steps to Reproduce: - Install the `mail` module. - Go to `Channels > New`. - Fill in the `channel name` and `Under…
Currently, an error occurs when creating a channel that includes guest members. Steps to Reproduce: - Install the `mail` module. - Go to `Channels > New`. - Fill in the `channel name` and `Under Members`, add a member with a `guest`, and `save`. `KeyError: 'partner_id'` This error occurs when a user creates a channel and adds a guest in the Members section. This error occurs after [this commit]( https://github.com/odoo/odoo/commit/ad612321bcafe6dfdaabf3aa37f26af364185a69), where the partner_id and guest_id fields dynamically become readonly [1], so that if only the guest is entered, the partner becomes readonly, and when the record is created, the partner_id key does not exist, and raises the error [2]. This commit ensures that the partner_id is accessed only if it is present in the record. [1]- https://github.com/odoo/odoo/blob/5bddf9bfb634d09d3264e4fe4734d75f1083775a/addons/mail/views/discuss_channel_views.xml#L87-L88 [2]- https://github.com/odoo/odoo/blob/5bddf9bfb634d09d3264e4fe4734d75f1083775a/addons/mail/models/discuss/discuss_channel.py#L235 sentry-6791956423 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222211
This fixes a chat composer issue where pressing Enter to choose an IME text suggestion could accidentally send the current draft message. Users typing with input methods for languages such as Chinese, Japanese, or Korean can now confirm suggestions without unintended messages being posted.
Original PR description
Before this commit, pressing ENTER to pick a composition suggestion from IME in a discuss channel composer would send a message with the current content of composer. This is definitely not the intended behavior: it should change the composing text by the IME software but the send on ENTER press should not happen while the text is in composing. This commit fixes the issue by adding condition for composing text. Task-5043396 Forward-Port-Of: odoo/odoo#224538 Forward-Port-Of: odoo/odoo#224265
This fixes an error that could occur when a sales order form included multiple linked invoices and a user made a change that refreshed the form. Users can now edit those sales orders without seeing a blocking traceback, improving reliability for customized workflows.
Original PR description
**Step to reproduce** - create a SO - link 2+ invoices to it - using studio, add invoice_ids to the SO Form - trigger a onchange (ex. change the product from SOL) - we receive a traceback…
**Step to reproduce** - create a SO - link 2+ invoices to it - using studio, add invoice_ids to the SO Form - trigger a onchange (ex. change the product from SOL) - we receive a traceback **Traceback:** ```ValueError: Expected singleton: account.move(<NewId origin=35>, <NewId origin=31>, <NewId origin=32>, <NewId origin=33>, <NewId origin=34>)``` **Issue:** - from `onchange` triggers chain,`_compute_duplicated_ref_ids` is invoked calling `_fetch_duplicate_reference` for the related moves (invoice_ids) such that as they are in create/edit mode - at this time `convert_to_write(moves[field_name], moves)` fails as moves has more than 1 record and `recordset[field]` is not valid syntax in such case https://github.com/odoo/odoo/blob/3966753eb5a8534c8b5b8a16e626f5250c9013cf/addons/account/models/account_move.py#L1868-L1884 - hence, we receive valueError, expecting a singleton **Fix;** - we adapt the method to accept multiple moves which may be in create/edit mode opw-4959528 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#223513
Updating a product’s on-hand quantity after requesting an inventory count with an accounting date now works correctly. The accounting date is recorded in the stock move reference, preventing the previous save error and keeping inventory valuation context available.
Original PR description
Problem: When trying to update a product’s quantity after requesting a count with an accounting date set, you get an error. This error occurs because the name field was removed from the stock move model. Purpose: To have the accounted on date information set on the stock move’s reference field instead of the name field. Steps to Reproduce on Runbot: 1. Navigate to Inventory > Operations > Physical Inventory. 2. Select a product in the list view and click on Request a Count. 3. Set the Accounting Date in the wizard. 4. Navigate to the product and try to update the on-hand quantity. 5. Once you save the updated on-hand quantity you will receive an error. opw-5009967 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Website Builder header border and rounded corner settings now visibly apply as expected. This helps users customize site navigation styling without workarounds or confusing ineffective controls.
Original PR description
Setting a border or round corners value on the header were not taking effect header because the proper css variables were not updated. This commit ensures the correct css variables are updated. Steps to reproduce: 1. Enter edit mode in Website Builder. 2. Select the navbar and change its border or round corners value. 3. Notice that the changes have no visible effect. Related to task 4367641.
Point of Sale product searches now return both product variants and regular products that match the same search terms. This prevents cashiers from missing the intended item when a variant name overlaps with another product name, improving checkout accuracy.
Original PR description
If you have a product template with variant, ex: Telephone case, variant name : Iphone 15 SE, Samsung Galaxy, Nokia 1999 When doing a search with more then 2 letters you will only find the Telephone…
If you have a product template with variant, ex: Telephone case, variant name : Iphone 15 SE, Samsung Galaxy, Nokia 1999 When doing a search with more then 2 letters you will only find the Telephone case, searh exemple: Iphone 15 SE, Galaxy, Samsung. ** Step to reproduce ** - Create a product called "Telephone case" and add a variant named samsung galaxy S24 ultra - Create a product called "Samsung galaxy" - Enable both products for point of sale - Go to the point of sale app and open a shop that sells both of those products. - Do a search for the product Samsung galaxy - Issue : Only the product "Telephone case" will appear. ** Cause of the issue ** Doing a search will call getProductsBySearchWord: https://github.com/odoo/odoo/blob/5a1fff2cc61bd8676049879039defa3fb2a3f13d/addons/point_of_sale/static/src/app/services/pos_store.js#L2401-L2407 During the product.exactMatch(words) we will get a hit since we will have a name of the product variant: https://github.com/odoo/odoo/blob/5a1fff2cc61bd8676049879039defa3fb2a3f13d/addons/point_of_sale/static/src/app/models/product_template.js#L265-L278 And the call for the function will finish there since the searchword lenght > 2 and we have a hit. ** Origin of the issue ** The variant search was implemented in "exactMatch()" which block more search if it find a result. https://github.com/odoo/odoo/commit/05abd586d7adcceed3dae0943526e6357b28dbb4 opw-4864976 Forward-Port-Of: odoo/odoo#217484
The two-factor authentication test flow now waits for page elements to be ready before continuing. This reduces false test failures caused by timing issues, helping keep quality checks stable without changing the user experience.
Original PR description
Added wait steps in the TOTP flow tests to ensure that UI elements are fully loaded and ready this should help to avoid race conditions in the tests. build_error-107908 Forward-Port-Of: odoo/odoo#219260
This fixes an issue where inherited property fields could show incorrect or missing values after cached data was unavailable. The change helps keep related business data consistent and reliable when records are loaded or recalculated.
Original PR description
inherited properties should be computed from its related field after cache miss 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#224550 Forward-Port-Of: odoo/odoo#224359
Printing long reception reports now keeps each table row together on a single PDF page. This prevents cut-off lines in warehouse reception documents, making printed allocation reports easier to read and use.
Original PR description
### Issue: - In the settings enable reception report. - Create a storable product with a product name of length 60. - Create and confirm a delivery with 20+ lines of 1 x that product. - Create and…
### Issue: - In the settings enable reception report. - Create a storable product with a product name of length 60. - Create and confirm a delivery with 20+ lines of 1 x that product. - Create and confirm a PO with 20+ lines referring to 1 x that product. - Validate the receipt > Allocation smart button > Assign all. - Click on print and open the PDF. #### > The last row of the first page is cut in half at the end of the page and the beginning of the next one. ### Cause of the issue: The class `o_report_reception` is used both in the view of the reception report `ReceptionReportMain`: https://github.com/odoo/odoo/blob/25b8e651c439d688bd05dd0d9619d74fa749597d/addons/stock/static/src/components/reception_report_main/stock_reception_report_main.xml#L16 and its printed version: https://github.com/odoo/odoo/blob/25b8e651c439d688bd05dd0d9619d74fa749597d/addons/stock/report/report_stock_reception.xml#L43-L44 However, when the report becomes too big (many lines), the class did not allow the user to scroll down the view and a fix has been implemented adding the overflow-y style to the class see https://github.com/odoo/odoo/commit/d8a19285939fb31f6d34290cb8138d402e93024b https://github.com/odoo/odoo/blob/25b8e651c439d688bd05dd0d9619d74fa749597d/addons/stock/static/src/scss/report_stock_reception.scss#L3 The issue being that wkhtmltopdf relies on the size of the table to determine if a row should be displayed on a page or an other one and if you can scroll down he will apparently not do his job correctly. opw-4824221 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#224434
Fixes a website editor crash that could happen when saving links in mega menus using the Cards template. The update ensures only real text color styles are treated as colors, preventing formatting classes from triggering an endless error loop.
Original PR description
Steps to Reproduce: - Open the website. - Create a mega menu. - Enter edit mode. - Change the mega menu template to “Cards”. - Click on any option available in the mega menu. - A link popover will…
Steps to Reproduce: - Open the website. - Create a mega menu. - Enter edit mode. - Change the mega menu template to “Cards”. - Click on any option available in the mega menu. - A link popover will open. - Click the Edit link button in the popover. - Click the Apply button to save the link. - A traceback occurs. Description of the issue: The error occurs because the text-wrap class is applied to the link. When the `hasColor` method is triggered, it checks whether **a.nav-link** has a text color class. However, `TEXT_CLASSES_REGEX` incorrectly matches **text-wrap** as a color class. As a result, the removeColor method attempts to remove it and triggers `_applyColor` to remove the color, but in `_applyColor` method it does not find any color to remove on selected text. As a result, the `removeColor` process enters an infinite loop, which eventually leads to a traceback. Solution: Update `TEXT_CLASSES_REGEX` so that it only matches valid text color classes and excludes formatting classes such as text-wrap, text-center, etc.
Saudi Arabia point-of-sale receipt QR codes now show the local KSA time instead of UTC. This keeps the scanned QR code time aligned with the printed receipt and supports ZATCA e-invoicing expectations.
Original PR description
**Problem:** If you have an SA company, and try to scan the QR code generated on the receipt, the time will be the UTC time instead of the KSA time, as we are in SA. **Steps to reproduce:** - Change your company to SA and install l10n_sa_pos - Make a purchase with a customer from SA - Scan the QR code from the receipt using an app such as E-invoice QR reader - The invoice date will be the UTC time, or 3 hours less than it should **Why the fix:** Before this fix, the time was always displayed as UTC. It could have been correct if it also displayed a 'Z' in the end, to indicate that it is not local KSA time. We now directly change it using the KSA time, to respect the ZATCA guidelines. The time is now the same on the printed invoice and in the app when scanning the QR code. opw-4769521 Forward-Port-Of: odoo/odoo#223348 Forward-Port-Of: odoo/odoo#216640
The website editor’s header border setting now works again after being broken by the new page-building tools. This lets users reliably adjust the look of website headers without needing technical help.
Original PR description
The border option for the header was broken during the implementation of the new html_builder. This commit restores the option by fixing the related action. task-4367641
Website editors can now resize text boxes in newly added floating cards without triggering an error. This fixes a setup issue in the card structure, making page editing smoother and reducing interruptions for content teams.
Original PR description
Steps to reproduce: - In "Website" app. - Create a "Floating cards" block using website editor. - Add a new card. - Adjust the text box size. - Error occurs. It was due to the XML structure of the new card, which was incorrect and caused the resize to crash in "grid" mode. opw-5027795 Forward-Port-Of: odoo/odoo#224426
Manufacturing orders created from sales demand now remain in draft when their bill of materials has no components or operations. This prevents empty orders from being confirmed too early, giving users time to add the needed production details before proceeding.
Original PR description
Issue Before This Commit: ============================ Currently, if a BOM has `no components or operations` and is triggered via `MTSO`, the generated Manufacturing Order (MO) is automatically set to a `confirmed` state. This behaviour is inconsistent and not meaningful, as there's nothing to produce or track. Steps to Reproduce: ============================ - Install the `mrp and sale` module. - Enable MTSO route. - Create a product with a BOM that has `no components or operations`. - Create a sale order for that product. MO is created in a `confirmed` state. With This Commit: ============================ This commit ensures that MOs triggered via `MTO(Already worked) or MTSO` are created in draft state if their BOM has no components and no operations. This allows the user to manually add required details before confirming the MO. supporting custom use cases. TaskID:- 4920195 Forward-Port-Of: odoo/odoo#221844
The Spanish SME balance sheet no longer double-counts certain current financial investment accounts. This ensures investment totals match the underlying accounting entries, improving accuracy for Spanish financial reporting.
Original PR description
**Issue**: * Amounts were exactly doubled in 'Current financial investments' (line 12500) in the Spanish Balance Sheet - SMEs report as account codes 551 and 5525 were incorrectly included in…
**Issue**: * Amounts were exactly doubled in 'Current financial investments' (line 12500) in the Spanish Balance Sheet - SMEs report as account codes 551 and 5525 were incorrectly included in balance_pymes_line_12500_sub_balances formula **Root Cause**: * Account codes 551 and 5525 were included in BOTH: 1. Line 12500 sub_balances (unfiltered account_codes expression) 2. Line 12500 sub_debits (domain expression with sum_if_pos filter) * This double-counting within the same line caused financial investment amounts to appear twice in the balance sheet **How to Reproduce**: 1. Create Spanish company with 'es_pymes' chart of accounts 2. Post journal entries to accounts 551 or 5525 (current financial investments) 3. Generate 'Balance Sheet - SMEs (ES)' report 4. Observe amounts in line 'V. Current financial investments' are exactly doubled compared to account balances 5. Click on the doubled amount - shows underlying transactions sum to half the amount **Fix**: * Removed account codes 551 and 5525 from balance_pymes_line_12500_sub_balances * These accounts are properly handled by the sub_debits expression * Each account is now counted only once within the line opw-4983300 Forward-Port-Of: odoo/enterprise#93052
This fixes an issue that prevented event badges from printing through the badge printer in Point of Sale. Event staff can now print attendee badges from the POS as expected, avoiding manual workarounds during check-in or sales flows.
Original PR description
Due to an oversight in odoo/enterprise#83021, printing badges using the badge printer from POS was not working. This commit fixes the issue by restoring the `badge_format` field to the list of fields loaded in the POS.
The US tax report is now connected to the relevant tax return type. This allows the system to set lock dates automatically, reducing manual setup and helping keep tax reporting controls consistent.
Original PR description
During this pr odoo/enterprise#87346 the US tax report was added. We can link this report with the return_type so that the lock date can be set automatically.
This fix prevents an error when processing subscription sales orders that do not yet have a last invoice date. The system now uses today’s date as a fallback, helping subscription stock movements continue smoothly without interruption.
Original PR description
The Issue: Prior to this commit, When the sale order last_invoice_date is False, a traceback is thrown The Fix: To resolve this, We get the last_invoice_date or todays date opw-4403557 Forward-Port-Of: odoo/enterprise#75717
UK tax report submissions to HMRC now include the correct obligation ID instead of leaving it undefined. This helps ensure reports are sent successfully and reduces filing errors for UK businesses using Odoo.
Original PR description
Issue: Prior to this commit, when sending a tax report to HMRC, the obligation ID was undefined Fix: sending the appropriate obligation ID opw-4965620
Fixed an issue where exporting accounting reports to Excel could fail when an account code looked like an extremely large number, such as "1E1000". Users can now export trial balance and related accounting reports more reliably without being blocked by uncommon account code formats.
Original PR description
_set_xlsx_cell_sizes tries to convert each cell into a float if it's possible. If the cell contains "inf", "1e1000" (or any value such that float(value) = float("inf")), then there is an OverflowError which is not catch by the try/except.
To reproduce, set an account code as "1E1000", make this account appearing in the trial balance (by creating a move) and export it as XLSX.
opw-4981385
Forward-Port-Of: odoo/enterprise#91686This fix prevents the Stock Fleet module from creating duplicate delivery view records when the system is upgraded. It helps ensure smoother upgrades without unnecessary duplicate configuration entries.
Original PR description
Commit a7f2a2cf9c96 changed the window action to take a specific view xmlid by creating a new `view_ids` entry. As the action is `noupdate=0`, upgrading the module will try to create a new record with the same name. This commit adds the `noupdate` tag around those record to avoid creating new view at update. runbot-230819
Italian VAT XML exports now correctly split quarterly submissions into three reporting sections instead of combining everything into one. The export file name and VAT threshold handling are also corrected, helping businesses submit compliant files with less manual adjustment.
Original PR description
Description of the issue this commit addresses: The XML export should contain three "Modulo" sections when the report is submitted quarterly but currently only ever sends one big chunk of data. Also the name of the exported file is wrong. --- Desired behavior after this commit merged: The exported file adapts to whether it is submitted monthly or quarterly and the name of the file issue is addressed. --- Community PR: https://github.com/odoo/odoo/pull/216887 task-4826511 Forward-Port-Of: odoo/enterprise#93181 Forward-Port-Of: odoo/enterprise#86642
Sales order previews now handle non-subscription quotations correctly, even when a subscription template was previously selected. This prevents users from seeing an error page when previewing quotes that do not include subscription billing information.
Original PR description
Steps to reproduce: 1. Go to Sales > Configuration > Settings. 2. Set Subscription Template as default Quotation Template e.g.(Yearly Cleaning) 3. Create a new Sales Order 4. Switch the quotation…
Steps to reproduce: 1. Go to Sales > Configuration > Settings. 2. Set Subscription Template as default Quotation Template e.g.(Yearly Cleaning) 3. Create a new Sales Order 4. Switch the quotation template from a Subscription one to a non-subscription template e.g.(Office Furnitures) 5. Click Preview on the Sales Order. Issue: A traceback is raised: `TypeError: unsupported operand type(s) for +: 'datetime.date' and 'bool'` Cause: In the portal template, the following expression is evaluated without checking if value is falsy or empty: https://github.com/odoo/enterprise/blob/36f419e4604a2adc946f3a6828e69fba7584d2df/sale_subscription/views/sale_subscription_portal_templates.xml#L66 The portal template contained expressions referencing subscription-specific fields (like plan_id.billing_period) without checking whether the sales order was actually a subscription. When the quotation template is non-subscription, these fields may be False, leading to the error. Solution: Guard all subscription-related blocks with condition: `<t t-if="sale_order.is_subscription">` opw-4980869
Restoring an uploaded spreadsheet that has no folder now saves a valid default folder setting instead of an undefined value. This prevents the Documents search panel from ending up in an inconsistent state after moving files out of the trash.
Original PR description
Steps to reproduce: - Go to documents and upload an XLSX file - Move the XLSX file to the trash - Restore the XLSX file Current behavior before PR: - The key 'searchpanel_documents_document' was set to undefined, When the file had no folder Desired behavior after PR is merged: - Files without a folder now store 'false' as the default search panel folder_id Task: [5005319](https://www.odoo.com/odoo/2328/tasks/5005319) Forward-Port-Of: odoo/enterprise#92799
Fixed an error that could prevent saving an uploaded expense when the selected employee was not linked to a system user. This helps finance teams record expenses for all employees without interruption.
Original PR description
Currently, an error occurs when creating an expense for an employee that is not linked to a user. **Steps to reproduce:** - Install the `hr_expense` module. - Create a new employee `test` (ensure…
Currently, an error occurs when creating an expense for an employee that is not linked to a user. **Steps to reproduce:** - Install the `hr_expense` module. - Create a new employee `test` (ensure this employee is not linked to a user). - Go to Expenses > upload [1] and open it. - Set the `Employee` to `test` and click `Save` (it may take up to 5 seconds). (See [2] for Steps to reproduce) **Error:** `AttributeError: 'hr.expense' object has no attribute 'uid'` **Root Cause:** At [3], the code incorrectly uses `self.uid` instead of `self.env.uid`. Since `hr.expense` records do not have a `uid` field, this leads to an `error`. **Fix:** This commit ensures that expenses can be saved correctly, even when the selected employee is not linked to a user. [1]: https://drive.google.com/file/d/1Ew2B_zMFCQbw-6nwfKctJPy1W4y2ZaIb/view?usp=sharing [2]: https://drive.google.com/file/d/1qP-9L_emaox3l9JyoNVYjqj1Ht8bJSmZ/view?usp=sharing [3]: https://github.com/odoo/enterprise/blob/804f263b80cb78884e3f246bcc7fa7ea4e0cf73a/hr_expense_extract/models/hr_expense.py#L90 sentry-6834628909 Forward-Port-Of: odoo/enterprise#93211
The CRM VoIP softphone now avoids loading extra data when the main web client starts and the softphone is not displayed. This reduces unnecessary background activity and can make startup lighter without changing user-facing behavior.
Original PR description
Avoid RPC on client startup, since the softphone isn't always display at webclient startup. To avoid these RPC, we simply wrap the method call inside an `onWillStart` hooks.
This fix prevents an error when opening the Payslips page in Payroll while debug mode is enabled. It ensures the page loads normally even when no payroll run is selected, improving reliability for setup and troubleshooting scenarios.
Original PR description
steps to reproduce: - create an empty db (without demo data) - install payroll - enable "debug" mode - go to Payroll > Payslips > Payslips menu - notice the traceback (`payrunId` is not a number) cause: - in "debug" mode the prop types are strictly checked - and `payrunId` is set optional but the type is `Number`, and `null` is passed fix: - pass `payrunId` only if it is not `null` :) task-5004937
This fix prevents exempt Brazilian ICMS taxes from being added as extra invoice amounts when Avalara marks them as not accounting-relevant. Businesses get more accurate invoice totals while still keeping a visible record of the exempt tax in the document chatter.
Original PR description
### Steps to reproduce: - Install l10n_br_edi, switch to Brazilian company - Set up Avalara - Create an invoice with the tax "ICMS Exemption Incl." which is included in price - Click "Generate taxes"…
### Steps to reproduce:
- Install l10n_br_edi, switch to Brazilian company
- Set up Avalara
- Create an invoice with the tax "ICMS Exemption Incl." which is included in price
- Click "Generate taxes" to compute the taxes with Avalara
- In "Journal Items" we can see a line for "ICMS Exemption Incl.", its value appear as excluded
### Cause:
The result from Avalara included a value for this tax:
```
'tax': 1.44,
'taxImpact': {
'accounting': 'none',
'impactOnFinalPrice': 'Included',
'impactOnNetAmount': 'Included',
},
```
But the untaxed amount is computed without this tax. Odoo keeps the untaxed amount from the response and add a line for the tax. As a result the tax is added to the amounts like an excluded tax would.
### Solution:
In the response from Avalara, we don't want to create a line for the tax `icmsDeson` when there is `'accounting': 'none'`.
We also log this tax in the chatter to keep a trace of it.
opw-4964315
Forward-Port-Of: odoo/enterprise#91940Fixed an issue where project budget indicators could show green even when an expense budget was exceeded. This helps users quickly identify overspending from the project dashboard and avoid missing budget overruns.
Original PR description
**Step to reproduce:** - install "project_account_budget" - go to accounting > accounting > Analytic Budget - create a budget of type expense,say test budget - select analytic account `Asustek - Wood…
**Step to reproduce:**
- install "project_account_budget"
- go to accounting > accounting > Analytic Budget
- create a budget of type expense,say test budget
- select analytic account `Asustek - Wood Corner`
- set budget amount => 500. open the budget
- create a new project 'test project"> open setting > Analytic Page
- add `Asustek - Wood Corner` analytic account in project field
- create a PO with amount > 500
- in analytic distribution column, add `Asustek - Wood Corner` in project column
- confirm PO and create Bill
- Go to `test project` settings > Dashboard smart button
**Observation:**
- For exceeding expense budget, we have green color in budget section
- It should be red
**Cause:**
The conditional class for budget progress was incorrectly evaluated due to missing parentheses around the `and` condition.
In expressions like:
`(true and (1 == 1 ? 'a' : 'c')) or (1 == 1 ? 'b' : 'd') → 'a'` ✅
`true and 1 == 1 ? 'a' : 'c' or 1 == 1 ? 'b' : 'd' → 'b'` ❌
Without parenthesis, the `or` clause is evaluated unexpectedly, even when the `and` branch is intended to take precedence.
This commit wraps the `and` condition in parentheses to ensure the correct evaluation order and consistent class assignment.
Budget:
<img width="1203" height="291" alt="budget 4968162" src="https://github.com/user-attachments/assets/2d8223d5-0344-4ad0-b33c-2598ea167f2d" />
Before fix:
<img width="623" height="195" alt="before fix 4968162" src="https://github.com/user-attachments/assets/4ac749bf-fa93-4835-963a-5dfbdd05559d" />
After fix:
<img width="643" height="225" alt="after fix 4968162 " src="https://github.com/user-attachments/assets/4fd228f9-e32f-48d9-b6ef-55251b21d601" />
opw-4968162
Forward-Port-Of: odoo/enterprise#91617Fixed an issue in the OCR manual correction interface where deselecting a highlighted box appeared to work but was not saved. This prevents previously deselected boxes from reappearing as selected after refreshing the page.
Original PR description
During refactoring of the boxes interface of the OCR (see commit acfbaf3), this occurrence of `dataMoveId` wasn't replaced with `recordId`. It causes a small bug where the box unselection wouldn't work properly. Visually, it looked like it was working as the JS code handling the unselection of boxes worked fine, but the unselection wasn't saved to the database. Upon refresh, all the boxes that were selected at some point will still be displayed as "user selected" in the UI. task-none Forward-Port-Of: odoo/enterprise#92980
Fixed an issue where tax return XML generation could omit data for some companies when company names were ordered in a certain way. The report now preserves the intended active company during generation, helping ensure accurate multi-company tax filings.
Original PR description
Error: When generating a tax return, there is a circumstance that will cause certain companies to be omitted from the xml computation. This happens when a child company is earlier alphabetically than the parent company. The company ids are ordered alphabetically for display purposes on the tax return view, however when writing this value into the `allowed_company_ids` context value, the first id in the list will override the current company environment variable during xml generation. To fix this the active company is passed into the context to ensure that it is not overwritten. OPW-4964467 Forward-Port-Of: odoo/enterprise#91667
The Peru purchase report now places detraction information in the columns required by SUNAT regulations. This helps businesses generate compliant TXT purchase reports and reduces the risk of reporting errors.
Original PR description
According to the Annex N.°8 of RS 040-2022/SUNAT (page 20 of https://www.sunat.gob.pe/legislacion/superin/2022/anexo-040-2022.pdf), detraction informations are considered as additional informations and should be displayed in columns 42 and 43. This commit moves detraction infos from columns 38, 39 to columns 42, 43. opw-4860530 Forward-Port-Of: odoo/enterprise#93044
The Luxembourg annual VAT declaration now includes 0% custom tax rates in the exported XML, preventing ECDF rejection when those fields are required. Employee average fields are also treated as decimal values, improving accuracy for Section V reporting.
Original PR description
**PROBLEM** 1. In Annexes D and E you can declare custom tax rate. If the custom rate is 0%, this percentage will not be exported into the xml. When submitting the xml to the ECDF, the submission…
**PROBLEM** 1. In Annexes D and E you can declare custom tax rate. If the custom rate is 0%, this percentage will not be exported into the xml. When submitting the xml to the ECDF, the submission will be rejected because the xml doesn't state how much % is the custom tax rate. 2. In Section V, code 110, 108 and 109 should be decimal since they are averages. **STEP TO REPRODUCE** 1. install the l10n_lu module and select the demo lu company. 2. In accouting app, goes to the annual tax report (Accounting/Reporting/Tax Report, select Annual VAT Declaration). 3. Goes to Appendix D or E, and fill code 128, 136, 144, and 162, and leave the custom rate(%) above each of them at 0%. 4. Export to xml (using the little cog thingy). 5. Notice the code 396, 394 149, and 153 doesn't appear in the xml. **CAUSE** 1. Field containing zero are filtered out the xml by default, which is the case of the custom rate (%) fields. 2. Average number of employee during the year is declared in the report data file to be of the integer type. **FIX** 1. Adding custom rate fields to the mandatory fields. 2. Changing type of average employee fields to float. opw-4978365 Forward-Port-Of: odoo/enterprise#91938
Bank reconciliation can now match outstanding payments even when the imported bank memo differs slightly from the original payment reference. This helps reduce missed matches from payment providers such as Stripe while preserving reliable reconciliation behavior.
Original PR description
Commit 4c23de148eb3689842a48df81a5ced772c214861 introduced another query to look for outstanding payments to match in the bank reco widget, aiming to reduce the number of wrong matches found by the algorithm. Doing so, limiting the match between account.payment initiated in odoo and their matching bank transaction imported (through stripe for example), on an exact match of the memo seemed like a good idea. But for obscure reasons, the memo we're sending is not guaranteed to be found back, depending on the payment provider and the import flow. Also, for backward compatibility, it now appears important to allow the match to be on a part of the memo, like we used to do. So we're back on a solution that splits the memo using ' - '. Forward-Port-Of: odoo/enterprise#93237
Upgrading the Stock Fleet Enterprise module no longer fails because of a duplicate map view record. This helps users and administrators apply updates reliably without encountering an upgrade-blocking error.
Original PR description
Currently, an error occurs when upgrading the module. Steps to Reproduce: - Install the `stock_fleet_enterprise` module. - Go to Apps and `upgrade the stock_fleet_enterprise` module. ``` ParseError:…
Currently, an error occurs when upgrading the module.
Steps to Reproduce:
- Install the `stock_fleet_enterprise` module.
- Go to Apps and `upgrade the stock_fleet_enterprise` module.
```
ParseError: while parsing /home/odoo/odoo18/enterprise/stock_fleet_enterprise/views/stock_picking_view.xml:14, somewhere inside <record id="stock_picking_action_view_map" model="ir.actions.act_window">
<field name="name">Map</field>
<field name="res_model">stock.picking</field>
<field name="view_ids" eval="[(0, 0, {'view_mode': 'map', 'view_id': ref('stock_picking_view_map')})]"/>
</record>
UniqueViolation: duplicate key value violates unique constraint "ir_act_window_view_unique_mode_per_action"
DETAIL: Key (act_window_id, view_mode)=(336, map) already exists.
```
This error occurs when a user upgrades the stock_fleet_enterprise module. During the upgrade, it attempts to recreate a view record that already exists [1], which raises the error. The error occurs after [this commit](https://github.com/odoo/enterprise/commit/a7f2a2cf9c96939543abcd72a71c483d8e5c805f)
This commit ensures that when a user upgrades the module, it unlinks the view record before creating it again.
[1]- https://github.com/odoo/enterprise/blob/18229d4e1fe67b57b2b15f4bb2f84cd76d196c6f/stock_fleet_enterprise/views/stock_picking_view.xml#L18
sentry-6811940271