Daily updates from Odoo
Wednesday, August 20, 2025
34 changes · saas-18.3
Resolved issues and error corrections
This fixes the Australian localization so the GST-only import tax is treated as fully included for customs purposes again. It restores the expected tax setup that had been unintentionally removed, helping businesses calculate Australian import GST correctly.
Original PR description
It was price_include before and got removed with the changes from https://github.com/odoo/odoo/commit/be308e106ce9699f99efe133976c40519d6128f9 Re-add them 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#223260
Point of Sale payments marked as Force Done now follow the auto-validation setting as expected. This ensures cashiers are automatically taken to the receipt screen when terminal payment auto-validation is enabled, reducing checkout friction.
Original PR description
When doing a force done on a terminal payment, if the auto validation was turned on, it would not be triggered after clicking on the force done button. Steps to reproduce: ------------------- * Turn on the auto validation for terminal payments * Create a new order and add a product * Select a terminal payment method (You can fake the force done state as I did in the tour) * Click on the "Force Done" button > Observation: You are not redirected to the receipt screen. opw-4954406 Forward-Port-Of: odoo/odoo#223282 Forward-Port-Of: odoo/odoo#222867
This fix prevents vendor bills or invoices marked as blocked from being automatically unblocked when payment status is recalculated during related accounting processes. It helps preserve finance teams' manual blocking decisions and avoids unintended payment or processing changes.
Original PR description
Problem: When the `payment_state` field on `account.move` is automatically computed, the logic will prioritize whether the move has been posted over whether it has been blocked. The effect is that if…
Problem: When the `payment_state` field on `account.move` is automatically computed, the logic will prioritize whether the move has been posted over whether it has been blocked. The effect is that if an invoice has been marked as blocked, it might be automatically unblocked during reconciliation. Solution: The `_compute_payment_state` method will now prioritize a move's `payment_state` being blocked over whether it has been posted. This prevents a blocked move from being unblocked unexpectedly. Steps to Replicate (Runbot 18) - Create a product - Track inventory - Cost > 0 - Control policy = On ordered quantities - Product category is valuated in real-time (Inventory Valuation - Automated) (requires 'Stock Accounting Automatic' group) 1. Create a PO for the product 2. Create a bill, validate it 3. Block the bill using the contextual action 4. Receive the product If you navigate back to the Vendor Bill, you will see that it has been unblocked. opw-4981799 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#223351 Forward-Port-Of: odoo/odoo#222906
Accounting imports with analytic allocations now avoid creating an extra analytic entry before posting. This keeps imported accounting data cleaner and ensures analytic entries are created only at the correct posting step.
Original PR description
When importing an account move with analytic distribution, two analytic items are created, one at the creation of the move, and another when the move is posted. This happens because, when creating the move from an import, the line values passed include Commands to create analytic_line_ids, and not analytic distributions. Desired behavior: Only one analytic item should be created, and only when the move is posted. When the move is created, its lines' analytic distribution should be correctly filled based on the data imported. Solution: This commit unlinks the Analytic Lines created at move imports (removing the analytic_line_ids from moves at create/write), after the analytic distribution is set on the corresponding move line. task-4987799 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#223300 Forward-Port-Of: odoo/odoo#222196
Purchase orders will no longer be reused for replenishment when their project does not match the new procurement need. This prevents purchases from being incorrectly grouped under the wrong project, improving cost tracking and project accuracy.
Original PR description
Steps to reproduce: - Create a storable product: - Vendor: Azure Interior - Routes: MTO + Buy - Click on the replenishment button → a purchase order is created - Open the PO and set a project - Replenish the product again Problem: The first purchase order is reused even though it has a project, while it should not. Solution: When searching for a candidate purchase order, ensure that the `project_id` matches the procurement values: - A PO with a project can only be reused for procurements with the same project. - A PO without a project can only be reused for procurements without a project. opw-4976606 Forward-Port-Of: odoo/odoo#223422
Self-order customers now see the correct total price when choosing products with multiple option types, such as size and toppings. This prevents undercharging or confusing price displays in POS self-order flows.
Original PR description
Currently, there is inconsistent behavior in price calculation when a user places a self order for a product containing attributes. **Pre-requisites:** - POS module installed and configured. -…
Currently, there is inconsistent behavior in price calculation when a user places a self order for a product containing attributes. **Pre-requisites:** - POS module installed and configured. - Variant enabled in settings. - Self-ordering is enabled in the POS configuration. - Two product attributes created in the settings/attributes: - One of type radio with variant creation set to Instantly. - Another of type multi-checkbox with variant creation set to Never. - Create attribute lines for both attributes with default extra prices. **Steps to reproduce:** 1) Create a product template linking the above attributes 2) Ensure the product is available in POS and self ordering 3) Open a POS session in one browser tab and the self-ordering in another. 4) Select the product in the self-ordering interface, first choosing an option for the radio attribute, then selecting one or more options for the multi-checkbox attribute. **Error:** You will see the difference between the expected price and the displayed price **Example for Clarity:** Consider a product called Pizza with 2 attributes. The base price of the pizza is $10. | Attribute | Option | Extra Price | | ----------------------------------- | ---------------- | --------------------- | | **Size** (radio) | Small (S) | \$0 (no extra charge) | | | Medium (M) | \$5 | | | Large (L) | \$10 | | **Extra Toppings** (multi-checkbox) | Veggies | \$3 | | | Extra Cheese | \$3 | | | Veggies & Cheese | \$5 | If the user selects a medium-sized pizza with veggie toppings, The expected price is: ``` $10 (base) + $5 (Medium size) + $3 (Veggies) = $18. However, the price shown is only $13. ``` **Root Cause:** For attributes of the multi-checkbox type, variant creation is set to Never by default. This means no product variants are generated for such attributes. Because of this, when calculating the price, the extra price associated with the multi-checkbox attribute is added directly to the base price of the product template instead of the price of the selected variant. This happens because the variant information is not properly passed to the price calculation method: https://github.com/odoo/odoo/blob/9df334c0aca8a57dcbed4c87b43b18403f3a7c6e/addons/pos_self_order/static/src/app/services/card_utils.js#L187-L196 https://github.com/odoo/odoo/blob/9df334c0aca8a57dcbed4c87b43b18403f3a7c6e/addons/point_of_sale/static/src/app/models/product_template.js#L185-L189 As a result, the extra price for the multi-checkbox attribute is incorrectly added to the product template’s base price rather than the variant’s price. **Solution:** Pass the product_variant derived from the selected product.product to the price calculation method. This ensures that if a variant exists based on the user’s selection, the extra price is added to the variant’s price rather than the base product template price, resulting in the correct total price. opw-4963537
Fixed an issue where the showcase block in email marketing could appear stacked in received emails even though it looked side-by-side in the editor. This keeps email layouts more consistent for recipients and reduces the risk of broken-looking marketing messages.
Original PR description
Problem: On large screens, the `s_showcase` template shows blocks stacked vertically instead of side-by-side as in the editor. Cause: After commit 10008b32334152ada1a847b091189d1d9d5aa3d3,…
Problem: On large screens, the `s_showcase` template shows blocks stacked vertically instead of side-by-side as in the editor. Cause: After commit 10008b32334152ada1a847b091189d1d9d5aa3d3, `s_showcase` was refactored to fix selection/formatting issues. Mixing relative widths (`col-sm`) with fixed widths (`col-1`) breaks in `convert_inline`, exceeding the 12-column grid. Solution: - Use `Math.floor` when calculating the `colSize` to prevent overflow Before: <img width="1862" height="948" alt="image" src="https://github.com/user-attachments/assets/35d82103-1f84-4754-862d-50ef3481bcb3" /> After: <img width="1847" height="955" alt="image" src="https://github.com/user-attachments/assets/20e1b454-dfc4-4ad0-9e6a-3b38c230d0fd" /> Steps to reproduce: 1. Open a new email marketing. 2. Drop the `s_showcase` snippet. 3. Send a test email. 4. Observe the received template is misaligned compared to the editor. opw-4946126 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222801
Event tickets sold through Point of Sale now keep their ticket-specific price when a customer is added or the pricelist is changed. This prevents accidental price reductions to the base product price and keeps event sales pricing consistent.
Original PR description
Before this commit: ========== - When selling event tickets through the Point of Sale (PoS), if an orderline was created with the ticket-specific price (higher than the base product price), the price would reset to the base product price when a customer (partner) was added or the pricelist was changed. After this commit: ========== - The event ticket orderline now retains its original ticket price even after a partner is selected or the pricelist is updated. This ensures pricing consistency and prevents unintended overrides for event-specific products. task-4862687 Forward-Port-Of: odoo/odoo#214109
Restaurant POS orders are now correctly marked for synchronization after staff edit order details, such as notes, customers, quantities, prices, discounts, or pricelists. This helps ensure changes made at the table or register are preserved when returning to the floor screen.
Original PR description
Previously, changes made to an order did not trigger synchronization when navigating back to the floor screen. These changes include: • Adding a note or customer note to a line or order • Setting a customer • Modifying quantity, price, or discount via the numpad • Setting a pricelist This commit ensures the order is marked as dirty, which triggers the sync when returning to the floor screen. task.4946929 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220724
The accounting dashboard now displays amounts awaiting review with the correct currency handling for journals using a foreign currency. This prevents users from seeing a misleading currency symbol next to a company-currency amount, improving trust in dashboard figures.
Original PR description
Steps to reproduce: - create a new journal with foreign currency - create an invoice (amount:100) with this journal and set it "to check" - Go to dashboard Issue: check balance is in company currency amount but the symbol is the one from the currency of the journal Solution: Chkl: <strike>Misc and Sales/Purchase Journals should display all amounts in company currency</strike> Eventually, we decided that it would be better for the stable versions to keep the currency displayed as the one from the journals. We therefore use the same logic as for the bill/invoices opw-4349684 Forward-Port-Of: odoo/odoo#215512 Forward-Port-Of: odoo/odoo#203475
Fixes an editor issue where choosing a font size could leave selected text visible but prevent users from continuing to type. The editor now regains focus after font size selection, making formatting and editing flow normally again.
Original PR description
### Steps to reproduce: - Go to the To-Do app and type something in the editor. - Select the typed text. - Click on the Font Size Input and choose a value from the dropdown (e.g.,80). - Try typing…
### Steps to reproduce: - Go to the To-Do app and type something in the editor. - Select the typed text. - Click on the Font Size Input and choose a value from the dropdown (e.g.,80). - Try typing again in the editable area. - Selection is still visible, the focus is no longer in the editable area. ### Description of the issue/feature this PR addresses: - `focusEditable()` skipped restoring focus if the selection was inside the editor, even when the editor itself wasn’t focused. - When the font size input (inside an iframe) is focused, editable loses focus. - Selecting a value from the dropdown blurs the iframe input, but focus is not returned to the editable area. - As a result, the selection is still visible but the user cannot type. ### Desired behavior after PR is merged: - Does nothing if the editor or its descendants have focus. - Focuses the editor if needed. - Restores selection only when it's outside the editor. - When the iframe input is blurred, focus is returned to the editable area. task-4932364 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#218774
Point of Sale now shows the right message when a takeaway or delivery order is missing required details, such as a time slot, customer, or delivery address. This helps staff understand exactly what needs to be fixed before completing the order, reducing confusion and failed order attempts.
Original PR description
STEPS TO REPRODUCE: ---------------- - Install `pos_restaurant`. - Set up a "Takeaway" preset with "identification = not required". - Remove all slots for today. - Try to place an order using "Takeaway" or "Delivery" without selecting a slot or address. ISSUE: ----------- - Only the "customer required" popup appeared, even if slot or address was missing. - For Delivery, missing address was not checked. CAUSE: ----------- - One single dialog was used for all checks, so it didn't check each thing separately. FIX: --------------- - Show specific popup depending on what is missing (customer, address, or slot). Task-4892105 Forward-Port-Of: odoo/odoo#216216
This fix prevents a hidden search sorting field from being accidentally removed while editing website pages. It helps avoid save-time errors and keeps website search forms working reliably after content edits.
Original PR description
Problem: In Website, the `order_by` hidden input stores the selected sort order for search. This input can currently be deleted via `oDeleteBackward`, which may break the form behavior. Solution: Make `order_by` input unremovable to ensure form integrity. Steps to reproduce: - Add a "Title" text block - Insert a search element before the text - Delete all the text - Use backspace to delete the header block - Save - > A traceback occurs because the `order_by` input was deleted opw-4863089 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220107
Time Off now uses the employee's active running contract when calculating holiday days, rather than accidentally choosing another contract for the same period. This ensures part-time and full-time schedules are applied correctly, improving accuracy for employees with multiple contracts.
Original PR description
Steps: -Install the hr_holidays_contract module - Create two contracts for the same employee: - Contract A (Part-time) starting from 01/01/2025 and set to Running - Contract B (Full-time) also…
Steps: -Install the hr_holidays_contract module - Create two contracts for the same employee: - Contract A (Part-time) starting from 01/01/2025 and set to Running - Contract B (Full-time) also starting from 01/01/2025 and set to New - open holiday dashboard for that employee Description of the issue/feature this PR addresses: The Time Off dashboard incorrectly considers the full-time contract instead of the part-time one, even though the part-time contract is in the running state. Cause: The contract selection logic did not correctly prioritize the running contract when multiple contracts existed for the same period. Fix: This PR updates the logic to ensure that: - If a contract is in the running state at a given time, it is used to determine the working schedule and time off calculations. - If no contract is running during that time and multiple contracts exist, the contract with the latest creation_id will be considered. task-4724155 Forward-Port-Of: odoo/odoo#212959
Outgoing emails now include links for attachments that are stored in cloud storage, not only for files that exceed the email size limit. This ensures recipients can access all intended documents when purchases or other records are emailed with cloud-hosted attachments.
Original PR description
Before this commit, when sending emails with attachments stored in the cloud, the attachments's links were not included in the email body, as we only included the links for attachments exceeding the max email size. With this commit, we ensure that all attachments stored in the cloud are converted to links in the email body and included in the the email. opw-4717083 Forward-Port-Of: odoo/odoo#208424
Fixes a display issue where collaborator avatars could overlap the form status buttons while scrolling long records. The status area now spans the full form width and only shows its shadow while scrolling, improving readability without adding unwanted horizontal scrolling.
Original PR description
User avatars displayed in collaborative mode overlap with buttons when scrolling. This commit extends the statusbar to take the full width, independently of the sheet's one. Also, to avoid an ugly shadow when not scrolling, it only adds it when the scroll is actually performed. Steps to reproduce: - open a task with two users - write in the description in collaborative mode -> user avatars should be displayed - make sure the description is long enough for the sheet to scroll - scroll for one of the avatars to reach the sticky statusbar => overlap between the avatar and the statusbar task-4907797
Purchase orders now recalculate the Company Total when the order currency is changed. This prevents outdated totals from being shown and helps users see accurate company-currency values after exchange rate changes.
Original PR description
**Steps to reproduce:** 1. Create a Purchase Order (PO) with a non-company currency (e.g., EUR if the main currency is USD). 2. Add at least one order line so the "Amount Total" is greater than zero. 3. Change the currency of the PO to a different one and save the record. **Expected behavior:** The `Company Total` field is recomputed using the new currency's exchange rate. **Actual behavior:** The `Company Total` remains unchanged, still showing the value in the original currency. **Fix:** Add `currency_id` to the `@api.depends` decorator of the `_amount_all` compute method. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220501
Confirmed repair orders can now correctly accept kit components without them disappearing after saving. This ensures repair teams can add bundled parts to ongoing repairs and keep the order details accurate.
Original PR description
Steps to reproduce the bug: - Create a repair order with any component. - Confirm the order. - Try to add a kit as a component. Problem: After saving, the kit disappears. When a kit is added to a confirmed repair order, its move should be confirmed and therefore exploded. However, the moves created from this kit move are just copies of the original move. Fields with copy=False are not copied, including the repair_id field. In this case, repair_id must be added to link the move to the repair order, so it needs to be set manually. opw-4937817 Forward-Port-Of: odoo/odoo#222998
Customer invoices can now be sorted by the Status and Sent columns in the invoice list. This makes it easier for accounting users to organize invoices and quickly find records by payment or sending state.
Original PR description
**Issue** Users were unable to sort invoices by the "Status" and "Sent" columns in the customer invoices list view. **Steps to Reproduce** 1. Go to Accounting > Customers > Invoices 2. Try sorting by the "Status" or "Sent" columns 3. Observe that sorting is not functional for these fields **Root Cause** Both `status_in_payment` and `move_sent_values` are computed (non-stored) fields. Odoo cannot sort by non-stored fields unless a SQL representation is provided using the `_field_to_sql` method. Opw-4976838 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222357
This fix prevents an error that could occur when a user removed a product from the parts list on a repair order and then changed the customer. Repair orders can now be edited and saved normally in this scenario, improving reliability for repair workflows.
Original PR description
When User removes the product from parts in repair order and tries to change the partner, A traceback will appear. Steps to reproduce the error: - Install ``repair`` module - Create new repair order > Add a line > Add a product in parts > Save - Remove product from parts > change customer > Save Traceback: ``` AssertionError: precision_rounding must be positive, got 0.0 ``` https://github.com/odoo/odoo/blob/122dece7eeedbf670254aebd2a2d69642b381547/addons/repair/models/repair.py#L319 When user removes the product from parts, ``precision_rounding`` becomes 0.0 Which results in the above traceback. sentry-6650889934 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#223224 Forward-Port-Of: odoo/odoo#212577
Users can now validate and send completed signed documents even if an incorrectly uploaded signing certificate is present. This prevents an unexpected error from blocking the signing workflow and keeps document processing moving despite the invalid certificate setup.
Original PR description
Currently, an error occurs when a user sign the document and tries to validate and send the completed document. **Steps to reproduce:** - Install the `sign` module. - Go to: `Sign Settings >…
Currently, an error occurs when a user sign the document and tries to validate and send the completed document. **Steps to reproduce:** - Install the `sign` module. - Go to: `Sign Settings > Cryptographic Signature` > Create a 'Signing certificate' and upload any random PDF (Observe: A warning appears `'This certificate could not be loaded. Either the content or the password is erroneous.'`). - In the Sign app, upload any document, drag and drop a `Signature` field, and sign the document. - Click `Validate & Send Completed Document`. **Note:** - [1] Make sure your system has cryptography version `41.0.7 or above`. - Refer to [2] for steps to reproduce. **Error:** `TypeError: expected bytes-like object, not bool` **Root Cause:** At [3], when the certificate is not correctly created, `certificate.pem_certificate` is `False`, which leads to an error. This commit allows validating and sending a signed document, when the certificate is invalid. [1]: https://github.com/odoo/odoo/blob/d730518fa6a1fba3b3edba6f3b65bcc88ed992fe/odoo/tools/pdf/signature.py#L16 [2]: https://drive.google.com/file/d/19fd82TdGzVPRUVW3PDMGEhyaQLTwL41h/view?usp=sharing [3]: https://github.com/odoo/odoo/blob/a6fa3784b20f75490e405e3728d5a335f2104fa0/odoo/tools/pdf/signature.py#L85 sentry-6796501254 Forward-Port-Of: odoo/odoo#222417
This fixes an issue where some users could see an error when opening the website after using and ending a live chat session. The change helps keep website access smooth for visitors and signed-in users by correctly handling live chat records and permissions.
Original PR description
When user tries to open the website, A traceback will appear. Steps to reproduce the error: - Install ``website_livechat`` with demo data - Sign in as ``Mitchell admin`` on one browser window -…
When user tries to open the website, A traceback will appear. Steps to reproduce the error: - Install ``website_livechat`` with demo data - Sign in as ``Mitchell admin`` on one browser window - Create a new ``User A`` > Set login and password for User A - In Incognito tab, Go to Sign in Page > click on the livechat button > Send any message > End the conversation > Sign in as ``Marc Demo`` > Open Website > Sign out - User will face Access Error - In Same Incognito Tab > Go to ``/web/login`` > click on the livechat button > Send any message > End the conversation > Sign in as ``User A`` > Open the Website Traceback: ``` AttributeError: 'discuss.channel' object has no attribute 'channel_ids' ``` https://github.com/odoo/odoo/blob/d9c63a85955c2321bae1a705cc09b2554155f826/addons/website_livechat/models/website_visitor.py#L113 Here, The ``guest_livechats`` variable contains records of the ``discuss.channel`` model. However, the ``discuss.channel`` model does not have a ``channel_ids`` field. So, It will lead to the above traceback. When the Marc Demo user logs out, the following line will raise an access error: because now the user is considered as a guest, and guest users do not have the necessary access rights to update the ``livechat_visitor_id`` field. To resolve this, ``sudo()`` is used to bypass access rights at the following line: https://github.com/odoo/odoo/blob/254d66e1e3d646c9c82fbb3561a40aba7790c3b5/addons/website_livechat/models/website_visitor.py#L112-L114 sentry-6670622453 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Fixed an issue where opening the Google Merchant Center data source link could fail when Shiprocket delivery was enabled. The system now avoids applying full customer detail checks to temporary records, preventing unnecessary errors and keeping product feed access working.
Original PR description
Steps to Reproduce: 1. Go to Delivery Methods. 2. Enable and configure Shiprocket, then publish it. 3. Go to Settings. 4. Search for Google Merchant Center Data Source. 5. Enable the checkbox. 6.…
Steps to Reproduce:
1. Go to Delivery Methods.
2. Enable and configure Shiprocket, then publish it.
3. Go to Settings.
4. Search for Google Merchant Center Data Source.
5. Enable the checkbox.
6. Click on the Copy File Link button.
7. Open the copied link in a new browser tab.
Observation:
A traceback occurs, stating that some of the customer’s fields are missing.
Issue:
In the `_prepare_best_delivery_by_country` method, we create a temporary partner
record. Later, in `_check_required_value`, we validate the Street, Email, Pincode,
and Phone Number fields for that partner. However, these fields are not set
in the temporary record, which causes the validation to fail.
Solution:
Added a check on `recipient._origin` to ensure that required field validations are only
applied on actual partner records. This prevents raising validation
errors when using temporary partner records in Shiprocket flow.
Added `@mute_logger('odoo.tools.translate')` to suppress translation warnings in
test. In our test case, we are calling `_check_required_value` directly, which
internally calls `_get_lang`. The `_get_lang` method attempts to fetch the
language from `http.request`, but since `http.request` is not available in test
context, it fails to retrieve the language and logs a warning.
https://github.com/odoo/odoo/blob/642dde9546417115cbce5b826cdf996970dfbb48/odoo/tools/translate.py#L514C5-L517C1
opw-4972889The point of sale preparation display no longer crashes when a restaurant uses only one preparation stage and marks it as Reset or Done. This keeps kitchen workflows running smoothly for simpler setups and avoids an interruption previously reported through Sentry.
Original PR description
This error occurs when we try to mark a single stage as `Reset` or `Done` in the preparation display. Steps to reproduce: --- - Install the `pos_restaurant` module - Create a New `Preparation Display` with one stage - Open `Preparation Screen` - Now `Reset` or `Done` the stage in the other tab Traceback: --- `IndexError: tuple index out of range` At [1], an error occurs because it tries to access a `position` that doesn't exist in the tuple. This happens because at [2], the code attempts to retrieve the second-to-last (-2) stage position, but only one stage is being used. [1]- https://github.com/odoo/enterprise/blob/285cca92a52f7b79de1d020558aa9b116cd7e44a/pos_enterprise/models/pos_prep_stage.py#L21-L22 [2]- https://github.com/odoo/enterprise/blob/285cca92a52f7b79de1d020558aa9b116cd7e44a/pos_enterprise/models/pos_prep_state.py#L72 sentry-6681171781
The accounting reports export now handles account codes or values that look like infinity without crashing. This ensures users can download Trial Balance spreadsheets even when account codes contain very large scientific-notation-like text.
Original PR description
_set_xlsx_cell_sizes tries to convert each cell into a float if it's possible. If the cell contains "inf", "1e1000" (or any value such that float(value) = float("inf")), then there is an OverflowError which is not catch by the try/except.
To reproduce, set an account code as "1E1000", make this account appearing in the trial balance (by creating a move) and export it as XLSX.
opw-4981385
Forward-Port-Of: odoo/enterprise#91686The kitchen preparation display no longer crashes when an order is marked done and the display has only one stage configured. This helps restaurants using simplified kitchen workflows continue processing orders without interruption.
Original PR description
Currently, an IndexError traceback occurs when changing the order state in the preparation display if it contains only one stage. **Steps to reproduce this issue:** 1) Install POS, Kitchen Display 2)…
Currently, an IndexError traceback occurs when changing the order state in the preparation display if it contains only one stage. **Steps to reproduce this issue:** 1) Install POS, Kitchen Display 2) Create a preparation display by removing all but one stage in the prep settings. 3) Open a restaurant session and create an order. 4) Open the preparation display and mark the created order as DONE. 5) A traceback will occur **Error:** ``` IndexError: tuple index out of range ``` **Cause:** When the Done button is clicked in a preparation display with only one stage, an ORM call to `change_state_status` is triggered. This then calls `_record_status_change_prep_time`, followed by `is_stage_position`. https://github.com/odoo/enterprise/blob/39810b5b7df01f381a08582ddc0c5218e99c964c/pos_enterprise/models/pos_prep_state.py#L31-L40 https://github.com/odoo/enterprise/blob/39810b5b7df01f381a08582ddc0c5218e99c964c/pos_enterprise/models/pos_prep_stage.py#L21-L22 In `is_stage_position`, static positions [0, -1, -2] are used to access items in the `stage_ids`. If only one stage exists, accessing indices -2 results in an IndexError. **Solution:** Before accessing a stage by position, check that the length of stage_ids is greater than or equal to the absolute value of the position. This prevents attempts to access out-of-range indices. opw-4985306
Dutch tax payment wizards now use the Omzetbelastingnummer when it is available, instead of always relying on the company VAT number. This ensures the payment communication is generated correctly, reducing the risk of payment matching issues with tax authorities.
Original PR description
**Steps to reproduce:** - Install Accounting and l10n_nl - Switch to a Dutch company (e.g. NL Company) - In company form, set VAT and Omzetbelastingnummer - Create an invoice with tax for previous…
**Steps to reproduce:** - Install Accounting and l10n_nl - Switch to a Dutch company (e.g. NL Company) - In company form, set VAT and Omzetbelastingnummer - Create an invoice with tax for previous month - Confirm the invoice - Go to "Accounting / Reporting / Statement Reports / Tax Return" - Select previous month - Create "Closing Entry" and post it - On "Miscellaneous Operations" journal in Accounting dashboard, click on "Pay tax: [date]" link - A wizard will appear fot the VAT payment **Issue:** The value of the "Communication" field is incorrect. **Cause:** The "Communication" field is always computed from the VAT of the company. However, when the "Omzetbelastingnummer" field is set, it should be used instead of the VAT. **Solution:** Use the "Omzetbelastingnummer" field to compute the "Communication" of the VAT payment when it is set. This is done through an overridden method because "Omzetbelastingnummer" is defined in an independent module. opw-4836615 Forward-Port-Of: odoo/enterprise#92563 Forward-Port-Of: odoo/enterprise#92407
The IoT app now creates a separate device record for every detected network device instead of reusing one record across the whole database. This prevents printers from becoming unavailable when similar identifiers are reported by Windows IoT boxes or when another IoT box on the same network is offline.
Original PR description
We used to create network device records only for network devices that didn't exist in the whole database. This allowed us not to duplicate printer records for clients that had two iot boxes on the same network. We remove this logic as it over complicates the IoT flow and understanding of clients/support. On Windows IoT Boxes, we sometimes get the same identifier for two different printers on two different networks, making the second printer unusable from the db. More, if for some reason a client has two Windows IoT boxes on the same network, and one is off, he won't be able to print through the first one. Backport of odoo/enterprise#92360 Forward-Port-Of: odoo/enterprise#92528
This fix prevents outdated map pins from remaining for child contacts after a parent company address is changed. It keeps contact locations in the Map View aligned with the latest address information, reducing confusion from incorrect customer or company locations.
Original PR description
**Issue:** When adding contacts with incorrect address data, the Map View could display outdated or incorrect markers **Cause:** The `partner_latitude` and `partner_longitude` fields were not reset…
**Issue:** When adding contacts with incorrect address data, the Map View could display outdated or incorrect markers **Cause:** The `partner_latitude` and `partner_longitude` fields were not reset for child contacts when the parent’s address changed **Fix:** We added a `partner_latitude` and `partner_longitude` reset when changing address in write We added `partner_latitude` and `partner_longitude` in the _address_fields to update the value each time it can be required, like on address change or contact creation The extension in the _address_fields is there to detect the changes on children synchronization, because it only replace the value that where present in vals for the fields in that list In that way, it will detect more address changes and trigger the write for the children with the corresponding parent `partner_latitude` and `partner_longitude` We also make sure that those extra _address_fields will not be displayed in the formatted address by removing them from `_formatting_address_fields` **Limitations:** One issue remains during import: the parent-child address synchronization is disabled on contact creation This means children may be created with addresses different from the parent’s and have mismatch positions on Map This can be corrected by updating or re-importing the parent to trigger synchronization **Steps to reproduce:** With Form: - Add a parent contact company with a valid address - Add a child contact related to company, with a valid address - Open the Map View, both address must appear on Map - Modify the parent address to remove street (make it invalid) - Check that the child address match the parent one - Check the Map View, before the fix the child should remain with a wrong position With import: Create an import file (an example is in on the ticket) - Add a sheet for the Parent contact with an valid address - Add a sheet to add the Child contact with a parent_Id, with a valid address - Add a sheet to break the address on the parent, removing the street - Open the contacts app - Import the valid Parent and Child sheets (you need to select Related Company / External ID) - Add a filter to get your created contacts - Check the Map View (You should see both parent and child) - Import the Break parent sheet - Check that the child address match the parent one in the Form - Check the Map View, before the fix the child should remain with a wrong position A file can be found on the ticket with pre-made data **Technical notes:** The reset logic is duplicated from the `base_geolocalize` module, because this module is optional and may not be installed in all cases Since `base_geolocalize` is not always present, its `write` override will not be triggered consistently On the other hand, `web_map` is automatically installed with the Enterprise version of Odoo Therefore, it is necessary to implement this fix in at least one of the two modules to ensure the behavior is active when Enterprise is used We chose to keep the override in both `base_geolocalize` and `web_map` to cover both Community and Enterprise cases reliably An alternative approach would be to move the reset logic directly into `res.partner` in the `base` module, making it always available regardless of installed addons and avoiding the duplication opw-4842910 Forward-Port-Of: odoo/enterprise#90392
Odoo Studio now handles cases where a button refers to a server action that has been deleted. Instead of showing an error and blocking users from editing the form, the missing action is ignored so users can continue working normally.
Original PR description
The error is triggered when a user configures a button to execute a serveraction, deletes the associated server action, and then attempts to edit the button. This causes a failure at the line `self.env.ref(str_action)` due to the missing external ID. **Steps to reproduce:** * Install `crm` and `web_studio` * crm > Form View> Studio > `Add a button`> Run a server Action > Enrich * Settings > Technical > Actions > Server Actions > `Enrich` > Delete it * crm > Form View > Studio `ValueError: External ID not found in the system: crm_iap_enrich.action_enrich_mail` **Solution:** * Return `False` when the referenced server action cannot be found or has been removed. **Sentry-6608495874** Forward-Port-Of: odoo/enterprise#89218
The Planning app no longer shows the auto-plan option for shifts that do not yet have a start or end date. This prevents an error when users work with unscheduled shifts from sales orders, keeping the planning workflow stable.
Original PR description
**Step to reproduce:** 1. Install sale_planning module 2. Create a product (Sales -> Products): - Set Product Type to Service - Enable Plan Services - Assign both a Planning Role and resources. 3.…
**Step to reproduce:**
1. Install sale_planning module
2. Create a product (Sales -> Products):
- Set Product Type to Service
- Enable Plan Services
- Assign both a Planning Role and resources.
3. Create a sales order for this product.
4. Confirm the Sales Order.
5. Click the "To Plan" button.
6. Switch to List View.
7. Open the Unscheduled Shifts (None) section.
8. Try to generate an Auto Plan.
**Issue:**
A traceback is raised during auto-planning when the start_datetime or end_datetime on the planning slot is missing.
`AttributeError: 'bool' object has no attribute 'astimezone'`
**Cause:**
The `auto_plan_ids()` method assumes that shifts have valid start_datetime and end_datetime.
However, for unscheduled shifts, these fields can be empty (i.e., False), causing the error.
https://github.com/odoo/enterprise/blob/42d829ea6e6a98f251cfffc8fb67b5320a5ada12/planning/models/planning.py#L1076-L1077
**Solution:**
we hide the auto-plan button, in case we do not have startdate or enddate
opw-4812509
co-authored by: Ajit Singh (aksi@odoo.com)
Forward-Port-Of: odoo/enterprise#89383Tax return XML generation now keeps the intended active company when multiple related companies are involved. This prevents company data from being accidentally omitted when company names sort in a particular order, improving accuracy of submitted tax return files.
Original PR description
Error: When generating a tax return, there is a circumstance that will cause certain companies to be omitted from the xml computation. This happens when a child company is earlier alphabetically than the parent company. The company ids are ordered alphabetically for display purposes on the tax return view, however when writing this value into the `allowed_company_ids` context value, the first id in the list will override the current company environment variable during xml generation. To fix this the active company is passed into the context to ensure that it is not overwritten. OPW-4964467
Upsell orders for subscriptions now prevent users from changing the commission plan when the original order has Freeze Plan enabled. This avoids misleading changes that would not affect the actual commission purchase order, keeping expectations aligned with billing behavior.
Original PR description
**Problem:** An inconsistent behavior occurs when a user changes the commission plan while creating an upsell order for a recurring Sales Order (SO). **Steps to reproduce:** 1) Install the…
**Problem:** An inconsistent behavior occurs when a user changes the commission plan while creating an upsell order for a recurring Sales Order (SO). **Steps to reproduce:** 1) Install the Subscriptions and partner_commission modules. 2) Create a subscription SO with a referrer_id and set a recurrence. 3) Enable the Freeze Plan option and create a commission plan from the view 4) Add a rate of 50 and product category as service in the commission rules. 5) In SOL add a subscription product contains recurrence with unit price of 100 6) Confirm the SO → Create Invoice → Confirm → Pay. 7) Go back to the SO and create an upsell for it. 8) Change the commission plan rate to 30 by creating a new plan. 9)Repeat step 4. **Issue:** When you navigate to the referrer record from the SO and open the Purchase Order via the smart button, you will see two Purchase Order lines both showing a value of 50, even though the upsell order had a new commission plan with a rate of 30. **Cause:** When the invoice is marked as paid, a Purchase Order with POL is created using values from the commission plan. For subscription orders, the system intentionally uses the subscription’s original commission plan instead of the updated one. https://github.com/odoo/enterprise/blob/03a5efc04538fce380ec3ea993e7586047fe117e/partner_commission/models/account_move.py#L197-L203 However, the problem is that the commission plan field remains editable in upsell SOs even when the parent SO has Freeze Plan enabled, misleading users into thinking the new commission plan will be applied. **Solution:** Make the commission plan field read-only for upsell SOs when the parent SO has Freeze Plan enabled. opw-4954307 Forward-Port-Of: odoo/enterprise#92157
The Journal Audit report no longer crashes if its underlying Journal Report has had all lines removed. Instead of showing an error, the system safely stops processing empty report data, helping accountants continue working without interruption.
Original PR description
Currently, error occurs when user try to open Journal Audit with no lines. Steps to replicate: - Install `accountant`. - Navigate to `Accountant > Configuration > Accounting reports`, search for `Journal Report` and open it. - Under the Lines tab, delete all the records and save. - Open the `Journal Audit` report, and the error will appear. Error: `IndexError: list index out of range` Cause: - An error occurred because the user deleted all the lines from the report, and the code tried to access the first element [1] of those lines (`lines[0]`) which caused the error. Solution: - Added a check if lines are present, if not then returned from the function. [1]: https://github.com/odoo/enterprise/blob/5670a73ef63d313f6c3df2b1ceeec7f7d6cd6a1b/account_reports/models/account_journal_report.py#L167 sentry-6795898305 Forward-Port-Of: odoo/enterprise#91979