Thursday, November 20, 2025
38 changes · saas-18.4
Resolved issues and error corrections
This change removes a unit test that depended on a different add-on and on Enterprise-only fields, which caused automated builds to fail. The test will be reintroduced later in the appropriate module if needed, helping keep the codebase stable and build results reliable.
Original PR description
The unit test `test_can_reset_deferred_invoice()` has several issues. 1. It should be in the `account_audit_trail` module, as the test requires this module. [Unit test documentation: modules](https://www.odoo.com/documentation/19.0/developer/tutorials/unit_tests.html#modules). 2. The test references fields from the Enterprise module `account_accountant`, `account.move.line.deferred_start_date` and `account.move.line.deferred_end_date`. This causes build tests to fail. As such, the test should be removed now and replaced later if necessary. Fixes [PR 235223](https://github.com/odoo/odoo/pull/235223) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#235813
When a purchase quotation is shared by email, the “View Quotation” button now points to the correct company website instead of the default database address. This ensures customers and portal users land on the right online page, especially in multi-company setups.
Original PR description
Versions -------- - 17.0+ Steps ----- 1. Host a server with demo data on localhost; 2. create & switch to a second company; 3. have a website linked to the second company; 4. set the website's domain to http://2.localhost:8069; 5. create a purchase order; 6. send order via email; 8. open mail via Settings / Technical / Email / Emails. Issue ----- The "View Quotation" button links to the default URL instead of the second company's website. Cause ----- The button added via `_notify_get_recipients_groups` only adds a relative URL, which then defaults to the database's base url when sent. Solution -------- Use an absolute URL, using the order's `get_base_url` method. opw-5035391 Forward-Port-Of: odoo/odoo#236438 Forward-Port-Of: odoo/odoo#233255
This change updates a test so it uses the same product editing flow a user would follow in the interface. As a result, the expected validation error is now correctly triggered, improving the reliability of the test suite and preventing false failures.
Original PR description
Versions -------- - 18.0+ Steps ----- 1. Have a minimal database with `event_product` installed; 2. run `:TestEventProduct.test_ensure_event_service_tracking`. Issue ----- > FAIL:…
Versions -------- - 18.0+ Steps ----- 1. Have a minimal database with `event_product` installed; 2. run `:TestEventProduct.test_ensure_event_service_tracking`. Issue ----- > FAIL: TestEventProduct.test_ensure_event_service_tracking > AssertionError: ValidationError not raised Cause ----- The test works as expected with `sale_project` installed due to a `write` override of `product.product`, setting the `service_tracking` to 'no' if `type` is no longer 'service': https://github.com/odoo/odoo/blob/dc57ea4d306f8745d37f2c5d2c3d3fa4bcaf7253/addons/sale_project/models/product_product.py#L25-L30 This change still occurs without `sale_project` installed, but via the `_compute_service_tracking` method defined in `product`: https://github.com/odoo/odoo/blob/dc57ea4d306f8745d37f2c5d2c3d3fa4bcaf7253/addons/product/models/product_template.py#L181-L183 As this value is set via a compute method instead of `write`, the `_check_event_ticket_service_tracking` method isn't triggered, and no error is raised. Solution -------- Simulate a front-end flow by changing the `type` to 'consu' on a product form. This way, the constraint method does get triggered as expected. runbot-234024 Forward-Port-Of: odoo/odoo#236045
When a Stripe payment fails due to a server validation or API error, the Point of Sale screen will now show the message instead of hiding it. This helps staff quickly understand what went wrong and retry or correct the payment without guessing.
Original PR description
Before this commit: =================== Previously, Stripe-related RPC calls used `silentCall`, which suppresses backend errors and prevents them from being displayed in the POS UI. As a result, users were unable to see important validation or API failure messages coming from the server After this commit: ====================== Use `call` instead of `silentCall`. Using `call` allows backend exceptions and validation errors to be propagated to the POS frontend, ensuring that the user receives clear feedback when a Stripe request fails. Task-4976972 Forward-Port-Of: odoo/odoo#236009
This fixes an error that could appear in Manufacturing when a line was left without a product name and the schedule date was changed. The update prevents the system from crashing on incomplete lines, making it safer to edit manufacturing orders.
Original PR description
The error arises when the user removes the product name from add a line and change the `Schedule Date`. Steps to reproduce: --- - Install `MRP` - Create a New MO - Add a product and confirm it - Add a product from add a line and remove the product name, and change the `Schedule Date` Traceback: --- `ValueError: Expected singleton: uom.uom()` `AssertionError: precision_rounding must be positive, got 0.0(v18.0)` When a move line has no `product_id`, its Unit of Measure (UoM) is also empty. Changing the date triggers computation, which causes an error due to these missing values. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#234884
The point-of-sale now loads only draft delivery orders when a session starts, instead of loading every delivery order. This reduces startup delays and improves overall performance; a minor console warning on the delivery button was also removed.
Original PR description
Before this commit:
---
- The POS loaded all delivery orders (including paid ones) when starting a session, which caused significant slowdowns.
- The delivery button component was missing `static props = {}`, which produced a console warning.
After this commit:
---
- The POS now loads only *draft* delivery orders, improving performance.
- Added `static props = {}` to the DeliveryButton component to remove the console warning.
task-5343700
Forward-Port-Of: odoo/enterprise#99904We fixed an issue that could block invoice creation for alternative upsell subscription orders. The system now carries over the correct invoice date information, so invoices can be generated successfully after an alternative order is confirmed.
Original PR description
Version - 17.0 Issue: - When creating and confirming an alternative sale order (SO) from an upsell order, attempting to generate an invoice would raise a deferred end date error - As a result, the…
Version - 17.0 Issue: - When creating and confirming an alternative sale order (SO) from an upsell order, attempting to generate an invoice would raise a deferred end date error - As a result, the invoice was not created, and even though the customer's payment succeeded, no invoice was issued. Steps to reproduce: - Create an upsell order of a subscription. - Click Create Alternative to generate an alternative SO. - Confirm the SO and click on Create Invoice to make the invoice - This will throw an error of defferred end date Cause: - The `next_invoice_date` was not copied from the previous upsell order to the new alternative SO. - Without this value, the deferred end date was incorrectly computed as today’s date - 1, triggering the error. Fix: - Copy the `next_invoice_date` from the previous upsell order to the new alternative SO to ensure proper deferred date computation. Impact: Invoices for alternative upsell sale orders can now be created successfully without errors. task-5241150 Forward-Port-Of: odoo/enterprise#99831 Forward-Port-Of: odoo/enterprise#98983
When importing bank statements from CSV, some validation errors during automatic reconciliation no longer cancel the imported lines. This means users can still review and reconcile the statement manually instead of losing the import and starting over.
Original PR description
### Issue: When importing a CSV file with bank statements, if an error is raised during the reconciliation, the creation of the bank statement lines is roll backed. ### Steps to reproduce: - Install…
### Issue: When importing a CSV file with bank statements, if an error is raised during the reconciliation, the creation of the bank statement lines is roll backed. ### Steps to reproduce: - Install "account_bank_statement_import_csv" - In the bank journal configuration: - Set the "Outstantding Receipts accounts" of "Manual payments" to a "Bank" account - Set the "Outstantding Payments accounts" of "Manual payments" to the same "Bank" account - Create a new transaction for $333.0 for example - Find its Journal Entry and change its reference to 'testref' - have a CSV file like this: ``` label, amount testref,333 ``` - Import this file - Make sure label is linked to label and amount to amount - Import - An error shows, no lines are imported ### Cause: On import, we try to auto reconcile the lines using `_cron_try_auto_reconcile_statement_lines` ([here](https://github.com/odoo/enterprise/blob/843a17367525c80653d37ecdd9d87434d3e92454/account_bank_statement_import_csv/wizard/account_bank_statement_import_csv.py#L146)). If an error occurs during the reconciliation, we call `self.env.cr.rollback()` [here](https://github.com/odoo/enterprise/blob/843a17367525c80653d37ecdd9d87434d3e92454/account_accountant/models/account_bank_statement.py#L190-L192). This rollback cancels the transaction, including the creation of the statement lines. ### Solution: If the error raised is a `UserError` then we don't roll back and just ignore it. This causes no issues as we caught all exceptions to always continue the reconciliation with the next batch. For UserErrors we should let the user reconcile manually afterward. Also, as the rollback can undo the creation of `st_lines`, we add `if st_lines.exists():` before writing on the variable. Test is not possible as we don't roll back during tests. opw-5138855 Forward-Port-Of: odoo/enterprise#99073
This fix ensures exchange difference entries are linked to the correct invoices when multiple invoices are paid together in one grouped payment. It prevents invoices from being associated with the wrong exchange entry, so payment and reconciliation records stay accurate.
Original PR description
# How to reproduce the issue: - Create two currency rates: one for today and one for the day before. - Create two invoices with different `amount_total`, both using the rate from yesterday. - Create…
# How to reproduce the issue: - Create two currency rates: one for today and one for the day before. - Create two invoices with different `amount_total`, both using the rate from yesterday. - Create a group payment dated today. Check the generated payment, its journal entry, and the reconciled items. Two exchange moves are created — one for each invoice. However, on the invoices themselves, only one of those exchange moves is associated with both invoices. Since commit 5420e40ff337080912edf7414257e03853be026a, the logic that associates exchange moves to `account.partial.reconcile` records was changed. It links an exchange move to a partial if any of its reconciled lines match either the partial's `debit_move_id` or `credit_move_id`. In a group payment scenario: - Two partials are created (one per invoice). - Each has a different `debit_move_id` (the invoice lines) but shares the same `credit_move_id` (the single payment line). - As a result, both partials match the same exchange move via the shared credit line — leading to incorrect assignment. opw-5147281 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#235324
This fixes an accounting error that could produce different journal balances when a foreign-currency invoice was duplicated or when the exchange rate was entered in a different place. The tax amounts are now calculated consistently using the company’s global rounding method, which helps keep invoice totals accurate and reproducible.
Original PR description
- Set the tax rounding method to `'global'` in the settings. - Create an invoice in a foreign currency with: - Quantity: `0.80` - Unit Price: `894.34` - Currency rate set on the invoice: `1 / 1189.5` - This results in a journal entry balance of **851,051.57**. - Now set the currency rate directly on the currency instead. - Duplicate the invoice: the journal entry balance becomes **851,053.94**. The issue arises because _sync_tax_lines, triggered when setting the currency rate directly on the invoice, was computing the journal entry balance on a per-line basis, even though the tax rounding method was configured as global. opw-5012817 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225407
This fix makes the rating cards in Website Slides use the same background color as the rest of the page. It improves visual consistency so the module matches the intended website theme more cleanly.
Original PR description
PR #229272 sets the background color of the portal chatter to `body-bg`, aligning it correctly with the other parts of the chatter and website themes. However, `website_slides` module has a customized scss variable to change its main body background color which makes the background color for the rating cards (chatter top) being different in this module. This change sets the `--body-bg` in this customized scss to the same variable used for the background color, aligning the background colors with each other. Before: <img width="1182" height="552" alt="image" src="https://github.com/user-attachments/assets/6aba4609-e99c-48de-8af7-a97029859fab" /> After: <img width="1097" height="555" alt="image" src="https://github.com/user-attachments/assets/0d4ed53b-6d83-4eba-8499-0d38b10b4234" /> Forward-Port-Of: odoo/odoo#236527
This change prevents delivery validation from failing when a sales order contains a down payment line. It ensures only real product lines are used for customs price calculations, so shipments can be confirmed without error.
Original PR description
Steps to reproduce ----- - Create a SO with a sendcloud delivery - Create an invoice for a down payment & confirm it - Go to the delivery and validate it > Traceback Cause ----- Creating a down…
Steps to reproduce ----- - Create a SO with a sendcloud delivery - Create an invoice for a down payment & confirm it - Go to the delivery and validate it > Traceback Cause ----- Creating a down payment adds lines to the SO https://github.com/odoo/odoo/blob/7bbfb207f8699973f8580ea18821f82b1a83e149/addons/sale/wizard/sale_make_invoice_advance.py#L163-L165 When we confirm the delivery, we retrieve the price of products for customs. https://github.com/odoo/enterprise/blob/f1a385e44ff9cb0e6a6c50c743762fb45329c957/delivery_sendcloud/models/sendcloud_service.py#L515-L520 To do this, we iterate over the SOL and skip lines where the product qty is 0 https://github.com/odoo/enterprise/blob/f1a385e44ff9cb0e6a6c50c743762fb45329c957/delivery_sendcloud/models/sendcloud_service.py#L525-L528 The problem is that the down payment SOL has no uom. This means that when we do `float_is_zero(line.product_uom_qty, precision_rounding=line.product_uom.rounding)` precision_rounding is `0.0`. So when `float_is_zero` calls `_float_check_precision` we go through https://github.com/odoo/odoo/blob/7bbfb207f8699973f8580ea18821f82b1a83e149/odoo/tools/float_utils.py#L33-L36 where the assert is false, creating the traceback. ----- Ticket: opw-5207574 Forward-Port-Of: odoo/enterprise#99178
This fix prevents the chosen warehouse from being replaced when enabling additional inter-company order options. It ensures each company keeps its intended warehouse setting, avoiding unexpected changes in purchase and sales setup.
Original PR description
Issue: -------- While having multiple companies, multiple warehouses and when different warehouses are set for different companies other than the first one(id=1) under Inter-Company Transactions "Use…
Issue: -------- While having multiple companies, multiple warehouses and when different warehouses are set for different companies other than the first one(id=1) under Inter-Company Transactions "Use Warehouse". Now, when we check the 'Generate Purchase Orders' then the 'Use Warehouse' value which was set before is getting overridden to the first Warehouse which has minimal 'id'. Cause: ------ [Here](https://github.com/odoo/enterprise/commit/6324a6bab04fa0f3aa6d87deabc44c7c2eafc295#diff-51563a07f4b65f4ffe54bfb161ac1e9e58ff0f0bcf2522c9f6aa3746b60a68adR28-R38) Since, whenever there's a change within any of those check-boxes the compute will be triggered and the values will get modified. During this trigger the value set in the 'Use Warehouse' is getting overridden to the warehouse with minimal 'id'(For ex: id-1). Solution: ----------- To fix this, we'll just check if there's no value set before. If yes, then we'll set the first warehouse which has minimal 'id'. Otherwise, set the one which is selected. Steps to reproduce: ------------------------- 1. Create a fresh db with multiple warehouses and 'sale_purchase_stock_inter_company_rules' module installed. 2. Go to General Settings> Inter-Company Transactions and check/select 'Generate Sale Orders' and set a different warehouse and save. 3. Now check/select the 'Generate Purchase Orders' and save. 4. Look at the Use Warehouse value in the Settings. It will be the first one with minimal 'id'. Ref PRs: 1. https://github.com/odoo/enterprise/pull/55350 Forward-Port-Of: odoo/enterprise#87276
This change moves a small customization to the module that actually depends on the portal features. It keeps the code organized correctly and reduces the risk of future maintenance issues.
Original PR description
Since #234356, `_get_allowed_message_post_params` method of the `PortalChatter` has been overridden in the `rating` module. As the `rating` has no dependency on the portal, the current change moves this override to the `portal_rating` module. Forward-Port-Of: odoo/odoo#236436 Forward-Port-Of: odoo/odoo#236249
This fix makes sure preparation displays are updated when staff transfer, merge, link, or unlink tables in the POS. It also prevents duplicate kitchen orders from being created when orders are combined and lines are cancelled, helping the kitchen screen stay accurate and consistent with the sales screen.
Original PR description
Task: [#5005179](https://www.odoo.com/odoo/1737/tasks/5005179) --- When executing table actions such as transfer, merge, link, or unlink, the related Preparation Displays (PDIS) were not being updated. This caused inconsistencies between the POS orders and the kitchen screens. Also, when merging or linking orders and cancelling some lines, a new `pdis_order` was created instead of reusing the existing one. This fix ensures that PDIS are correctly synchronized and notified on any table actions. Forward-Port-Of: odoo/odoo#233630
This fix ensures Preparation Displays update correctly when POS table actions are used, such as transfer, merge, link, or unlink. It prevents mismatches between the order seen at the POS and what appears on kitchen screens, improving accuracy during service.
Original PR description
Task: [#5005179](https://www.odoo.com/odoo/1737/tasks/5005179) --- When executing table actions such as transfer, merge, link, or unlink, the related Preparation Displays (PDIS) were not being updated. This caused inconsistencies between the POS orders and the kitchen screens. Also, when merging or linking orders and cancelling some lines, a new `pdis_order` was created instead of reusing the existing one. This fix ensures that PDIS are correctly synchronized and notified on any table actions. Forward-Port-Of: odoo/enterprise#98374
Live chat visitors can no longer initiate call sessions. This closes a loophole in the server-side checks so the restriction is enforced consistently, helping prevent unintended call requests from unauthenticated users.
Original PR description
In [1], we fixed an issue where the start call button would be visible to portal partners. We do not want visitors to initiate calls on live chats. However, there also is a guard in the `rtc` controller which only checks that public users cannot start calls. The server code should also be adapted to properly ensure no live chat visitor can start a call. [1]: https://github.com/odoo/odoo/pull/236272 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#236495
This change fixes an error that could happen when viewing chat reports grouped by help status. It removes an incorrect lookup path so the report opens normally when agents click those results.
Original PR description
The `help_status` field of the channel member history model is used to quickly find sessions where help was requested/provided. However, the field exposes a `_search` method that doesn't exists which lead in a crash when clicking on the agent report bars when grouping by `help_status`. This field is stored so we don't need the search. 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
The Point of Sale now shows the product configurator when a product includes a free-text option, even if there is only one selectable value. This lets staff enter the required custom text instead of being blocked by a missing input field.
Original PR description
**Steps to reproduce:** - Make a new product, make a single variant with a single value for it - The variant value should have the Free Text checkbox enabled - Go to PoS, click on said product - The product configurator will not be displayed, so there is no way to write on this Free Text field **Why the fix:** Before this commit, we did not display the product configurator if all variant attributes were single choice, because it did not make sense to show it just for the user to click on confirm. But this did not account for the fact that if a Free Text option is enabled, we should still display it, so that the user can write whatever they want on it, even if it is the only option available. We now display the product configurator in all cases where a Free Text field is present, as we need the customer to be able to fill it, even if it is the only available option. opw-5133743
This change adds automated coverage for @mention suggestions in channels restricted to a specific group. It helps ensure people only see the right suggestions in these channels, reducing the chance of incorrect or confusing mentions.
Original PR description
This commit adds a test for mention suggestions in group-restricted channels (`group_public_id`). task-5258925 Forward-Port-Of: odoo/odoo#235478
This change fixes an issue where the message composer could fail while loading suggestions if no message was attached yet. It makes the feature more reliable and prevents an internal error from blocking the user experience.
Original PR description
This commit solves a runbot issue created by the debounced nature of the suggestion fetch. A composer could not have a message associated with it and was therefore failing to find the related thread. Now, the thread is set to undefined in that case since we do not need the result anyway. fixes-runbot-230311 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#236262
When a vendor bill email contains several attachments, Odoo now avoids creating additional bills unless the attachments are actually useful. This reduces clutter in the database and helps avoid unnecessary document processing costs.
Original PR description
Steps to reproduce: - Set up email alias for Vendor Bill journal - Send email with N images alias Issue: <N> Bills are created, in each one we will attempt to extract the image content to enrich the bill. Analysis: This occurs because we split the attachment list into several groups, each one creating a new invoice (except the first). However we don't take into account if the attachments are actually meaningful. In many cases this behavior will pollute the database and waste iap credits. This commit proposed to evaluate if in each group there is at least a meaningful attachment before creating/extending an invoice opw-5076315 [Ticket link](https://www.odoo.com/odoo/project/49/tasks/5076315)
Timesheet totals shown on helpdesk team pages were sometimes displayed with the wrong unit conversion, especially when the system was set to Days/Half-days. This fix restores the correct calculation so users see accurate totals, such as 2.5 days instead of 160 days.
Original PR description
Steps to reproduce: -------------------- 1. Install helpdesk_timesheet 2. Create a new team with timesheets enabled 3. Create a new ticket and add a timesheet line with some time (e.g., 20 hours) 4.…
Steps to reproduce: -------------------- 1. Install helpdesk_timesheet 2. Create a new team with timesheets enabled 3. Create a new ticket and add a timesheet line with some time (e.g., 20 hours) 4. Open the team’s settings and observe the Timesheets stat button 5. Go to Timesheets > Configuration > Settings 6. Set "Encoding method" to "Days/Half-days" 7. Reopen the team’s settings and observe the Timesheets stat button again Issue: ------ Incorrect value displayed in the Timesheets stat button. (e.g., 160 Days instead of 2.5 Days) Cause: ------ After commit d23ca81, the UoM model was restructured, changing how conversions between hours and days are computed. The field `factor_inv`, previously used in the computation of total_timesheet_time, was removed. Earlier, `factor_inv` handled this conversion correctly. After its removal, the computation now directly uses factor, which leads to incorrect values when converting to days. https://github.com/odoo/enterprise/blob/92bb923ffe185b7744adeadcc8f2972f9a64effb/helpdesk_timesheet/models/helpdesk_team.py#L32-L36 For ex: Consider unit_amount = 20 minutes: **Before** Case 1: Encoding method = Hours/Minutes (unit_amount_sum / product_uom.factor) * uom_team.factor (20 / 1) * 1 = 20 Hours --> CORRECT Case 2: Encoding method = Days/Half-days (unit_amount_sum / product_uom.factor) * uom_team.factor (20 / 1) * 8 = 160 Days --> INCORRECT **After** Encoding method = Days/Half-days (unit_amount_sum * (1.0 if helpdesk_ticket.encode_uom_in_days else product_uom_factor)) / uom_team.factor (20 * 1) / 8 = 2.5 Days --> CORRECT Reference: The [UoM’s factor ](https://github.com/odoo/odoo/blob/ca9df34f3a29796596f92e55647f61f95a95af52/addons/uom/data/uom_data.xml#L29-L37)has also been changed. **NOTE:** Before this change, when the user opened the timesheet sublist view in debug mode and clicked the View button, it opened the default form view of the `account.analytic.line` model instead of the intended timesheet form view. This allowed editing of the Unit of Measure (product_uom_id) field also. To prevent this, the form view reference has been explicitly specified, similar to the one used in the [Project module](https://github.com/odoo/odoo/blob/3f23bd9723d9065f17c1960d185d67a0a809a889/addons/hr_timesheet/views/project_task_views.xml#L41). Solution: ---------- This commit ensures accurate conversion of timesheet values between hours and days opw-5184077 Related community PR: https://github.com/odoo/odoo/pull/233803 Forward-Port-Of: odoo/enterprise#98545
The project dashboard now shows the correct timesheet total when timesheets are entered in days or half-days. This fixes a display error that could make the stat button show much larger values than expected, helping users trust the numbers they see.
Original PR description
Steps to reproduce: -------------------- 1. Install hr_timesheet 2. Create a new project and a task 3. On the task, add a timesheet line with some time (e.g., 20 hours) 4. Open the project dashboard…
Steps to reproduce: -------------------- 1. Install hr_timesheet 2. Create a new project and a task 3. On the task, add a timesheet line with some time (e.g., 20 hours) 4. Open the project dashboard and check the Timesheets stat button 5. Go to Timesheets > Configuration > Settings 6. Set "Encoding method" to "Days/Half-days" 7. Reopen the project dashboard and check the Timesheets stat button again Issue: ------ Incorrect value displayed in the Timesheets stat button. (e.g., 160 Days instead of 2.5 Days) Cause: ------- After this 28b69da, UoM model got restructured and the conversion logic between hours and days changed. https://github.com/odoo/odoo/blob/aeda822db05b218fd1271c7666307950b7a98512/addons/hr_timesheet/models/project_project.py#L137-L143 The `total_timesheet_time` value is now already stored in the final unit (e.g., days). The subsequent division in `_get_stat_buttons()` was a redundant **double conversion**, resulting in incorrect display. https://github.com/odoo/odoo/blob/aeda822db05b218fd1271c7666307950b7a98512/addons/hr_timesheet/models/project_project.py#L231-L234 **Before** Case 1: Encoding method = Hours/Minutes Consider allocated_hours = 80 Hours, total_timesheet_time = 20 Hours Then: uom_ratio = 1/1 => 1 allocated = 80/1 => 80 Hours effective = 20/1 => 20 Hours --> CORRECT Case 2: Encoding method = Days/Half-days Consider allocated_hours = 80 Hours, total_timesheet_time = 2 Days (already in days — no conversion needed, but the system incorrectly tries to convert it) Then: uom_ratio = 1/8 => 0.125 allocated = 80/.125 => 640 Days effective = 2/0.125 => 16 Days --> INCORRECT **After** Consider allocated_hours = 80 Hours (needs conversion to days as per encoding method) and total_timesheet_time = 2 Days (already in days, no conversion). Then: uom_ratio = 1/8 => 0.125 allocated = 80*.125 => 10 Days effective = 2 => 2 Days --> CORRECT Reference: The [UoM’s factor ](https://github.com/odoo/odoo/blob/ca9df34f3a29796596f92e55647f61f95a95af52/addons/uom/data/uom_data.xml#L29-L37)has also been changed. Solution: ---------- This commit ensures accurate conversion of timesheet values between hours and days opw-5184077 Related enterprise PR: https://github.com/odoo/enterprise/pull/98545 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233803
This fix prevents calendar event titles from being cut off in day view, especially on mobile devices. Users can now read the full event name at a glance, making it easier to review what needs to be done.
Original PR description
Before this commit, when the user goes to a calendar view in day to check what he have to do. He cannot see the event title properly in his mobile phone since the title is truncated. This commit makes sure the event title is not truncated to clearly see the whole event title. Before the fix: <img width="1172" height="802" alt="image" src="https://github.com/user-attachments/assets/f85a4a03-89a3-48c8-bda7-38e72854ce1f" /> After the fix: <img width="1179" height="808" alt="image" src="https://github.com/user-attachments/assets/7b0b31ba-10f5-412b-837b-8399c78c5bac" /> Forward-Port-Of: odoo/odoo#235823
This change prevents an error from appearing in Documents when a linked CRM record has been deleted. The system now correctly marks the related document as having no source record, so users can open Documents normally without a traceback.
Original PR description
Steps to reproduce: - Install crm and documents - Go to CRM → Activity Types - Set a folder in the Upload Document activity - Create a CRM lead and schedule an upload document activity - Delete the created lead - Open the Documents module Issue: - A traceback occurs because web_read tries to access values_by_id[record.id], as the upload request document remains in the database after its related activity is deleted. Solution: - fix the recompute of res_name and set it to False, avoiding MissingError opw-5080182 Forward-Port-Of: odoo/enterprise#97461
This update makes the Black Box payment device handling more resilient by retrying when the device returns an invalid response or no valid acknowledgment. It also aligns the timeout behavior with the documented limit, helping reduce payment interruptions at the point of sale.
Original PR description
Following documentation, max timeout should be 1.5s and we should retry 3 times on every bb NACK/invalid data. Forward-Port-Of: odoo/enterprise#99911 Forward-Port-Of: odoo/enterprise#99705
The website now hides mega menu links when their content is not available to the current visitor, instead of showing empty dropdowns. This makes the navigation cleaner on both desktop and mobile and avoids confusing users with menu items they cannot use.
Original PR description
Before this commit, when setting the mega menu content visibility, the navbar link would still appear even if the user does not have access to the mega menu content. This commit hides the navbar link for the mega menu in the mobile and desktop view when the user does not have access to the mega menu content, in order to prevent unnecessary elements in the navbar. Steps to reproduce the bug: - Add a mega menu element in the navbar - Open the mega menu - Set the mega menu content visibility to conditional (logged in) - Open the website while logged out (The mega menu link is here but the content is not displayed. However, the dropdown is still opened but it is empty.) task-3992066 Forward-Port-Of: odoo/odoo#235516 Forward-Port-Of: odoo/odoo#179454
This fix ensures POS order costs are calculated correctly when a product has variants and its Bill of Materials includes lines that apply only to specific variant values. As a result, each sold variant now reflects the right cost, avoiding incorrect margins and reporting.
Original PR description
When you create a product with atleast one variant that has 2 value, and create a BoM for this product that has 2 lines with each line having one of the two values, then create a POS order with one…
When you create a product with atleast one variant that has 2 value, and create a BoM for this product that has 2 lines with each line having one of the two values, then create a POS order with one unit of each variant, the cost of the first line not correctly computed. Steps to reproduce: ------------------- * Create a prodcut P with one attribute A that has two values A1 and A2 * Create a product C with no attribute and a cost of 10$ * Create a BoM for P with two lines: - Line 1: product C, quantity 1, only for attribute value A1 - Line 2: product C, quantity 2, only for attribute value A2 * Open a PoS session * Add Product P with attribute value A1 to the order * Add Product P with attribute value A2 to the order * Validate the order and close the session * Go to the order and check the cost of each line > Observation: The cost are not correct, they should be 10$ and 20$ Why the fix: ------------ Before this fix we were not taking the `bom_product_template_attribute_value_ids` into account when filtering the stock moves to consider for the cost computation. This value represent the attribute values that the product must have for this BoM line to be considered. opw-4765234 Forward-Port-Of: odoo/odoo#235502 Forward-Port-Of: odoo/odoo#225014
Updated the LinkedIn API header version used by the social LinkedIn integration. This was needed because the previous API version was retired, helping keep LinkedIn connections working without interruption.
Original PR description
This commit updates the linkedin version header so that we can use the version of the API. Our actual version was recently sunset, needing the change of version to be done. task-5271712 Forward-Port-Of: odoo/enterprise#99759
Fixed an error that could prevent non-admin employees from using the Purchase Order Suggest wizard. Regular purchase users can now complete the suggestion flow without being blocked by access restrictions, improving day-to-day purchasing operations.
Original PR description
**Issue:** Non-admin users get an AccessError as follows ```doesn't have 'create' access to: - Default Values, Based on (Purchase Order Suggest) (ir.default: 45)... ``` when using the Purchase Order…
**Issue:** Non-admin users get an AccessError as follows ```doesn't have 'create' access to: - Default Values, Based on (Purchase Order Suggest) (ir.default: 45)... ``` when using the Purchase Order Suggest wizard. **Cause:** The `ir_default_user_rule` record rule restricts non-admin users to only create/modify ir.default records where `user_id = user.id` However, in `_save_values_for_vendor` method: https://github.com/odoo/odoo/blob/6b8a8196c63275eead6709bb20002df0be12a059/addons/purchase_stock/wizard/purchase_order_suggest.py#L199-L204 `ir.default.set()` is called without setting the `user_id` parameter, which defaults to an attempt to create a global default: what only admins can do. **Steps to reproduce:** - create a non-admin user with purchase user permissions. - log in as that user and create a Purchase Order - add products to the catalog and click "Suggest. - configure suggest parameters and click "Compute" (Note: compute is only enabled when estimated_price > 0) An AccessError occurs opw-5076647 Forward-Port-Of: odoo/odoo#227643
This change fixes a website editing issue where shape previews could stay stuck after the mouse moved away. It ensures the image returns to its original look correctly, so hover-based image options like shapes and filters behave as expected.
Original PR description
After hover effect has been added back in this [commit], we could see an issue when we had a hover effect and tried to preview a shape. Steps to see the issue: - Open website and start editing - Drop…
After hover effect has been added back in this [commit], we could see an issue when we had a hover effect and tried to preview a shape. Steps to see the issue: - Open website and start editing - Drop a text-image snippet onto the page. - Then add a hover effect to the snippet image. - Open the image shape selector and hover over the shapes. => Bug: the preview is broken; when the mouse leaves a shape, the original shape is not reset. Same issue with other options when there is a hover effect on an image (e.g. "image Filter"). Current flow is: We are previewing shape -> img src is changed -> `originalImgSrc` in `ImageShapeHoverEffect` interaction is changed -> we revert preview -> img src is reverted, but MutationObserver doesn't change `originalImgSrc` immediately, and when reverting a step, we stop the interaction -> destroy is called and image source is set to `originalImgSrc`, but it is the old one with a shape. We want to update the `src` only if it is currently the one that we set as hovering. [commit]: https://github.com/odoo/odoo/commit/80b5db99a3c26c3dd4fb5c55e04b8813dddb5b8d task-5207382
This change reverses a recent update to how journal items are shown so that adding new lines to accounting entries works correctly again. It fixes an issue that could prevent debit and credit amounts from being computed properly when users edit entries.
Original PR description
This reverts commit 6ed1e43b3f7d53c6a45fe24a1c68f8386e6adf8e. The commit is reverted because the `journal_line_ids` field is causing issues with onchange methods that rely on cached values. Specifically, the automatic computation of `debit`/`credit` when adding new lines to a journal entry was failing. While `journal_line_ids` (as a subset of `line_ids`) works correctly when the data is stored in the database, its absence during an onchange computation (which relies solely on cache) led to incorrect behavior. In stable versions, `journal_line_ids` is: * Kept but deprecated. * Made non-exportable. The field will be removed in `master`. task-5241650 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
A recent change that hid sections and notes in journal item tabs has been rolled back because it interfered with how new journal lines are calculated. This restores the expected automatic debit and credit updates when users add lines to an entry.
Original PR description
This reverts commit 17d0e67106a30a46d608331680e5094dbc44e2e0. The commit is reverted because the `journal_line_ids` field is causing issues with onchange methods that rely on cached values. Specifically, the automatic computation of `debit`/`credit` when adding new lines to a journal entry was failing. While `journal_line_ids` (as a subset of `line_ids`) works correctly when the data is stored in the database, its absence during an onchange computation (which relies solely on cache) led to incorrect behavior. no-task
Website card images no longer show unwanted white borders when a hover animation is applied. This keeps the image filling its container correctly and improves the visual quality of edited website pages.
Original PR description
Step to reproduce: 1. Open website 2. Click edit button and drop s_three_columns snippet 3. Click image and change animation option into hover 4. Some extra white space shown. Before this commit: Applying a hover animation on card images caused the `object-fit` property to unintentionally switch from `cover` to `contain`, resulting in visible white borders around the image.This happened because of the `geo_square` shape, which is automatically injected when a hover effect is applied and no user shape is chosen. This behavior was intentionally introduced in PR [1]. After this commit: Now cropped images use object-fit: contain to preserve the visible properly. and after stretch option apply it can take cover of this container. so his ensures the image fully covers its container without leaving any white gaps. [1]:https://github.com/odoo/odoo/pull/119197 task:4875770 Forward-Port-Of: odoo/odoo#215766
Opening the shop floor app from a Manufacturing Order now shows the correct work center for that order, instead of possibly reopening the last work center used by the operator. This prevents users from landing on the wrong screen and makes it easier to see and manage the current order from the smart button.
Original PR description
Opening shop floor from MO smartbutton activates the WC "Overview". Subsequent opening of shopfloor app will also land on WC "Overview". Also removes an 'undefined' part of local storage key. BEFORE:…
Opening shop floor from MO smartbutton activates the WC "Overview". Subsequent opening of shopfloor app will also land on WC "Overview". Also removes an 'undefined' part of local storage key. BEFORE: Due to an oversight during this fix odoo/enterprise#93553, opening shop floor from MO smartbutton selects the WC from local storage (ie last clicked by user), with a filter for the current MO. (ie. when clicking Shopfloor smartbutton on an MO we can land on the wrong WC) NOW: Opening shop floor from MO smartbutton selects the WC "All MO" with a filter for the current MO. If we close shopfloor and come back to the shop floor app we land back on the "All MO" WC, which is the intended behaviour. Note: I did not rewrite tests I did here: https://github.com/odoo/enterprise/pull/93553/files#diff-2aa7dbd54334d280c72d91b7d472077aaae9af017408f1b0d71150bb16a022f4 as the setup is quite different in 18.0 (no access to the required stepUtils and the tour flow is quite different) task#4629641 Forward-Port-Of: odoo/enterprise#99855 Forward-Port-Of: odoo/enterprise#93841
This update prevents an error when a helpdesk ticket is moved to Done or Canceled in a team that has no working hours configured. It ensures the closing process only uses the working-hours logic when that setting is actually present, avoiding an unexpected traceback for users.
Original PR description
> **The issue:** When you go to a helpdesk's team settings -> SLA Policies -> Working hours, set the working hours to empty and then disable SLA Policies and save. After that if you try to move a ticket in the same team to done or canceled you will receive an exception. **Cause:** The part of the code causing the issue is supposed to only run if a Working Hours policy is set. **Fix:** Changed the section of the code to only run when Working Hours is set. opw-5120962 > Forward-Port-Of: odoo/enterprise#98889 Forward-Port-Of: odoo/enterprise#96546
This update prevents an error when opening older Point of Sale refund orders created from multiple original orders. It ensures upgraded databases keep working correctly and avoids interruptions during upgrade checks.
Original PR description
In saas~17.1, the field `refunded_order_id` was changed from a Many2Many to a Many2One, as refunding lines from different orders with the same order was no longer possible. The problem is that there were no changes applied to the existing data to account for this, so databases with those kind of refunds will trigger an error when the field is computed: ``` ValueError: Wrong value for pos.order.refunded_order_id ``` This behaviour can also break upgrades if the error happens during the mock crawl test after the upgrade. To reproduce: - In 17, create an order refunding products from different orders. - Upgrade to 18. - Try to view the refunding order. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#224515 Forward-Port-Of: odoo/odoo#221355