Daily updates from Odoo
Friday, June 26, 2026
242 changes
21 changes
Enhancements to existing features
The PDP registration flow now lets users adjust their email during signup, which avoids issues if the original value needs to be changed. It also adds extra protection to the connection process and resets the KYC status when deregistering, so the verification can be started again if needed.
Original PR description
It seems the readonly can cause some problem because the user might want to change it during the registration. Also adding the hash signed to the connect route to make sure nobody can impersonate the kyc Also clicking on the button_deregister_pdp_participant action will now reset the kyc status so that you can do it again if needed. task-626574 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#268833
This update improves how French companies are guided through electronic invoicing and PDP registration. It replaces confusing Peppol messages with clearer French e-invoicing wording, shows stronger prompts to register when needed, and streamlines the registration process so it is easier to complete and less error-prone.
Original PR description
#### [IMP] account_peppol,l10n_fr_pdp: rework PDP registration If PDP is not installed but Peppol is installed we suggest installing the PDP module for French companies - in the send & print instead…
#### [IMP] account_peppol,l10n_fr_pdp: rework PDP registration
If PDP is not installed but Peppol is installed we suggest
installing the PDP module for French companies
- in the send & print instead of the following warnings
- "You can send this invoice electronically via Peppol." (what is peppol)
- "partner has requested electronic invoices reception on Peppol."
- in the send & print for any French company that is not on PDP
(this warning can be disabled by setting the system parameter
`account_peppol.disable_pdp_warning` to true)
- in the peppol registration wizard by adding a warning
If PDP is installed we make the following changes to the send & print
- change the wording mentioning "Peppol" to mention the French e-invoicing instead
- make a PDP version of the "Peppol Info" (`account_peppol.WhatIsPeppol`)
- it explains what French E-Invoicing is
- it provides a button to open the registration wizard
- in case the company is registered on Peppol it deregisters the
company first (just like the "complete registration" button)
- display the "You can send this electronically via Peppol" warning
also for French companies (with the wording and "Peppol Info" mentioned above)
- It is displayed in case we are opening the Send & Print wizard from a French
company for a partner on peppol but the "Peppol" / "French
E-invoicing" checkbox is not checked
- Change the wording of the French company non-PDP warning to encourage
the user to register
In the PDP registration wizard
- make all the fields visible directly (already at the start of the KYB/KYC)
- make the SIREN part of the identifier readonly
- make the fields readonly after the verification
- automatically "validate" / register to PDP when we receive the KYC success
task-6320246
#### [IMP] l10n_fr_pdp: add system param for kyc siren
After the previous commit it is not really possible anymore
to use a different SIREN for the KYC than the one in the pdp identifier.
This is because:
- We derive the SIREN directly from the
Identifier in the registration wizard.
- The registration will be validated automatically after the KYC
- The values are readonly after the KYC in any case
That is a problem for testing because we have 1 SIREN to test the
KYC and it is independent from the identifiers provided by the French
datasets for the PDP test environment.
task-None
Forward-Port-Of: odoo/odoo#271733Resolved issues and error corrections
This fix ensures the pencil button used to suggest forecasted demand stays visible even when the Forecasted Stock row is hidden. It prevents an unrelated display change from hiding an important action in Master Production Schedule, making planning smoother for users.
Original PR description
Steps to reproduce:
1. Install Manufacturing.
2. Enable 'Master Production Schedule' in the Settings.
3. Go to [Manufacturing -> Planning -> Master Production Schedule].
4. Ensure 'Demand Forecast' and 'Forecasted Stock' rows are enabled from the dropdown.
5. Observe the edit pencil button next to 'Forecasted Demand' is visible.
6. Hide 'Forecasted Stock' using the rows filter dropdown.
Issue:
The edit pencil button ("Suggest Forecasted Demand") next to the 'Forecasted Demand' row disappears when the 'Forecasted Stock' row is hidden.
Expected behavior:
The edit pencil visibility should not be affected by the 'Forecasted Stock' row.
opw-6240596
Forward-Port-Of: odoo/enterprise#120208This update prevents the Point of Sale from crashing when a Pine Labs payment is force-cancelled after the terminal has already timed out or been cancelled. It improves the cancellation flow so staff can safely close the payment without seeing an error screen.
Original PR description
**Step to Reproduce:** 1. Open the POS. 2. Add any product to the order. 3. Proceed to the payment screen and select `Pine Labs` as the payment method. 4. Observe that the Pine Labs terminal does not…
**Step to Reproduce:** 1. Open the POS. 2. Add any product to the order. 3. Proceed to the payment screen and select `Pine Labs` as the payment method. 4. Observe that the Pine Labs terminal does not respond and no payment popup appears on the device. 5. Wait until the payment request is cancelled (either manually or due to timeout). 6. Click the `Force Cancel` button. 7. Observe that the POS throws a traceback. **Video:** https://drive.google.com/file/d/1A3QPdby-J12IWgOX_SfCLrauQ_QnbqvG/view **Issue:** When a Pine Labs payment request is cancelled (either through a cancel request or by timeout), clicking the `Force Cancel` button results in a traceback in the POS. **Reason:** During the cancellation flow, the payment line status is updated to `retry` so that the transaction can be marked as cancelled and retried if necessary. Later, when the user clicks `Force Cancel`, `_paymentCancelRequestHandler()` attempts to retrieve the pending Pine Labs payment line using: ```javascript const line = this.pendingPineLabsPaymentLine(); ``` However, `pendingPineLabsPaymentLine()` only returns payment lines whose status is not `retry`, as defined here: https://github.com/odoo/odoo/blob/19.0/addons/point_of_sale/static/src/app/services/pos_store.js#L1820 Since the payment line was already transitioned to the `retry` state during the cancellation flow, no `payment line` is found and `line` becomes `undefined`. The handler subsequently attempts to update the status of this `undefined` `payment line`, resulting in the traceback when `Force Cancel` is executed. **Solution:** Add a condition in `_paymentCancelRequestHandler()` to verify that a payment line is available before attempting to update its status. If no payment line is found, it indicates that the payment line has already been moved to the `retry` state during a previous cancellation attempt. In such cases we clear `pollingTimeout`, `inactivityTimeout` and reset `this.payment_stopped` to `false`. This prevents the traceback while ensuring that the `Force Cancel` flow properly cleans up the pending payment state. opw-6297135 Forward-Port-Of: odoo/odoo#271397 Forward-Port-Of: odoo/odoo#271241
When sending invoices with a custom report attached, the attachment will now keep its own configured filename instead of inheriting the standard invoice’s localized name. This prevents duplicate-looking attachments and makes emailed invoices easier to identify for customers and accounting teams.
Original PR description
Steps to reproduce: * Install `l10n_mx_edi` (or `l10n_sa_edi`). * Go to **Accounting → Customers → Invoices**. * Open **Studio** and, from the top bar, go to **Reports**. * Duplicate the standard…
Steps to reproduce: * Install `l10n_mx_edi` (or `l10n_sa_edi`). * Go to **Accounting → Customers → Invoices**. * Open **Studio** and, from the top bar, go to **Reports**. * Duplicate the standard **Invoice PDF** report. * Open the duplicated report and make any modification to it. * Enable **Developer Mode**. * Go to **Settings → Technical → Actions → Reports** and update the custom report's **Printed Report Name**. * Go to **Settings → Technical → Email → Templates** and create a new invoice email template. * Add the custom report to the template's **Dynamic Reports**. * Create and confirm an invoice for a **Mexican company**. * Click **Send** and select the newly created email template. Observed behavior: * The custom report attachment uses the CFDI-based filename instead of its own report name, making it appear as a duplicate of the standard invoice attachment. Cause: * `_get_placeholder_mail_template_dynamic_attachments_data` relied on the `invoice_report` context key to pass the extra report into `_get_invoice_report_filename`. However, localization overrides (e.g. `l10n_mx_edi`, `l10n_sa_edi`) unconditionally return their own filename without checking the context, so the extra report's `print_report_name` was never evaluated. Fix: * Introduce `_get_invoice_mail_template_dynamic_report_filename` on `account.move` that directly evaluates a given report's `print_report_name`, bypassing the localization override chain. * Call this new method in `_get_placeholder_mail_template_dynamic_attachments_data` instead of the context-based `_get_invoice_report_filename` call. This avoids the need to patch every localization override and cleanly separates the concern of naming dynamic report attachments from the main invoice report filename logic. opw-6228268 Forward-Port-Of: odoo/odoo#271489
This update removes a warning generated by the documentation system when it starts up. It helps keep the code compatible with newer Docutils versions and reduces the risk of future breakage.
Original PR description
Using `Publisher.set_components()` triggers a `PendingDeprecationWarning` stating that the method will be removed in Docutils 2.0. This commit fixes the warning by passing the component names (`reader`, `parser`, and `writer`) directly into the `Publisher` constructor during instantiation, ensuring compatibility with upcoming Docutils versions. runbot-940246 Forward-Port-Of: odoo/odoo#272117
This update fixes a test issue in WhatsApp channels where a seen-status update could be sent before the connection was ready to receive it. As a result, the seen indicator now loads reliably and the test no longer fails intermittently.
Original PR description
The "Allow SeenIndicators in WhatsApp Channels" test delivers the seen update over the bus with `_sendone`, but nothing waited for the websocket to subscribe to the channel first. When the notification was sent before the subscription landed it was dropped, the member's seen_message_id was never updated client-side and the seen indicators never rendered, so the assertion timed out. The current user is a member of the channel, so it is subscribed at connection time: wait for the subscription together with `start()` (listener registered first) before opening the channel and sending the notification. https://runbot.odoo.com/odoo/error/242021 Forward-Port-Of: odoo/enterprise#121857
This change fixes an automated test so it works in databases that only have the Invoicing app installed. It prevents test failures in community setups where the accounting-specific payment state is not available.
Original PR description
The `in_payment` state does not exist in community with only the Invoicing module installed. It is added in `enterprise` in the Accounting module. runbot.build.error-939451 Forward-Port-Of: odoo/odoo#267475
The stock forecast report now converts all incoming and outgoing quantities into the product’s own unit of measure before showing them on the graph. This prevents mixed units from distorting the chart, so the forecast is easier to read and gives a more accurate view of future stock.
Original PR description
When a stock move's UoM differs from the product template's UoM, the report aggregation incorrectly shows data for both UoMs of stock move.quantity on the same graph. All moves should be normalized…
When a stock move's UoM differs from the product template's UoM, the report aggregation incorrectly shows data for both UoMs of stock move.quantity on the same graph. All moves should be normalized to the UoM of the product for which we are viewing the forecast. We can do this with: `m.quantity * move_uom.factor / pt_uom.factor AS quantity` If the UoMs of the stock move and the product template are identical, as is the case most of the time, this simply multiplies by one, and the query behaves exactly as it did before. But if the units are distinct, the move UoM is converted into the product template UoM so that the data for stock move quantity is normalized to one shared unit across the entire forecast graph. **E.g.**: m.quantity == 500g m.UoM == g m.UoM.factor == 1 pt.UoM == kg pt.UoM.factor == 1000 500g * 1 / 1000 ==> .5kg **Steps to Reproduce on Runbot**: 1. Create a product which uses kg and g. 2. Confirm and Validate a receipt for this product (10 kg for example). 3. Confirm a second receipt for this product in the same UoM kg. 4. Confirm and Validate a delivery for this product with UoM g (500 g for example). 5. View the forecasted graph for the product, and you will see that the y axis is scaled on grams ~500, and the current / future stock moves in the report are still scaled based on kg. opw-6234066 Forward-Port-Of: odoo/odoo#272245 Forward-Port-Of: odoo/odoo#266811
This fix prevents the Point of Sale app from crashing when a company has no country set. It makes receipt-related processing more resilient, so users are less likely to encounter an unexpected error during normal operations.
Original PR description
### Description: Fix an unhandled exception linked to `vat_check` by using optional chaining. When a company does not have a country set, accessing `vat_check` throws an error because the parent object is undefined. ### Reference: opw-6321507 ___ I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#271853
This update stops the messaging autocomplete from offering a “Create” action when there is no usable recipient text. It prevents accidental creation of blank contacts, avoiding clutter and later errors when those contacts are opened in Contacts.
Original PR description
The chatter recipients input always added a "Create" option to its autocomplete dropdown, even when the field held no text. The feature that introduced this input,…
The chatter recipients input always added a "Create" option to its autocomplete dropdown, even when the field held no text. The feature that introduced this input, https://github.com/odoo/odoo/commit/3b985d2c4239fe702c1a56bef04fc112af39e954, wired that option to create a res.partner straight away. Selecting "Create" with an empty input therefore created a partner with no name, displayed everywhere as "Unnamed". The email popover that opens for a recipient without an address then offered a Discard button, but the empty partner was already saved. The same sequence could be repeated to accumulate nameless contacts, which later raise a missing name error when opened in the Contacts app. Only add the "Create" option when the typed term resolves to a name or an email, in getAutoCompleteSources of recipients_input.js. An input with no usable text has nothing to create from, which matches the standard many2one autocomplete that only offers creation once text is entered. Steps to reproduce: 1. Open any record with a chatter 2. Click "Send message" 3. In the recipients field type a character then delete it, leaving the field empty with the dropdown still open 4. Click the "Create" option 5. On the "What's the email address of Unnamed?" popover, click Discard => A blank "Unnamed" contact is created, and repeating the steps creates more Ticket [link](https://www.odoo.com/odoo/action-4043/5942428) opw-5942428 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#250973
Tax reports now correctly include lines that belong to child taxes inside a tax group. This fixes missing amounts in generic report queries, helping ensure Philippine tax reports are more accurate and complete.
Original PR description
When using group taxes, the base invoice lines only store the parent tax in the `account_move_line_account_tax_rel` table. Because of this, if a child tax within the group contains a specific tax report tag, the generic report query would previously fail to pick up those base lines. This commit updates the SQL join conditions in `l10n_ph_generic_report.py` to also match `account_tax.id` against the child taxes of the linked parent tax using the `account_tax_filiation_rel` table. This ensures that base lines are correctly reported under the tags of their respective child taxes. Task-6278098 Forward-Port-Of: odoo/enterprise#121876 Forward-Port-Of: odoo/enterprise#121596
This update adds validation to ensure the company SIA code used for Italian Ri.Ba. exports is exactly 5 characters long. It prevents batch payment validation from failing with an error when the code is too long, helping users complete payments smoothly.
Original PR description
Currently, the sia_code field on res.company lacks length validation. For Italian Ri.Ba (CBI) exports, this field MUST be exactly 5 characters. If a user enters more (e.g., during initial setup), the Batch Payment validation (specifically the XML file generation) crashes with a traceback. Steps to Reproduce: - Set Company SIA Code to 6+ characters - Create multiple payments with Ri.Ba. method - Create a Ri.Ba Batch Payment - Click 'Validate' Ticket [link](https://www.odoo.com/odoo/project.task/6031062) opw-6031062 Forward-Port-Of: odoo/enterprise#121610
This update fixes a problem that could cause invoices with many section lines to crash when the system tries to calculate line grouping. It prevents unnecessary repeated recalculations, making large invoices more reliable to open and process.
Original PR description
Since PR #223686, `parent_id` became a non-stored field. On complex invoices with many sections, assigning `parent_id` to lines outside the current compute batch in `_compute_parent_id` triggers unwanted cascading recomputes. **Steps to reproduce:** 1. Create an invoice with 200+ sections and at least one product per section. 2. Read `parent_id` for any line. 3. "RecursionError: maximum recursion depth exceeded" is raised. **Fix:** Only assign `parent_id` to lines within the protected compute batch. opw-6302149 Forward-Port-Of: odoo/odoo#271350
The website generator’s page limit message has been rewritten to be more general instead of naming a fixed number. This gives the team more flexibility to adjust page limits later without needing another wording change.
Original PR description
Page limit note fixed by being more general instead of stating a blatant 200. This gives us more leeway to control the nbr of pages IAP side. Forward-Port-Of: odoo/enterprise#121827 Forward-Port-Of: odoo/enterprise#121671
This update ensures taxes defined to apply everywhere continue to work even when no fiscal position is set. It also keeps the tax-related view and totals in sync after fiscal position changes, so users see the right taxes and balances.
Original PR description
A tax created without a fiscal position (empty fiscal_position_ids) is conceptually an "All" tax: it should apply across every fiscal position, including the empty ones used for tax units. Problem…
A tax created without a fiscal position (empty fiscal_position_ids) is conceptually an "All" tax: it should apply across every fiscal position, including the empty ones used for tax units. Problem map_tax drops every tax when the FP has no mapping, including the "All" ones that should pass through. action_open_related_taxes only lists the FP's tax_ids, so "All" taxes are invisible from the FP form. The Taxes stat button is hidden whenever the FP has no tax_ids. action_update_fpos_values invokes the field computes directly, so tax and balance lines fall out of sync after an FP change. Fix map_tax: when the FP has no tax_ids, return the input taxes whose fiscal_position_ids is empty (the "All" ones) instead of an empty recordset. action_open_related_taxes: extend the domain to also include taxes bound to no fiscal position. partner_view: drop the invisible="not tax_ids" guard on the Taxes stat button. action_update_fpos_values: route the deferred computes through _check_balanced and _sync_dynamic_lines so tax lines stay in sync after the update. task-id [6231514](https://www.odoo.com/odoo/project/967/tasks/6231514) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#272350 Forward-Port-Of: odoo/odoo#268273
This change corrects a tax test so it no longer treats all taxes the same when a fiscal position is applied. Taxes that are not linked to any fiscal position are now correctly kept, while only taxes tied to a fiscal position are expected to be removed, making the test match real behavior more accurately.
Original PR description
map_tax on an empty fiscal position now preserves taxes with no fiscal_position_ids. Filter those out in test_tax_unit_auto_fiscal_position so the assertion only checks that taxes bound to a fiscal position are dropped by the unit FP. comunity PR: https://github.com/odoo/odoo/pull/268273 task-id 623151 Forward-Port-Of: odoo/enterprise#121889 Forward-Port-Of: odoo/enterprise#121525
This change prevents the Italian POS fiscal printer from getting stuck after printing the first receipt. It removes a timing conflict between receipt printing and the receipt screen, so the printer can continue handling later messages normally without requiring a page reload.
Original PR description
Module: l10n_it_pos Steps to reproduce: - In the POS settings, enable "Automatic Receipt Printing"; - Enable "ePos Printer" to make the "Skip Preview Screen" option appear; - Disable "Skip Preview…
Module: l10n_it_pos Steps to reproduce: - In the POS settings, enable "Automatic Receipt Printing"; - Enable "ePos Printer" to make the "Skip Preview Screen" option appear; - Disable "Skip Preview Screen"; - Disable "ePos Printer"; - Set up an Italian Fiscal Printer; - Open a POS session and process a first order. Issue: After the first receipt, no other messages (price display, receipt, open register) are sent to the fiscal printer. A page reload is required. Cause: When "Automatic Receipt Printing" is true but "Skip Preview Screen" is false, a race condition occurs. `afterOrderValidation` triggers a print job while simultaneously transitioning to the `ReceiptScreen`. When the `ReceiptScreen` mounts, it triggers a second fiscal print job before the first has resolved. This creates a deadlock in `toHtml` of `renderService`, permanently blocking the printer queue. Solution: Since the italian localisation sending the receipt to the fiscal printer is mandatory, the printing route is now tied to the "Skip Preview Screen" option. Enterprise PR: https://github.com/odoo/enterprise/pull/112654 [opw-5979212](https://www.odoo.com/odoo/project/49/tasks/5979212) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#271685 Forward-Port-Of: odoo/odoo#256932
This change prevents the Italian fiscal printer from getting stuck after the first receipt in POS. It removes the conflicting receipt-printing path and aligns the receipt flow with the fiscal printer setup so printing continues normally without requiring a page refresh.
Original PR description
Module: l10n_it_pos Steps to reproduce: - In the POS settings, enable "Automatic Receipt Printing"; - Enable "ePos Printer" to make the "Skip Preview Screen" option appear; - Disable "Skip Preview…
Module: l10n_it_pos Steps to reproduce: - In the POS settings, enable "Automatic Receipt Printing"; - Enable "ePos Printer" to make the "Skip Preview Screen" option appear; - Disable "Skip Preview Screen"; - Disable "ePos Printer"; - Set up an Italian Fiscal Printer; - Open a POS session and process a first order. Issue: After the first receipt, no other messages (price display, receipt, open register) are sent to the fiscal printer. A page reload is required. Cause: When "Automatic Receipt Printing" is true but "Skip Preview Screen" is false, a race condition occurs. `afterOrderValidation` triggers a print job while simultaneously transitioning to the `ReceiptScreen`. When the `ReceiptScreen` mounts, it triggers a second fiscal print job before the first has resolved. This creates a deadlock in `toHtml` of `renderService`, permanently blocking the printer queue. Solution: Since the italian localisation sending the receipt to the fiscal printer is mandatory, the printing route is now tied to the "Skip Preview Screen" option. UI settings are adjusted to hide the redundant auto-print checkbox when an IT fiscal printer is configured. Community PR: https://github.com/odoo/odoo/pull/256932 [opw-5979212](https://www.odoo.com/odoo/project/49/tasks/5979212) Forward-Port-Of: odoo/enterprise#121556 Forward-Port-Of: odoo/enterprise#112654
This fix prevents an error when sending Colombian debit notes to DIAN. It removes a field that should not be included in debit note documents, so these documents can be generated and submitted successfully.
Original PR description
Issue: Sending Debit Notes to a tax authority can cause the following error: "ValueError: The following child node is not defined in the template: DebitNote/cbc:BuyerReference" Steps to reproduce on…
Issue: Sending Debit Notes to a tax authority can cause the following error: "ValueError: The following child node is not defined in the template: DebitNote/cbc:BuyerReference" Steps to reproduce on any database with DIAN and Colombian localization: 1. Create a new "Sales" type journal. Then, check the checkbox “Nota de Debito”. 2. Find a res.partner with a ref field, or add a ref field to any partner. 3. Make an invoice using the partner found in step 2. Ensure it uses a tax. Confirm it. 4. Send that invoice to DIAN. 5. Create a Debit Note for that invoice. Use the journal created in step 1. 6. Add a product, price, and tax to the debit note. Confirm it. 7. Send the debit note to DIAN. Explanation: The `_add_invoice_header_nodes` method on the AccountEdiXmlUbl_21 model adds a BuyerReference node unconditionally. (See account_edi_xml_ubl_21.py.) But the DebitNote XML template does not include a BuyerReference element (see ubl_21_debit_note.py). This caused a ValueError when assembling the XML for debit note documents. Solution: The fix overrides this in the Colombian localization by clearing the BuyerReference value when the document type is "debit_note". That way, the node is omitted from the output. opw-6181039 Forward-Port-Of: odoo/enterprise#121458 Forward-Port-Of: odoo/enterprise#121422
This fix ensures that DIAN email templates are translated when a new language is added to a database. It matters because users installing languages after setup will now see these official email templates in their chosen language instead of partially untranslated content.
Original PR description
### Issue: When installing a new language on a database with `l10n_co_dian`, the DIAN email templates are not translated Languages already installed when `l10n_co_dian` is installed are correctly…
### Issue: When installing a new language on a database with `l10n_co_dian`, the DIAN email templates are not translated Languages already installed when `l10n_co_dian` is installed are correctly translated, as the copy happens at that moment Only languages installed afterwards are affected ### Cause: The DIAN email templates are created dynamically via `_create_dian_mail_templates` as copies of the `account` templates Because they are created at runtime, no translations exist for their XML IDs in the `l10n_co_dian` `.po` files The `TranslationImporter` finds nothing to import for them The fix hooks into `_load_module_terms` to sync translations from the source `account` templates to the DIAN ones whenever a new language is installed `TranslationImporter.save()` is used without `force_overwrite`, so existing translations on `noupdate` records are never replaced This is the standard way to push translations while preserving any manually modified values ### Notes: Languages installed before this fix are not updated Only newly installed languages will get the synced translations ### Steps to reproduce: - Install `l10n_co_dian` - Enable Developer Mode in Settings - Install any language (e.g. `fr_FR`) - Go in Settings > Technical > Email > Email Templates - Search for DIAN and open Invoice or Credit Note Before the fix, the DIAN invoice and credit note templates had untranslated name, description and body_html opw-6269979 Forward-Port-Of: odoo/enterprise#120855
4 changes
Resolved issues and error corrections
This update fixes an issue where messages in chat threads could sometimes fail to appear after a reload. It improves reliability so users consistently see the latest conversation content without needing to refresh again.
Original PR description
The Thread component mirrors `thread.isLoaded` into the `state.mountedAndLoaded` flag that gates whether the real messages (as opposed to the empty phantom placeholder) are rendered. The mirroring…
The Thread component mirrors `thread.isLoaded` into the `state.mountedAndLoaded` flag that gates whether the real messages (as opposed to the empty phantom placeholder) are rendered. The mirroring effect both read `mountedAndLoaded` as a dependency and wrote it. `useEffect` records its dependency array before running the body, so right after the effect sets `mountedAndLoaded` to true the recorded dependencies still hold the pre-write pair `[isLoaded=true, mountedAndLoaded=false]`; that update only settles on a later, microtask-deferred patch. When a second reload runs `reset()` in that window, it drives `mountedAndLoaded` back to false while `isLoaded` stays true. The settling patch then computes the very `[true, false]` pair that was already recorded, so the effect never re-runs: `mountedAndLoaded` is stranded at false and no message is ever rendered. Depend on a monotonic `resetCount` bumped by `reset()` instead of on `mountedAndLoaded` itself. It is never written by the effect, so the recorded dependencies can no longer match the current ones after a reset and the effect always re-runs to re-sync `mountedAndLoaded` with `isLoaded`. `reset()` keeps clearing `mountedAndLoaded` as before (the false dip is needed for the reload scroll handshake), so the behaviour is otherwise unchanged. https://runbot.odoo.com/odoo/error/940032 Forward-Port-Of: odoo/odoo#272281
The Italian Ri.Ba. setup now enforces that the company SIA code is exactly 5 digits. This prevents batch payment validation from failing later when generating the export file, avoiding disruptive errors for users during payment processing.
Original PR description
Currently, the sia_code field on res.company lacks length validation. For Italian Ri.Ba (CBI) exports, this field MUST be exactly 5 characters. If a user enters more (e.g., during initial setup), the Batch Payment validation (specifically the XML file generation) crashes with a traceback. Steps to Reproduce: - Set Company SIA Code to 6+ characters - Create multiple payments with Ri.Ba. method - Create a Ri.Ba Batch Payment - Click 'Validate' Ticket [link](https://www.odoo.com/odoo/project.task/6031062) opw-6031062 Forward-Port-Of: odoo/enterprise#121610
This change prevents invoice line grouping from getting stuck in a repeat calculation loop on very large, section-heavy invoices. It improves stability when opening or processing complex invoices, so users are less likely to hit errors.
Original PR description
Since PR #223686, `parent_id` became a non-stored field. On complex invoices with many sections, assigning `parent_id` to lines outside the current compute batch in `_compute_parent_id` triggers unwanted cascading recomputes. **Steps to reproduce:** 1. Create an invoice with 200+ sections and at least one product per section. 2. Read `parent_id` for any line. 3. "RecursionError: maximum recursion depth exceeded" is raised. **Fix:** Only assign `parent_id` to lines within the protected compute batch. opw-6302149 Forward-Port-Of: odoo/odoo#271350
When a pricelist uses a fixed price, variant extra prices are no longer relevant, but they were still shown to users. This update hides that badge in both Sales and Website Sales so customers and sales users only see prices that actually apply.
Original PR description
Issue: --- If pricelist.compute_price is fixed, extra price of variant is not taken into calculation, but it's shown in extra price badge. Steps to reproduce: --- 1- Create a product template with two variants. 2- Apply extra price for each attribute values. 3- Apply a pricing with a fixed price for the product on a pricelist. 4- Create a SO and apply the pricelist. Add the product to SOL. 5- Open product configurator on SOL. - As you see, the extra price is shown but it's not effective. 6- Open the product in website with the pricelist. - Here also the extra price is shown but it's not effective. Cause: --- This is caused because there is no mechanism to hide extra price having pricelist.compute_price == fixed. Fix: --- We need to fix the issue both in sale and website_sale separately by having a flag to ensure extra price badge is hidden if compute_price is fixed. opw-6276208 Forward-Port-Of: odoo/odoo#271572 Forward-Port-Of: odoo/odoo#270140
2 changes
Resolved issues and error corrections
This update fixes a failing automated test related to French leave management. It adds a safe fallback for the user time zone when it is not available during test runs, preventing avoidable errors in Odoo’s automated validation environment.
Original PR description
Currently the test test_holiday_in_week is failing in runbot tests This is due to the fact that during the tests the user tz in env is not set and hence it fails in the pytz library. Added a fallback to avoid the issue runbot issue opw-237623 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#248941
This update fixes an access issue that could block database users from synchronizing their databases. It ensures the correct permission check is applied so the synchronization process now completes smoothly.
Original PR description
The aim of this commit is to allow the databases_user to synchronize their databases. Context: The commit https://github.com/odoo/odoo/commit/846eb51a02baaf2e4f6e6780f8d0ceb23322c38b introduced a change of behavior in stable that performs some more check on access rights. Before this commit: The checks introduced by the commit resulted in an access error. There wasn't any groups on the action itself resulting in a check of the access right "write" on the model. As the model is `project.project` and a databases_user might not be granted write access on the project itself, it resulted in an access error. After this commit: The flow continues smoothly. As the action has now a group set on it, this is checked first and match the proper access right. opw-6329058 Forward-Port-Of: odoo/enterprise#121589
1 change
Resolved issues and error corrections
When a new file is uploaded in Documents, it is now shown with its available actions right away. This avoids the extra step of deselecting and reselecting the file just to access those actions, making the workflow smoother and faster.
Original PR description
Bug === When uploading a new file in documents, it's selected, but the actions are not visible (we need to unselect - select the record to see the actions). Task-5408471
3 changes
Resolved issues and error corrections
This change fixes an accounting issue where a grouped customer payment could stay marked incorrectly after a related invoice was edited and the bank reconciliation was undone. With the fix, all linked payments now switch back to the proper intermediate state, so they can be reconciled again without errors or inconsistent amounts.
Original PR description
**Steps to reproduce:** - Install Accounting - Create an invoice: * Customer: Partner A * Total: 30.00 - Confirm the invoice - Create a second invoice for the same customer: * Customer: Partner A *…
**Steps to reproduce:** - Install Accounting - Create an invoice: * Customer: Partner A * Total: 30.00 - Confirm the invoice - Create a second invoice for the same customer: * Customer: Partner A * Total; 10.00 - Confirm the invoice - From the invoice list, select both invoice - Create payment: * Journal: Bank * Group Payments: [checked] * Group Payments: [checked] * Amount: 40.00 - Create a third invoice for another customer: * Customer: Partner B * Total: 25.00 - Confirm the invoice - Register payment from the invoice - Install Accounting - Create an invoice: * Customer: Partner A * Total: 30.00 - Confirm the invoice - Create a second invoice for the same customer: * Customer: Partner A * Total; 10.00 - Confirm the invoice - From the invoice list, select both invoice - Create payment: * Journal: Bank * Group Payments: [checked] * Amount: 40.00 - Create a third invoice for another customer: * Customer: Partner B * Total: 25.00 - Confirm the invoice - Register payment from the invoice - Create a fourth invoice for another customer: * Customer: Partner C * Total; 40.00 - Confirm the invoice - Register payment from the invoice - From the payment list, select all 3 payments and create batch payment - Validate the batch payment - From Accounting dashboard, open Bank journal - Create a new bank statement line of 105.00 - Match it with the batch payment At that point, the statement line is reconciled with the 4 invoices and the 3 payments are marked as paid. - Go to the fourth invoice - Reset it to draft - Change the price - Save When the amount of the invoice is changed, the statement line is unreconciled and all the payments should change state from "Paid" to "In Process". **Issue:** All the single payments have their state correctly changed to "In Process", except for the group payment for the 2 first invoices, which leads to undesired values when trying to reconcile the statement line with the batch payment again. **Cause:** When the statement is unreconciled, all the partial reconcile records are deleted and the state of the linked payments are updated to "In Process". The payments are retrieved by checking if there are linked to an account move present in the partial reconcile record and if the amount of the payment matches the amount of the partial reconcile record. In case of a group payment, there are 2 partial reconcile records for each invoice linked to the payment. Therefore, in that case, the amount doesn't match the amount of the payment because it matches the amount of one of the invoice. opw-6141089
Shopee can send buyer identifiers that are larger than the system’s original limit, which could cause an error when creating new contacts. This update ensures those contacts are still matched and saved correctly, preventing sync failures for affected orders.
Original PR description
When the Shopee connector was introduced, Shopee documented `buyer_user_id` as an int32. We therefore store it in an `Integer` field, which maps to a PostgreSQL int32 column. However, feedback showed that Shopee can send ids exceeding the int32 bounds, leading to a traceback when creating new contacts. Shopee has since updated their documentation to confirm the field is actually an int64. Since we are in stable and cannot change the column type, this commit falls back to the `ref` field of the `res.partner` model to store and match Shopee contacts whose identifier doesn't fit within an int32. opw-6325948 See also: - master: https://github.com/odoo/enterprise/pull/121507 - upgrade: https://github.com/odoo/upgrade/pull/10578 Forward-Port-Of: odoo/enterprise#121498
The company SIA code is now checked to make sure it is exactly 5 digits, as required for Italian Ri.Ba exports. This prevents batch payment validation from failing later with an error when the code is too long.
Original PR description
Currently, the sia_code field on res.company lacks length validation. For Italian Ri.Ba (CBI) exports, this field MUST be exactly 5 characters. If a user enters more (e.g., during initial setup), the Batch Payment validation (specifically the XML file generation) crashes with a traceback. Steps to Reproduce: - Set Company SIA Code to 6+ characters - Create multiple payments with Ri.Ba. method - Create a Ri.Ba Batch Payment - Click 'Validate' Ticket [link](https://www.odoo.com/odoo/project.task/6031062) opw-6031062 Forward-Port-Of: odoo/enterprise#121610
6 changes
Resolved issues and error corrections
Completed shifts will now display correctly in the Kanban view. This restores the intended visual behavior so finished work is clearly shown as completed to users.
Original PR description
Issue: When completing a shift, the Kanban card is not blurred. Cause: In PR https://github.com/odoo/enterprise/pull/113153, the `state` value was changed from `completed` to `4_completed`, but the condition in the Kanban card was not updated. Fix: Update the Kanban card condition to use `4_completed` instead of `completed`.
This fix corrects an incorrect data key used in the Belgian payroll reporting process. It helps ensure payroll information is sent and interpreted properly, reducing the risk of reporting errors.
Original PR description
Task#6333132
This update corrects how activities are shown in the Sign chatter, making the information icon match the look of other activity types. It also prevents both the user and role avatars from appearing at the same time, improving clarity and reducing visual clutter.
Original PR description
* Aligning style of information icon with the one from other activity types * Avoid showing both user and role avatars Task-6292889 Task-6253574
When an AI agent opens a view and there are no results to display, the empty-state help text is now formatted consistently with manually opened views. This makes the message clearer and keeps the user experience consistent regardless of how the view is opened.
Original PR description
Purpose: -------- Currently, when a view is opened by an AI Agent and if there are no records to show (even after filtering them manually), the no content helper is not formatted as it would be if the user opened the view manually. This happens because the tools to open the views by AI return the action dictionaries instead of letting the action service fetch them based on an action Id. However `_loadAction` in the action service only markups the "help" key when it fetches the action, not if it was passed. With this commit, the "help" key will be markuped before being processed by the action service when an action dict is returned from an AI tool. Task-6251090 Forward-Port-Of: odoo/enterprise#120538
Bank reconciliation now shows child contacts consistently when choosing a partner, matching the behavior of the automatic reconciliation flow. This prevents users from being unable to select the correct contact for customer payments linked to a subsidiary contact.
Original PR description
When creating a bank statement line, we can not set an individual contact that is a children of a company contact. However, when clicking on the 'Set Partner' button, all contacts are shown in the modal list view. This commit aligns the domain coming from the 'Set Partner' button with the domain from the 'partner_id' field of the auto reconcile wizard Steps: - Have a contact X, with a child contact Y - Create and confirm an invoice for contact Y, amount 1000 - Create a bank statement line for 1000 -> You can not select Y, only X - Click 'Add & Close' - Click on 'Set Partner' button -> Y is displayed opw-6205154 Forward-Port-Of: odoo/enterprise#121354 Forward-Port-Of: odoo/enterprise#118036
Fixed an issue where the list autofill tooltip could show an error instead of a helpful label when the list data was still loading. This makes the spreadsheet experience smoother and prevents confusing messages during autofill suggestions.
Original PR description
The getter `getTooltipListFormula` would return the result of `getListHeaderValue` as the content of the tooltip, but this returned a loading error instead of a string if the list was not ready yet. Task: [6289944](https://www.odoo.com/web#id=6289944&cids=1&menu_id=4720&action=333&active_id=2328&model=project.task&view_type=form) Forward-Port-Of: odoo/enterprise#121416 Forward-Port-Of: odoo/enterprise#119876
5 changes
Resolved issues and error corrections
This update prevents an error that could appear when a user clears the currency field while registering a payment for Argentine withholding. It makes the payment process more reliable and avoids an unexpected traceback in this workflow.
Original PR description
When the user removes the currency from the payment register, a traceback is raised. Steps to reproduce the error: - Install ``l10n_ar_withholding`` module - Switch to ``(AR) Exento`` company - Create a new invoice > Confirm > Pay > Unset the currency Traceback: ```py ValueError: Expected singleton: res.currency() ``` https://github.com/odoo/odoo/blob/d98afdc08b46bf458eaa287ea882cc7663286a59/addons/l10n_ar_withholding/wizards/account_payment_register.py#L27 This line causes a traceback with an empty currency when the user removes the currency from the payment register. sentry-7362499567 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Mailing campaigns now correctly count email bounces for contacts, even when the bounce notice comes from a different sender address. This improves the accuracy of campaign reports and helps teams better identify invalid or unreachable email addresses.
Original PR description
Previously, when a mailing campaign sent out an email to a mailing.contact, and that email bounced, the bounce would not increment the contact's bounce count. This commit makes it so that the bounce count is correctly updated when a mailing campaign sends an email that bounces. task-4893615
When a user signs in from a new device, the alert email will now be sent in that user’s chosen language. This fixes cases where the subject and email content could appear in the wrong language, improving clarity and consistency for users with 2FA enabled.
Original PR description
**Steps to reproduce:** - Enable 2FA - Change user language - Log in in another private window / device - Check the notification email of a login with another device - Email body/subject are not properly adapted to user language **Issue:** View manual rendering doesn't pass the user language. **Fix:** Add it to the context before `_render_template` and subject translation (reapply similar fix [1]). [1] https://github.com/odoo/odoo/commit/4d8d1736ca03a3d6b4e86cbc7463a79a284d1f3c opw-6042550
This change prevents the Repair app from failing during installation in certain database setups. It matters because it restores successful automated builds and avoids a blocking error when the app is installed without optional add-ons being loaded first.
Original PR description
Runbot builds on version 17.0 and 18.0 fail due to the lines below. These lines reference `move.sale_line_id` as the previous dependencies did not add `sale_line_id` to the `stock.move` model when using --skip-auto-install. https://github.com/odoo/odoo/blob/51824f462402d3d141bda2717402d1fdcf2e118b/addons/repair/models/stock_move.py#L97-L100 To reproduced the issue: 1. New blank database 2. ./odoo-bin -d [database-name] -i repair --skip-auto-install 3. See error in console Looking ahead to verison 18.1+ we see the dependencies change here: https://github.com/odoo/odoo/commit/f7dbdec11b74f8c7d969763d8c5cf09542a47f86 **Affects 17.0 and 18.0** Ticket [link](https://www.odoo.com/odoo/project/27948/tasks/6306099) This can also close this very, very old PR https://github.com/odoo/odoo/pull/189584 Forward-Port-Of: odoo/odoo#271901
The Italian Ri.Ba. payment flow now checks that the company SIA code is exactly 5 digits long. This prevents batch payment validation from failing with an error during XML generation when the code is too long.
Original PR description
Currently, the sia_code field on res.company lacks length validation. For Italian Ri.Ba (CBI) exports, this field MUST be exactly 5 characters. If a user enters more (e.g., during initial setup), the Batch Payment validation (specifically the XML file generation) crashes with a traceback. Steps to Reproduce: - Set Company SIA Code to 6+ characters - Create multiple payments with Ri.Ba. method - Create a Ri.Ba Batch Payment - Click 'Validate' Ticket [link](https://www.odoo.com/odoo/project.task/6031062) opw-6031062 Forward-Port-Of: odoo/enterprise#121610