Daily updates from Odoo
Friday, November 14, 2025
175 changes
25 changes
Enhancements to existing features
Product names and descriptions sent in India e-invoicing and e-waybill documents are now automatically shortened when they exceed the required character limits. This helps prevent submission errors and ensures generated JSON stays compliant with local rules.
Original PR description
Product descriptions in invoice lines must comply with character limits: - E-invoicing: maximum 300 characters - E-waybill: maximum 100 characters for both product names and descriptions Descriptions exceeding these limits are automatically truncated in the generated JSON. task-5061450 Forward-Port-Of: odoo/odoo#228549
The point-of-sale now shows clearer messages when the fiscal device is disconnected or when a social security number is required but missing. It also tells the user what to do next, reducing confusion and helping staff resolve payment issues faster.
Original PR description
We now display an error when the FDM is disconnected, or when the user needs to fill in the social security number. We also advise what to do in such cases. Forward-Port-Of: odoo/enterprise#99285
This change makes stock availability calculations much faster for pickings with many linked incoming and outgoing moves. As a result, users should see product availability information update more quickly, especially on large transfers.
Original PR description
Before this commit, computing `product_availability` and `product_availability_state` required calling the `get_report_lines` method from the `stock.forecasted_product_product` model. In pickings…
Before this commit, computing `product_availability` and `product_availability_state` required calling the `get_report_lines` method from the `stock.forecasted_product_product` model. In pickings containing moves linked to many incoming and outgoing moves, the `reconcile_out_with_ins` function caused performance issues. The reconciliation logic worked as follows: 1. For each `out_move`, attempt to match it with an `in_move` if the `in_move` references the `out_move` in its `move_dests`. 2. If the demand of the `out_move` is not fully satisfied, add it to `unreconciled_outs`. 3. Loop over `unreconciled_outs` (after attempting to reconcile them using the initial prodcedure) to reconcile against the remaining `in_moves`. The performance bottleneck was that even when an `in_move` directly referenced an `out_move`, the code would unnecessarily loop over **all** `in_moves` to filter out the `in_moves` that has the `out_move` in its `move_dest`. --- To improve performance, an **inverse mapping** from `out_move` IDs to their corresponding `in_moves` is introduced. - Reconciliation now starts by iterating only over the relevant `in_moves`. - If the demand is still unmet, the algorithm attempts reconciliation against the remaining `in_moves`. - This reduces the time complexity to **O(N + M)**, since `in_moves` with zero quantities are removed and never revisited. **Implementation details:** - An `OrderedSet` is used for the inverse mapping to preserve the original query order. - Benefits of `OrderedSet`: - **O(1)** removal (assuming no collisions) - Maintains insertion order, ensuring the same order as the query result. --- | Metric | Before PR | After PR | |---------------|-----------|----------| | Execution Time| ~90 sec | ~10 sec | The benchmark above is done on a `stock.picking` record that queried in the `_get_report_lines` method **5331** `out_moves` and **8922** `in_moves`. opw-4951469 Forward-Port-Of: odoo/odoo#233967 Forward-Port-Of: odoo/odoo#224002
Resolved issues and error corrections
This update corrects how shipping data is rounded before being sent to DHL. It prevents validation failures caused by tiny floating-point precision differences, so shipments with prices or weights like 11.43 or 0.3 are accepted reliably.
Original PR description
Multiple rounding issues could cause DHL validation errors. Example with product price: - Create a storable product - Create a quotation with quantity 7, price 11.43 - Validate the SO - Go to delivery, use DHL carrier, validate - DHL traceback: 11.429999999999998 not multiple of 0.001 Example with product weight: - Create 3 products, each 0.1 kg - Create a SO with these products - Validate the SO - Go to delivery, use DHL carrier, validate - DHL traceback: 0.30000000000000004 not multiple of 0.001 See official DHL API documentation: https://developer.dhl.com/api-reference/dhl-express-mydhl-api and check the POST /shipments data schema opw-5000193 Forward-Port-Of: odoo/enterprise#98913 Forward-Port-Of: odoo/enterprise#96012
This update ensures the first line of a bank statement is always identified correctly, even when certain values are set during creation or later updated. This prevents incorrect bank journal balances from appearing, improving the reliability of account balances.
Original PR description
Ensure proper computation of first_line_index when line.internal_index or line.state changes. Previously, the computation of first_line_index was grouped with the date computation. However, due to a specific ORM behavior, the compute method is not triggered when one of the computed fields (in this case, the date) is provided in the create values. As a result, first_line_index could remain falsy, leading to an incorrect balance in the bank journal. no task id --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#235561
This change fixes a crash that could happen when checking which message was last seen by everyone in a discussion. It now uses a more reliable way to identify the current user’s member record, which prevents the error and makes the calculation more robust.
Original PR description
The `lastMessageSeenByAllId` compute function sometimes crashes when the persona linked to a member is unknown. This occurs because the compute function compares the member's persona to determine if it belongs to the current user. However, members are not always sent along with their persona. The compute function should instead compare the member directly to the current user's member. This fixes the issue and makes more sense. 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#235338 Forward-Port-Of: odoo/odoo#235253
This change ensures the system always sends the expected reconnecting and reconnect events when a websocket connection is lost unexpectedly, even if the closing handshake was incomplete. It improves the consistency of connection status updates and helps avoid intermittent failures in automated tests and live sessions.
Original PR description
The websocket worker broadcasts events that track connection state changes (connect, disconnect, reconnecting, reconnect). Sometimes a WebSocket can close without the client noticing, leaving it…
The websocket worker broadcasts events that track connection state changes (connect, disconnect, reconnecting, reconnect). Sometimes a WebSocket can close without the client noticing, leaving it stuck in the `CLOSING` state. If the client starts the worker during this period, the worker detects the issue and triggers a disconnect event, but neither reconnecting nor reconnect is emitted. Conceptually, reconnecting/reconnect should fire on any unexpected loss of connection. This patch ensures those events are properly triggered in this case. This also fixes a runbot error ([1]) where a test simulates the loss of the connection. The test sometimes runs before another service's call to `bus_service.start`, reproducing this exact scenario. [1]: https://runbot.odoo.com/odoo/runbot.build.error/223185 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#235319
This update removes the requirement to enter share capital for Italian companies that are not limited liability companies. It prevents unnecessary validation issues when setting up or updating company details, making the registration process smoother.
Original PR description
Share capital should not be mandatory for non limited liability company. [Ticket link](https://www.odoo.com/odoo/project.task/5131029) opw-5131029 Forward-Port-Of: odoo/odoo#235498
This fix allows users to generate a debit note from an existing credit note in the Argentine localization. Before this change, the process failed with an error, which made it harder to correct invoicing mistakes after a credit note had been issued.
Original PR description
Co-authored-by: Katherine Zaoral <zaoral@users.noreply.github.com> THE FIX COMES FROM: 37faec2f38c9658a0f491c72f284908dc929fa17 ORIGINAL PR: https://github.com/odoo/odoo/pull/205430 Description of…
Co-authored-by: Katherine Zaoral <zaoral@users.noreply.github.com> THE FIX COMES FROM: 37faec2f38c9658a0f491c72f284908dc929fa17 ORIGINAL PR: https://github.com/odoo/odoo/pull/205430 Description of the issue/feature this PR addresses: - In debit notes wizards: If we make a wrong credit note and we want to correct it we must generate a debit note related to it. Currently odoo only allows to generate debit notes from an invoice. Steps to reproduce the error. - Install the Argentine localization - Create an invoice and post it - From the invoice using the wizard create a credit note and post it. From the credit note open the wizard to create a debit note. On submit the wizard we obtain an exception "You can not use a credit_note document type with a invoice" This happens because the debit note wizard use copy method without change the l10n_latam_document_type_id value. Current behavior before PR: When creating a debit note from a credit note get an error. Desired behavior after PR is merged: We can create a debit memo from a credit note. opw-4304256 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#233875 Forward-Port-Of: odoo/odoo#225501
This change fixes an issue where creating multiple journals of the same type could trigger a duplicate alias error. Odoo now checks all relevant aliases, even when no alias domain is configured, so journal creation works consistently.
Original PR description
**Issue** When creating two new journals and selecting the *type* before the *name*, Odoo generates an alias using the type (e.g. `sale--...`). When saving a second journal with the same type, the…
**Issue** When creating two new journals and selecting the *type* before the *name*, Odoo generates an alias using the type (e.g. `sale--...`). When saving a second journal with the same type, the alias conflicts and raises a "This alias already exists" error. **Steps to Reproduce** 1. Navigate to Accounting > Configuration > Journals. 2. Create a new journal. 3. Set the Type to Sales before entering the Name. 4. Save the journal. 5. Repeat the process to create another journal of the same type. 6. Observe that an error occurs: alias name is already used. **Root Cause** The uniqueness check in _ensure_unique_alias only compares alias_name against existing aliases with the same alias_domain. However, many aliases are created with alias_domain = False. Since those were excluded from the domain, the check failed to detect duplicates correctly. **Fix** Update the domain in _ensure_unique_alias to also include aliases where alias_domain is unset. This ensures that aliases are always unique regardless of whether a domain is configured. Opw-5028713 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233101 Forward-Port-Of: odoo/odoo#225537
This update corrects how scheduling intervals are combined so they are consistently normalized before use. It prevents mismatches and errors when different interval types are merged, improving the reliability of planning-related operations.
Original PR description
Note: >The `WorkIntervals` class has been removed, and the `keep_distinct` flag has been introduced in `18.4` to simplify its logic. For the following explanation, we will refer to an `Intervals`…
Note: >The `WorkIntervals` class has been removed, and the `keep_distinct` flag has been introduced in `18.4` to simplify its logic. For the following explanation, we will refer to an `Intervals` class with `keep_distinct = False` as 'Intervals', and to one with `keep_distinct = True` as 'WorkIntervals'. ## The issue Prior to this commit, the `other` parameter in the `_merge` method could belong to a different class, not necessarily an instance of `Intervals`. https://github.com/odoo/odoo/blob/8c737601327acec1d83e1e5e3c6e66c9fd226339/addons/resource/models/utils.py#L158-L165 The comment indicates that normalization should be enforced; however, there is no corresponding reference to it within the `_boundaries` method. https://github.com/odoo/odoo/blob/8c737601327acec1d83e1e5e3c6e66c9fd226339/addons/resource/models/utils.py#L48-L53 That normalization just happens in the `__init__`. https://github.com/odoo/odoo/blob/8c737601327acec1d83e1e5e3c6e66c9fd226339/addons/resource/models/utils.py#L117-L132 ## Example For example, in Planning module, we perform operations between `Intervals` and `WorkIntervals`. The `WorkIntervals` class behaves differently from `Intervals`: while `Intervals` uses disjoint closed intervals, `WorkIntervals` uses disjoint semi-closed intervals. ## Side effects During these operations, the `_merge` method was not normalizing the `_items`, which caused inconsistencies and errors (when we are merging two unormalized intervals `([0, 10], [10, 20])` with an empty `others`). ## The fix This commit ensures that the `other` parameter is normalized before processing the `_merge` operation. The fix ensures that normalized intervals are always produced after `_merge`, even when unnormalized intervals are provided as input. ## Real case That issue has been found in that ticket: 5184291 Forward-Port-Of: odoo/odoo#235133 Forward-Port-Of: odoo/odoo#234352
This fix restores employee selection for users who do not have full Employees access, especially in mobile and Studio-created fields. It ensures public employee information can be read correctly so search results appear instead of showing no records.
Original PR description
**Steps to reproduce** - With Studio, create a many2one field in relation to the Employee model. - Have a user with no "Employees" rights. - With this user and in mobile view, click on the field to…
**Steps to reproduce** - With Studio, create a many2one field in relation to the Employee model. - Have a user with no "Employees" rights. - With this user and in mobile view, click on the field to select an employee. -> No records found. Note: the many2one_avatar_employee widget used in HR apps avoid this problem. **Cause** Issue since https://github.com/odoo/odoo/commit/e962860c6f0d8ec9e50bb376e1faab5c7bc69374 The `web_search_read` on the private employee model returns no records when an `image_*` or `avatar_*` field is part of the requested fields. This is because we try to fetch these fields https://github.com/odoo/odoo/blob/188a3fe45fb41463ff86d1fa5e930ab43fb70d0e/addons/hr/models/hr_employee.py#L240 but they are not stored on the public employee model, and will not be put in cache. When performing a read after that, these fields are missing from cache. We try to fetch them from the db https://github.com/odoo/odoo/blob/e962860c6f0d8ec9e50bb376e1faab5c7bc69374/odoo/models.py#L3185 but this fetch is again done using the public employee. This results in missing values and is interpreted as an access error, no data is returned in `web_search_read`. **Solution** Read the problematic fields to make them present in cache when the cache of the public employee is copied to the one of the private employee. opw-4297115 Forward-Port-Of: odoo/odoo#234456 Forward-Port-Of: odoo/odoo#197575
When a shape is already applied to a background or image, it is now clearly highlighted in the selector. This makes it easier for users to see the current choice, while also improving keyboard navigation and closing behavior for a smoother editing experience.
Original PR description
Before this commit, when a shape was applied to a background or an image, that shape was not highlighted in the shape selector. After this commit, active shapes are highlighted with a border in the shape selector. task-5187272
This change restores rounding calculations to the correct place in accounting scenarios and updates incorrect comments in the tests. It helps ensure invoices, refunds, and reconciliation behave consistently and are validated more accurately.
Original PR description
Also fixes the comments that were wrong. Change some values to better test things 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#235392 Forward-Port-Of: odoo/odoo#234213
The website now updates the displayed price without national taxes when a quantity-based fixed pricelist price applies. This ensures Argentinian customers see the correct price as they change quantities on product pages.
Original PR description
Versions -------- - saas-18.4+ Steps ----- 1. Have a company with Argentinian localization; 2. in Website settings, enable "Display Price without National Taxes"; 3. add a quantity-based fixed price on the website's pricelist; 4. go to a product page where the fixed price can be applied; 5. increase quantity so the fixed price should apply. Issue ----- The price without national taxes isn't getting updated. Cause ----- In the `_get_additional_combination_info` override, the given `quantity` gets ignored, as well as the pricelist price for product variants, instead defaulting to their `lst_price`. Solution -------- Pass the quantity to `_compute_price_rule`, and use the result for both templates & variants. opw-5040056
The Wave document layout now keeps multi-line footers from overlapping invoice content when viewed in the portal on mobile devices. This improves readability and prevents important information from being hidden in customer-facing previews.
Original PR description
In the Wave layout, a multi-line footer overlaps document information when the portal view is opened from a mobile interface. Steps to reproduce: - Open Settings > General settings > Configure Document Layout - Select Wave layout and add a multi-line footer - Open an invoice, go to portal preview, switch to mobile view Issue: The footer overlaps invoice information. This occurs because the boundaries of the SVG drawing are not well defined and it will unexpectedly shrink. opw-5023032 Forward-Port-Of: odoo/odoo#230230
Saudi invoices could lose their taxes when a customer was assigned a Saudi fiscal position. This update corrects the tax setup so the expected tax remains visible and applied on invoice lines.
Original PR description
Steps to reproduce: - With a SA company setup - Create an invoice - Set a Saudi Arabia partner - Add a product with 15% tax defined on it Issue: No tax shows up on the invoice line Analysis: This occurs because the default fiscal positions are all empty and empty fiscal positions remove all taxes. opw-5166882 Forward-Port-Of: odoo/odoo#234387
Warnings attached to products will only appear on sales, purchase, and stock documents when the warning feature is enabled in settings. This fixes the issue where old warnings could still show up even after the feature was turned off, reducing confusion for users.
Original PR description
Step to reproduce:
- install purchase
- go to setting -> (enable) warning
- create a new products and add purchase warning
- now disable the warning from setting
- create a PO with that product
Observation:
- warning is visible, even though we disabled the setting
Cause:
- After commit [1] , once a warning is set on a product, it is displayed on
document regardless of the warning setting.
[1]:https://github.com/odoo/odoo/commit/1e13520ca9bb18deba85110ce9362ac2adb55904
Fix:
- Fix the computes of warning message to run only,
when the warning setting is enabled
opw-5156107
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#231393This update fixes a configuration access issue in the bank transfer setup so the system can correctly read needed settings. It helps avoid errors when users prepare or send payments using ISO 20022 formats.
Original PR description
Forward-Port-Of: odoo/enterprise#99359
This update improves how fixed taxes are represented in electronic invoices, especially when some taxes must be excluded from the original line and shown separately. It also corrects rounding and grouping behavior so invoice totals and tax breakdowns are more accurate and consistent.
Original PR description
This commit contains 2 things: - an helper to extract any tax_data and move it to another base_line - the usage of this helper in UBL to turn emptying taxes into additional base_lines == Add helpers…
This commit contains 2 things: - an helper to extract any tax_data and move it to another base_line - the usage of this helper in UBL to turn emptying taxes into additional base_lines == Add helpers to turn tax_data into new base_lines easily == With this helper, you can now exclude any tax from any base line and turn them into new base lines. Also, I changed a bit the smooth distribution of rounding because the math.ceil is sometimes too greedy and make the whole results to be less accurate. == Make a different behavior between recycling contribution taxes / emptying taxes == In UBL, all fixed taxes are treated as allowances/charges. In this commit, we make a clear distinction between recycling contribution taxes that are treated as allowances/charges and emptying taxes that are exempted of tax and are treated as addition invoice lines in the document. == Fix a small issue with aggregate_function passed to reduce_base_lines_with_grouping_function == The aggregator wasn't called when setting the 'target_base_line' at the very first time. task_id: 5182783 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#234489
This update fixes an issue that could prevent pending transactions from displaying correctly in bank reconciliation screens. It also corrects how journal totals are retrieved, so the amounts shown to users are computed properly instead of being left unresolved.
Original PR description
In this commit: https://github.com/odoo/enterprise/commit/1691a9d6ec426566b81537544cafe09d9c62ad78 We added a template to inherit BankRecKanbanRenderer, but we forgot to add the extension. By doing that it broke the pending transaction template override. Also this: https://github.com/odoo/enterprise/commit/5d5a7aca4f0abb4492314324631e8b5463a35332 change the getJournalTotalAmount to use a super instead, but it was missing an await otherwise we just have a promise no task id Forward-Port-Of: odoo/enterprise#99066
This fix allows vendor bills and invoices with deferred amounts to be reset to draft multiple times, even when audit trail rules are involved. It removes a blocker that could prevent users from correcting and reprocessing these documents after a previous reset.
Original PR description
Resetting a vendor bill or invoice with deferred amounts will unlink or reset all existing deferred entries. If the audit trail is enabled, some of these entries must be cancelled instead. [AccountMove.button_draft()](https://github.com/odoo/enterprise/blob/a3f461040cb3443fbcb190c28fddae7044bbd1e7/account_accountant/models/account_move.py#L80-L88) If a protected entry is already cancelled, `AccountMove._unlink_or_reverse()` will still attempt to cancel it. This prevents entries from being Reset to Draft more than once. The current commit removes this restriction. opw-5187737 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#235223
When a customer requests a partial refund through Helpdesk, the credit note now includes only the product chosen in the refund wizard. This prevents unrelated products from being added to the credit note and makes the refund flow match the user’s selection.
Original PR description
_ ## Short functional explanation of the error Let's say a customer buys 2 products. An SO is created. This customer wants to refund only one of the 2 products. He sends a ticket to helpdesk and we…
_ ## Short functional explanation of the error Let's say a customer buys 2 products. An SO is created. This customer wants to refund only one of the 2 products. He sends a ticket to helpdesk and we click on refund. Even if we specify the product to refund, this action creates a credit note containing both products (previously present on the SO) instead of only the one to refund. Additionally, when selecting the product, we could see in the dropdown of suggestions all the existing products, instead of only the ones related to the SO. ## Reproduction Steps 1. Create a SO containing 2 different products and confirm it. 2. Create a regular invoice and confirm. 3. Go to Helpdesk. Click on the configuration tab, and helpdesk teams. 4. Click on your helpdesk team, scroll down. In After-Sales, check "Refunds". 5. Create a ticket and specify the customer who wants to refund. Make sure the correct helpdesk team is assigned. 6. Click on refund. It opens the wizard. Specify the product to refund and the Invoices to Refund. 7. Click on reverse. ### Expected behavior A credit note containing only the specified product to refund should be created. ### Unexpected behavior The created credit note contains both products originally present on the SO. ## Origin of the issue When issuing a refund from helpdesk_stock_account, this piece of code is called: https://github.com/odoo/enterprise/blob/2051e84c55618c64179c4b9f3e99f4e795bacd32/helpdesk_stock_account/wizard/account_move_reversal.py#L16-L17 which calls the ```reverse_moves``` method in the helpdesk_account.py file, which itself calls the ```reverse_moves``` method in the account_move_reversal.py file, in the account module, and so on. Finally, we arrive in the account_move.py file. In the ```_reverse_moves``` of this file, we can see the code: https://github.com/odoo/odoo/blob/bee7fc1f955c52a88b527ad9a2ddf0021529bbc7/addons/account/models/account_move.py#L4937-L4947 where we simply copy all the lines of the move in the SO without filtering them. As a result, we get the lines of the product we don't want to refund __ opw-5148789 Forward-Port-Of: odoo/enterprise#98771
The Website app’s “Optimize SEO” dialog has been adjusted so it waits for the page preview to finish loading before opening. This prevents occasional crashes when users try to open SEO tools immediately after reloading a page on a slow connection.
Original PR description
Steps to reproduce: - Open Website app and enter edit mode on any page. - Reload the page with a slow connection. - Immediately open "Optimize SEO" from the navbar menu. Before this commit, the dialog accessed the preview document while the iframe was reloading, so reading location.origin raised a TypeError. After this commit, the dialog waits for the iframe to finish loading or returns immediately when it is already complete, preventing crashes. task-5104033 Forward-Port-Of: odoo/odoo#235231 Forward-Port-Of: odoo/odoo#230820
This change prevents an error that could happen when a user opened Edit Configuration on a configurable product after its name had been removed from the order line. It ensures the edit option only appears when it is valid to use, avoiding a confusing interruption in the sales flow.
Original PR description
Currently, when a user adds a configurable product to an order line, and remove the name of product and click on `Edit Configuration` (pencil icon) error is encountered. **Steps to Reproduce:** -…
Currently, when a user adds a configurable product to an order line, and remove the name of product and click on `Edit Configuration` (pencil icon) error is encountered. **Steps to Reproduce:** - Install Sales module - Create a Quotation - Add a product(e.g Acoustic Bloc Screen), then only remove the name from the orderline and click on **edit button(pencil Icon)**. **Error:** `TypeError: SaleProductConfiguratorController.sale_product_configurator_get_values()` `missing 1 required positional argument: 'product_template_id'` **Root Cause:** When a user clicks on Edit configuration, the client-side JavaScript makes an RPC call to the server, targeting the `sale_product_configurator_get_values`. which expects product_template_id at [1] and since it is removed from order line the error is encountered. [1]- https://github.com/odoo/odoo/blob/1b657cf1e1ce43874a3ede307b2f8ad68216aa56/addons/sale/controllers/product_configurator.py#L11-L13 **Solution:** This commit prevents the error by correcting `depends` on the field `is_configurable_product`, which will ensure that edit button will be only present if the configurable product is selected. Sentry-5741581459, 6925770690 Forward-Port-Of: odoo/odoo#217464
10 changes
Enhancements to existing features
Product names and descriptions sent for Indian e-invoicing and e-waybill generation are now automatically shortened when they exceed the required character limits. This helps ensure the exported data stays valid and avoids failures when submitting documents to the authorities.
Original PR description
Product descriptions in invoice lines must comply with character limits: - E-invoicing: maximum 300 characters - E-waybill: maximum 100 characters for both product names and descriptions Descriptions exceeding these limits are automatically truncated in the generated JSON. task-5061450 Forward-Port-Of: odoo/odoo#228549
Resolved issues and error corrections
This change makes connection status notifications more consistent when a browser connection is lost unexpectedly. It ensures users and background services receive the full sequence of reconnecting and reconnect events, which helps avoid missed updates and reduces test failures.
Original PR description
The websocket worker broadcasts events that track connection state changes (connect, disconnect, reconnecting, reconnect). Sometimes a WebSocket can close without the client noticing, leaving it…
The websocket worker broadcasts events that track connection state changes (connect, disconnect, reconnecting, reconnect). Sometimes a WebSocket can close without the client noticing, leaving it stuck in the `CLOSING` state. If the client starts the worker during this period, the worker detects the issue and triggers a disconnect event, but neither reconnecting nor reconnect is emitted. Conceptually, reconnecting/reconnect should fire on any unexpected loss of connection. This patch ensures those events are properly triggered in this case. This also fixes a runbot error ([1]) where a test simulates the loss of the connection. The test sometimes runs before another service's call to `bus_service.start`, reproducing this exact scenario. [1]: https://runbot.odoo.com/odoo/runbot.build.error/223185 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#235319
This change prevents an error that could occur when the system checks which message was last seen by everyone in a conversation. It makes the check more reliable when some participant details are missing, improving chat stability for users.
Original PR description
The `lastMessageSeenByAllId` compute function sometimes crashes when the persona linked to a member is unknown. This occurs because the compute function compares the member's persona to determine if it belongs to the current user. However, members are not always sent along with their persona. The compute function should instead compare the member directly to the current user's member. This fixes the issue and makes more sense. 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#235338 Forward-Port-Of: odoo/odoo#235253
We updated the self-order IoT component so it can correctly read the newer image version date format. This prevents version checks from failing and helps keep device updates working smoothly.
Original PR description
New image versions are formatted as YYYY.MM.DD instead of YY.MM. The previous can be casted to float, but not the new one. We then only take the year and month to before casting. Forward-Port-Of: odoo/enterprise#99416
This update lets users create a debit note from an existing credit note in the Argentine localization. It removes an error that blocked this correction flow, making it easier to reverse and adjust documents when a credit note was issued by mistake.
Original PR description
Co-authored-by: Katherine Zaoral <zaoral@users.noreply.github.com> THE FIX COMES FROM: 37faec2f38c9658a0f491c72f284908dc929fa17 ORIGINAL PR: https://github.com/odoo/odoo/pull/205430 Description of…
Co-authored-by: Katherine Zaoral <zaoral@users.noreply.github.com> THE FIX COMES FROM: 37faec2f38c9658a0f491c72f284908dc929fa17 ORIGINAL PR: https://github.com/odoo/odoo/pull/205430 Description of the issue/feature this PR addresses: - In debit notes wizards: If we make a wrong credit note and we want to correct it we must generate a debit note related to it. Currently odoo only allows to generate debit notes from an invoice. Steps to reproduce the error. - Install the Argentine localization - Create an invoice and post it - From the invoice using the wizard create a credit note and post it. From the credit note open the wizard to create a debit note. On submit the wizard we obtain an exception "You can not use a credit_note document type with a invoice" This happens because the debit note wizard use copy method without change the l10n_latam_document_type_id value. Current behavior before PR: When creating a debit note from a credit note get an error. Desired behavior after PR is merged: We can create a debit memo from a credit note. opw-4304256 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#233875 Forward-Port-Of: odoo/odoo#225501
This fix ensures that restaurant self-orders placed with online payment and “Pay After Meal” selected are sent to the kitchen display as expected. It prevents orders from being missed in preparation, helping staff start work on time and avoid service delays.
Original PR description
Configuration: ------------------------- - Restaurant Mode - Self-Order Mode: “QR + Ordering” - Service At: Table Issue : Order Not coming in Preparation Display for (Pay-After-Meal) Online ---------------------------------------------------- Steps to Reproduce: 1. Open the Restaurant. 2. Place an order from the mobile self-order with “Pay After Meal” enabled. 3. Set online payment. 4. order does not appear in the kitchen display. Cause: - The system only sent paid orders to the kitchen, skipping pay-after-meal case. Fix: - Updated logic to send all orders to the kitchen when “Pay After Meal” is selected, --------------------------------------------------- Task-5106704 Related PR- https://github.com/odoo/odoo/pull/231005
This change corrects how certain bank export settings are read so the system can access them reliably. It helps avoid errors when generating payment files and ensures the process works as expected for users with standard permissions.
Original PR description
Forward-Port-Of: odoo/enterprise#99359
This update prevents the footer from overlapping invoice content when the Wave document layout is viewed on mobile devices. It keeps the document preview stable so multi-line footers display correctly and do not cover important information.
Original PR description
In the Wave layout, a multi-line footer overlaps document information when the portal view is opened from a mobile interface. Steps to reproduce: - Open Settings > General settings > Configure Document Layout - Select Wave layout and add a multi-line footer - Open an invoice, go to portal preview, switch to mobile view Issue: The footer overlaps invoice information. This occurs because the boundaries of the SVG drawing are not well defined and it will unexpectedly shrink. opw-5023032 Forward-Port-Of: odoo/odoo#230230
This update corrects how local fixed taxes are shown in Mexican CFDI documents. Previously, a fixed tax amount could be multiplied by 100 in the XML, which produced incorrect tax values; now the amount is handled properly so invoices are generated with the right local tax information.
Original PR description
Steps to reproduce: 1. With an MX Company setup configure a new tax as follows - Tax Computation: Fixed - SAT Tax Type: Local - Factor Type: Cuota - Amount: 5 2. Create a customer invoice with the tax 3. Generate CFDI Issue: In the XML the ImpuestosLocales node contains `<implocal:TrasladosLocales ImpLocTrasladado="VAT 0%" Importe="20.00" TasadeTraslado="500.00"/>` The tax fixed amount was multiplied by 100 This occurs because we don't check if the tax is fixed when normalizing the amount opw-5132807 Forward-Port-Of: odoo/enterprise#98988
Purchase orders that have been locked are now protected from cancellation. If someone wants to cancel one, they must first unlock it, which helps prevent accidental changes and keeps order records more reliable.
Original PR description
Issue before this commit: ========================== Locked purchase orders could still be cancelled, which defeats the purpose of locking them. Steps to reproduce: ========================== 1. Install the `purchase` module. 2. Enable "Lock Confirmed Orders" in the configuration. 3. Create and confirm a purchase order. 4. Lock the purchase order. 5. Try to cancel it → the PO still gets cancelled despite being locked. After this commit: =========================== Cancelling a locked purchase order is no longer allowed. If a user tries to cancel a locked PO, a UserError will be raised instructing them to unlock it first. Locking a purchase order is intended to prevent accidental changes, including edits and cancellations, once the order is confirmed. With this change, users must explicitly unlock a purchase order before cancelling it, ensuring better control and data integrity. TaskId: 4760864
7 changes
Resolved issues and error corrections
This update ensures browsers fetch the latest spreadsheet data instead of reusing an outdated cached version when a sheet is duplicated. As a result, duplicated tabs now show the most recent edits reliably.
Original PR description
It happens that browser may use a cache if there's no explicit cache control/expiration time: https://httpwg.org/specs/rfc9111.html#heuristic.freshness Steps to reproduce (non-deterministic): - create a new spreadsheet - do some changes, edit a few cells - right click on the tab and hit "Duplicate" => the spreadsheet is not up-to-date on the duplicated tab. The browser loaded the response from "disk cache" instead of fetching the latest data from the server. I'm using Chrom Version 142.0.7444.162 (Official Build) (64-bit) We add an explicit cache control.
Follow-up reminder emails now correctly send any attachments and dynamic reports configured on the email template. This ensures customers receive the full intended reminder message, without missing documents.
Original PR description
### Issue: We can add attachments and dynamic report to the email templates, but they are not sent with follow-ups. ### Steps to reproduce: - Go to the "Payment reminder" email template - Under the…
### Issue: We can add attachments and dynamic report to the email templates, but they are not sent with follow-ups. ### Steps to reproduce: - Go to the "Payment reminder" email template - Under the page "Content", add an attachment by clicking the "Attachments" button - Under the page "Settings", add a dynamic report - Create an overdue invoice for a partner - Go on the form view of the partner, "Accounting" page - Click "Send", make sure the template used is the one with the attachments - Send - The attachments on the template and the dynamic report are not sent ### Cause: The mail template to send the follow-ups is only used to prefill the wizard. ### Solution: Add the template in `_get_wizard_options()` to add the template in the option and later use it to add/generate its attachments. This commit also refactors how the attachments are computed: The previous code was adding the invoices PDFs then removing them. The whole process was confusing. Now `options['attachment_ids']` is appended in `_get_followup_attachments()` with the desired attachments depending on the options. opw-5147736 Forward-Port-Of: odoo/enterprise#98454
This update corrects how fixed local taxes are shown in Mexico CFDI invoices. Previously, the tax rate could be multiplied by 100 in the XML, producing incorrect values; now the exported information matches the configured tax amount.
Original PR description
Steps to reproduce: 1. With an MX Company setup configure a new tax as follows - Tax Computation: Fixed - SAT Tax Type: Local - Factor Type: Cuota - Amount: 5 2. Create a customer invoice with the tax 3. Generate CFDI Issue: In the XML the ImpuestosLocales node contains `<implocal:TrasladosLocales ImpLocTrasladado="VAT 0%" Importe="20.00" TasadeTraslado="500.00"/>` The tax fixed amount was multiplied by 100 This occurs because we don't check if the tax is fixed when normalizing the amount opw-5132807 Forward-Port-Of: odoo/enterprise#98988
This change fixes an issue where the system could try to read payment-related configuration without the proper elevated access. It helps ensure bank payment exports work reliably and avoids unexpected errors when processing these settings.
Original PR description
Forward-Port-Of: odoo/enterprise#99359
This update improves how Uruguayan vendor bills are synchronized and imported. It now processes all bills found in an uploaded XML file, keeps clearer tracking for manually created versus automatically created documents, and adds the related XML file to imported records for easier review and debugging.
Original PR description
1) Update l10n_uy_edi translations. 2) When an uruguayan xml file is uploaded on a purchase journal it could contain the information of more than one CFE but before this commit only the first CFE was…
1) Update l10n_uy_edi translations. 2) When an uruguayan xml file is uploaded on a purchase journal it could contain the information of more than one CFE but before this commit only the first CFE was processed. Now all the CFEs are processed. 3) Add suffix '-manual' for new vendor edi documents uuid that are created by drag and drop xml file. 4) Create xml attachment in the edi document if it is created by drag and drop xml file. 5) Add suffix '-notification' for new vendor edi documents uuid that are created by 'UY: Create vendor bills (sync from Uruware)'. 6) Cron is run by batches (size=10). 7) Add tests. The suffixes -manual and -notification are used to differentiate between EDI documents generated manually and those generated automatically. This is useful to determine whether the document was created by a user or by an automated process, also helps users identify its origin more easily and also it is useful for debugging and tracking purposes. Task Adhoc side: 43467 Task latam side: 1355 Forward-Port-Of: odoo/enterprise#86829
This update fixes a timing issue in batch barcode processing so the system correctly waits for each barcode action to finish before continuing. It helps prevent occasional scan-related test failures and makes batch scanning more reliable for users.
Original PR description
Commit bc9247d46225c696842bc7b0e3c883320231ab1b has introduced an override of the `processBarcode` method. However, it does not return nor await the super call. In particular, in the case where the super call should be done the overrides returns "undefine" rather than a promess to await and hence that call is not awaited anymore. Note: This error has been noticed from the fact that the test `test_barcode_batch_scan_lots` sometimes fails on step 29/31. runbot-233631 Forward-Port-Of: odoo/enterprise#99303
When creating a refund from Helpdesk, the credit note now includes only the product chosen by the user. It also limits the product suggestions to items related to the original sales order, reducing mistakes and making refunds more accurate.
Original PR description
_ ## Short functional explanation of the error Let's say a customer buys 2 products. An SO is created. This customer wants to refund only one of the 2 products. He sends a ticket to helpdesk and we…
_ ## Short functional explanation of the error Let's say a customer buys 2 products. An SO is created. This customer wants to refund only one of the 2 products. He sends a ticket to helpdesk and we click on refund. Even if we specify the product to refund, this action creates a credit note containing both products (previously present on the SO) instead of only the one to refund. Additionally, when selecting the product, we could see in the dropdown of suggestions all the existing products, instead of only the ones related to the SO. ## Reproduction Steps 1. Create a SO containing 2 different products and confirm it. 2. Create a regular invoice and confirm. 3. Go to Helpdesk. Click on the configuration tab, and helpdesk teams. 4. Click on your helpdesk team, scroll down. In After-Sales, check "Refunds". 5. Create a ticket and specify the customer who wants to refund. Make sure the correct helpdesk team is assigned. 6. Click on refund. It opens the wizard. Specify the product to refund and the Invoices to Refund. 7. Click on reverse. ### Expected behavior A credit note containing only the specified product to refund should be created. ### Unexpected behavior The created credit note contains both products originally present on the SO. ## Origin of the issue When issuing a refund from helpdesk_stock_account, this piece of code is called: https://github.com/odoo/enterprise/blob/2051e84c55618c64179c4b9f3e99f4e795bacd32/helpdesk_stock_account/wizard/account_move_reversal.py#L16-L17 which calls the ```reverse_moves``` method in the helpdesk_account.py file, which itself calls the ```reverse_moves``` method in the account_move_reversal.py file, in the account module, and so on. Finally, we arrive in the account_move.py file. In the ```_reverse_moves``` of this file, we can see the code: https://github.com/odoo/odoo/blob/bee7fc1f955c52a88b527ad9a2ddf0021529bbc7/addons/account/models/account_move.py#L4937-L4947 where we simply copy all the lines of the move in the SO without filtering them. As a result, we get the lines of the product we don't want to refund __ opw-5148789 Forward-Port-Of: odoo/enterprise#98771
16 changes
Enhancements to existing features
The Indian localization now determines whether invoice lines are goods or services directly from the HSN code, reducing unnecessary mismatch warnings. Missing or invalid HSN codes will now block invoice reporting, helping businesses catch compliance issues earlier.
Original PR description
With this **PR**, we remove the warning about mismatches between HSN code and product type. From now on, the product type will be derived directly from the HSN code: if the HSN starts with '99', it will be considered a 'service'; otherwise, it will be treated as 'goods'. This simplifies the user experience by reducing unnecessary warnings. This will also cover cases where the product is service but the HSN is of goods for e.g. Job Work, Discount Line etc. Additionally, invalid/missing HSN on invoice line will now raise a blocking warning. **task**-5061450 Community PR - https://github.com/odoo/odoo/pull/227879 Forward-Port-Of: odoo/enterprise#95108
Point of Sale can now send refund requests to Six payment terminals when an order line has a negative amount. This helps stores process returns through the terminal more accurately and adds safeguards to avoid incorrect automatic refunds from invalid transaction data.
Original PR description
This PR adds the possibility to refund payments with Six terminals which use TIM (Till Integration Module) protocol. When the amount is negative on an order line in PoS, it will now request a refund instead of a payment on a Six terminal This PR also adds the reversals to Six terminals and adds a check for the `transactionType` field to make sure we don't automatically refund if we get invalid data in this field task-3619619
Kenya payroll is being updated so flexible benefit amounts are configured through salary rules instead of separate payroll input records. This makes payroll setup more consistent and prepares the benefits configuration for the newer salary-rule-based flow, with related test and demo data updates.
Original PR description
The main purpose is to adapt the flexible benefits system to use salary rules for its configuration. At this stage, it simply requires converting the payroll inputs into flexible salary rules. . Adapted the record in the hr_salary_rule_data that linked to payroll inputs to become salary rules with condition_select set to property_input. . Removed the obsolete records previously defined in hr.payslip.input.type and converted their purpose into corresponding salary rules in hr.salary.rule. . Modify the existing tests in test_salary_rules and updated demo data to correctly utilize the new salary rule codes for input creation task-5122338
Planning users will now see more readable names when selecting resources and sale order lines in dropdown fields. This makes it easier to identify the right resource or sales line quickly and reduces selection mistakes.
Original PR description
New formatting for M2X selection of: - Resource - Sale Order Line Improved display_name of Resource and Sale Order line in M2X dropdowns by applying formatted_display_name. task-4972325 Examples : <img width="509" height="459" alt="image" src="https://github.com/user-attachments/assets/6cfa9d8a-59d9-4db5-aa6f-812fe9599068" />
When a call activity is completed by placing a call, the related call record is now shown directly in the chatter. This makes it easier for users to review call details and keep communication history connected to the business record.
Original PR description
If a call activity is marked as done by placing a call, we will show the link to the voip.call record in the chatter. Task-5108217
SEPA payroll payments can now be used without automatically installing the full Accounting app. This keeps Accounting optional while allowing businesses to use Payroll with the free Invoicing module, helping avoid unnecessary plan or pricing changes.
Original PR description
Purpose: Previously, installing Payroll with SEPA payments automatically installed the Accounting app through the `hr_payroll_account` dependency. This forced users out of the OAF plan and added a large module they might not need. This PR includes: - Removed dependency on `hr_payroll_account` from the SEPA Payroll module. - Added dependency on `hr_payroll` instead. - If Accounting is installed, SEPA continues to work as before. Result: With this change, SEPA payroll payments can now work with only the Invoicing module (which is free and doesn’t impact pricing). Accounting remains optional, if already installed, the behavior stays the same. task-5248512
Invoices and sales orders for Brazilian localization now show a clearer tax breakdown for each line, including tax name, amount, and percentage. This improves transparency for users and their customers, especially when taxes are calculated through Avalara.
Original PR description
*: l10n_br_edi, l10n_br_avatax, l10n_br_edi_sale, l10n_br_edi_pos Purpose: Display the tax breakdown of each line on invoices and sale orders, showing the tax name, tax amount, and tax percentage. This implementation will offer transparency to users and their customers alike. Additional changes: - Refactored duplicate logic to mixin since common methods were used across pos.order, sale.order, and account.move - Added _search_existing_tax so that taxes can be searched based on the response received from Avalara - Added l10n_br_tax_details compute to mixin - Extracted _l10n_br_call_avatax_taxes for pos.order and sale.order - l10n_br_edi_avatax_data should be a Json field and not be cleared task-5117824
Planning schedules now show every employee in a selected department when viewing shifts grouped by resource, including employees without assigned shifts. This makes it easier for managers to spot available people and assign work directly from the Gantt view.
Original PR description
Steps to reproduce: - Install the Planning module - Open the Gantt view - Group by Resource - Search using a Department Now, allocated and unallocated employees are shown when grouping by resource and filtering by department. This helps in easily assigning shifts. task-4377548
Resolved issues and error corrections
Fixed an issue where Brazil AvaTax installations could fail if the Brazil EDI module was not installed. The tax calculation now uses its own country-code mapping, improving reliability for companies using AvaTax on its own.
Original PR description
Problem: When only l10n_br_avatax or l10n_br_avatax_sale are installed, an AttributeError gets thrown because the field, l10n_br_edi_code, is defined in the dependent module, l10n_br_edi. Solution: A mapping from the country to its EDI code is defined in the mixin so that the required information is still passed into the tax calculation request. This removes the need to use the field l10n_br_edi_code defined in l10n_br_edi. related PR: https://github.com/odoo/enterprise/pull/97845 runbot-build-error-233841
Partial credit notes on subscription invoices now reduce the invoiced quantity only by the amount credited, instead of clearing it completely. This keeps subscription records accurate after partial refunds, helping teams avoid billing discrepancies and incorrect subscription status information.
Original PR description
**Issue** When creating a partial credit note (i.e., for a quantity less than originally invoiced) for a subscription invoice, the `qty_invoiced` on the corresponding subscription order line is…
**Issue** When creating a partial credit note (i.e., for a quantity less than originally invoiced) for a subscription invoice, the `qty_invoiced` on the corresponding subscription order line is incorrectly set to zero, instead of reflecting the remaining quantity. **Steps to Reproduce** 1. Create a subscription with a quantity of 50. 2. Confirm the subscription and generate an invoice. 3. Create a credit note (reversal) for the invoice. 4. Change the credited quantity to 30. 5. Post the credit note. 6. The subscription order line shows qty_invoiced = 0 instead of the expected 20. **Root Cause** The method `_get_max_invoiced_date()` is used to determine the latest invoiced period for a subscription. In its original implementation, it removes refunded periods from the list of invoice dates regardless of whether the refund is partial or full. This causes the system to consider the period as not invoiced at all, which leads to incorrect recomputation of `qty_invoiced` **Fix** Adjust `_get_max_invoiced_date()` to track the net invoiced quantity per period. A period is only removed from the list of invoice dates if it has been fully refunded (i.e., net quantity is zero). This ensures that partially refunded periods are still considered invoiced, and the `qty_invoiced` is correctly updated to reflect the remaining quantity Opw-4908760 Forward-Port-Of: odoo/enterprise#99326 Forward-Port-Of: odoo/enterprise#91344
This update restores the correct display and calculation of pending bank transactions in bank reconciliation. It fixes a missing template extension and ensures totals are fully calculated before being shown, helping users see accurate reconciliation information.
Original PR description
In this commit: https://github.com/odoo/enterprise/commit/1691a9d6ec426566b81537544cafe09d9c62ad78 We added a template to inherit BankRecKanbanRenderer, but we forgot to add the extension. By doing that it broke the pending transaction template override. Also this: https://github.com/odoo/enterprise/commit/5d5a7aca4f0abb4492314324631e8b5463a35332 change the getJournalTotalAmount to use a super instead, but it was missing an await otherwise we just have a promise no task id Forward-Port-Of: odoo/enterprise#99066
Payroll accounting localization packages now install automatically when the matching local payroll app is installed. This prevents missing salary journal settings, helping payroll structures work correctly without manual setup.
Original PR description
Bug: On a runbot, when installing a new loca, the structure doesn't have a salary journal. Cause: If you have hr_payroll_account, you then have payroll and accounting. Then let's say you install l10n_eg_hr_payroll, it will not automatically install l10n_eg_hr_payroll_account because it depends on l10n_eg which is not installed. So the field salary journal exists because of hr_payroll_account but is not populated by the l10n_eg_hr_payroll_account module. Fix: Change the autoinstall modules needed so that only the hr_payroll_account and l10n_xx_hr_payroll account are needed to autoinstall the l10n_xx_hr_payroll_account module. This will automatically install the corresponding l10n_xx module. Task: 5245980
This fix ensures older payments missing a required tracking ID can still be included in payment batches. When exporting payments, the system now creates the missing ID automatically, avoiding errors for companies with legacy data.
Original PR description
…ayments The migration script [1] for the end-to-end feature creates the `end_to_end_uuid` field even when `account_online_payment` is not installed. In such databases, the field is added but remains NULL for existing payments. If these legacy payments are later added to a batch, a traceback occurs because the batch logic assumes that `end_to_end_uuid` is always set [2]. This commit generates a UUID on the fly when exporting a payment whose `end_to_end_uuid` is empty, ensuring that batch creation works correctly even when `account_online_payment` was not installed. [1]: https://github.com/odoo/upgrade/blob/ed83d47b2aaa63113ea86ea83d1ca2c886f60063/migrations/account_iso20022/saas~18.5.1.0/pre-migrate.py#L10 [2]: https://github.com/odoo/enterprise/blob/ebdc2fe2ade72b1505dac5490b7df2a1d06fcb4b/account_iso20022/models/account_journal.py#L289 no task-id Forward-Port-Of: odoo/enterprise#99364
Intrastat reports now use the region assigned to the relevant warehouse when one is available, instead of always falling back to the company default. This improves reporting accuracy for businesses operating warehouses in different regions, including sales, purchases, and point-of-sale flows.
Original PR description
* = stock_intrastat_{pos,purchase_stock,sale_stock}
This commit changes the intrastat report to use the warehouse intrastat
region on moves that has a warehouse intrastat region. Previously, the
region applied was the default one in the company's configuration. The
report's query and domain were modified to take into account the warehouse
region if the move has a warehouse intrastat region.
3 new bridge modules were created with pos, purchase stock, and sale stock.
Each bridge module adds the necessary query join and domain to get the region code.
task-5135764The bank reconciliation screen now uses the remaining unpaid amount when adding partially reconciled invoices or bills. This prevents incorrect payment amounts from appearing and helps accounting teams reconcile bank transactions accurately.
Original PR description
A mistake in 0051b2e1cc12112767acb60a451b0c0b40ab9358 made the bank rec widget use the total currency amount instead of the residual currency amount, which lead to incorrect amounts when adding an invoice/bill line that was previously partially reconciled.
Report variants that are limited by country are shown correctly again when foreign VAT is not allowed. This restores access to the appropriate accounting reports for companies operating under those local rules.
Original PR description
Since this commit https://github.com/odoo/enterprise/commit/13b28f789e0b1d9c3e266a99aae65c48bb6ce8b6, no variants with the availability condition set to country and not allowing foreign vat were displayed anymore. Forward-Port-Of: odoo/enterprise#99379
25 changes
Enhancements to existing features
This change clears the blackbox processing queue whenever point-of-sale data is reloaded. It helps prevent rare situations where queued requests could keep repeating and cause the POS to become unresponsive.
Original PR description
This commit adds a clear of the blackbox queue when reloading data. This could avoid potential unexpected deadloop of calls in the queue. Forward-Port-Of: odoo/enterprise#99252
This change removes the need for the Sign app to be installed for the accountant knowledge features to work. It simplifies setup and reduces unnecessary dependency between products, while keeping the related templates and embedded signature elements available where needed.
Original PR description
task-5154292
Resolved issues and error corrections
This change moves a fleet-related tax report test and its query logic out of the community edition and into the enterprise module where the required vehicle data is available. It resolves a build failure in the community version while preserving the intended fleet reporting behavior for enterprise users.
Original PR description
Community build was failing with: ``` FAIL: TestAccountFleet.test_tax_report_with_vehicle_split_repartition Traceback (most recent call last): File '/data/build/odoo/addons/account_fleet/tests/test_account_fleet.py', line 99, in test_tax_report_with_vehicle_split_repartition self.assertEqual(len(tax_details), 2) AssertionError: 0 != 2 ``` The test and SQL join logic relied on `vehicle_id` propagation that only exists in the enterprise addon `account_accountant_fleet`. Since the community edition cannot populate `vehicle_id` on tax lines, the query always returned zero rows, causing the failure. To fix this, the fleet-specific tax report query and test have been moved to the enterprise module, where the vehicle-aware tax reporting functionality actually resides. This keeps community builds green while retaining the intended behavior in enterprise. runbot error:233462 Forward-Port-Of: odoo/odoo#235339 Forward-Port-Of: odoo/odoo#234095
This change prevents tracking from crashing when related records do not have a display name. Instead of showing an error, the system now falls back to a safe default, matching the behavior used in similar cases. This improves reliability for users working with tracked one-to-many and many-to-many fields.
Original PR description
Description of the issue/feature this PR addresses: Addresses: https://github.com/odoo/odoo/issues/178883 Same issue is also in 18.0. Is there a separate PR necessary or will this be ported forward? Current behavior before PR: An error is displayed when tracking is activated on one2many and many2many with records without display_name. Desired behavior after PR is merged: Should not crash and use fallback like in other cases. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#214121
Fixed an issue where opening certain dropdowns on the website could accidentally trigger a page reload in some browsers. This improves the experience for visitors and editors by preventing the page from refreshing before a selection is made.
Original PR description
In some browsers, opening a `<select>` triggers a click event. Because of this when the blog's sidebar "Archive" dropdown is opened, it might reload the page before the selection is actually made. This commit solves this by detecting a distinct event when PostLink is activated on `<select>` element. Steps to reproduce: - Using Firefox - Install `website_blog` - Edit the blogs page - Activate the sidebar - Save - Open the "Archive" dropdown => The page was reloaded Forward-Port-Of: odoo/odoo#233202
The fleet tax reporting test and related query were moved into the Enterprise edition, where the required vehicle-linked data is available. This fixes community build failures while keeping the intended fleet reporting behavior available for Enterprise users.
Original PR description
Community build was failing with: ``` FAIL: TestAccountFleet.test_tax_report_with_vehicle_split_repartition Traceback (most recent call last): File '/data/build/odoo/addons/account_fleet/tests/test_account_fleet.py', line 99, in test_tax_report_with_vehicle_split_repartition self.assertEqual(len(tax_details), 2) AssertionError: 0 != 2 ``` The test and SQL join logic relied on `vehicle_id` propagation that only exists in the enterprise addon `account_accountant_fleet`. Since the community edition cannot populate `vehicle_id` on tax lines, the query always returned zero rows, causing the failure. To fix this, the fleet-specific tax report query and test have been moved to the enterprise module, where the vehicle-aware tax reporting functionality actually resides. This keeps community builds green while retaining the intended behavior in enterprise. runbot error:233462 Forward-Port-Of: odoo/enterprise#99288 Forward-Port-Of: odoo/enterprise#98650
This change allows outstanding accounts to be created even when a company does not use a standard chart template. It helps businesses with manually configured accounting setups avoid errors and continue processing expenses normally.
Original PR description
The creation of outstanding accounts when fallback should not require a chart template, since companies may have manually configured their chart of accounts. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update prevents errors when creating a new branch in Indian databases that do not yet have newly introduced taxes. It ensures the correct fiscal mappings are created for both intra-state and inter-state cases, avoiding failures during setup.
Original PR description
In cases, where new taxes are introduced in stable, and for the fiscal mapping are added as well. But for existing dbs, the new tax might not be available and when creating new branch it might lead to traceback because, we create new fiscals for intrastate and interstate --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change prevents a permissions error that could stop sales orders from being confirmed in branch-company setups, especially when dropshipping is enabled. It ensures Odoo checks company-related taxes in a safer way so users only see records they are allowed to access.
Original PR description
Versions -------- - saas-18.4+ Steps ----- 1. Create a branch company B; 2. create a branch C for the branch company B; 3. change to branch C; 4. create a warehouse; 5. enable dropshipping; 6. add a…
Versions -------- - saas-18.4+ Steps ----- 1. Create a branch company B; 2. create a branch C for the branch company B; 3. change to branch C; 4. create a warehouse; 5. enable dropshipping; 6. add a vendor to a stored product with the Dropship route enabled; 7. log in as a sales user with access to branch C only; 8. add product to a sales order & confirm. Issue ----- > Access Error > Uh-oh! Looks like you have stumbled upon some top-secret records. > Sorry, Marc Demo (id=5) doesn't have 'read' access to: > - Companies, YourBranch (res.company: 3) Cause ----- The error gets thrown during the `_prepare_purchase_order_line` method, specifically on the line which filters `supplier_taxes_id` using `lambda x: x.company_id in company_id.parent_ids`. This passes via the field's `convert_to_record` method, which attempts to access the `active` field of the companies to filter out any that are archived[^1]. [^1]: https://github.com/odoo/odoo/blob/5b911a97a3885283d2f21ac30abb96cb10fe39d9/odoo/orm/fields_relational.py#L608-L612 In previous versions, this wasn't an issue, because the `active` field was still present in cache from the `_compute_parent_ids` which is called with `sudo`, but as of saas-18.4, it attempts to refetch these values, leading to the error. Solution -------- Instead of using `filtered`, use `filtered_domain` using the result of `account.tax._get_company_domain`. opw-5112625 Forward-Port-Of: odoo/odoo#231743
When opening a project from a sales order, the system now automatically focuses on the tasks linked to that specific sales order. This prevents users from first seeing unrelated tasks from the same project, making it easier to find the information they need.
Original PR description
Before this commit, when the user clicks on x projects and x tasks stat button in the sale order form view and that SO is linked to some task and more than one project, the user will be redirected in kanban view of projects and when he will click on a project, he will see all tasks linked to that project instead of seeing the tasks linked to SO inside that project. This commit makes sure a default search is added in the tasks views when the user open a project from an SO to be sure the user will first see the tasks linked to that SO.
This change prevents the chat system from crashing in cases where a member’s profile information is missing. It now uses a more reliable way to identify the current user’s member record, which keeps message tracking working correctly.
Original PR description
The `lastMessageSeenByAllId` compute function sometimes crashes when the persona linked to a member is unknown. This occurs because the compute function compares the member's persona to determine if it belongs to the current user. However, members are not always sent along with their persona. The compute function should instead compare the member directly to the current user's member. This fixes the issue and makes more sense. 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#235338 Forward-Port-Of: odoo/odoo#235253
Opening some activity items from the Activities calendar could fail when the system did not provide enough information to display the record. This fix adds a safe fallback so the correct form view opens instead of showing an error, improving reliability for users.
Original PR description
When opening certain activity items from the Activity Calendar popover,
the backend returns an `ir.actions.act_window` result missing the `views` key.
The frontend attempted to call:
action.views.map(...)
which caused:
TypeError: Cannot read properties of undefined (reading 'map')
This patch adds a safe fallback:
if (!action.views) action.views = [[false, "form"]];
so that the action always has a valid view, preventing a crash and maintaining expected behavior.
Steps to reproduce:
- Go to Activities → Calendar
- Click on different activity items
- Click the "View" button
- JS error occurs for some items
After applying this fix, affected actions open a fallback form view instead of crashing.
This issue also occurs on official demo (demo.odoo.com).Saudi invoices could incorrectly show no tax on invoice lines when a Saudi customer was selected. This fix restores the expected tax behavior so invoices calculate and display taxes properly for Saudi Arabia setups.
Original PR description
Steps to reproduce: - With a SA company setup - Create an invoice - Set a Saudi Arabia partner - Add a product with 15% tax defined on it Issue: No tax shows up on the invoice line Analysis: This occurs because the default fiscal positions are all empty and empty fiscal positions remove all taxes. opw-5166882 Forward-Port-Of: odoo/odoo#234387
This update fixes two issues in mailing messages: an extra blank paragraph could be added in the email content, and some opened messages could keep expanding the page indefinitely. It improves the reliability of the email editor and makes saved mailings display correctly in read-only view.
Original PR description
This [commit] introduced 2 issues in `mass_mailing`: - when creating a mailing with the basic editor, it adds an empty paragraph above the `o_layout` block, even thought the entire mailing content…
This [commit] introduced 2 issues in `mass_mailing`: - when creating a mailing with the basic editor, it adds an empty paragraph above the `o_layout` block, even thought the entire mailing content should be enclosed inside the `o_layout` block. - when sending such an email (with the wrong paragraph) and consulting the readonly value in the `mass_mailing` Form view, the view started growing indefinitely. How to reproduce: - create a mailing using the basic editor and send the email - open the mailing in readonly Issues: - there is a paragraph outside the `o_layout` element in the DOM - the page scrolls indefinitely because `o_layout` has `min-height: 100%`. Resolution: - don't force `o_layout` to have a `min-height`, which will prevent the infinite scrolling for mailing that were sent with a wrongly placed paragraph. - configure the mailing so that the editable element has `contenteditable="false"`, and the element with `o_mail_no_options` coming from the basic template gets `contenteditable="true"` so that the editor is informed that the user is only allowed to edit the content of that node, not the outside of it, which will prevent the empty paragraph insertion. [commit]: https://github.com/odoo/odoo/commit/edf7f7bb0c62978640c181eccb4934855d5d872d task-5263045
The signing process test now runs with a regular user instead of only an administrator, which helps catch permission-related mistakes that were previously missed. This prevents a signing error from slipping through when a salesperson field points to the wrong user and a customer tries to sign a document.
Original PR description
By running the test_sign_flow tour as a regular user, a typo is detected by the tests in the sign.send.request wizard. The issue is that, on the model `res.partner`, the field `user_id` is the…
By running the test_sign_flow tour as a regular user, a typo is detected by the tests in the sign.send.request wizard.
The issue is that, on the model `res.partner`, the field `user_id` is the Salesperson associated to this Contact, whereas the field `user_ids` contain the `res.users` that inherit this Contact, and `main_user_id` is the most appropriate User of `user_ids` when we need only one.
When testing as admin, all fields are the admin user, whereas when testing as Laurie Poiret (or any regular user), the Salesperson is still the admin while `main_user_id` is Laurie Poiret.
A regular user can access only its own `sign_signature` field, while an administrator can access the `sign_signature` of all users, so this bug remained undetected:
On a runbot, log in as `admin` to change the sales person of Marc Demo to Mitchel Admin, then log in as `demo` and click on "Sign Now" on the `Rental_Agreement.pdf` template.
You do not have enough rights to access the field "sign_signature" on User (res.users). Please contact your system administrator.
Operation: read
User: 5
Groups: allowed for groups 'Role / Administrator'This change ensures the system consistently reports when a WebSocket connection is lost and then recovered, even in a rare edge case where the closing process was incomplete. It helps keep connection status events accurate and also resolves an intermittent test failure in the background service.
Original PR description
The websocket worker broadcasts events that track connection state changes (connect, disconnect, reconnecting, reconnect). Sometimes a WebSocket can close without the client noticing, leaving it…
The websocket worker broadcasts events that track connection state changes (connect, disconnect, reconnecting, reconnect). Sometimes a WebSocket can close without the client noticing, leaving it stuck in the `CLOSING` state. If the client starts the worker during this period, the worker detects the issue and triggers a disconnect event, but neither reconnecting nor reconnect is emitted. Conceptually, reconnecting/reconnect should fire on any unexpected loss of connection. This patch ensures those events are properly triggered in this case. This also fixes a runbot error ([1]) where a test simulates the loss of the connection. The test sometimes runs before another service's call to `bus_service.start`, reproducing this exact scenario. [1]: https://runbot.odoo.com/odoo/runbot.build.error/223185 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#235319
This change fixes an issue in the Argentine localization where users could not generate a debit note from an existing credit note. It now lets businesses correct mistakes more smoothly by creating the proper reversing document without encountering an error.
Original PR description
Co-authored-by: Katherine Zaoral <zaoral@users.noreply.github.com> THE FIX COMES FROM: 37faec2f38c9658a0f491c72f284908dc929fa17 ORIGINAL PR: https://github.com/odoo/odoo/pull/205430 Description of…
Co-authored-by: Katherine Zaoral <zaoral@users.noreply.github.com> THE FIX COMES FROM: 37faec2f38c9658a0f491c72f284908dc929fa17 ORIGINAL PR: https://github.com/odoo/odoo/pull/205430 Description of the issue/feature this PR addresses: - In debit notes wizards: If we make a wrong credit note and we want to correct it we must generate a debit note related to it. Currently odoo only allows to generate debit notes from an invoice. Steps to reproduce the error. - Install the Argentine localization - Create an invoice and post it - From the invoice using the wizard create a credit note and post it. From the credit note open the wizard to create a debit note. On submit the wizard we obtain an exception "You can not use a credit_note document type with a invoice" This happens because the debit note wizard use copy method without change the l10n_latam_document_type_id value. Current behavior before PR: When creating a debit note from a credit note get an error. Desired behavior after PR is merged: We can create a debit memo from a credit note. opw-4304256 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#233875 Forward-Port-Of: odoo/odoo#225501
This change fixes a build failure affecting payroll tests by removing a field reference from modules that do not always have it available. It helps ensure payroll localizations can be tested reliably without unexpected errors during automated builds.
Original PR description
The issue occurs because the _get_whitelist_fields_from_template() method includes the overtime_from_attendance field, introduced in this https://github.com/odoo/enterprise/pull/92093. This field comes from the hr_work_entry_attendance module, which is not listed as a dependency in all payroll localisations. As a result, the field cannot be found during test execution. Solution: Remove the overtime_from_attendance field from all _get_whitelist_fields_from_template overrides in the localisation modules, and instead include this field by overriding the function in the hr_work_entry_attendance module. build error-243483 task-5169211
This fix brings back report variants that were no longer shown for companies using country-based availability rules without foreign VAT support. It ensures the correct report options appear again, so users can access the right local tax reports as expected.
Original PR description
Since this commit https://github.com/odoo/enterprise/commit/13b28f789e0b1d9c3e266a99aae65c48bb6ce8b6, no variants with the availability condition set to country and not allowing foreign vat were displayed anymore.
This update fixes a rounding problem in DHL shipping data that could cause shipment validation to fail for perfectly normal prices and weights. It helps ensure deliveries can be created smoothly without DHL rejecting the request due to tiny floating-point precision errors.
Original PR description
Multiple rounding issues could cause DHL validation errors. Example with product price: - Create a storable product - Create a quotation with quantity 7, price 11.43 - Validate the SO - Go to delivery, use DHL carrier, validate - DHL traceback: 11.429999999999998 not multiple of 0.001 Example with product weight: - Create 3 products, each 0.1 kg - Create a SO with these products - Validate the SO - Go to delivery, use DHL carrier, validate - DHL traceback: 0.30000000000000004 not multiple of 0.001 See official DHL API documentation: https://developer.dhl.com/api-reference/dhl-express-mydhl-api and check the POST /shipments data schema opw-5000193 Forward-Port-Of: odoo/enterprise#99012 Forward-Port-Of: odoo/enterprise#96012
This update ensures the first line of a bank statement is computed correctly whenever key line details change. It prevents cases where the statement balance could be wrong because an internal index was not refreshed at the right time.
Original PR description
Ensure proper computation of first_line_index when line.internal_index or line.state changes. Previously, the computation of first_line_index was grouped with the date computation. However, due to a specific ORM behavior, the compute method is not triggered when one of the computed fields (in this case, the date) is provided in the create values. As a result, first_line_index could remain falsy, leading to an incorrect balance in the bank journal. no task id --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#235561
This change prevents an error that could appear when creating multiple journals of the same type before naming them. Odoo now correctly keeps aliases unique even when no alias domain is set, avoiding a save failure for users.
Original PR description
**Issue** When creating two new journals and selecting the *type* before the *name*, Odoo generates an alias using the type (e.g. `sale--...`). When saving a second journal with the same type, the…
**Issue** When creating two new journals and selecting the *type* before the *name*, Odoo generates an alias using the type (e.g. `sale--...`). When saving a second journal with the same type, the alias conflicts and raises a "This alias already exists" error. **Steps to Reproduce** 1. Navigate to Accounting > Configuration > Journals. 2. Create a new journal. 3. Set the Type to Sales before entering the Name. 4. Save the journal. 5. Repeat the process to create another journal of the same type. 6. Observe that an error occurs: alias name is already used. **Root Cause** The uniqueness check in _ensure_unique_alias only compares alias_name against existing aliases with the same alias_domain. However, many aliases are created with alias_domain = False. Since those were excluded from the domain, the check failed to detect duplicates correctly. **Fix** Update the domain in _ensure_unique_alias to also include aliases where alias_domain is unset. This ensures that aliases are always unique regardless of whether a domain is configured. Opw-5028713 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233101 Forward-Port-Of: odoo/odoo#225537
The Wave document layout no longer allows a multi-line footer to overlap invoice content when viewed on mobile. This improves the readability and appearance of portal previews and prevents document information from being hidden.
Original PR description
In the Wave layout, a multi-line footer overlaps document information when the portal view is opened from a mobile interface. Steps to reproduce: - Open Settings > General settings > Configure Document Layout - Select Wave layout and add a multi-line footer - Open an invoice, go to portal preview, switch to mobile view Issue: The footer overlaps invoice information. This occurs because the boundaries of the SVG drawing are not well defined and it will unexpectedly shrink. opw-5023032 Forward-Port-Of: odoo/odoo#230230
Regular users could experience a crash when receiving incoming calls because the system tried to update call details without the needed access rights. This update lets the call handler save the contact link safely, preventing the interruption and keeping incoming calls working smoothly.
Original PR description
In order to prevent users from tampering with their voip.call records, they aren't given direct write access to them. This leads to crashes in the get_contact_info function, which attempts to update the partner_id field of call records. This commit resolves the issue by switching to sudo mode for setting the partner_id.
Pasted web links in the message composer now turn into clickable links correctly. This improves the writing experience and helps users share links without needing to reformat them manually.
Original PR description
When pasting a URL in the html composer, the link was not being correctly parsed and converted into a clickable hyperlink. This commit fixes the issue by ensuring that the LinkPastePlugin is included in the composer plugin set, allowing for proper link detection and conversion. Also, this commit forced links to open in a new tab when being parsed with LinkPlugin. task-5259858 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
12 changes
Resolved issues and error corrections
When a helpdesk refund is created from a sales order, the credit note now contains only the product that was actually selected for refund. This also improves the product dropdown so users only see products related to the original sales order, reducing mistakes and unnecessary corrections.
Original PR description
_ ## Short functional explanation of the error Let's say a customer buys 2 products. An SO is created. This customer wants to refund only one of the 2 products. He sends a ticket to helpdesk and we…
_ ## Short functional explanation of the error Let's say a customer buys 2 products. An SO is created. This customer wants to refund only one of the 2 products. He sends a ticket to helpdesk and we click on refund. Even if we specify the product to refund, this action creates a credit note containing both products (previously present on the SO) instead of only the one to refund. Additionally, when selecting the product, we could see in the dropdown of suggestions all the existing products, instead of only the ones related to the SO. ## Reproduction Steps 1. Create a SO containing 2 different products and confirm it. 2. Create a regular invoice and confirm. 3. Go to Helpdesk. Click on the configuration tab, and helpdesk teams. 4. Click on your helpdesk team, scroll down. In After-Sales, check "Refunds". 5. Create a ticket and specify the customer who wants to refund. Make sure the correct helpdesk team is assigned. 6. Click on refund. It opens the wizard. Specify the product to refund and the Invoices to Refund. 7. Click on reverse. ### Expected behavior A credit note containing only the specified product to refund should be created. ### Unexpected behavior The created credit note contains both products originally present on the SO. ## Origin of the issue When issuing a refund from helpdesk_stock_account, this piece of code is called: https://github.com/odoo/enterprise/blob/2051e84c55618c64179c4b9f3e99f4e795bacd32/helpdesk_stock_account/wizard/account_move_reversal.py#L16-L17 which calls the ```reverse_moves``` method in the helpdesk_account.py file, which itself calls the ```reverse_moves``` method in the account_move_reversal.py file, in the account module, and so on. Finally, we arrive in the account_move.py file. In the ```_reverse_moves``` of this file, we can see the code: https://github.com/odoo/odoo/blob/bee7fc1f955c52a88b527ad9a2ddf0021529bbc7/addons/account/models/account_move.py#L4937-L4947 where we simply copy all the lines of the move in the SO without filtering them. As a result, we get the lines of the product we don't want to refund __ opw-5148789
This fix stops a crash that could happen when a user tried to edit a configurable product on a quotation after removing its name. The edit option now only appears when it is actually valid, preventing the error and avoiding a broken user experience.
Original PR description
Currently, when a user adds a configurable product to an order line, and remove the name of product and click on `Edit Configuration` (pencil icon) error is encountered. **Steps to Reproduce:** -…
Currently, when a user adds a configurable product to an order line, and remove the name of product and click on `Edit Configuration` (pencil icon) error is encountered. **Steps to Reproduce:** - Install Sales module - Create a Quotation - Add a product(e.g Acoustic Bloc Screen), then only remove the name from the orderline and click on **edit button(pencil Icon)**. **Error:** `TypeError: SaleProductConfiguratorController.sale_product_configurator_get_values()` `missing 1 required positional argument: 'product_template_id'` **Root Cause:** When a user clicks on Edit configuration, the client-side JavaScript makes an RPC call to the server, targeting the `sale_product_configurator_get_values`. which expects product_template_id at [1] and since it is removed from order line the error is encountered. [1]- https://github.com/odoo/odoo/blob/1b657cf1e1ce43874a3ede307b2f8ad68216aa56/addons/sale/controllers/product_configurator.py#L11-L13 **Solution:** This commit prevents the error by correcting `depends` on the field `is_configurable_product`, which will ensure that edit button will be only present if the configurable product is selected. Sentry-5741581459, 6925770690
This update fixes two issues in website editing: one where deleting a replaced image could block saving, and another where using the browser Back button could leave the editor in an error state. It helps users safely discard or save changes without the page getting stuck or showing unexpected errors.
Original PR description
\* : website, web_editor, html_editor Commit [1]: Steps to reproduce: replacing image stuck issue when deleted 1. Go to Website > Edit. 2. Add any picture snippet (e.g., Text-Image). 3. Click the…
\* : website, web_editor, html_editor Commit [1]: Steps to reproduce: replacing image stuck issue when deleted 1. Go to Website > Edit. 2. Add any picture snippet (e.g., Text-Image). 3. Click the 'Replace' button and upload an image. 4. Open the media dialog again and delete the uploaded image. 5. Click the 'Discard' button. 6. Try to save the changes. Issue: - The website gets stuck in the same position and does not allow saving. - In the Python terminal, a missing error warning appears because the image is deleted from both `ir.ui.view` and `ir.attachment`. Expected behaviour: - Saving should be allowed with a default image, that is similar to other images. This commit catch the warning response and replaces the deleted image, allowing the website to save changes without getting stuck. Commit [2]: resolve traceback when leaving edit mode via browser Steps to reproduce: 1. Go to Website > Edit. 2. Open the snippet modal and select any snippet. 3. Press the 'Back' button in your browser. 4. A dialog will appear asking to discard changes; click 'OK'. 5. A traceback error occurs, and an empty space appears in the editor. Issue: - Previously, a commit addressed a similar scenario, but that time the browser had an event listener bind on hashchange. - Now, that `hashchange` event of browser has been replaced with `popstate`, which triggers before the 'window' event listener. - As a result, the editor is left in an unstable state, causing a traceback error. Solution: - This commit ensures the 'window' event executes before the browser event. - It verifies if the editor is open and forces a `skipLoad`, preventing the `route_change` call in the browser. task-4570164
This fix restores the ability to refuse a validated leave allocation when there are already approved leaves in the same period. Before this change, the system could wrongly treat those existing leaves as if they belonged to the new allocation, blocking the refusal with an error message.
Original PR description
## Issue: When you have an allocation and set a leave for that period, if you add a new allocation for that period and you validate it, it will be impossible to Refuse this allocation later A…
## Issue: When you have an allocation and set a leave for that period, if you add a new allocation for that period and you validate it, it will be impossible to Refuse this allocation later A UserError was raised asking to remove the leave even if it should be linked to the first allocation created ## Cause: The `action_refuse()` method for `hr.leave.allocation` uses the `virtual_leaves_taken` value inside the `_get_consumed_leaves()` function's result That parameter is calculated for the allocation as far as it state is `validate`, for all the leaves in that time interval, including previously created leaves The leaves will be allocated to the last allocation created, so the last one can't be removed later As a result, the allocation is considered as already used by these pre-existing leaves, even if the leave can still be modified to return to the state prior to the allocation's validation ## Steps to reproduce: - Create an initial Allocation (that should end after the next created Allocation) - Create a Leave from 22/12/2025 to 31/12/2025 - Create an Allocation including the leave period (01/12/2025 to 31/12/2025) - Validate, then Refuse opw-4900686 Forward-Port-Of: odoo/odoo#222171
This fix prevents subscription invoicing from failing when a previously invoiced order line has been deleted. It keeps invoice generation working normally, including the earlier partial credit note behavior, so customers can continue billing without errors.
Original PR description
**Issue** When a subscription order line is deleted after being invoiced, attempting to create a new invoice for the subscription raises a UserError about UoM category mismatch. Video:…
**Issue** When a subscription order line is deleted after being invoiced, attempting to create a new invoice for the subscription raises a UserError about UoM category mismatch. Video: https://drive.google.com/file/d/11-CV7wcEHQJFoVEQM5o5YBkZuTXPYDqL/view **Steps to Reproduce** 1. Create and confirm a subscription with a recurring product (e.g., Car Leasing) 2. Generate and post the invoice for the subscription 3. Add a new product line to the subscription (e.g., Office Cleaning Service) 4. Delete the original invoiced line (Car Leasing) 5. Attempt to create an invoice for the new product line → Error: "The unit of measure Units defined on the order line doesn't belong to the same category as the unit of measure False defined on the product. Please correct the unit of measure defined on the order line or on the product, they should belong to the same category." (https://drive.google.com/file/d/11-CV7wcEHQJFoVEQM5o5YBkZuTXPYDqL/view) **Root Cause** Commit https://github.com/odoo/enterprise/commit/22e49fca1e0fbfefac974c562491d170b8d70025 introduced quantity tracking per period in _get_max_invoiced_date() to fix partial credit note handling. The implementation accesses `sale_line_ids.product_uom` assuming sale_line_ids is always populated. However, when a sale order line is deleted, the related account.move.line remains in the system with empty sale_line_ids. Accessing `sale_line_ids.product_uom` on an empty recordset returns False, causing the UoM validation to fail during invoice creation. **Fix** Add a fallback to use the invoice line's own product_uom_id when sale_line_ids is empty. This preserves the partial credit note fix from https://github.com/odoo/enterprise/commit/22e49fca1e0fbfefac974c562491d170b8d70025 while handling the edge case of deleted subscription lines. If no valid UoM is found, the line is skipped in the calculation.
This fixes an error that could prevent the Survey kanban view from opening properly. The update reuses an existing setting instead of trying to overwrite a read-only value, restoring normal access to the view.
Original PR description
Similar error as in #103351, but now in the kanban view instead of in the list view. We encountered an error when opening the survey kanban view because the renderer override attempted to assign a value to the "canCreate" property, which is defined as a getter only. To solve this, we now rely on the existing "canCreate" property directly. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes several Viva Wallet payment problems in Point of Sale. Payments are now matched to the correct order and terminal, so overlapping transactions, stuck payments, and page refreshes during payment no longer cause confirmations to fail or affect the wrong sale.
Original PR description
This commit fixes various issues when using Viva Wallet, including the following: - When two Viva Wallet terminals had a payment in process at the same time in the same POS, one of the payments would…
This commit fixes various issues when using Viva Wallet, including the following: - When two Viva Wallet terminals had a payment in process at the same time in the same POS, one of the payments would fail on Odoo even when it succeeded on the terminal. - When a previous Viva Wallet payment was stuck (never completed or failed), trying to make a new payment would mistakenly affect that previous order instead of the new order. - When refreshing the page during a payment, it becomes stuck and never confirms or fails. To fix these issues, there are two main changes: 1. Stop using the `getPendingPaymentLine` method to retrieve the Viva Wallet payment line. This method is flawed as it assumes there is only one pending payment at a time. 2. Store the Viva session ID for a payment in the payment line's UI state, instead of on the plain JS object. This allows it to persist after a refresh. opw-5226966 opw-5248178 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change fixes an issue that could cause barcode scanning to fail when entering certain barcode numbers, especially with GS1 settings. It ensures the system uses the correct information from the scan result so warehouse users can continue scanning without errors.
Original PR description
This error occurs while entering the barcode number. Steps to reproduce: --- - Install `stock_barcode` module(without demo) - Setting > Barcode > Set Barcode Nomenclature = `Default GS1 Nomenclature`…
This error occurs while entering the barcode number. Steps to reproduce: --- - Install `stock_barcode` module(without demo) - Setting > Barcode > Set Barcode Nomenclature = `Default GS1 Nomenclature` - Barcode > click on `Scan or tap` > Enter a barcode(barcode number should startwith `urn` (eg: "urn:epc:tag:sgtin-96 : 3.0614141.038656.0")) > Apply Traceback: --- `KeyError: 'rule'` (with GS1 Nomenclature) `AttributeError: 'list' object has no attribute 'get'` (without GS1 Nomenclature) At [1], we expect the key `rule` to be present in the result, but this key is never set in the return statement at [2]. Since [1] also relies on the result’s type, a new key value `type` has been added in this [commit] to address that. This commit ensures that the correct keys are passed in the result dictionary. [1]- https://github.com/odoo/enterprise/blob/b001e9cc2af0f800e2a7965b61aa9b9c5bd4e89e/stock_barcode/controllers/stock_barcode.py#L29-L31 [2]- https://github.com/odoo/odoo/blob/f8f72b15598576f5870e49879e96fc5c127a6100/addons/barcodes/models/barcode_nomenclature.py#L174-L189 [commit]: https://github.com/odoo/odoo/commit/1394fa161a6fcf77b4443cbf784ad7dd635e7f9e#diff-be2a58d0591614180295c070396ff487f4bc04bf33aad2829d7bfab4671a792cR60 sentry-6992944243
This update corrects how withholding taxes paid during payments are reflected in Philippine tax reports. It ensures the reported amounts match what businesses actually withheld, improving the accuracy of submitted figures and reducing reporting discrepancies.
Original PR description
Partially backport the rework from 19 in order to ensure withholding taxes on payment affect the amounts as expected. Community PR: odoo/odoo#226794 Ref 19.0 Community: odoo/odoo#218090 Ref 19.0 Enterprise: odoo/enterprise#89830 Task [link](https://www.odoo.com/odoo/project.task/5081387) task-5081387
The Uruguay EDI process now always calculates exchange rates against the Uruguayan Peso, even when the company uses a different base currency. This makes invoice and electronic document amounts more consistent and reduces the risk of incorrect rate handling for foreign currencies.
Original PR description
This PR fixes the currency rate calculation in the Uruguay EDI module to always compute the rate relative to UYU (Uruguayan Peso) regardless of the company's base currency. * Replaces the previous logic that calculated rates based on company currency with a direct UYU conversioni * Simplifies the rate calculation by removing the amount-based fallback logic * Ensures consistent UYU rate computation for all non-UYU currencies LATAM Task 1358 / Adhoc task 51716 Forward-Port-Of: odoo/enterprise#93144
This update fixes how withholding taxes are applied when a payment is made, so the reported amounts match what users expect. It helps ensure Philippine tax reports stay accurate and consistent with payment activity.
Original PR description
Partially backport the rework from 19, in order to ensure withholding taxes on payment affect the amounts as expected. Enterprise PR: odoo/enterprise#94541 Ref 19.0 Community: odoo/odoo#218090 Ref 19.0 Enterprise: odoo/enterprise#89830 Task [link](https://www.odoo.com/odoo/project.task/5081387) task-5081387
This update corrects how the company identification number is written in NACHA payment files. It now follows the required formatting rules so payment files are more likely to be accepted by banks and processing systems.
Original PR description
According to https://achdevguide.nacha.org/ach-file-overview: - An alphanumeric field must be left-justified and post-padded with spaces. - A numeric field must be unsigned, right-justified and pre-padded with zeros. The Company Identification being an alphanumeric value (see https://achdevguide.nacha.org/ach-file-details), it should be left-justified and post-padded with spaces even in the type 8 record, like it is actually in the type 5 record. opw-5048564 Forward-Port-Of: odoo/enterprise#98922
5 changes
Resolved issues and error corrections
The floor plan now only shows booking notifications when they match the booking setup selected in the point of sale. This avoids confusing temporary bookings that could appear and then disappear after a refresh, and it also clears the booking setting automatically when table booking is turned off.
Original PR description
Task: [#5005216](https://www.odoo.com/odoo/my-tasks/5005216) Enterprise v18.0: [#93636](https://github.com/odoo/enterprise/pull/93636) --- **Before:** If no appointment type is specified in the POS config and a table is booked via the website, the floor plan is notified of a new booking because the resource used is one of the POS config resources. However, if the page is refreshed, the booking disappears since no appointment type is defined in the POS config **After:** The floor plan is notified of a new booking only if the appointment type of the booking matches the one specified in the POS config. If no appointment type is set in the POS config, no booking notifications are sent. Additionally, when the "Table Booking" field is unchecked in the POS config, the appointment type is automatically unset.
This change fixes an issue where some incoming emails could not be read if they used the encoding label "cp-850". Odoo now recognizes this label as a valid variant, so these messages are processed correctly instead of causing an error.
Original PR description
While investigating a few support tickets related to how the l10n_cl override the fetch mail methods, we noticed a more general issue: As of now, the payload parsing business logic of Odoo can't…
While investigating a few support tickets related to how the l10n_cl override the fetch mail methods, we noticed a more general issue:
As of now, the payload parsing business logic of Odoo can't handle emails encoding parts with `charset=cp-850`.
This is due to the fact that `cp-850` is not a accepted/standard encoding alias for cp850 charsets in python's `encoding` library.
Whether or not a mail stack should generate mail using `charset=cp-850` or not, we this fix aims at pro-actively declaring `cp-850` as a valid alias for cp850, so that implicitly the email CPython library can correctly decode the payloads in emails.
### Before this bug:
Sending a mail using `charset=cp-850` would generate a traceback.
Example:
```
From: Sender Name <sender@example.com>
To: Recipient Name <odooalias@example.com>
Subject: Test Email with CP-850 Encoding
Date: Thu, 13 Nov 2025 12:00:00 +0100
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="----------=_4987654321-00000000"
This is a multi-part message in MIME format.
------------=_4987654321-00000000
Content-Type: text/plain; charset=cp-850
Content-Transfer-Encoding: quoted-printable
Hallo, dit is een test met een =82 speciale letter.
=
------------=_4987654321-00000000--
```
Would generate:
```
File "/home/odoo/src/odoo/addons/mail/models/mail_thread.py", line 1398, in message_process
msg_dict = self.message_parse(message, save_original=save_original)
File "/home/odoo/src/odoo/addons/mail/models/mail_thread.py", line 1792, in message_parse
msg_dict.update(self._message_parse_extract_payload(message, msg_dict, save_original=save_original))
File "/home/odoo/src/odoo/addons/mail/models/mail_thread.py", line 1592, in _message_parse_extract_payload
content = part.get_content()
File "/home/odoo/miniconda3/lib/python3.10/email/message.py", line 1096, in get_content
return content_manager.get_content(self, *args, **kw)
File "/home/odoo/miniconda3/lib/python3.10/email/contentmanager.py", line 22, in get_content
return self.get_handlers[maintype](msg, *args, **kw)
File "/home/odoo/miniconda3/lib/python3.10/email/contentmanager.py", line 67, in get_text_content
return content.decode(charset, errors=errors)
LookupError: unknown encoding: cp-850
```
### After fix:
`content = part.get_content()` correctly handles the `cp-850` alias
OPW-5171501
OPW-5247486
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prGantt items can no longer be dropped onto rows that are grouped by a field users should not edit. This prevents accidental updates to protected values during planning, avoiding unexpected changes in work orders and similar records.
Original PR description
Issue ----- Gantt view's drag & drop allows the user to change the value of readonly fields if they are stored. E.G. in the Planning view of MRP, grouped by Work Center > Product, dragging & dropping…
Issue ----- Gantt view's drag & drop allows the user to change the value of readonly fields if they are stored. E.G. in the Planning view of MRP, grouped by Work Center > Product, dragging & dropping can change the product of the WO if the user is not careful and drops the WO on top of another product's WO. Steps to reproduce ----- - Have 2 products - Create a MO for product 1 with a WO at work center 1, plan it - Create a MO for product 2 with a WO at work center 2, plan it - Got to Manufacturing, Planning, Planning by Work Center - Add a custom group (by product) - Drag the WO of WC2 and drop it on top of the other WO > Both the WC and the product of the second WO change Cause ----- The example problem is only for versions 17.0 & 18.0 where the `product_id` field of `mrp.workorder` is both readonly and stored. https://github.com/odoo/odoo/blob/31e46a841b38de0f99beb1844f985bc670621486/addons/mrp/models/mrp_workorder.py#L34 While the user cannot change the field value manually, automatic actions such as a gantt view drag & drop can change its' value by passing it to `write` since the field is stored. This does not pose any problem for related fields that are not stored. More broadly, gantt views should not ignore the `readonly` attribute of fields. Solution ----- Add a new `o_gantt_readonly` class to all cells of rows grouped by a readonly field - and their "child" rows. For example, if the grouping is done by "Work Center > Product > Quality Check" and "Product" is readonly, rows grouped by either "Product" or "Quality Check" will be marked as readonly. When the user drags a pill, dynamically remove the class from cells of the same "child group". The class will then be added back upon pill drop. ----- Ticket: opw-4875366
This change makes analytic line creation use the company’s currency rules instead of the journal item’s currency. It prevents small calculation differences when currencies use different rounding settings, helping ensure more accurate accounting analytics.
Original PR description
Analytic line values are determined by the balance of a journal item, not their amount_currency. https://github.com/odoo/odoo/blob/8258ddf12ed6c0495628f7a480d1e2424e756540/addons/account/models/account_move_line.py#L3230-L3237 However, the journal item's currency is referenced when creating an analytic line. This can cause discrepancies when the journal item's currency has a different rounding factor (`rounding`). [Ticket link](https://www.odoo.com/odoo/unassigned-tasks/5171681) opw-5171681 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update brings back contact information in the Swiss payroll transmission employee view. It matters because the missing details are needed to keep employee records complete and support correct payroll reporting.
Original PR description
task-5248986