Daily updates from Odoo
Thursday, April 9, 2026
33 changes · 18.0
Resolved issues and error corrections
This update resolves an issue preventing video embedding within Knowledge articles. The change explicitly allows the `/video` command for the KnowledgeHtmlField, ensuring videos can be seamlessly integrated. This improves the functionality of Knowledge for users.
Original PR description
Problem: The `KnowledgeHtmlField` is sanitized, which prevents the `/video` command from being available, even though video insertion is expected to work in Knowledge. Solution: Explicitly enable the `/video` command for `KnowledgeHtmlField` despite the field being sanitized. opw-6035026
This update resolves an issue where shipment validation was failing due to missing tracking data from Easypost. The fix ensures that picking is correctly validated and the carrier tracking URL is appropriately empty, preventing unnecessary shipping creation in the Easypost backend. Easypost support suggested a delay between purchase and tracking requests as a potential workaround.
Original PR description
Problem: 'tracker' object in response from GET /orders/:id request can sometimes be null. This means that when the mail template 'mail_template_data_delivery_confirmation' is sent, a traceback occurs…
Problem: 'tracker' object in response from GET /orders/:id request can sometimes be null. This means that when the mail template 'mail_template_data_delivery_confirmation' is sent, a traceback occurs with error: TypeError: 'NoneType' object is not subscriptable. As a result the picking is not validated in odoo but a shipping has succesfully been created in the easypost backend. Solution: Prevent traceback form happening, picking gets correctly validated and carrier_tracking_url field is empty. Transcript from Easypost support: << I'm also seeing the tracker showing as null when reviewing the response. I'll go ahead and create a ticket for the engineering team to investigate. I can see that the tracking code is being returned in the request, but the full tracking object is not. Since this appears to be happening on a case-by-case basis, you may want to allow more time between the BUY and the GET requests, as I noticed they are being triggered very close together. I'm not certain if that's related, but it may be worth trying as a troubleshooting step while we have this under review. >> opw-5402415 Forward-Port-Of: odoo/enterprise#111833
This update corrects an issue where special characters (&) in payment references were causing errors during SEPA XML export. The fix replaces '&' with '+' to ensure compliance with SEPA/SIX standards, preventing payment rejection by banks and guaranteeing accurate financial reporting.
Original PR description
Steps to reproduce: 1. Install modules `account_batch_payment` and `l10n_ch`. 2. Configure SEPA Credit Transfer for a CH company. 3. Create a vendor bill with a reference containing `&` (e.g. "Net &…
Steps to reproduce: 1. Install modules `account_batch_payment` and `l10n_ch`. 2. Configure SEPA Credit Transfer for a CH company. 3. Create a vendor bill with a reference containing `&` (e.g. "Net & Cost"), confirm it and register a payment using SEPA Credit Transfer. 4. Create a batch payment with the SEPA payment and validate it. Issue: The `&` character is exported as `&` in the generated PAIN XML, while according to the SIX specification it should be replaced with `+` Cause: The payment reference is inserted into the PAIN XML file without replacing the '&' character. During XML generation this produces an invalid entity (`&`) which results in an `XMLSyntaxError` and prevents the payment file from being processed. Solution: Replace the `&` character with `+` when sanitizing the payment communication so that the generated value complies with the SEPA/SIX character set and produces valid XML. Reference[Pg: 9]: https://www.europeanpaymentscouncil.eu/sites/default/files/KB/files/EPC217-08%20Draft%20Best%20Practices%20SEPA%20Requirements%20for%20Character%20Set%20v1.1.pdf opw-5941724 Co-authored by @bhra-odoo Forward-Port-Of: odoo/enterprise#110809
This update fixes an issue where credit notes were incorrectly displayed with positive values in Thailand's tax reports. The fix now accurately reflects credit note amounts by checking if the related transaction is a refund. This ensures accurate tax reporting for Thai businesses using the l10n_th module.
Original PR description
# How to reproduce - Install the l10n_th module - Use the demo TH company - Ensure you have the demo invoices and credit notes associated to that company - Go to the Tax Report - Select Tax Report…
# How to reproduce - Install the l10n_th module - Use the demo TH company - Ensure you have the demo invoices and credit notes associated to that company - Go to the Tax Report - Select Tax Report (TH) - Click on "Sales Tax Report (xlsx)" # The problem The Credit Notes' Total Amount, Total Excl and Vat Amount are positives. They should be negative instead. The same issue appear for "Purchase Tax Report (xlsx)". This issue also concerns Credit Notes created manually in the Journal Entries # Why The logic for the sign of the value fields in the reports is the following : ```py sign = move.reversed_entry_id.payment_state == 'partial' and -1 or 1 ``` This is unreliable because a Credit Note will not always have a reversed_entry_id associated or if it has one, it's payment_state may change A refactor of theses reports has been made for versions 19.0+ but it seems too big to backport (https://github.com/odoo/enterprise/pull/75645/changes) Instead, we just check if the current move's type is a refund. If yes, we reverse the sign. opw-6006720 Forward-Port-Of: odoo/enterprise#110816
This update corrects a display issue where the product count in the stat button on Sale Order Lines created from tasks would incorrectly show '0 products' until the task was saved. Now, the count accurately reflects the products associated with the task, improving the user experience when creating sales orders.
Original PR description
Previously, when creating a Sale Order Line on the fly from a task, the product count in the stat button showed '0 products' until the task was saved. Now, the counter no longer drops to 0 when the record is not saved. task-4276677 Forward-Port-Of: odoo/enterprise#95100
A bug was preventing users from deleting timesheet records when a delete confirmation dialog was open. Pressing Enter would start/stop the timer instead. This update ensures that the delete confirmation dialog is correctly triggered, resolving this unexpected behavior.
Original PR description
When a delete confirmation dialog is open in the timesheet list view, pressing Enter starts/stops the timer instead of confirming the dialog. This happens because the timer's window keydown handler does not check for active modals before intercepting the Enter key. Add a `.modal` check consistent with the grid renderer's onKeyDown. Steps to reproduce: 1) Open timesheet list view 2) Select a record and delete it 3) When the confirmation dialog opens, hit ENTER key Current behavior: The Timer starts recording timesheet Expected behavior: The record should be deleted For ref: https://youtu.be/tzm_3RNe1ig Forward-Port-Of: odoo/enterprise#112583
This update resolves a problem where overridden group names in the accounting module weren't being properly translated. The fix ensures that translated versions of these group names are exported, preventing inconsistencies between the English source strings and the translated versions used within Odoo. This improves the accuracy of translations for users.
Original PR description
The `account_accountant` module overrides the English name of several `res.groups` records owned by `account`. Without `account_accountant`-scoped XMLIDs for those records, the overridden names are never exported into this module's POT file. At runtime, `account`'s translations are loaded instead, which no longer match the overridden English source strings. We fix this by registering additional XMLIDs under `account_accountant` so the overridden names get translated independently. Forward-Port-Of: odoo/enterprise#112898
This update corrects an error in the forum tour, ensuring it correctly guides users through the drag-and-drop process for adding content. The tour has been updated to support both text snippets and forms, enhancing the user experience for the website forum.
Original PR description
This commit fixes the incorrect steps in the forum_cover_dropzone tour added in #257527. The tour util adding the s_text snippet was removed to add a snippet using the drag and drop method. The snippet added was changed to form snippet to also check that forms can be dropped in the s_cover in website_forum.
This update fixes a technical issue where sending snailmail letters with a large number of pages (over 8) would result in a generic error. The change provides a more specific error message, helping users quickly understand and resolve sending failures. This improves the user experience and reduces support requests.
Original PR description
When a user attempted to send a letter with snailmail that had more than 8 pages, sending would fail, and a generic error message is logged on the letter. This commit makes the error message generated in that flow more specific to help users better understand the root cause of sending failure. task-5883011 Forward-Port-Of: odoo/odoo#257867
This update fixes an issue where surveys with conditional questions weren't displaying the correct follow-up questions after a user skipped a question and then answered the initial one. Now, the survey accurately triggers and displays the next relevant questions based on user responses, ensuring a smoother and more accurate survey experience. This improves data collection reliability.
Original PR description
Problem: In a survey that allows roaming, when a user skips a question with conditional questions triggered by its answers, submits the survey and then answers the question, the triggered questions…
Problem: In a survey that allows roaming, when a user skips a question with conditional questions triggered by its answers, submits the survey and then answers the question, the triggered questions are not displayed next. The survey either gets submitted or displays the next skipped mandatory question. Steps to reproduce: 1. Create a survey with roaming allowed and at least 2 questions. 2. Make the first question mandatory and add an answer that triggers the display of the second question. 3. Start the survey, skip the first question and submit the survey. 4. After skipping the first question and trying to submit, answer the first question with the answer that should trigger the second question. 5. Notice how the second question is not displayed and the survey is submitted or the next skipped mandatory question is displayed instead. Cause: When looking for the next question to display, the survey only checks for skipped mandatory questions. It doesn't check if there are any triggered questions that should be displayed before the next skipped mandatory question. opw-5917891
This update ensures that archived product labels are correctly displayed when filtering within the Odoo Sales dashboard. Previously, the system incorrectly filtered out archived products, causing issues with spreadsheet global filters. This fix resolves this issue by correctly loading display names for all records, including archived ones.
Original PR description
## Description: Steps to reproduce: - Open Dashboard > Sales > Sales. - Search for an item to filter. - Click the "Product" filter. - Click "Search more". - Search for an archived product. - Select it to add it to the filter. Issue: The filter needs `nameService.loadDisplayNames()` to resolve the label of the selected record ids. In 17.0, that service calls `webSearchRead()` without `active_test=False`, so archived records are filtered out and treated as missing. This makes spreadsheet global filters fail on archived records. Fix: Fetch display names with `active_test=False` in the shared web `nameService`, so already-known archived record ids can still be resolved. Task: [6094596](https://www.odoo.com/odoo/project/2328/tasks/6094596) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#257534
This update fixes an issue where salespersons weren't receiving accurate invoice amounts in their email notifications. The fix ensures the correct record reference and amount are displayed, regardless of the invoice's draft status. This improves the clarity and reliability of sales order follow-up communications.
Original PR description
Steps to produce: --- - Install `Sales` module. - Create a sale order, set a product, and assign Marc Demo as salesperson in the Other Info tab. - Confirm the sale order and create an invoice. Issue:…
Steps to produce: --- - Install `Sales` module. - Create a sale order, set a product, and assign Marc Demo as salesperson in the Other Info tab. - Confirm the sale order and create an invoice. Issue: --- - In the email notification sent to the salesperson, the record reference displays as False and the amount shows as 0.00. Root cause: --- - Here at [1], the record name is False because the invoice is still in draft state. - In [18], _sync_invoice sets amount_currency = line.balance for new lines, but balance is precomputed as 0 before the INSERT because _compute_balance returns 0 for invoice lines. In [17] it read price_subtotal directly, which is always correct. - In 17.0 the same mail fires at the same moment, but _sync_invoice had already set balance = −295 and amount_currency = −295 from price_subtotal, so the email reads the correct 295.00. Solution: --- - Use record.display_name instead of record.name, as display_name is always present regardless of the record state. - Use the tax totals amount instead of amount_total, which is not yet computed on draft invoices. [1]https://github.com/odoo/odoo/blob/0bcc34ec2f92b9b95cde321423d810002bb317ce/addons/account/models/account_move.py#L6478 [18]https://github.com/odoo/odoo/blob/b0a50104a12b205958316d382b4c7b2176395877/addons/account/models/account_move_line.py#L1566-L1610 [17]https://github.com/odoo/odoo/blob/73c076893de79df5a86aa970fde46a7aacbeaf3d/addons/account/models/account_move_line.py#L1536-L1585 Before: --- <img width="400" height="175" alt="image" src="https://github.com/user-attachments/assets/48c2dc03-765a-49c3-bad3-fd0b14405786" /> After: --- <img width="400" height="175" alt="image" src="https://github.com/user-attachments/assets/53682171-155f-46b3-85dd-0c7c98482067" /> opw-6023827 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update enhances the Odoo packaging process for Windows by adding optional dependencies. This allows for a more streamlined installation experience for Windows users, reducing potential conflicts and improving overall stability. It's a technical update focused on improving the Odoo platform's compatibility.
This update fixes a potential memory issue that could occur when importing invoices. Specifically, the system was incorrectly matching invoices with empty vendor references, leading to a large number of purchase orders being processed and causing a 'MemoryError'. The change now filters out these empty references, improving the stability and performance of the bill import process.
Original PR description
Description of the issue/feature this PR addresses:
A Peppol message contains a reference with a trailing comma.
```
<cac:OrderReference>
<cbc:ID> Uw bestelling,</cbc:ID>
</cac:OrderReference>
<cac:BillingReference>
<cac:InvoiceDocumentReference>
<cbc:ID> Uw bestelling,</cbc:ID>
</cac:InvoiceDocumentReference>
</cac:BillingReference>
```
Current behavior before PR:
A MemoryError occurs in `_cron_peppol_get_new_documents` because the trailing comma leads to a fetching hundreds of thousands of purchase orders with domain `[('partner_ref', 'in', [('Uw bestelling', '')]`
Desired behavior after PR is merged:
Purchase orders are not matched by empty reference.
opw-6102641
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update resolves a stability issue in the spreadsheet pivot feature. Previously, the system incorrectly relied on a single field property to determine groupability, leading to crashes when encountering unsupported field types like JSON. The fix ensures pivots only support compatible field types, preventing errors and improving overall reliability.
Original PR description
Spreadsheet pivots only do not support all field types. But we were relying only on `field.groupable` to determine if a field could be grouped, which is wrong (eg. JSON fields can be groupable but are not supported). It leads to crashes for fields that were groupable, but didn't have an entry in `pivotNormalizationValueRegistry`. Added a test for all of the field types to ensure we have a correct behavior. Task: 6036075 Task: [6036075](https://www.odoo.com/odoo/2328/tasks/6036075) Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update significantly speeds up the process of retrieving sale order information linked to stock lots. The fix involved adding an index to the stock.move.line model, reducing query times from 20-40 seconds to 1-4 seconds. This improves overall sales efficiency.
Original PR description
Issue: -- The query created by the function '_compute_sale_order_ids' takes around 20-40 seconds since its doing "WHERE" searches on millions of stock.picking records Fix: -- Added an index to the…
Issue: -- The query created by the function '_compute_sale_order_ids' takes around 20-40 seconds since its doing "WHERE" searches on millions of stock.picking records Fix: -- Added an index to the "lot_id" field of the stock.move.line model. (Already existing databases can be fixed by using the webshell) Steps to recreate the issue: -- 1. Have around a million stock.picking records 2. Go to "Inventory/Products/Lots/Serial Numbers" 3. Select any existing record or create and save a new one 4. These actions will take around 20-40 seconds to complete Before this commit: -- Selecting or saving any 'stock.lot' takes around 20 seconds After this commit: -- Selecting or saving any 'stock.lot' takes around 1-4 second Benchmark: -- Benchmark test was done one a database with ~4000 stock.move records and 1.74 million stock.picking records Opw-5459842 | Before this Commit | ~20 seconds | After this Commit | **~1-4 seconds & Memory usage just a little bit higher --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where invoicing a Point of Sale order multiple times in Odoo could create unnecessary stock picking records. This was happening when backend users repeatedly clicked 'Invoice,' leading to duplicate pickings, especially with the 'Anglo-Saxon' configuration. This change ensures that invoices are processed correctly without creating redundant stock movements.
Original PR description
Calling `action_pos_order_invoice` on an already-invoiced POS order (e.g. a backend user clicking "Invoice" more than once) would unconditionally invoke `_create_order_picking`, producing one extra `stock.picking` per click under anglo-saxon + update_stock_at_closing configurations. opw-6092999 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#257509
This update resolves an issue where users without project access were unable to view project details from timesheets. The fix uses a temporary 'sudo' bypass to grant access, ensuring all users can correctly see project information when linked to a timesheet.
Original PR description
### Steps to reproduce: - Download 'Sales', 'Project', 'Employees', and 'Timesheets' apps - Create an employee and link them to a user that doesn't have any access rights except to 'Timesheets =…
### Steps to reproduce:
- Download 'Sales', 'Project', 'Employees', and 'Timesheets' apps
- Create an employee and link them to a user that doesn't have any access rights except to 'Timesheets = User:own timesheets'
- In Sales, create a service with the following specifications:
- 'Create on Order' is 'Project'
- 'Invoicing Policy' is 'Based on Timesheets'
- Create a new quotation that requests this service and click 'Confirm'
- In 'Project' > 'Configuration' > 'Projects', choose the newly created project and add a line that has the new employee in the 'Invoicing' tab
- Log in as that employee and go to 'Timesheets'
- Create a new entry for the newly created project
- Click the project's name
> Access Error: You are not allowed to access 'Collaborators in project shared' (project.collaborator) records.
### Cause of Issue:
This happens because the user doesn't have access rights to the 'Project' app, hence they don't have access to `collaborator_ids` which are retrieved here. https://github.com/odoo/odoo/blob/3dfb2849acd899ccbf4048f2a15dff3c74aed96d/addons/project/models/project_project.py#L1113-L1120
### Fix:
Since an access to the 'Projects' app isn't necessary to view a project assigned to you, `sudo()` is used here to bypass the `collaborator_ids` check.
opw-6074833This update resolves an issue where users without project access rights were unable to view project details from their timesheets. The fix adds a temporary override (sudo) to grant access, allowing users to correctly see project information. This ensures all users can access the relevant project data.
Original PR description
### Steps to reproduce: - Download 'Sales', 'Project', 'Employees', and 'Timesheets' apps - Create an employee and link them to a user that doesn't have any access rights except to 'Timesheets =…
### Steps to reproduce:
- Download 'Sales', 'Project', 'Employees', and 'Timesheets' apps
- Create an employee and link them to a user that doesn't have any access rights except to 'Timesheets = User:own timesheets'
- In Sales, create a service with the following specifications:
- 'Create on Order' is 'Project'
- 'Invoicing Policy' is 'Based on Timesheets'
- Create a new quotation that requests this service and click 'Confirm'
- In 'Project' > 'Configuration' > 'Projects', choose the newly created project and add a line that has the new employee in the 'Invoicing' tab
- Log in as that employee and go to 'Timesheets'
- Create a new entry for the newly created project
- Click the project's name
> Access Error: You are not allowed to access 'Collaborators in project shared'
(project.collaborator) records.
### Cause of Issue:
This happens because the user doesn't have access rights to the 'Project' app, hence they don't have access to `collaborator_ids` which are retrieved here. https://github.com/odoo/odoo/blob/3dfb2849acd899ccbf4048f2a15dff3c74aed96d/addons/project/models/project_project.py#L1113-L1120
### Fix:
Since an access to the 'Projects' app isn't necessary to view a project assigned to you, `sudo()` is necessary for hr_timesheet users without project access rights.
opw-6074833This update resolves an issue preventing the Account EDI UBL import from working correctly in the Odoo Community edition. Specifically, a problem with missing country data was causing errors during the import process. The fix ensures proper data handling, allowing imports to succeed.
Original PR description
If you're in community, the retrieval of account results in a traceback, failing the import **[FIX] account_edi_ubl_cii: empty country fails the import** If you don't find a country, we try to run _run_vat_test with False as a value, resulting in an Error when we do apply a lower() on it. A simple way to reproduce is to put the GB code in the UBL (which is the right value), while the xml_id is uk. We also fix it there. Runbot-242379 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a bug where KPI cards (Billable Hours, etc.) didn't update properly when global filters were applied in the Timesheets dashboard. The issue stemmed from a hardcoded filter that limited data to a single user. Removing this restriction ensures KPI cards accurately display timesheet data based on selected filters.
Original PR description
Steps to reproduce: - 1. Go to the dashboard app > Timesheets. 2. Apply any global filter. Issue: - The main KPI cards (Billable Hours, Non-billable Hours, Billable Rate) do not update correctly when any global filter is applied. Filtering by 'Employee' causes the cards to show zero. Other filters like 'Project' or 'Department' show incomplete and incorrect data, reflecting only the timesheets of a single hardcoded user. Cause: - The pivot tables (`pivot 5` and `pivot 6`) that source the data for the KPI cards contained a hardcoded domain `['user_id', '=', 2]`. This condition changes any selection made in the global filter and shows incorrect data. Fix: - The hardcoded `['user_id', '=', 2]` condition has been removed. task-4782213 Forward-Port-Of: odoo/odoo#224810
This update fixes a bug where creating new sale order lines sometimes resulted in the creation of duplicate sale orders. The fix ensures that existing sale orders are reused when a new line is added, streamlining the sales process and preventing data duplication. This improves order management efficiency.
Original PR description
_*= sale_project **Issue:** When a new sale order line is created on the fly, a new Sale Order is being created instead of reusing an existing one. **Root Cause:** This happens when the project_sale_order is not being passed correctly in the context, causing a new Sale Order to be created. **Fix:** Explicitly pass the default_order_id in the context. If an existing Sale Order is found, it will be reused instead of creating a new one. **Technical Details:** Updated the `default_order_id` to use sale_order_id instead of `project_sale_order_id` in `sale_project`. This ensures that the field functions correctly even when `project_sale_order_id` is empty. **task-4276677** --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#203230
This update resolves an issue where deleting a task stage caused unexpected view changes and the display of archived tasks. Now, the system correctly closes the deletion dialog, removes the stage, and returns the user to the original project tasks view, maintaining the correct filters and breadcrumbs.
Original PR description
# Steps to reproduce 1. Create a project 2. Create a stage 4. Remove the stage # Current behavior Instead of remaining in the project tasks view, it switches to the tasks view filtered with the current project. Additionally, it displays archived tasks because no filter is selected, thereby discarding original ones. This also applies to stage deletion in other views (e.g., My Tasks), where the search filters are completely discarded. # Expected behavior The dialog should be closed, the stage should be deleted, and the original view should remain active. This is done through a soft-reload of the page, ensuring the original view is kept, together with original breadcrumbs, and the stage is visually disappearing. task-5498274 Forward-Port-Of: odoo/odoo#246935
This update fixes an issue where product names displayed in purchase order lines would change when navigating between pages. The fix ensures product names are consistently shown, improving order clarity and reducing potential confusion for users. This change maintains the ability to search for products using vendor codes or names.
Original PR description
**Steps to reproduce:** * Install the *Purchase* module * Create a product and set an *Reference* and Under the *Purchase* tab, add a vendor and define a *Vendor Product Code*. * Create a Purchase…
**Steps to reproduce:** * Install the *Purchase* module * Create a product and set an *Reference* and Under the *Purchase* tab, add a vendor and define a *Vendor Product Code*. * Create a Purchase Order with the same vendor set as on the product. * Add the configured product to the *Purchase Order Lines*. * Add the same product again on a second line and save the order. * Activate debug mode * Go to the view:Form and add a limit to have only 1 POL per page * Return to your PO * Go to the second page **Observed behavior:** * The *product display name* in the purchase order lines is different on the second page compared to the first page. **Cause:** * On the first page, purchase order lines are fetched via a web_read on the purchase order. * On subsequent pages, lines are fetched via a web_read directly on the purchase order lines. * The client requests both name and product_id.display_name. product field context includes partner_id, causing product_id.display_name to be computed as the vendor name. * As both values resolve to the vendor name, the original product name is lost, leading to inconsistent display across pages. **Note:** A similar issue was addressed in this commit : https://github.com/odoo/odoo/commit/28d53e0e565e266ca3fa2b67e359b4383fa42c36 * but its consequence it breaks the search using the vendor code/name in POL. * That change was reverted in this commit duo to the there consequence : https://github.com/odoo/odoo/commit/c9e8a802315be27a076ae677b9191c075e4c239d **Fix:** * This ensures the product name is propagated correctly in the form view while preserving search by vendor code or name. --- opw-5170924
This update fixes a bug that prevented Peppol invoices from importing correctly. Specifically, changing the Peppol journal type to non-purchase caused import errors. This change ensures that Peppol invoices are processed reliably, avoiding disruptions to financial data.
Original PR description
Prevent changing a Peppol journal to a non-purchase type, to avoid import errors when receiving Peppol invoices. Step to reproduce: - Setup a company with Peppol - Change the Peppol reception journal type to non-purchase - Try to run Peppol cron to import invoice, it fails with "Cannot create a purchase document in a non purchase journal" opw-6071992 opw-6064502 Forward-Port-Of: odoo/odoo#257955 Forward-Port-Of: odoo/odoo#256823
This update fixes a potential tax issue related to invoice display. When an invoice includes multiple GmbH names in the address field, the system now correctly displays only the primary delivery address, ensuring accurate tax reporting and avoiding potential deductions refusals. This ensures compliance with German tax regulations.
Original PR description
If two GmbH (Ltd.) names appear in the invoice address field (e.g., "Proveco GmbH, Test GmbH"), the invoice is problematic from a tax perspective, as two GmbH are considered separate legal entities, and it is not clearly identifiable who the actual recipient of the service is. Consequently, the tax office can refuse the input tax deduction if the invoice recipient is not clearly identifiable. Steps: - Create a company contact (X) and a delivery address (Y) - Create an invoice for X, delivery address will be Y - Open preview -> The delivery partner's display name is 'X, Y', it should be only 'Y' Fix: Adding a context key to the invoice document to conditionally display the parent contact name in the display_name Ticket [link](https://www.odoo.com/odoo/project.task/5900567) opw-5900567 Forward-Port-Of: odoo/odoo#257652
This update resolves a warning appearing on Odoo.sh production branches during module updates. The change lowers the logging level from WARNING to DEBUG, aligning with existing practices and ensuring updates appear green, indicating a successful process. This improves the overall reliability and visual status of Odoo deployments.
Original PR description
Description of the issue/feature this PR addresses: During a module update (-u ModuleName), the check introduced by #220983 patches temporarily a field with "company_dependent=True" because the…
Description of the issue/feature this PR addresses: During a module update (-u ModuleName), the check introduced by #220983 patches temporarily a field with "company_dependent=True" because the overriding module is not loaded yet. But currently it is logged as a warning and makes Odoo.sh production branch appears in yellow (warning state), while the update is actually fine. Current behavior before PR: Logs may contain warnings such as: - Patching res.partner.ref with company_dependent=True - Patching product.template.sale_ok with company_dependent=True - Patching product.product.default_code with company_dependent=True even though there is no actual issue (ok normal behavior) The main problem is that this makes Odoo.sh production branches appear not with green status, while the update module is actually fine. Desired behavior after PR is merged: Keep the same mechanism, but lower the log level from WARNING to DEBUG. This aligns the behavior with the "translate=True" patch logic, which is already logged at DEBUG. Having the production branches green. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects a translation issue by ensuring Belgian province names are displayed in their native Dutch and French. This improves the user experience for customers and partners in Belgium, aligning with localization standards.
Original PR description
The `name` field of `res.country.state` is not translatable. For that reason we want to have the province names in their native language. [opw-6107258](https://www.odoo.com/odoo/project.task/6107258)
This update resolves an issue where attachment overviews (the blue boxes) weren't appearing in the chatter after uploading a file. This change ensures that users can always see the previews of attached files within the chatter interface. This was necessary due to a shift in rendering strategy for attachments, which initially caused this display problem.
Original PR description
--- When in the chatter, we can create an activity. If we add an attachment to the notes of this activity and save it, the overview of the attachment won't show in the chatter. 1. Open an app that gives you access to the chatter, for instance, an invoice in Accounting. 2. Click on Activity. Click on Log a Note... and on the button Upload a file. Upload an attachment and save. The overview of the file (blue box with the name of the attachment) should appear. The overview doesn't appear Since 19.0, we want to replace static rendering with embedded components everywhere for rendering attachments, but this creates issues for the rendering of the overview in the chatter. Therefore, after internal discussion, we agreed to keep rendering overviews statically. Backport of: https://github.com/odoo-dev/odoo/commit/4a2412b93bcac9e71826f7c0101243cdb882ddf6 opw-6035026 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects a previous restriction in how the system identifies Spanish freelancers. Specifically, it now recognizes 'Comunidades de Bienes' (CBs) – entities taxed through income attribution – as freelancers, ensuring accurate fiscal categorization in reports and tax modules. This change improves compliance for businesses operating in Spain.
Original PR description
In Spain, "Comunidades de Bienes" (VAT starting with 'E') are entities without legal personality that tax via income attribution to their members. For accounting and tax reporting purposes, they must be treated as individuals/freelancers rather than corporations. The current _l10n_es_freelancer logic was too restrictive, only matching standard DNI (8 digits + letter) or NIE (starting with X, Y, Z). This caused CBs to be excluded from freelancer-specific logic, leading to incorrect fiscal categorization in reports and tax modules. The regex has been updated to optionally allow the 'E' prefix while ensuring the rest of the string maintains a valid format, effectively broadening the scope of what the system considers a Spanish freelancer. task-6014192 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where the 'Jump to Present' button in the Odoo chatter interface would disappear for some users. The change simplifies the button's visibility detection, ensuring it's consistently displayed regardless of message volume or layout, improving user experience.
Original PR description
**Description of the issue this PR addresses:** ---------------------------------------------- In 18.0, the Jump to Present button in chatter could fail to appear when the user scrolled away from the latest messages. **Current behavior before PR:** ---------------------------------------------- - The present detection threshold relied on both viewport height and the cumulative height of recent messages. - In some chatter layouts, this threshold could exceed the visible area, preventing the Jump to Present button from appearing. **Desired behavior after PR is merged:** ---------------------------------------------- - The present threshold is based only on the viewport height. - The Jump to Present button appears consistently regardless of message size or chatter layout. Task-5435586 ---------------------------------------------- I confirm I have signed the CLA and read the PR guidelines at https://www.odoo.com/submit-pr
This update resolves a technical error in the Danish accounting module (l10n_dk) that prevented proper processing of accounts without a standard code. The fix ensures the system correctly handles these accounts, improving data accuracy and functionality. This change was made as part of a larger effort to enhance the reliability of the Odoo accounting system.
Original PR description
From https://github.com/odoo/odoo/pull/256541.
```yml
File "/home/.../odoo/addons/l10n_dk/migrations/1.4/end-migrate.py", line 102, in migrate
if len(account.code) < 6:
TypeError: object of type 'bool' has no len()
```
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#258299This update fixes an issue where Arabic text on invoices was incorrectly formatted in English reports. The change ensures parentheses and other symbols wrap correctly around Arabic characters, improving invoice readability for international users. This resolves a visual discrepancy in the generated PDF documents.
Original PR description
**Problem:** When printing an invoice in English (LTR report) with a product whose name contains Arabic text and parentheses (e.g., لوحة توزيع كهربائية 100 أمبير (شنايدر )), the brackets appear in…
**Problem:** When printing an invoice in English (LTR report) with a product whose name contains Arabic text and parentheses (e.g., لوحة توزيع كهربائية 100 أمبير (شنايدر )), the brackets appear in the wrong position in the generated PDF. **Steps to reproduce:** 1. Create a product named: لوحة توزيع كهربائية 100 أمبير (شنايدر ) 2. Create an invoice with that product 3. Print the invoice PDF in English 4. Observe the brackets are misplaced in the description column **Current behavior:** Parentheses appear detached from the Arabic word they enclose, floating at the wrong end of the text. **Expected behavior:** Parentheses correctly wrap the enclosed Arabic text. **Cause of the issue:** Odoo's report CSS sets `direction: ltr` on elements that are ancestors of the line description span. When CSS `direction: ltr` targets the same element as `dir="auto"`, wkhtmltopdf's WebKit engine lets the CSS rule win, keeping the paragraph base direction as LTR. The Unicode BiDi algorithm then resolves parentheses (neutral characters) using LTR as the base direction, misplacing them. **Fix:** Placing `dir="auto"` directly on the `<span>` that renders the line description — rather than the parent `<td>` — avoids the CSS override. wkhtmltopdf then detects the first strong character (Arabic) and uses RTL as the base direction for that span, allowing the BiDi algorithm to correctly position the brackets. opw-5884712 Forward-Port-Of: odoo/odoo#251190