Daily updates from Odoo
Monday, March 23, 2026
64 changes · saas-19.1
Enhancements to existing features
This update ensures that follow-up reminders are consistently sent to customers, even when a large volume of reminders are queued. The system now automatically re-triggers the reminder process if there are still outstanding reminders, preventing delays and improving customer communication. A configurable batch size allows users to optimize the process for their specific needs.
Original PR description
In case there is a lot of followup to process, the followup cron doesn't retrigger and we have to wait the next day for them to be sent. This commit make use of the ir.cron progress API so that the cron is retriggered if there are followup left to be sent. We also make the batch_size configurable to that a user could tune it on the cron. opw-6042472 Forward-Port-Of: odoo/enterprise#110918
This update allows HR staff to create leave entries for Swiss employees even when payroll impacts are present, offering greater flexibility in managing employee time off. The change relaxes previous restrictions based on payroll data, ensuring accurate leave tracking while accommodating various Swiss payroll scenarios. This improves the usability of the HR module for our Swiss clients.
Original PR description
Currently we block leave creation if the employee has a validated payslip in that period. In this commit we relax the constraint in the following way, we will allow to put the leave if: - `l10n_ch_swissdec_payroll_impact` is False - `l10n_ch_continued_pay_percentage` and `l10n_ch_disability_percentage` are BOTH 100% if `l10n_ch_swissdec_payroll_impact` is True - `l10n_ch_swissdec_work_interruption` cannot be True in both cases task-5948505 Forward-Port-Of: odoo/enterprise#107847
Resolved issues and error corrections
This update corrects a bug in the SendCloud delivery service that was preventing the system from correctly processing delivery requests. The issue stemmed from an incorrect use of Python slicing, which was causing a data retrieval error. The fix ensures reliable delivery processing.
Original PR description
Slicing in Python returns a sub-list, even for a single element. Doing `res[:1]` does not return the first element so doing `.get` causes an error. This was not caught because the tests do not run in CI due to the tags on the class. Forward-Port-Of: odoo/enterprise#111254
This update fixes an issue where the Report Editor wouldn't automatically focus on the editable field after making changes like deleting rows or columns. This ensures a smoother user experience when working with report designs, preventing unnecessary clicks and improving efficiency. The change was made to address a test failure related to browser focus behavior.
Original PR description
PR [1] ensures that editable is focused after deleting row or column from table menu by preventing default while clicking on table menu button. This change causes test [2] to fail if a table menu test runs beforehand, due to browser’s native focus behavior. This commit ensures that editable is focused whenever clicking on t-field. [1]: https://github.com/odoo/odoo/pull/249256 [2]: https://github.com/odoo/enterprise/blob/19.0/web_studio/static/tests/client_action/report_editor/report_editor_dom_edition.test.js#L456-L478 Community PR: https://github.com/odoo/odoo/pull/249256 task-5725593 Forward-Port-Of: odoo/enterprise#109034
This update resolves an error that occurred when activating the 'hr_expense_stripe' module with unsupported currencies (like INR). The module will no longer attempt to create a specific journal, and existing company currencies will now be used as a fallback, ensuring the invoicing dashboard functions correctly.
Original PR description
Currently, an error occurs when a user opens the invoicing dashboard after activating the `hr_expense_stripe` module for Stripe card issuing with only unsupported currencies active. Steps to…
Currently, an error occurs when a user opens the invoicing dashboard after activating the `hr_expense_stripe` module for Stripe card issuing with only unsupported currencies active. Steps to reproduce: (19.0) - Install `account` module - Set Company currency to `INR` and deactivate `USD` in currencies. - Install `hr_expense_stripe` - Create New company > Set `Country` and `Currency` (eg: India and INR) > Switch to New company > Open `Invoicing` you will get the error. Steps to reproduce: (saas-19.1) - Install `account` module - Set Company currency to `INR` and deactivate `USD` in currencies. - Install `hr_expense_stripe` > Open `Invoicing` you will get the error. Traceback: `ValueError: Expected singleton: res.currency()` In this [PR], the behavior is such that if `company.stripe_currency_id` is not set, we do not create the "Stripe Issuing". In 19.0, `@template` was executed after the post-init hook, and we were preventing the creation of the [journal] at that stage. However, when a new company is created, the template data is automatically loaded for companies with a matching chart of accounts. As a result, the `stripe_issuing_journal` is created, which leads to the error. However, in saas-19.1, due to recent improvements in a [commit], the `@template` will now loads data for companies without post init hook. As a result, the `stripe_issuing_journal` is being created, and we are encountering an error. Solution: - The`Stripe Issuing` journal will no longer be created on installing the module. - For existing databases, we will use the company currency as a fallback value to ensure that a valid currency is applied. [PR]: https://github.com/odoo/enterprise/pull/96271 [journal]: https://github.com/odoo/enterprise/blob/fea009f98885a97439edfea75376b7323c8c9a03/hr_expense_stripe/models/res_company.py#L186-L187 [commit]: https://github.com/odoo/odoo/pull/228950/changes/21fd14ed5e8bdd2cf203d466069437a62a87f2bd sentry-7284934493 Forward-Port-Of: odoo/enterprise#108436
This update fixes an issue where the "Submit" button was hidden when creating return types in the account reports. The change removes an outdated field requirement, ensuring the button is always visible for users to complete the return type creation process. This improves usability for users generating return reports.
Original PR description
When a user creates a return_type, the submit button is not visible as there is no type_external_id. Since now, we have the states_workflow this is not useful anymore. This commit is basically a back port of https://github.com/odoo/enterprise/commit/305b0078e584487036d907d6e18b7911bc7ff1de Forward-Port-Of: odoo/enterprise#110328
This update corrects a previous error that occurred when the 'Payroll: Update Data' cron job ran, specifically within the Saudi Arabian payroll configuration. The issue stemmed from deleting salary rule categories, which caused a data mismatch during the update process. This fix ensures that the rule category data is updated before the salary rule data, preventing the error and maintaining accurate payroll processing.
Original PR description
Currently, an error occurs when the "Payroll: Update Data" scheduled action is executed. **Steps to Reproduce:** - Install `l10n_sa_hr_payroll` with demo data. - Switch to `Saudi Arabian` company. -…
Currently, an error occurs when the "Payroll: Update Data" scheduled action is executed. **Steps to Reproduce:** - Install `l10n_sa_hr_payroll` with demo data. - Switch to `Saudi Arabian` company. - Go to `Payroll` > `Configuration` > `Salary` > `Rule Categories`. - Delete all records related to the Saudi Arabian company. - Go to `Scheduled Actions` and run `"Payroll: Update Data"`. `ValueError: External ID not found in the system: l10n_sa_hr_payroll.l10n_sa_category_provision` After [this commit], the category_id field becomes non-required, allowing users to delete a rule category record even if it is linked to a salary rule. When updating the data file [1], this causes an error due to the missing rule category [2]. This commit ensures that, when updating the salary rule data, the rule category data is updated beforehand, as shown here [3]. [this commit]: https://github.com/odoo/enterprise/commit/c663fd2a81b7f6b34f8199fdbdc4a75c4f21379e [1]- https://github.com/odoo/enterprise/blob/5ab4cb8bbf8211783a23a4334b633d52633b0324/l10n_sa_hr_payroll/models/hr_payslip.py#L157-L165 [2]: https://github.com/odoo/enterprise/blob/5ab4cb8bbf8211783a23a4334b633d52633b0324/l10n_sa_hr_payroll/data/hr_salary_rule_saudi_data.xml#L249 [3]: https://github.com/odoo/enterprise/blob/5ab4cb8bbf8211783a23a4334b633d52633b0324/l10n_ke_hr_payroll/models/hr_payslip.py#L9-L18 sentry-7349905716
This update fixes an error in the reports generated for Ecuador (l10n_ec_reports_ats) by ensuring the correct 'tipoCliente' value is used for foreign partners. Previously, the system incorrectly identified company types, leading to inaccurate tax reporting. This change aligns with AFIP requirements and ensures compliance.
Original PR description
Since `tipoCliente` is now determined using the computed `is_company` field, the test data must reflect this logic. `partner_ext` represents a foreign partner and is considered a company, therefore its `tipoCliente` should be set to '02'. See: https://github.com/odoo/enterprise/commit/a779badac35cf4a8f483f490e8ae29eb6bf3d2c5 `l10n_ar_edi`: For foreign partners, AFIP requires the CUIT pais based on the partner’s country and document type, not on partner.is_company. In multi-localization databases, is_company may be influenced by local heuristics and lead to picking the wrong foreign tax identifier. Use the identification type instead: VAT documents map to the legal-entity CUIT pais, while non-VAT documents map to the natural-person one. See: https://github.com/odoo/enterprise/pull/86089#discussion_r2128977870 runbot-241126
This update resolves a technical issue related to how geographic data (specifically topoJSON) is processed within the Odoo Enterprise spreadsheet reports. The fix ensures accurate display of maps and charts based on location data, improving the reliability of reports. This change primarily impacts users who rely on location-based data visualizations.
Original PR description
test adaptation Counterpart of github.com/odoo/odoo/pull/248847 Task-5224009 Forward-Port-Of: odoo/enterprise#107912
This update fixes a bug preventing portal users from viewing timesheets on helpdesk tickets linked to projects with 'Invited internal and portal users' visibility. The change expanded the domain to include both 'portal' and 'invited_users' visibility options, ensuring correct timesheet display for all users.
Original PR description
Steps to reproduce: - Create Project A with visibility set to `Invited internal and portal users.` - Create a Helpdesk Team and assign Project A to it. - Create a helpdesk ticket. - Log a timesheet…
Steps to reproduce:
- Create Project A with visibility set to `Invited internal and portal users.`
- Create a Helpdesk Team and assign Project A to it.
- Create a helpdesk ticket.
- Log a timesheet on the ticket and share the ticket with the portal user.
- Log in as the portal user and check the timesheet.
- Observe that the timesheet is not visible to the portal user.
Cause:
- After introducing the `invited_users` option in `privacy_visibility`, the portal domain in `_timesheet_in_helpdesk_get_portal_domain` was not updated.
- The domain was still defined as: `('project_id.privacy_visibility', '=', 'portal')`
- As a result, timesheets linked to projects with visibility set to “Invited internal and portal users” were excluded from the portal user’s view.
Solution
Update the domain to include both visibility options: `('project_id.privacy_visibility', 'in', ['portal', 'invited_users'])`
- This ensures timesheets are visible to portal users when the project visibility is either portal or invited_users.
task-5924243
Forward-Port-Of: odoo/enterprise#107800This update resolves an issue where the topbar menu wasn't correctly updated after a user opened a menu using an AI Agent. The fix ensures the topbar accurately reflects the currently active menu, improving the user experience when interacting with AI-powered features. This enhances usability and consistency.
Original PR description
Purpose: -------- When a menu (view) was opened through an AI Agent, the menu in the topbar was not updated. This commit fixes this behaviour by setting the menu when the menu's action has been loaded Task-6017607 Forward-Port-Of: odoo/enterprise#109929
This update automatically calculates and transmits the required perception commission for Swiss employees through the Swissdec system. This ensures accurate and timely reporting for tax compliance, addressing a previous issue with manual calculations. The change impacts the l10n_ch_hr_payroll module.
Original PR description
task-6050810 Forward-Port-Of: odoo/enterprise#111143
This update resolves a problem where the website's tour process was failing due to timing issues, particularly with translation loading in recent Chrome versions. The fix adds a temporary step to ensure translations load before the tour continues, preventing interruptions and ensuring a smoother user experience.
Original PR description
This commit adds an intermediary step ensuring the proper page has been reached before actually doing the checks and avoiding to let startup requests (like the loading of the translations) pending at the end of the tour (and the eventual stop of the runner browser). Note: this is most likely due to a timing (indeterministic by nature) change, emphasised by recent Chrome versions (like v145). runbot-239128 Forward-Port-Of: odoo/enterprise#111013 Forward-Port-Of: odoo/enterprise#110648
This update resolves a test issue where simultaneous data synchronization in the Point of Sale (POS) tax module caused errors. The fix ensures that backend calls complete before the test continues, improving test reliability and preventing disruptions. This enhances the overall stability of the POS tax functionality.
Original PR description
In the test test_pos_avatax_flow, two calls are made to get_order_tax_details almost simultaneously, which causes the second call to raise an error due to both call trying to sync the same order at the same time. This commit fixes the test by waiting for the backend calls to be done before proceeding with the test next steps. runbot-error: 238871, 238872 Forward-Port-Of: odoo/enterprise#110341
This update corrects a bug where changes to view ordering within the Odoo Studio were not being applied correctly. The fix involved updating the default order setting to be applied through the designated `defaultOrderBy` attribute on the related model, ensuring consistent view ordering for users.
Original PR description
Bug === When changing the order of the views using studio, it wasn't applied. The reason is that we add a default order at the wrong place in JS, it should be done with the attribute made for that, `defaultOrderBy` on the relational model. Task-6047024 Forward-Port-Of: odoo/enterprise#111395 Forward-Port-Of: odoo/enterprise#111091
This update resolves an issue with automatic GST token refreshes in the Odoo Enterprise system. The automatic refresh process has been disabled, and now the refresh is triggered manually when needed, ensuring compliance and reducing potential operational overhead. This change improves stability and control over token management.
Original PR description
With this PR, the GST token refresh cron interval is updated from 5 hours to 9999 months to effectively disable automatic execution. The cron will instead be triggered manually from `validate_otp` and `_cron_refresh_gst_token` based on the token expiration time. Forward-Port-Of: odoo/enterprise#109937
This update clarifies error messages related to Instagram integration (code 9004) within the Odoo Enterprise platform. The change provides users with more helpful guidance when encountering these issues, reducing the need to contact support. This improves the overall user experience and stability of the Instagram feature.
Original PR description
Purpose ======= Explain the possible errors for the code 9004, to help users debugging their Odoo servers without creating a ticket. Task-5972197 Forward-Port-Of: odoo/enterprise#110571 Forward-Port-Of: odoo/enterprise#109319
This update corrects a visual issue in the accounting reports where the company header was grayed out in dark mode. The change ensures consistent branding and a better user experience by using a standard muted data color, aligning with the overall design of the application.
Original PR description
Before this pr: - The company header in the accounting reports is grayed out in the light mode only, not in the dark mode. Reason: - Until now, we have been using the hard-coded 'lightgrey' color for the company header. After this pr: - In this pr, we are changing the color of the company header from hard-coded 'lightgrey' color to the standard variable color '--AccountReport-muted-data-color' used for muted data in account reports. Task-5960592 Forward-Port-Of: odoo/enterprise#111509 Forward-Port-Of: odoo/enterprise#110108
This update resolves an issue where long tax amounts in Ke revenue reports were causing display problems. The fix ensures that tax totals are correctly rendered, regardless of the numerical size, improving the clarity and accuracy of financial reports. This enhancement impacts the user experience for Ke revenue reporting.
Original PR description
This commit aims to: Fix Display issue when the amount is long. task-5162891 Forward-Port-Of: odoo/enterprise#111003 Forward-Port-Of: odoo/enterprise#100319
This update fixes an issue where the Gemini AI feature sometimes returned empty responses to users, creating a confusing 'broken' experience. The fix automatically retries the request with a slightly increased processing budget and, after three attempts, gracefully informs the user of the failure. This ensures a more reliable and consistent AI experience.
Original PR description
It often occurs that gemini responses come back empty without anything to show to the users. Specifically, the response object has content but the "parts" are empty - the place were you either get a function call or a message to the user by the LLM. Prior to this commit, when this occured, we didn't perform any explicit handling. We would always just return what the LLM responded with, which when empty would be nothing. UX wise, it would seem like something broke because the user would basically get no reply. In this commit, we add a retry mechanism in `_request_llm_google` of `llm_api_service.py`, where if we get no response, we increase the thinking budget of the next request to 512 and try again. 512 tokens were chosen completely arbitrarily - anecdotally, the model should use around 300 thinking tokens for its tasks so 512 should be enough. After 3 unsuccessful tries, we send a failure response to the user. Task-5959805 Forward-Port-Of: odoo/enterprise#108755
This update fixes a bug where project timesheets didn't accurately reflect changes in manufacturing employees. The fix automatically updates the AAL (analytic accounting line) associated with the work center when an employee is switched, ensuring accurate tracking of labor costs on the project dashboard. This improves the reliability of project cost reporting.
Original PR description
### Steps to reproduce: - Create an MTO product and another Service product that create a project and task - Create a quotation with both products - Create two employees with different hourly cost - Go to Manufacturing order - Configure an employee to manufacture the product at a work station. - Observe the project dashboard - Go back to the MO and change the employee on the work station - Notice the project dashboard Timesheets section doesn't have any change on the amount ### Cause: This is happening because when changing the employee we don't modify anything in the AAL linked to the work station. As we only modify the AAL when the duration change. ### Fix: We call _create_analytic_entry when we change the employee on the work station to change the amount and the employee_id for the AAL. opw-5939321 Forward-Port-Of: odoo/enterprise#111040 Forward-Port-Of: odoo/enterprise#109695
This update resolves an issue preventing invoices with the ICBPER tax code from generating correctly. The fix addresses a technical problem related to how the system handles fixed taxes, ensuring invoices with this tax type now process without errors. This improves the accuracy of invoice generation for Peruvian businesses.
Original PR description
**Steps to reproduce:** 1. Install module `l10n_pe_edi`. 2. Switch company to PE. 3. Create a tax: - Name: ICBPER - Amount type: Fixed - Code: ICBPER - Amount: 0.5(e.g.) - Set the tax group to ICBPER…
**Steps to reproduce:**
1. Install module `l10n_pe_edi`.
2. Switch company to PE.
3. Create a tax:
- Name: ICBPER
- Amount type: Fixed
- Code: ICBPER
- Amount: 0.5(e.g.)
- Set the tax group to ICBPER (In Advance Option)
4. Create a invoice and add a product with ICBPER tax.
5. Post the invoice and click "Process Now" (at header).
**Issue:**
Processing the invoice raises:
AttributeError: 'dict' object has no attribute '_get_downpayment_lines'
**Cause:**
When `fixed_taxes_as_allowance_charges` is True, `_setup_base_lines()` calls `_turn_emptying_taxes_as_new_base_lines()`, which splits fixed taxes (e.g., ICBPER) into separate base lines.
During this process, `base_line['record']` is no longer the original `account.move.line` record. Instead, it becomes a dictionary containing record under `base_line['record']['record']`.
- With the flag enabled: `base_line['record']` -> dict `line._get_downpayment_lines()` -> AttributeError
- With the flag disabled: `base_line['record']` -> `account.move.line``line._get_downpayment_lines()` -> works correctly
The Peru EDI implementation directly accesses `base_line['record']` expecting an `account.move.line`. The the nested dict structure causes the crash during file generation.
**Solution:**
Override `_add_invoice_config_vals()` to explicitly set `fixed_taxes_as_allowance_charges = False`
- Add test to ensure invoices with ICBPER fixed taxes generate XML without error
**opw-5809939**
Forward-Port-Of: odoo/enterprise#108638This update resolves issues related to how client IDs are formatted within the Odoo Enterprise payroll module (l10n_be_hr_payroll). Specifically, it adapts to a new naming convention for Client IDs, ensuring compatibility and preventing potential errors. The changes also include several bug fixes related to connection and configuration processes within the payroll module.
Original PR description
Forward-Port-Of: odoo/enterprise#111276
This update resolves an issue where CFDI reports incorrectly displayed '99 - False' instead of '99 - Por definir' for payment method 99. The fix ensures that the report accurately reflects the payment method selected during invoice creation, improving report accuracy for Mexican tax compliance.
Original PR description
**PROBLEM** PR https://github.com/odoo/enterprise/commit/843d57b25f925a5d4f1848b85717adb4d1a9d388 Archives payment method 99, but because it's archived `_l10n_mx_edi_get_extra_invoice_report_values()` doesn't retrieve it. This leads the pdf report to display '99 - False' instead of '99 - Por definir'. **STEP TO REPRODUCE** 1. Create an invoice with the mx company. 2. Set the due date sometime in the month later. (To have the PPD payment policy on the invoice). 3. Send and generate the invoice using cfdi. opw-5927655 Forward-Port-Of: odoo/enterprise#111051 Forward-Port-Of: odoo/enterprise#107267
This update resolves issues with overtime calculations related to employee timezones. Previously, the system incorrectly handled overlapping attendances and failed to properly delete outdated overtime lines, leading to inaccurate reporting. This fix ensures accurate overtime tracking regardless of employee timezone settings.
Original PR description
Steps to reproduce (singleton crash): Create an employee in a UTC+ timezone (e.g. Asia/Shanghai or Australia/Adelaide) with an overtime ruleset containing a paid rule. Generate work entries for a…
Steps to reproduce (singleton crash): Create an employee in a UTC+ timezone (e.g. Asia/Shanghai or Australia/Adelaide) with an overtime ruleset containing a paid rule. Generate work entries for a period, then create two consecutive midnight-to-midnight attendances in the employee's local timezone. Creating the second attendance crashes with: "ValueError: Expected singleton: hr.attendance.overtime.line(...)". Steps to reproduce (stale overtime lines): With the same setup, delete the attendance after it generated overtime lines. The overtime lines remain in the database instead of being removed. The singleton crash occurred because `end_of_day` in `_get_overtime_intervals` was computed as a naive datetime, implicitly treated as UTC. For UTC+ timezones, the actual local end of day is earlier than UTC midnight. As a result, overtime intervals were computed with a stop time extending past the real local midnight into UTC time. When consecutive attendances were processed together, these extended intervals overlapped. The `Intervals` class (`keep_distinct=True`) merges overlapping intervals into a single entry with a multi-record recordset as payload. The subsequent `overtime.rule_ids.work_entry_type_id` and `overtime.status` calls expected a singleton but received a multi-record set, causing the crash. The same multi-record issue also affected the iteration in `_set_real_overtime_intervals` and the overtime work entry loop in `_get_attendance_intervals`. The stale overtime lines issue occurred because `_get_overtimes_to_update_domain` (hr_attendance) built its search date range from raw UTC `.date()` values instead of the employee's local timezone. For UTC+ employees whose attendance spans local midnight, the overtime line is dated in the next local calendar day. Since the domain was derived from UTC dates, that next local day fell outside the search range, so the overtime line was never found and deleted when the attendance was removed. Solution: - In `_get_overtime_intervals`, localize `end_of_day` to the employee's timezone before converting to UTC, so overtime intervals are correctly bounded by the local end of day. - In `_set_real_overtime_intervals` and the overtime loop in `_get_attendance_intervals`, iterate over individual records from potentially multi-record `Intervals` payloads to avoid singleton errors. - In `_get_overtimes_to_update_domain` (hr_attendance), localize check_in/check_out to the employee's timezone before computing the date range so overtime lines for dates that only exist in local time are correctly included in the delete-and-recreate cycle. opw-5931665 Forward-Port-Of: odoo/enterprise#109419
This update corrects a problem where appraisal dates weren't being calculated correctly due to a timing issue in the testing process. The fix ensures that appraisal settings are properly applied before test employees are created, resulting in accurate appraisal date calculations for employees.
Original PR description
Issue: The computation of the next appraisal date for employees depends on setting the appraisal plan for a company or changing the company's settings for `duration_after_recruitment`, `duration_first_appraisal`, `duration_next_appraisal`. Fix: Moving the test employee creation after configuration of the company settings for the appraisal plan. task-6050719 Forward-Port-Of: odoo/enterprise#111345 Forward-Port-Of: odoo/enterprise#111265
This update fixes a visual issue where blank spaces appeared in activity cards after a description was cleared. The change ensures that the activity card only displays content when there's actual information, preventing unnecessary empty space and maintaining a cleaner user interface. This improves the overall user experience.
Original PR description
**Description of the issue/feature this PR addresses:** When an activity description is cleared, the stored value may still contain empty HTML content. The UI was still rendering this as a note,…
**Description of the issue/feature this PR addresses:** When an activity description is cleared, the stored value may still contain empty HTML content. The UI was still rendering this as a note, resulting in unnecessary blank space in the activity card. **Current behavior before PR:** Even when the activity description is cleared and contains only empty HTML, the activity note container is still rendered, leaving visible empty space in the UI. **Desired behavior after PR is merged:** The activity note is rendered only when it contains meaningful content. Empty HTML descriptions are ignored, preventing blank space from appearing in the activity card UI. Before <img width="445" height="84" alt="image" src="https://github.com/user-attachments/assets/f6648bb0-78d9-4063-a347-fe664370106e" /> After <img width="459" height="72" alt="image" src="https://github.com/user-attachments/assets/84c2063a-7c68-4dfe-b729-566ca4b5dcd1" /> task-[4752613](https://www.odoo.com/odoo/project/1519/tasks/4752613) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#254708 Forward-Port-Of: odoo/odoo#252139
This update fixes an issue where kit products in Point of Sale orders were incorrectly displaying a total cost of $0 and inaccurate margin calculations. The fix ensures that the total cost and margin are accurately computed for kit-type products, providing reliable pricing information for these products.
Original PR description
Steps to reproduce: = - Create a product with type = Goods and Track Inventory by Quantity - Go to product category > inventory valuation > costing method -> FIFO - Create a BOM for the product with BOM Type = Kit. - Create and validate a POS order. - Open the order in the backend. Issue: = - The total cost was shown as 0.0 for kit products. Also, the margin amount and margin percentage were incorrect. Fix: = - Ensure that the total cost and margin are correctly computed for kit-type products in POS orders. task-5924559 Forward-Port-Of: odoo/odoo#248137
This update ensures that manufacturing orders are created separately for MTO products that share components. Previously, only one MO was created, leading to tracking issues. Now, each product with shared components will have its own distinct manufacturing order, improving inventory accuracy and traceability.
Original PR description
Currently, when a user creates a Sale Order for MTO products that share the same component (which itself has a BOM), the system does not create a separate child MO for each manufacturing order. ##…
Currently, when a user creates a Sale Order for MTO products that share the same component (which itself has a BOM), the system does not create a separate child MO for each manufacturing order. ## Steps to produce: - Install Sales and Manufacturing - Go to Settings and turn on Replenish on Order (MTO). - Create products 'Wooden Arrow' and 'Wooden Rod' with a BOM that includes: - 'Stick', which itself has a BOM with 'Raw stick'. - On each product page, go to Inventory and enable the MTO route, except for 'Raw Stick' . - Create a Sale Order for Wooden Arrow and Wooden Rod for Customer 'Administrator'. - Confirm the Sale Order. - Go to Manufacturing > Open and check both Manufacturing Orders. ## Observed Behavior: Currently, the manufacturing order for 'Wooden Arrow' has a child MO, but the order for 'Wooden Rod' does not. The child MO under 'Wooden Arrow' produces two sticks at once. However, each manufacturing order should have its own separate child MO so that every item is produced and tracked individually. ## Root cause: The issue happens because when a Sale Order is confirmed, [_run_manufacture](https://github.com/odoo/odoo/blob/7c7c6663e28974834d1569b27605f6ce400c7b16/addons/mrp/models/stock_rule.py#L81-L120) is called. This method creates a new MO or updates an existing one based on the domain returned by `_make_mo_get_domain` [1]. For 'Wooden Arrow' and 'Wooden Rod; new MOs are created because no existing MO matches their BOM ID, product ID, or reference. They are added to `new_productions_values_by_company` [2], which is then used to create the MOs [3]. When `_run_manufacture` runs for 'Stick', it is triggered twice since both MOs require it as a component. The first time, no MO matches the domain, so a new one is created. The second time, the domain matches the existing MO (same BOM ID and product ID), so that MO is updated instead [4]. Because of this, `new_productions_values_by_company` is not filled again, and no second child MO is created. [1]- https://github.com/odoo/odoo/blob/c2595e47e3b36120f4c3da8bfe8c16f6c5969a70/addons/mrp/models/stock_rule.py#L146-L165 [2]- https://github.com/odoo/odoo/blob/c2595e47e3b36120f4c3da8bfe8c16f6c5969a70/addons/mrp/models/stock_rule.py#L98-L103 [3]- https://github.com/odoo/odoo/blob/c2595e47e3b36120f4c3da8bfe8c16f6c5969a70/addons/mrp/models/stock_rule.py#L113-L115 [4]- https://github.com/odoo/odoo/blob/c2595e47e3b36120f4c3da8bfe8c16f6c5969a70/addons/mrp/models/stock_rule.py#L105-L110 ## Solution: To resolve this issue, the domain has been tightened to include the parent production group ID. Since the parent MO’s group ID is passed through the procurement variable when `_run_manufacture` is executed for its component products, this group ID can be used to ensure the correct MO is matched. **Why modify the existing test case?:** With this change, in the `test_sale_mrp_pickings` test case, a new child MO for 'Stick' is created under the MO for 'Arrow' instead of modifying another parent MO for 'Stick'. The test case has been updated accordingly. (Confirmed the new behavior with CRL and TAGO) opw-5480133 Forward-Port-Of: odoo/odoo#248229
This update resolves an issue where product availability emails were sending large, full-size images, leading to slow email loading times. The fix ensures images are now optimized for email delivery, improving performance and user experience. This change impacts the visual quality of product availability notifications.
Original PR description
Steps to reproduce in local: 1. Install `website_sale_stock` 2. Make a product variant with an image 3. To make it easy set field `Back in stock Notifications`'s value on this product with the help…
Steps to reproduce in local:
1. Install `website_sale_stock`
2. Make a product variant with an image
3. To make it easy set field `Back in stock Notifications`'s value on this product with the help of the studio
4. Add a person to receive notification in this field
5. Don't set Outgoing email server
6. Run cron `Product: send email regarding products availability` manually
7. To Check sent email go to `Setting > Technical > Email > Emails`
Issue:
- The image is a full-size image
<table>
<tr>
<th style="text-align: center;">Before</th>
<th style="text-align: center;">After</th>
</tr>
<tr>
<td style="text-align: center;">
<img width="1395" height="728" alt="Before"
src="https://github.com/user-attachments/assets/a3fe3b38-c4a5-4a78-a63a-552c96cfdf84" />
</td>
<td style="text-align: center;">
<img width="1383" height="662" alt="After"
src="https://github.com/user-attachments/assets/8c346302-4295-44f2-8172-6a01072b23c7" />
</td>
</tr>
</table>
opw-5915587
Forward-Port-Of: odoo/odoo#249000This update fixes an issue where consolidated POS invoices were incorrectly showing a zero payable amount due to pre-payment mapping. MyInvois now requires invoices to accurately reflect the total amount, regardless of prior payments. This change ensures the payable amount aligns with MyInvois API requirements, resolving a compatibility problem.
Original PR description
For POS consolidated invoices, the PrePayment Amount was mapped to the payment linked to the document. This incorrectly decreased the Total Amount Payable to 0, since POS orders are already paid at the counter. MyInvois tax officer and helpdesk requires that the Total Amount Payable (cbc:PayableAmount) to reflect the total amount of the issued e-document , regardless of prior payments. This commit forces the PaidAmount to 0 for consolidated documents, ensuring the PayableAmount correctly matches the TaxInclusiveAmount as expected by the MyInvois API. task-[6021698](https://www.odoo.com/odoo/all-tasks/6021698) Forward-Port-Of: odoo/odoo#254183 Forward-Port-Of: odoo/odoo#253499
This update fixes an issue where the table editor lost focus after deleting rows or columns, disrupting the editing process and causing confusion. Now, the editor automatically refocuses, ensuring a smoother and more intuitive experience when making changes to the table.
Original PR description
**Current behavior before PR:** When a user deletes a row or column from table menu, the editor loses focus. As a result, actions like Undo do not behave as expected and require multiple attempts to restore the original table state. This breaks the editing flow, causes confusion when performing table-related actions. **Desired behavior after PR:** This PR ensures that editable is focused after deleting row or column from table menu. This commit also makes sure that selection is set properly and hint is visible on empty cell after deleting the column. task-5725593 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249256 Forward-Port-Of: odoo/odoo#245433
A recent issue was causing the Odoo dashboard to crash when users attempted to print. This pull request fixes a bug in the spreadsheet module that was triggering the crash. Users can now reliably print from the dashboard without encountering errors.
Original PR description
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#254815
This update fixes a bug preventing the hover effect for Bento product designs in the editor. The issue stemmed from an incorrect variable reference, which has now been corrected. This ensures users can properly view product descriptions when hovering over Bento designs.
Original PR description
During the introduction of the Bento product design in commit [1], a specific hover effect to show and hide the description was implemented. However, due to an incorrect reference to the 'catalog' variable, this feature was not available in the editor. This commit updates the variable to the correct one, enabling the feature in the editor. [1]: https://github.com/odoo/odoo/commit/1739b954fa34bc62223d892f2cdacbccebd5f8a2 task-6051497 | Current | This branch | |--------|--------| | <img width="1792" height="836" alt="Capture d’écran 2026-03-19 à 14 29 16" src="https://github.com/user-attachments/assets/7a900d47-73b4-4c35-b51e-8ff847361f0b" /> | <img width="1785" height="901" alt="Capture d’écran 2026-03-19 à 14 16 30" src="https://github.com/user-attachments/assets/eb5312bd-04dd-4acb-a44b-fc500b89ddda" /> | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where foreign partners were incorrectly identified as Argentinean due to a misinterpretation of identification codes. The change now accurately restricts partner detection to Argentina, ensuring correct business logic and reporting for Argentine users. This improves data accuracy and reliability.
Original PR description
In `_compute_is_company`, partners were identified as Argentinean (`l10n_ar_partners`) if their identification type had an AFIP code. However, some foreign identification types also carry an AFIP code (e.g., US 'it_fid' uses AFIP code '91'). This caused foreign partners to be incorrectly identified as Argentinean, which led to incorrect `is_company` computation for those records. This change ensures that only partners actually located in Argentina are processed using the local identification heuristic. runbot-241126
This update optimizes how Odoo handles large sales orders, significantly speeding up the rendering process. Previously, a slow process was triggered when processing many order lines, leading to UI delays. Now, the system pre-computes parent-child relationships, resulting in a much smoother and faster experience for users.
Original PR description
This commit resolves a performance bottleneck that occurred when handling very large sale orders (e.g., ~200 order lines). Previously, the util function `getParentSectionRecord` determined the parent…
This commit resolves a performance bottleneck that occurred when handling very large sale orders (e.g., ~200 order lines). Previously, the util function `getParentSectionRecord` determined the parent (sub)section of an order line by iterating over all preceding order lines. Since this logic was executed for each order line, the overall complexity became O(n²). Moreover, this function was invoked inside the `shouldCollapse` method, which is used in multiple UI flows during rendering. As a result, large sale orders could cause noticeable UI slowdowns and block the main JavaScript thread. To address this, we now build a parent–child section mapping once per render in O(n) time. Subsequent lookups simply read from this mapping instead of recomputing the parent by scanning previous lines. This significantly reduces the computational cost and prevents UI blocking when working with large orders, leading to a much smoother rendering experience. opw-5865167 Benchmark: | No. records | Before | After | |----------------|---------------|--------------| | 150 | 1300ms | ~850ms | | Before | After | |---------------|--------------| | <img width="287" height="284" alt="image" src="https://github.com/user-attachments/assets/dd73ab18-3c53-4958-99b7-083dd5cd9e64" /> | <img width="311" height="277" alt="image" src="https://github.com/user-attachments/assets/b6e90fa3-85eb-4d72-b616-28aff9a938e8" />| --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#252991
This update corrects a map data issue that was preventing the display of Russia on the Asia map. It also adds a new Oceania map, ensuring more complete geographical representation within the Odoo spreadsheet functionality. This enhances the accuracy and usability of maps displayed in the spreadsheet.
Original PR description
- Fix Asia map (russia was missing) - Added Oceania map Task-5224009 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#248847
This update resolves an issue where project sharing visibility was incorrectly changing after sharing with portal users. The change ensures that projects shared with 'Invited internal users and portal users' retain their intended visibility settings, preventing unintended changes to user access. This improves the reliability of project sharing workflows.
Original PR description
Steps to reproduce: - Create/open any project - Set visibility to `Invited internal users and portal users`. - Share project with a portal user - Visibility changes to `All internal users and invited portal users`. Cause: - Previously, this behavior was implemented specifically for sharing the project from the cog menu. However, the `Share Project` option has now been removed from the cog menu. - After introducing the new `invited_users` visibility option, the existing share logic was not updated to support this new value; as a result, the project's existing visibility is unintentionally overwritten. Solution: - Remove the hardcoded update of `privacy_visibility` in the `action_send_mail` method. task-5924243 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248235
A recent update caused a technical error in the composer when users tried to select mentions (@). This was due to a change in how the system identifies mentions, specifically a renaming of an attribute. This fix ensures the composer functions correctly when selecting mentions, improving the user experience.
Original PR description
Problem: Opening the composer, typing "@" and selecting any item causes a traceback. Cause: After 8c99b17fcc3a612fd897da9ee29e2f53254d5933, the attribute `channel` was renamed to `thread`. Some code still referenced the old `channel` attribute, leading to errors when selecting mentions. Steps to reproduce: - Open the composer. - Type "@" to trigger mentions. - Select any item from the suggestions. - Observe a traceback. opw-6030307 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#254127
This update resolves a problem where users without live chat access were encountering errors when trying to open the live chat invite panel. The fix ensures that active live chat partners are correctly retrieved for invited users, improving the overall live chat experience. This prevents frustration and ensures all users can easily initiate live chat conversations.
Original PR description
When opening the livechat invite panel, users without livechat access rights encounter an access error. This commit fixes the issue by ensuring active live chat partners can be retrieved for invited users. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#254928 Forward-Port-Of: odoo/odoo#254565
This update resolves an issue preventing users from adding a partner's bank account to the 'Recipient Bank' field when creating a credit note. Previously, this field only showed company accounts, blocking credit note processing. Now, the field correctly prefilters bank accounts based on the expected recipient, enabling proper credit note creation.
Original PR description
Description of the issue this commit addresses: The Recipient Bank field in the Other Info tab of the Account Move form view refilters accounts to only show you company's ones. This is expected for invoices but is blocking when doing a credit note. You can't find a partner's bank account to fill that field. --- Steps to reproduce: 1. Install account. 2. Create an Invoice to a partner which has a bank account setup. 3. Create a Credit Note for that Invoice. 4. In the "Other Info" tab, remove the partner's bank account. 5. Try to search for his bank account to add it back. It won't show up. --- Desired behavior after this commit is merged: The Recipient Bank field prefilters bank accounts based on who is expected to be the recipient of the move. --- task-5976951 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#254850 Forward-Port-Of: odoo/odoo#252961
This update fixes issues with the XML invoices generated for Spanish VAT (EDI) reporting. Specifically, it now correctly calculates and formats tax outputs per tax type instead of per line item, and enables rounding for tax data aggregation. This ensures accurate VAT reporting and compliance.
Original PR description
- Adjusting invoice-level `<TaxesOutputs>` nodes to be generated per tax rather than per line - Enabling rounding for invoice-level tax data aggregation - Adding a second rounding test derived from bug ticket task-6009108 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#253305
This update corrects a problem where invoices using fixed taxes for 'consigne/vidange' were failing Peppol validation. The fix adjusts how tax exemptions are handled during invoice generation, ensuring compliance with Peppol standards and allowing these invoices to be successfully processed.
Original PR description
**PROBLEM** Here is the client use case: The client uses fixed tax to do 'vidange/consignage'. When selling a product with a 'consigne/vidange', they add a fixed tax which amount correspond to the…
**PROBLEM** Here is the client use case: The client uses fixed tax to do 'vidange/consignage'. When selling a product with a 'consigne/vidange', they add a fixed tax which amount correspond to the 'consigne/vidange'. When returning the 'consigne', you would create an invoice line, with a product with a price of 0, negative quantity,a 0% tax and the fixed tax for the 'consigne'. When an invoice contains such lines, it fails peppol validations. **STEP TO REPRODUCE** 1. Create a fixed tax used for 'vidange/consigne'. 2. Create an invoice, with a line with unit price of 0, negative quantity, a 0% tax and the fixed tax for the 'consigne'. 3. Send the invoice using peppol, use a validator to validate the xml and notice you get the following errors: [BR-E-01] [BR-E-08]. **CAUSE** Fixed tax (like the one used for vidange) are aggregated in new invoice lines by the function `_ubl_turn_emptying_taxes_as_new_base_lines()`. Let say we have the following invoice: line 1: qty=2, unit_price=3, taxes: 21% & vidange(fixed tax of 1). line 2: qty=-1, unit_price=0, taxes: 0% & vidange. After calling `_ubl_turn_emptying_taxes_as_new_base_lines()`, we got: line 1: qty=2, unit_price=3, taxes: 21%. line 2: qty=-1, unit_price=0, taxes: 0%. line 3: qty=1, unit_price=1(amount of the fixed tax), taxes:None. When generating the VAT breakdown, we have 2 line will end up being tax exempted (line 2 and 3). Because the `tax_exemption_reason` differs, they will not be merged in the same entry in the breakdown, which break the constraint of peppol saying we can only have one VAT breakdown with code 'Exempt from tax'. Line 2 reason comes from: https://github.com/odoo-dev/odoo/blob/de22093ee225df499b2de80e1f07dd281ac686bc/addons/account_edi_ubl_cii/models/account_edi_common.py#L271-L274 opw-5912986 Forward-Port-Of: odoo/odoo#254875 Forward-Port-Of: odoo/odoo#250413
This update resolves an issue where tours on the website were experiencing delays loading translations, particularly with recent Chrome versions. The change introduces a temporary step to ensure translations start loading promptly, preventing tours from stalling and improving the user experience.
Original PR description
This commit adds an intermediary step ensuring the proper page has been reached before actually doing the checks and avoiding to let startup requests (like the loading of the translations) pending at the end of the tour (and the eventual stop of the runner browser). Note: this is most likely due to a timing (indeterministic by nature) change, emphasised by recent Chrome versions (like v145). runbot-239128 Forward-Port-Of: odoo/odoo#254745 Forward-Port-Of: odoo/odoo#253896
This update fixes a bug where customers could unintentionally modify global discount lines within optional sections of sales orders. The change prevents customers from editing these discount lines, ensuring accurate order pricing and preventing potential revenue discrepancies. This improves order accuracy and reduces the risk of errors.
Original PR description
Issue: --- Due to this issue global discount line can be edited by customer. #### Steps to reproduce: 1- Create a SO with SOLs and add a optional section. 2- Add a global discount under optional section. 3- Preview the SO. The quantity of discount can be edited. Cause and Fix: --- In `_can_be_edited_on_portal` we are not excluding the global discount line from being editable. We could fix that by excluding line with company discount product from being editable. opw-6045297 Forward-Port-Of: odoo/odoo#254870
This update resolves a problem where pasting content into the HTML composer in Discuss would retain unwanted formatting and styles. The update intercepts the paste event to remove formatting tags, ensuring a cleaner and more consistent experience for users when creating HTML content. This improves the usability of the HTML composer.
Original PR description
When pasting content into the HTML editor composer, we want to ensure that no formatting is retained from the source in Discuss. This is achieved by intercepting the paste event in the clipboard plugin and removing the style and remove tags that we do not want to allow in the HTML editor composer in Discuss. This prevents any unwanted styles or HTML elements from being introduced into the composer in Discuss. task-5364799 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#238136
This update corrects a visual issue where menu items on the website didn't align properly when using mobile view or hamburger menus. The fix adjusts how menu labels are styled, ensuring they align to the right or center based on the user's chosen setting. This improves the overall website appearance and user experience.
Original PR description
Steps to reproduce: =================== 1- Enter the website editor 2- Enable mobile view 3- Edit the alignment of the mobile menu to be center or right aligned The group labels (e.g. "Shop",…
Steps to reproduce: =================== 1- Enter the website editor 2- Enable mobile view 3- Edit the alignment of the mobile menu to be center or right aligned The group labels (e.g. "Shop", "Forum") stay left-aligned regardless of the chosen alignment. This can also be seen on desktop by switching to the sidebar header template. Cause: ====== The class .accordion-button uses `display:flex` and `text-align:left` and that class is used for the menu groups labels. this prevents the alignment from working. Solution: ========= When right-aligned (`text-end`), reverse the flex direction so the arrow moves to the left and the text stays on the right. When centered (`text-center`), let the text span fill the remaining space and center its content via `text-align: center`, keeping the arrow on its position. The default left-aligned case is unchanged. opw-5494765 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244565
This update resolves an issue where the selection within the HTML editor would reset to the beginning after using the command palette. The change creates an override to refocus the editable area upon closing the command palette, ensuring the user's current selection is preserved. This improves the editor's usability and workflow.
Original PR description
Before this commit: when the whole editable regains the focus, the selection in the editable is reset to the start of it. After this commit: We create a override for hotkey service to open the command palette with an onClose to refocus the editable area without losing the current selection. For the hotkey override, we pass the area option so it's only valid in the editable area. Outside the editable, the command palette is opened in the default way. task-5949705 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#254623 Forward-Port-Of: odoo/odoo#250624
This update ensures payment methods created within a company branch can be consistently used across all company branches, resolving a previous validation error. The fix adds a necessary constraint to the payment method model, aligning with existing company checks and preventing inconsistencies in the point-of-sale system. This improves data integrity and user experience.
Original PR description
Steps to reproduce: ------------------- * Let's say you're on company A, create a pos payment method * Don't assign a pos yet * Create a branch company sub_A * Switch to that branch company * Create…
Steps to reproduce: ------------------- * Let's say you're on company A, create a pos payment method * Don't assign a pos yet * Create a branch company sub_A * Switch to that branch company * Create a pos * Now switch to company A but also select sub_A * In the config of the pos from sub_A, try to add the new payment method and save > Validation error -> Normal * Now instead go to the payment method form * In the point of sales select the pos sub_A * Save > No error * Try opening the pos sub_A > Validation error, same as the first one -> Normal Why the fix: ------------ We already have a contraint on the pos config model checking that the companies match. https://github.com/odoo/odoo/blob/88df50bc96448dfaff28bd37e970ffd18bf8d554/addons/point_of_sale/models/pos_config.py#L469-L473 However when writing on the model pos payment there is no constraint and the ORM currently does not trigger constraints on comodel of the field we're modifying so we need to add this constraint on the pos payment method model as well opw-6000206 Forward-Port-Of: odoo/odoo#253858
This update resolves an issue where cross-origin requests with the Range header would fail due to preflight checks. The change adds the necessary header to allow these requests to succeed, improving compatibility with external systems. While future customization is considered, this fix addresses a specific, previously undetected problem.
Original PR description
Previously, specifying the Range header in a CORS request would result in a preflight failure even if cors was enabled on the route. It is sometimes desirable to allow querying ranges even in a CORS context. It may be desirable at some point in the future to allow controllers to customize their preflight responses more thoroughly, but considering this hasn't really be an issue before, it seems premature. Instead, this commit just adds the Range header to the Allow-Control-Allow-Headers response header to allow such requests to succeed. Forward-Port-Of: odoo/odoo#254805
A recent test related to archiving products in Point of Sale was failing intermittently. This update ensures all test sessions are properly closed before running the test, resolving the issue where products weren't being archived correctly. This improves the reliability of our testing process.
Original PR description
After this commit https://github.com/odoo/odoo/pull/252211/changes/3344bd72b9c5591b466aeca7f9da218da53dee3b the test test_archived_product_removed_and_order_is_refunded was sometimes broken because some session were still opened and the product could not be archived. This commit ensures that all sessions are closed before lauching the test. runbot-error: 241842 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#253296
This update corrects a formatting issue in Odoo's Danish tax XML files (l10n_dk) related to the 'nemhandel' identifier. The 'DK' prefix was missing, which is now added to ensure compliance with Danish tax regulations. This ensures accurate data transmission for VAT reporting.
Original PR description
In this commit af94099c4d74e9c48251a1c1656e3ad11b9f8a70, we made a fix regarding OIOUBL21 XML files, but we forgot to add the 'DK' prefix for CVR nemhandel identifier. The format should be 'DK' + nemhandel_identifier_value. no-task Forward-Port-Of: odoo/odoo#254430
This fix ensures that product order lines in the Point of Sale (POS) system accurately reflect all assigned attributes, regardless of whether the product is selected or scanned. Previously, the system displayed inconsistent information, leading to inaccurate order details. This update corrects this behavior, improving the reliability of POS transactions.
Original PR description
Currently, when a product has more attribute values then variant values (some attribue can have only one option), the pos behaves differently depending if you select the product or scan it. Steps to reproduce: ------------------- * Modify the acoustic bloc screen "Attributes & Variants" tab * Have one attribute line Color, only White as values * Have one attribute line Size, S and M as values * Go to the variants, select the one corresponding to the Size S > Observe it also has the attribute White * Set a barcode on this variant * Open shop * Select Acoustic Bloc Screens, select Size S, confirm * Now scan the barcode > Observation: 2 Different pos order lines on the order, the first shows S, White as attributes, the second one only shows S. Why the fix: ------------ We need to use all attribute values, not only the variant values. opw-5932560 Forward-Port-Of: odoo/odoo#252233
This update corrects a display issue where half-day leave periods (e.g., 3.5 days) were not accurately shown in the calendar view. The system now correctly calculates and displays half-day leave durations, ensuring a more precise representation of employee time off.
Original PR description
-When the leave includes a half day (for example, 4.5 or 3.5 days), the half-day portion is not displayed on the dashboard. --Rendering logic has been adjusted to count for half-days. Forward-Port-Of: odoo/odoo#250342
This update corrects a bug where live chat channel names were duplicated when a user was both the visitor and the agent (self-chat). The fix ensures the visitor user is handled correctly, preventing incorrect channel naming. This improves the consistency and accuracy of live chat interactions.
Original PR description
Since PR #212150 when getting the livechat channel values, the `visitor_user` value is set to the current visitor user even when the visitor user is the same as the agent (self chat). The code is guarded in the next step and so this visitor is not added to the channel members but the already set value affects the livechat channel name. The bug becomes visible when the `displayName` computation is changed later by the PR #227240. This change ensures that the visitor user remains falsy throughout the process when the visitor and agent are the same. task-6015652 Forward-Port-Of: odoo/odoo#255093
This update ensures that e-invoices generated using the l10n_vn_edi_viettel module include complete seller address information, specifically street2, city, zip, state, and country. This change is necessary to meet Viettel EDI requirements and avoid potential invoice rejection issues.
Original PR description
The seller address on e-invoices was missing some fields. This commit updates the logic to include street2, city, zip, state, and country when generating the seller address, ensuring full address details are provided in compliance with Viettel EDI requirements. task-6040875 Forward-Port-Of: odoo/odoo#254564
This update fixes an issue where the VAT Return (CZ) report was incorrectly displaying negative amounts when using VAT 24 or VAT 23 tax grids on invoices with credit amounts. The change ensures the report accurately reflects VAT amounts, improving the reliability of Czech Republic tax reporting within Odoo.
Original PR description
With l10n_cz company: 1. Create some invoices using the VAT 24 or VAT 23 tax grid on an invoice line containing an amount in credit. 2. Go to the VAT Return (CZ) report 3. The amount shown will be negative instead of positive, which goes against what the report should show. Missed by 17a6117ed88c29b5bc4db0c872bcdbc109a7d98b opw-5978183 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#252243
A recent test used to fail unexpectedly due to an error in how it accessed image URLs. This update adds a safety check to the template, ensuring it handles cases where the related information isn't immediately available. This resolves a previous bug and improves the stability of the meeting tour functionality.
Original PR description
Before this commit, test `test_04_meeting_view_tour` could crash non-deterministically with the following error:
```
OwlError: An error occured in the owl lifecycle (see this Error's "cause" property)
Caused by: TypeError: Cannot read properties of undefined (reading 'avatarUrl')
at DiscussSidebarCallParticipants.template
```
This happens because the template was reading a deep field in a JS relation without guard in `rtc_session.channel_member_id.avatarUrl`.
When a rtc_session is known in client code, the `channel_member_id` is not necessarily known, therefore code should guard it unless context is explicit that this is known.
This commit adds optional guarding in the template to take into account possibility to know rtc session without the related channel member id.
Fixes runbot-error-242142
Backport of https://github.com/odoo/odoo/pull/233232
Forward-Port-Of: odoo/odoo#255265This update resolves issues with overtime calculations related to timezone differences, specifically impacting how attendances are processed in UTC+ timezones. The fix ensures accurate overtime intervals are generated and prevents crashes or stale overtime records, improving the reliability of employee time tracking.
Original PR description
Steps to reproduce (singleton crash): Create an employee in a UTC+ timezone (e.g. Asia/Shanghai or Australia/Adelaide) with an overtime ruleset containing a paid rule. Generate work entries for a…
Steps to reproduce (singleton crash): Create an employee in a UTC+ timezone (e.g. Asia/Shanghai or Australia/Adelaide) with an overtime ruleset containing a paid rule. Generate work entries for a period, then create two consecutive midnight-to-midnight attendances in the employee's local timezone. Creating the second attendance crashes with: "ValueError: Expected singleton: hr.attendance.overtime.line(...)". Steps to reproduce (stale overtime lines): With the same setup, delete the attendance after it generated overtime lines. The overtime lines remain in the database instead of being removed. The singleton crash occurred because `end_of_day` in `_get_overtime_intervals` was computed as a naive datetime, implicitly treated as UTC. For UTC+ timezones, the actual local end of day is earlier than UTC midnight. As a result, overtime intervals were computed with a stop time extending past the real local midnight into UTC time. When consecutive attendances were processed together, these extended intervals overlapped. The `Intervals` class (`keep_distinct=True`) merges overlapping intervals into a single entry with a multi-record recordset as payload. The subsequent `overtime.rule_ids.work_entry_type_id` and `overtime.status` calls expected a singleton but received a multi-record set, causing the crash. The same multi-record issue also affected the iteration in `_set_real_overtime_intervals` and the overtime work entry loop in `_get_attendance_intervals`. The stale overtime lines issue occurred because `_get_overtimes_to_update_domain` built its search date range from raw UTC `.date()` values instead of the employee's local timezone. For UTC+ employees whose attendance spans local midnight, the overtime line is dated in the next local calendar day. Since the domain was derived from UTC dates, that next local day fell outside the search range, so the overtime line was never found and deleted when the attendance was removed. Additionally, `_get_localized_times` called `.astimezone()` on naive UTC datetimes without first localizing them, producing incorrect local times for the same reason. Solution: - In `_get_overtimes_to_update_domain`, localize check_in/check_out to the employee's timezone before computing the overtime search date range (with a ±1 day buffer) so overtime lines for dates that only exist in local time are correctly included in the delete-and-recreate cycle. - Fix `_get_localized_times` to call `utc.localize()` on naive UTC datetimes before converting to the employee's timezone. opw-5931665 Forward-Port-Of: odoo/odoo#251812
Previously, emails weren't automatically sent when a task was created using a template. This update ensures that emails are consistently sent, mirroring the behavior when a task is copied. This improves communication and notification workflows for project teams.
Original PR description
Steps to reproduce: - Open form view project that has task templates. - Add a partner to follow project when task is created. - From `New` button click on any available task templates . Issue: - Mail is not sent when task is created from template. Fix: - Now we are treating creating task from template same as we do copy. Solution: - Make sure we send a mail and stop the normal logging which happens when copying the task. Forward-Port-Of: odoo/odoo#250306
This update corrects a validation error that occurred when generating invoices in the Belgian accounting module (l10n_be) using Peppol. The fix addresses a rounding discrepancy that caused the invoice XML to fail validation, ensuring compliance with VAT regulations. It achieves this by correctly handling decimal rounding differences.
Original PR description
**Steps to reproduce:** - Install Accounting and l10n_be - Switch to a Belgian company (e.g. BE Company CoA) - In Accounting settings: * activate Peppol * set "Rounding Method" to "Round Globally" -…
**Steps to reproduce:**
- Install Accounting and l10n_be
- Switch to a Belgian company (e.g. BE Company CoA)
- In Accounting settings:
* activate Peppol
* set "Rounding Method" to "Round Globally"
- Create an invoice:
* Customer: [a Belgian customer with a VAT]
* Invoice Lines:
| Label | Quantity | Price | Taxes |
| ------- | ---------- | ------- | ------- |
| Line 1 | 1.0 | 90.30 | 0% |
| Line 2 | 0.45 | 2.54 | 6% |
| Line 3 | 0.28 | 6.87 | 6% |
- Confirm the invoice
- Send the invoice to Peppol
**Issue:**
The generated XML has a line with `<cbc:LineExtensionAmount>` set to 90.31, `<cbc:InvoicedQuantity>` set to 1.0 and `<cbc:PriceAmount>` set to 90.30, which fails the validation with the following error:
`[BR-E-08]-In a VAT breakdown (BG-23) where the VAT category code (BT-118) is "Exempt from VAT" the VAT category taxable amount (BT-116) shall equal the sum of Invoice line net amounts (BT-131) minus the sum of Document level allowance amounts (BT-92) plus the sum of Document level charge amounts (BT-99) where the VAT category codes (BT-151, BT-95, BT-102) are "Exempt from VAT".`
**Cause:**
The use of decimal number in quantity generates a 0.01 rounding difference in the base amounts.
The extra cent is dispatched in one of the `<cbc:LineExtensionAmount>` node.
**Solution:**
There is no easy solution to handle these rounding cases. The solution used in this fix is to handle the extra cents as if they are cash rounding amount and declare them in `<cbc:PayableRoundingAmount>` node.
opw-5933545
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#255095
Forward-Port-Of: odoo/odoo#253625This update optimizes a key stock query that previously performed very slowly due to complex string comparisons. The change replaces these comparisons with a more efficient method of checking location ancestry using integer IDs, dramatically reducing query execution times, especially when dealing with large lists of locations. This improves overall system responsiveness and stability.
Original PR description
### Description of the issue/feature this PR addresses: Some stock queries determine whether a location belongs to the subtree of a set of locations by checking the parent_path prefix against…
### Description of the issue/feature this PR addresses:
Some stock queries determine whether a location belongs to the subtree of a set of locations by checking the parent_path prefix against candidate parent locations. This is done using a correlated EXISTS subquery with a LIKE parent.parent_path || '%' condition.
When the list of candidate locations becomes large (for example tens or hundreds of thousands of ids), this approach causes extremely poor performance because the database must repeatedly compare hierarchical path strings for every candidate row.
This PR improves the performance of this ancestry check by replacing the string prefix comparison with a direct check on the ancestor ids contained in parent_path.
### Current behavior before PR:
The query determines whether a location belongs to the subtree of one of the provided locations using:
location.parent_path LIKE parent.parent_path || '%'
For each row, PostgreSQL must evaluate a correlated subquery against all candidate parent locations. Because this relies on string prefix comparisons on parent_path, when the location list is large, this results in extremely slow queries.
### Desired behavior after PR is merged:
Instead of performing string prefix comparisons, the query extracts the ancestor ids directly from parent_path.
The path is:
1. Trimmed to remove leading and trailing /
2. Split into an array of ancestor ids
3. Expanded using unnest
4. Checked for intersection with the provided location ids
This converts the ancestry check from repeated string comparisons into a simple integer membership check.
### Benchmarks
Comparing performance of old subquery:
```
SELECT stock_location_inner.id
FROM stock_location AS stock_location_inner
WHERE EXISTS (
SELECT 1
FROM stock_location parent
WHERE parent.id IN (long list)
AND stock_location_inner.parent_path LIKE parent.parent_path || '%%'
);
```
to new one:
```
SELECT stock_location_inner.id
FROM stock_location AS stock_location_inner
WHERE EXISTS (
SELECT 1
FROM unnest(
string_to_array(trim(both '/' FROM stock_location_inner.parent_path), '/')::int[]
) AS path_id(id)
WHERE path_id.id IN (long list)
);
```
Depending on the number of elements in 'long list'
| # of elements | Before | After |
| --- |---|---|
| 130,000 | 21min | 0.8sec |
| 10,000 | 95sec | 0.5sec |
| 1,000 | 10.5sec | 0.5sec |
In practice, on the reference ticket this causes the "Validate" button on a stock picking to go from timing out to taking 8 seconds.
### Reference
opw-5932436
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#254245This update resolves a problem where invoice lines were not appearing correctly when certain tax modules (l10n_in and l10n_ar) were installed. The change ensures that invoice lines are created and managed through the correct Odoo data structure, preventing conflicting entries and ensuring accurate reporting.
Original PR description
Create the invoice line through the `invoice_line_ids` o2m write command instead of a standalone `account.move.line` create with move_id. The mock server's `inverse_fname_by_model_name` mapping only keeps one o2m per co-model; when extra modules add another o2m with the same inverse (`l10n_in_withholding_line_ids` from l10n_in, `l10n_ar_withholding_ids` from l10n_ar_withholding), it shadows `invoice_line_ids` and the list renders empty. runbot-233670 Forward-Port-Of: odoo/odoo#255188
Features or functions removed from Odoo
This update removes a lingering file that was unintentionally left behind after the l10n_it_xml_export module was removed in the previous release. This cleanup ensures a cleaner and more streamlined codebase, addressing a minor technical detail.
Original PR description
The module was removed in 19.0 by this commit: https://github.com/odoo/enterprise/commit/761e08667a9c8172217afe8b709445d8e12b3872 However a file was accidentally left behind This commit cleans up the remaining file Forward-Port-Of: odoo/enterprise#111461