Daily updates from Odoo
Navigate
Branch
Tuesday, February 24, 2026
289 changes
25 changes
Enhancements to existing features
This update enhances the accuracy of account reconciliation by validating the use of 'integer' and 'fraction' groups within regular expressions. Previously, inconsistencies in these groups could lead to incorrect amount formatting, particularly with formats like CODA files. Now, the system enforces that both groups are present when defined, providing clearer error messages to guide users.
Original PR description
When using a regular expression to extract amounts from a label, especially for formats without a decimal separator (like CODA files), the logic now supports and validates the use of named groups 'integer' and 'fraction'. This commit ensures that: - If 'integer' is defined, 'fraction' must also be present to correctly format the decimal value. - If 'fraction' is defined, 'integer' must be present. - Meaningful UserErrors are thrown to guide the user when one group is missing. Enterprise PR: odoo/enterprise#103630 Task [link](https://www.odoo.com/odoo/project.task/5449413) task-5449413 Forward-Port-Of: odoo/odoo#242750
Resolved issues and error corrections
This update ensures internal users accessing message links within slides are consistently directed to the backend form view, aligning with other portal documents. Previously, internal users were incorrectly redirected to the website page. This change maintains a unified user experience across all portal users.
Original PR description
Since #202555, a message link in slides redirects internal users to the website page if it's published. To ensure consistency with other documents in the portal, this commit redirects internal users to the backend form view of the slides. Portal and public users continue to be redirected to the published website page. Forward-Port-Of: odoo/odoo#249720
This update fixes a problem where the earliest contract start date for employees wasn't consistently tracked. Now, the system automatically updates this key field whenever a new contract is created or an existing contract's start date changes, guaranteeing accurate historical data for payroll and reporting.
Original PR description
Version-19.0 **Issue**: Field `first_contract_in_company` was only set by the archive wizard, which is too late. We need that information at other places too. ### What This PR Does This PR restores…
Version-19.0
**Issue**: Field `first_contract_in_company` was only set by the archive wizard, which is too late.
We need that information at other places too.
### What This PR Does
This PR restores the reliable computation of the employee's first contract date by:
- Computing the earliest contract start date across all versions of the employee.
- Automatically updating the `first_contract_in_company` field whenever:
1. A new contract is created
2. an existing version changes it start date, or
3. an existing version is deleted for the employee.
### Technical Summary
**Update the first contract date on create/write**
- when an hr.version is created or updated, it will recompute the employee's earliest
`contract_date_start` across all versions.
- The update is performed in `_compute_first_contract_in_company()`, which:
1. fetches all the active versions of employee
2. filter those having `contract_date_start`
3. Computes the earliest start date.
4. Updates `employee.first_contract_in_company` accordingly.
**Result**
The field `first_contract_in_company` is now always accurate and reflects real employee history.
Forward-Port-Of: odoo/enterprise#107971
Forward-Port-Of: odoo/enterprise#102198This update resolves an issue where consolidated invoices were incorrectly linking orders due to a bug in how the system processed POS orders. The fix ensures that all orders associated with a consolidated invoice are accurately reflected, improving invoice accuracy and reporting. This change was made to enhance the reliability of our invoicing process.
Original PR description
Step to Reproduce: * Install l10n_my_edi_pos and switch to that company * Configure two POS sessions (POS 1 and POS 2) * Create orders as follows: POS 1: * 2 uninvoiced orders * 1 invoiced order *…
Step to Reproduce: * Install l10n_my_edi_pos and switch to that company * Configure two POS sessions (POS 1 and POS 2) * Create orders as follows: POS 1: * 2 uninvoiced orders * 1 invoiced order * Close POS 1 POS 2: * 1 uninvoiced order * 1 invoiced order * Close POS 2 Reopen POS 1: * 1 uninvoiced order * Close POS 1 Reopen POS 2: * 1 uninvoiced order Close POS 2 * Go to Orders → Consolidated Invoice * Create a consolidated invoice using the correct date range Observation: * Two documents are created * No. of orders linked to each document are incorrect Cause: * `_split_pos_orders_in_lines` overwrites entries in the `lines_per_config` dictionary * Previous orders for the same config are lost Fix: * Extend the existing recordset in `lines_per_config` instead of overwriting it Before <img width="1230" height="231" alt="order consolidation bug" src="https://github.com/user-attachments/assets/26657f34-998e-41c4-a68a-0939cbe6de1d" /> After <img width="1265" height="206" alt="consolidated order fixed" src="https://github.com/user-attachments/assets/7c703416-ac3b-412e-bb28-0d6f73fa25f2" /> opw-5904420 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248402
This update fixes an issue where work entries created from attendance archives were incorrectly including existing entries on the same day, leading to inaccurate work duration reporting. The change ensures that work entries accurately reflect the correct duration for each date, resolving a potential discrepancy in time tracking.
Original PR description
Current behavior: work entries created from attendance archive "included" existing work entries on the same day, even when they do not overlap in time frame. This happens because the attendance intervals are created from records in self, not all attendances on a given day Expected behavior: work entries should reflect the correct duration for a date. opw-5499002 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/enterprise#107704
This update fixes a problem that occurred after installing the l10n_lu_hr_payroll module. The 'Payroll: Update data' cron job was failing due to a missing file. The issue was resolved by removing the outdated file reference, ensuring the cron job now runs correctly.
Original PR description
When the ``Payroll: Update data`` cron is executed after installing the ``l10n_lu_hr_payroll`` module, a traceback is raised. Steps to reproduce the error: - Install ``l10n_lu_hr_payroll`` module - Run the ``Payroll: Update data`` cron Traceback: ```py FileNotFoundError: [Errno 2] No such file or directory: '/home/odoo/src/enterprise/saas-19.1/l10n_lu_hr_payroll/data/hr_payslip_input_type_data.xml' ``` In commit [1], ``hr_payslip_input_type_data.xml`` file was removed. However, it is still being referenced in the code below here. https://github.com/odoo/enterprise/blob/4174108cb98a9fd84a012ff9dca81ae322c5f338/l10n_lu_hr_payroll/models/hr_payslip.py#L209 As a result, when the ``Payroll: Update data`` cron runs, the system attempts to update a file that no longer exists, causing a FileNotFoundError. [1]: https://github.com/odoo/enterprise/commit/0fecd57652c8c72a4fb91d44bd0c5d75f621541a sentry-7278209115 Forward-Port-Of: odoo/enterprise#108068
This update simplifies the process of adding the 💯 emoji to Odoo messages by introducing a new, more commonly used shortcode (:100:). Additionally, the emoji picker's empty state message has been updated for clarity. These changes improve the user experience and make it easier to express reactions within Odoo.
Original PR description
Purpose of this PR: Before this PR, the 💯 emoji could only be found using the`:hundred_points:` shortcode, which is less commonly used. This PR adds the `:100:` shortcode to improve discoverability. Additionally, the empty-state helper text in the emoji picker is adjusted from `"No emoji matches your search"` to `"No emojis match your search"` for better wording. task-5873748 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#250145 Forward-Port-Of: odoo/odoo#248654
This update corrects a problem in the payment dashboard query that was causing errors and slowing down performance. The change ensures the query behaves consistently with previous versions by disabling record rules, which reduces unnecessary joins and avoids ambiguous column errors. This improves the dashboard's speed and reliability.
Original PR description
In v19 `_where_calc` was merged[^1] into `_search`, where `bypass_access=True` replicates the previous behavior. The dashboard query for payments to check was executed with the default…
In v19 `_where_calc` was merged[^1] into `_search`, where `bypass_access=True` replicates the previous behavior.
The dashboard query for payments to check was executed with the default `bypass_access=False`, causing record rules to be applied. This introduced extra joins (e.g. on `res_company`) and resulted in ambiguous column errors during aggregation.
```py
File "/home/odoo/src/odoo/19.0/addons/account/models/account_journal_dashboard.py", line 414, in _get_journal_dashboard_data_batched
self._fill_sale_purchase_dashboard_data(dashboard_data)
File "/home/odoo/src/odoo/19.0/addons/account/models/account_journal_dashboard.py", line 600, in _fill_sale_purchase_dashboard_data
self.env.cr.execute(sql)
File "/home/odoo/src/odoo/19.0/odoo/tests/test_cursor.py", line 79, in execute
return self._cursor.execute(*args, **kwargs)
File "/home/odoo/src/odoo/19.0/odoo/sql_db.py", line 433, in execute
self._obj.execute(query, params)
psycopg2.errors.AmbiguousColumn: column reference "currency_id" is ambiguous
LINE 1: SELECT journal_id, company_id, currency_id AS currency, invo...
^
```
Set `bypass_access=True` to match the original `_where_calc` behavior and avoid unnecessary joins.
opw-5951694
upg-3902613
[^1]: https://github.com/odoo/odoo/commit/6f95152b00df75f503f445e3b77b891b5f83c055
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#250003This update fixes an issue where non-sale enabled products were incorrectly appearing in sales orders. The change ensures that only products designated for sale are selectable, preventing errors and improving order accuracy. This resolves a potential data inconsistency.
Original PR description
Steps to produce: --- - Install `sale_renting` and `sale_management` modules. - Go to `Sales > Products > Products`. - Create a product and disable the Sales option (`sale_ok = False`). - Create a…
Steps to produce:
---
- Install `sale_renting` and `sale_management` modules.
- Go to `Sales > Products > Products`.
- Create a product and disable the Sales option (`sale_ok = False`).
- Create a Sales Order and try to add that product.
Issue:
--
- Even though the product is not sale-enabled (`sale_ok = False`), it is still selectable in the Sales Order.
Root cause:
---
- At [1], The issue occurs because `super_domain` was not always included.
- When `order_is_rental` is True, `super_domain + []` happens,
so only `super_domain` is applied.
- But when `order_is_rental` is False, instead of
`super_domain + [('rent_periodicity', '=', False)]`, only
`[('rent_periodicity', '=', False)]` was returned, and
`super_domain` was ignored.
- Because of this, base conditions from `super_domain` like
`sale_ok = True` were not applied.
Solution:
---
- Add parentheses around the conditional expression to ensure proper evaluation order and correct domain construction, so only products with `sale_ok = True` are selectable.
[1] https://github.com/odoo/enterprise/blob/abfde5f253c4c52d3a734ca8dafe6f8ed261cf75/sale_renting/models/sale_order_line.py#L49
opw-5902403
---
Forward-Port-Of: odoo/enterprise#107639This update fixes an issue where Odoo would crash during invoice imports, leading to duplicate invoices being created. The fix ensures that invoices are properly acknowledged even if an import error occurs, preventing this duplication. This improves data integrity and reduces the risk of errors.
Original PR description
When importing invoices, if an error occurs in `_peppol_import_invoice`, Odoo crashes before acknowledging the already created bills. But, since `rollbackable_transaction` is used in `_extend_with_attachments`, the invoice is already committed. Since the acknowledgement is not sent while the invoice is committed, the next `_peppol_get_new_documents` attempt duplicates the invoice. opw-5937044 Forward-Port-Of: odoo/odoo#249842 Forward-Port-Of: odoo/odoo#249521
This update enhances how Odoo extracts amounts from bank statements (like CODA files). It now supports decimal amounts identified through regular expressions, specifically designed for statements that don't use decimal points. This allows for more accurate reconciliation of financial data from various bank statement formats.
Original PR description
Update the reconciliation logic of reco models to support regex patterns using named capture groups 'integer' and 'fraction'. This is specifically designed for cases where bank statement labels (like CODA files) provide amounts in cents i.e continuous string of digits without a decimal separator. The logic now: - Prioritizes 'integer' and 'fraction' named groups if present in the match. - Concatenates these groups with a decimal point to form a valid float. - Falls back to the standard digit extraction logic if named groups are not found. So now if user wants the amount to be extracted in decimal values from label then user needs to add regex which supports two groups 'integer' and 'fraction'. Community PR: odoo/odoo#242750 Task [link](https://www.odoo.com/odoo/project.task/5449413) Task-5449413 Forward-Port-Of: odoo/enterprise#103630
This update fixes a bug where deactivated withholding taxes were still being calculated in payments. The fix ensures that the system no longer includes inactive tax rates, resulting in accurate payment totals. This improves financial reporting and reduces the risk of errors.
Original PR description
# How to reproduce - Install the l10n_ar_withholding module - Pick a Vendor and add a Purchase Withholding tax in the accounting tab - Go into configuration and disable that tax - Create a Vendor Bill with that Vendor - Confirm the bill and create a payment # The problem The deactivated tax is still computed in the payment # Why The function that fetches the withholding taxes does not check if the taxes are active or not # The fix I though of 2 solution : - Add an override to remove the taxes from the Vendor when they are deactivated - Add a filter to the fetch function to check if the taxes are active I chose the 2nd solution as it is the least invasive one. opw-5917257 Forward-Port-Of: odoo/odoo#247831
This update resolves an issue preventing the correct display of an employee's SSN when generating CFDI reports in the payroll module. The fix updates a template reference to directly access the SSN from the employee record, ensuring accurate reporting. This improves the functionality of a key payroll reporting feature.
Original PR description
Steps to reproduce the issue: 1. Install the module `l10n_mx_hr_payroll_account_edi`. 2. Generate a payslip for an employee. 3. The following traceback is raised at the moment to click on "Generate…
Steps to reproduce the issue:
1. Install the module `l10n_mx_hr_payroll_account_edi`.
2. Generate a payslip for an employee.
3. The following traceback is raised at the moment to click on "Generate CFDI" button:
```py
File "/data/build/odoo/odoo/addons/base/models/ir_qweb.py", line 858, in _render_iterall raise
QWebError(qweb_error_info) from error odoo.addons.base.models.ir_qweb.QWebError: Error while rendering the
template: KeyError: 'l10n_mx_ssn' Template: l10n_mx_hr_payroll_account_edi.report_payslip_mx_cfdi Reference:
8166 Path: /t/t/div/t[2]/div[4]/table[2]/tbody/tr/td/div[5]/span[1]
Element: <span class="ms-1" t-field="o.version_id.l10n_mx_ssn"/>
```
---
To avoid moving the `l10n_mx_ssn` field from the `hr.employee` model to `hr.version`, the `t-field` in the template is updated to `o.employee_id.l10n_mx_ssn`.
This approach is valid because an employee's SSN rarely changes. If a modification is ever needed, it can be updated directly on the employee form, where the field is already tracked.
target: saas-19.2
task-5962423This update significantly speeds up the salary simulation process within the HR system. By adding an index and avoiding unnecessary image calculations, the simulation now completes much faster – nearly five times quicker. This improves user experience and efficiency when configuring employee salaries.
Original PR description
Description ----------- Add missing index on `hr.expense.employee_id` as it's used in a few places as a transitive dependency. Avoid computing images for new employee versions during simulation, as it's loading external dependencies, incurring a performance cost. Benchmark --------- On a staging database, opening the salary configurator and clicking on 'Simulation' when selecting a new car took: | Timings for | Before | After | Speed up | |--------------------|--------|--------|----------| | `onchange_benefit` | ~750ms | ~160ms | 4.6x | | `update_salary` | 2.3s | 1.1s | 1.9x | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249160 Forward-Port-Of: odoo/odoo#241901
This update streamlines the process of generating salary simulations by introducing a standardized context manager. This ensures consistent setup and teardown of necessary operations, reducing potential errors and improving the reliability of the simulation results. It also enforces the correct configuration for these critical calculations.
Original PR description
Description ----------- Getting an `hr.version` from an `offer` during simulation is done in a savepoint, preceded and followed with flushing of the environment and some post-cleanup. This is verbose…
Description ----------- Getting an `hr.version` from an `offer` during simulation is done in a savepoint, preceded and followed with flushing of the environment and some post-cleanup. This is verbose and error-prone, as it's done at each call site of `hr.contract.salary.offer._get_version` and `hr.version._generate_salary_simulation_payslip` (or any other future method that may require such a savepoint). These methods have a comment that mentions *requiring* a savepoint to be called, but nothing is enforcing it, so a bug due to oversight is bound to happen. Context keys are also injected a bit everywhere like `salary_simulation` and `tracking_disable`, without much consistency, and adding to the visual clutter. This commit introduces a little context manager called `hr_version_context` that manages the creation of the savepoint, the setup and teardown necessary, and the setting of the keys in the context. It's accompanied by a decorator `@requires_hr_version_context` that will fail if the caller didn't use `hr_version_context` before invoking the marked method. This ensures: - Correct creation of the savepoint and its related pre-/post-operations - Apply context keys consistently - Ensure methods that require such setup *cannot* be called without it. Forward-Port-Of: odoo/enterprise#107743 Forward-Port-Of: odoo/enterprise#103187
This update ensures payslips display the employee's actual start date with the company, rather than the contract's start date. This correction addresses inconsistencies when employees change jobs internally, guaranteeing accurate historical pay information and preventing outdated dates from appearing on payslips.
Original PR description
In the paysplip definition, the current contract's start date is used. But if a person changes job or contract internally we don't want this value to change and we want it fixed to when the person joined the company. Notably, if a person worked at the same company in two well distinct periods, we want to consider the beginning of this period and not of the previous one(s). Here we create a new function, similar to _get_first_version_date() which returns the beginning of the contract tied to the first version of the period, instead of the beginning of the version itself, which might be before or after the actual date of the start of the contract. We call this function _get_first_contract_date(). Task: 5909637 Enterprise PR: https://github.com/odoo/enterprise/pull/106692 Forward-Port-Of: odoo/odoo#249347 Forward-Port-Of: odoo/odoo#248598
This update corrects a previous issue where payslips incorrectly used the current contract start date. Now, payslips display the employee's actual entry date with the company, ensuring accurate payroll calculations and historical records, especially for internal job changes. This change impacts payroll processing in Switzerland and the UAE.
Original PR description
In the payslip definition, the current contract's start date is used. But if a person changes job or contract internally we don't want this value to change and we want it fixed to when the person joined the company. Notably, if a person worked at the same company in two well distinct periods, we want to consider the beginning of this period and not of the previous one(s). Since Switzerland uses a custom report for the payslip, the same change is applied there. Task: 5909637 Community PR: https://github.com/odoo/odoo/pull/248598 Forward-Port-Of: odoo/enterprise#107854 Forward-Port-Of: odoo/enterprise#106692
This update resolves an issue where snippets were unintentionally nested within other snippets, causing unexpected behavior in the website builder. The change prevents snippets like 's_popup' and 's_table_of_content' from being dropped into other snippets, ensuring a more stable and predictable website design experience. This improves the consistency and reliability of the website builder interface.
Original PR description
This commit prevents the following snippets to be dropped inside other snippets like tabs, toc, and more: - s_popup - s_newsletter_subscribe_popup - s_newsletter_benefits_popup - s_tabs - s_table_of_content - s_faq_horizontal task-5439635 Forward-Port-Of: odoo/odoo#242035
This update resolves a crash in the Delivery Slip report when printed in languages other than English. The issue stemmed from the report using English labels for key fields. The fix now correctly targets technical fields, ensuring the report functions smoothly across all supported languages.
Original PR description
Steps to reproduce: 1. Switch the partner language to Spanish. 2. Print the Delivery Slip. 3. The report crashes due to translated XPath anchors. Cause: XPath targeted hardcoded English strings 'Tracking Number' and 'Total Weight'. Solution: Target technical fields o.carrier_tracking_ref and o.shipping_weight instead of text labels. opw-5493498 Forward-Port-Of: odoo/odoo#248679
This update resolves a testing issue that prevented users from validating invoices in the AR VAT module. By using 'sudo()' when writing XML fields, the system now bypasses permission restrictions, ensuring consistent and reliable testing. This improves the overall stability of the AR VAT functionality.
Original PR description
This pull request makes a minor update to the `_dummy_afip_validation` method in `account_move.py`, improving its reliability for testing environments. * Testing reliability: The method now uses `sudo()` when writing dummy AFIP fields, ensuring that the operation succeeds even if the current user lacks write permissions. Without this fix, if the user doesn't belong to group "base system", it won't be able to validate invoices in testing environment. <img width="1258" height="454" alt="image" src="https://github.com/user-attachments/assets/522bfd9d-33be-4bcd-a60b-ef4c09a8e0d6" /> Forward-Port-Of: odoo/enterprise#107937
This update resolves an issue where Odoo couldn't reliably print to older printers. By defaulting to 'IPP Everywhere' PPDs for compatible printers, the system now supports a wider range of printer models, ensuring consistent printing functionality. This change primarily affects printers discovered via DNS-SD.
Original PR description
When no `ppd` is available for the cups discovered printer, we now use the IPP Everywhere ppd. We only set it for dnssd printers as printer that only implement socket/lpd could be too old and not compatible with IPP Everywhere. Forward-Port-Of: odoo/odoo#247210
This update resolves an issue where the payroll sheet calculation would fail if there were warnings present. The change allows the payroll sheet to be generated even with warnings, ensuring accurate payroll processing. This improves the reliability of the HR payroll module.
Original PR description
Revert https://github.com/odoo/enterprise/pull/104137 Forward-Port-Of: odoo/enterprise#108340
This update ensures that invoices generated with the `l10n_it_edi` module correctly display the total amount in EUR, as required by Italian tax regulations. Previously, the total was incorrectly formatted in the invoice currency, leading to potential compliance issues. This change ensures accurate reporting for Italian businesses.
Original PR description
With an `l10n_it` company: - Create an invoice in a foreign currency and export the XML. In the XML, the field `ImportoTotaleDocumento` is expressed in the invoice currency, while `Divisa` is set to…
With an `l10n_it` company: - Create an invoice in a foreign currency and export the XML. In the XML, the field `ImportoTotaleDocumento` is expressed in the invoice currency, while `Divisa` is set to the company currency. `ImportoTotaleDocumento` must be expressed in EUR, as stated in the following document: https://www.agenziaentrate.gov.it/portale/documents/20143/0/10FAQ+pubblicate+il+19+luglio+2019+(aggiornate+il+1+luglio+2021).pdf/6e8acb34-b7c5-730e-6a39-79c0a296e02b > L'art. 21, comma 2, lettera l) del d.P.R. n. 633/72 specifica che > “aliquota, ammontare dell'imposta e dell'imponibile con arrotondamento al centesimo di euro”. > Conseguentemente, se la fattura è emessa da soggetti residenti o stabiliti il codice da inserire nel campo `<Divisa>` > deve essere obbligatoriamente “EUR”. > Article 21, paragraph 2, letter (l) of Presidential Decree No. 633/72 specifies that > “the tax rate, the amount of the tax, and the taxable amount must be stated with rounding to the euro cent.” > Consequently, if the invoice is issued by resident or established taxpayers, the code to be entered in the `<Divisa>` > field must mandatorily be “EUR”. As a result, we now use the **company currency amount** for the `ImportoTotaleDocumento` field (assuming the company currency is always EUR for `l10n_it`). Ticket [link](https://www.odoo.com/odoo/project.task/5913088) opw-5913088 Forward-Port-Of: odoo/odoo#249272 Forward-Port-Of: odoo/odoo#247537
This update resolves an issue where Odoo incorrectly defaulted to USD as the Stripe currency, causing potential blocking for European companies where EUR is the correct currency. The change switches to EUR as the default, ensuring accurate Stripe integration and preventing disruptions for EU users. This resolves previous support tickets opw-5393508, opw-5913327, and opw-5953025.
Original PR description
Right now, we need to guess the correct stripe currency for the stripe account depending on the country, we used the USD as an ultimate fallback But, the USD currency is easy to guess, where the EUR is way harder (it may not be the company currency). So, it is too error-prone to set the USD as the default fallback, and it can lead to EU companies being blocked as their stripe currency is the wrong one. We therefore switch it to EUR. opw-5393508 opw-5913327 opw-5953025 Forward-Port-Of: odoo/enterprise#108293
This update corrects a critical issue in the generation of Belgian UBL invoices by ensuring the required ‘schemeID’ is included. This ID, part of the ISO 6523 ICD list, is now correctly applied, ensuring compliance with regulatory standards for company registries. This fix improves the accuracy and reliability of invoice processing for Belgian businesses.
Original PR description
1) This commit adds the new generic methods to build an UBL file. The big objective is to remove the hierarchy of UBL later on and make BIS3 completely standalone. In this commit, BIS3 is not independent of UBL 2.1 & 2.0. 2) Missing schemeID for Belgium Company registry Since https://github.com/odoo/odoo/commit/d40652c17b43b6a9fd4d19ce84b943b2a51fad9c, in Belgium, we set by default the company registry. However the schemeID is missing and should be part of the ISO 6523 ICD list: https://docs.peppol.eu/poacc/billing/3.0/codelist/ICD/ 3) Fix PartyLegalEntity when the country is NL and there is no company registry/EAS/Endpoint That case was raising a traceback before this commit. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249093 Forward-Port-Of: odoo/odoo#246377
29 changes
New functionality added to Odoo
This update adds support for Toss Payments, a new payment provider, specifically for South Korea. It allows customers to pay via card, bank transfer, or a new mobile phone option, and enables webhook integration for seamless transactions. Tokenization and refunds are not yet implemented.
Original PR description
**Backport of #228564 to saas-19.1** This change integrates a new payment provider: Toss Payments. The provider only supports payments in South Korea. Payment methods of the provider: - card: credit/debit card + "easy pay" (Kakao Pay, Toss Pay, Naver Pay, etc.) - bank_transfer - [NEW] mobile_phone: payment via mobile service provider The module also enables provider webhook feature. The webhook registration is done manually by submitting URL registration on Toss Payments' merchant management webpage. Note: - Tokenization is not implemented in this commit. The provider has tokenization feature, but is limited to subscription related payment only due to the provider's policy. - Refund is not implemented in this commit. task-3505313
Enhancements to existing features
This update adds tests to ensure accurate calculation of wage types on payslips, considering variations in employee contracts and leave requests across multiple months. These tests verify the correct application of different monthly wage types, enhancing payroll accuracy and reliability. This improves the overall stability of the Swiss payroll module.
Original PR description
This commit adds tests to the `_compute_l10n_ch_swiss_wage_ids` function to verify **Wage Types** in payslips across multiple months and with different **Monthly Wage Types** defined in an employee’s contract, as well as multiple leave requests occurring in different months. task-5906677 Forward-Port-Of: odoo/enterprise#107802
Resolved issues and error corrections
This update resolves an issue where consolidated invoices were incorrectly listing orders. The fix ensures that all orders from POS sessions are accurately included when generating a consolidated invoice. This improves the reliability of financial reporting and simplifies invoice reconciliation.
Original PR description
Step to Reproduce: * Install l10n_my_edi_pos and switch to that company * Configure two POS sessions (POS 1 and POS 2) * Create orders as follows: POS 1: * 2 uninvoiced orders * 1 invoiced order *…
Step to Reproduce: * Install l10n_my_edi_pos and switch to that company * Configure two POS sessions (POS 1 and POS 2) * Create orders as follows: POS 1: * 2 uninvoiced orders * 1 invoiced order * Close POS 1 POS 2: * 1 uninvoiced order * 1 invoiced order * Close POS 2 Reopen POS 1: * 1 uninvoiced order * Close POS 1 Reopen POS 2: * 1 uninvoiced order Close POS 2 * Go to Orders → Consolidated Invoice * Create a consolidated invoice using the correct date range Observation: * Two documents are created * No. of orders linked to each document are incorrect Cause: * `_split_pos_orders_in_lines` overwrites entries in the `lines_per_config` dictionary * Previous orders for the same config are lost Fix: * Extend the existing recordset in `lines_per_config` instead of overwriting it Before <img width="1230" height="231" alt="order consolidation bug" src="https://github.com/user-attachments/assets/26657f34-998e-41c4-a68a-0939cbe6de1d" /> After <img width="1265" height="206" alt="consolidated order fixed" src="https://github.com/user-attachments/assets/7c703416-ac3b-412e-bb28-0d6f73fa25f2" /> opw-5904420 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248402
This update resolves a problem where products weren't loading correctly when switching between companies within the Point of Sale (POS) loyalty system. The fix prevents errors that occurred when trying to load products directly, ensuring all products are accessible regardless of the company setting. This improves the reliability of the POS loyalty functionality.
Original PR description
Step to reproduce - install `pos_loyalty` and have two companies - for this record: `loyalty.gift_card_product_50` set company_id = company1 - switch to company b and start pos Observation: - no products are loaded Cause: - `browse()` was used to load records `gift_card_product_50` and `ewallet_product_50` - when any of them is restricted on one company it fails to load whole model Fix: - Instead of directly loading them, we use `search()` to avoid `AccessError` so that rest of the products can be loaded. - Gift card is still not shown as expected opw-5449466 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244912
This update fixes a security vulnerability that allowed internal Odoo users to access invoice download links (JSON/XML files). The change now restricts access to these links to only authorized invoicing users, preventing unauthorized access to sensitive data. This ensures data privacy and compliance.
Original PR description
Steps to reproduce: 1. Create an Invoice 2. Send for EDI (should in error, easy way to do it in local turn off the internet) 3. Turn Debug mode 4. Click Download (A new window with URL with will be open) showing the JSON/XML 5. Change Marc Demo (or any user) being internal user without Invoicing rights 6. That user can access the JSON/XML with that particular URL After this commit- We make sure only Invoicing Users can download the JSON/Export task-5481114 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#243257
This update fixes an issue where work entries created from attendance archives were incorrectly including existing entries on the same day, leading to inaccurate work duration tracking. The change ensures that work entries accurately reflect the correct duration for each date, resolving a potential discrepancy in employee time records.
Original PR description
Current behavior: work entries created from attendance archive "included" existing work entries on the same day, even when they do not overlap in time frame. This happens because the attendance intervals are created from records in self, not all attendances on a given day Expected behavior: work entries should reflect the correct duration for a date. opw-5499002 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/enterprise#107704
This update resolves a crash in the Delivery Slip report when printed in Spanish. The issue stemmed from the report using English labels for key fields, leading to errors. The fix now correctly targets technical fields for accurate reporting in all supported languages.
Original PR description
Steps to reproduce: 1. Switch the partner language to Spanish. 2. Print the Delivery Slip. 3. The report crashes due to translated XPath anchors. Cause: XPath targeted hardcoded English strings 'Tracking Number' and 'Total Weight'. Solution: Target technical fields o.carrier_tracking_ref and o.shipping_weight instead of text labels. opw-5493498 Forward-Port-Of: odoo/odoo#248679
This update fixes an issue where changes to order quantities on the ticket screen weren't being saved. The fix ensures that modifying a loaded order, such as increasing the quantity of a product, accurately reflects the updated order details. This improves the accuracy of order processing and prevents discrepancies between the ticket and the actual order.
Original PR description
Currently, modifying a loaded order (e.g., changing product quantity) does not save the changes, and the old order without modifications is shown on the ticket screen. ### **Steps to Reproduce:** 1)…
Currently, modifying a loaded order (e.g., changing product quantity) does not save the changes, and the old order without modifications is shown on the ticket screen. ### **Steps to Reproduce:** 1) Install the POS Restaurant app with demo data. 2) Open a Restaurant Session. 3) Click on 'Register' to create a Direct Sale. 4) Add a product (e.g., Water with Qty 2) and a customer (e.g., 'Billy Fox'). 5) Click on 'Orders' from the navbar and load the recently created order. 6) Update the quantity of Water from 2 to 5 and click on 'Orders' again. ### **Error:** The quantity of Water is not updated, the order line still shows a quantity of 2. Ref video: https://drive.google.com/file/d/1XR5W5Klyyll3KujirKb3UuAELjMcA7yD/view ### **Root Cause:** Clicking on 'Orders' calls `syncAllOrders` (see [1]), which is responsible for updating the orders. However, `this.getPendingOrder()` returns null in this scenario, causing the orders array to be empty and the function to return early without syncing. ### **Fix:** Override `updateSelectedOrderline` in `OrderSummary`. This method is invoked whenever the Numpad modifies an orderline. By calling `addPendingOrder` within this method, we ensure that Numpad modifications are correctly registered. This allows `syncAllOrders` to properly sync the updated order with the server when navigating away. [1]- https://github.com/odoo/odoo/blob/7fd5f90fe8fce4de49ec10c683f92e7a3557981a/addons/point_of_sale/static/src/app/services/pos_store.js#L1485-L1512 opw-5405402 Forward-Port-Of: odoo/odoo#240366
This update corrects a problem in the payment dashboard query that was causing performance issues and errors. By aligning the query with previous behavior, the issue of unnecessary joins and ambiguous column errors has been resolved. This ensures the dashboard functions correctly and efficiently.
Original PR description
In v19 `_where_calc` was merged[^1] into `_search`, where `bypass_access=True` replicates the previous behavior. The dashboard query for payments to check was executed with the default…
In v19 `_where_calc` was merged[^1] into `_search`, where `bypass_access=True` replicates the previous behavior.
The dashboard query for payments to check was executed with the default `bypass_access=False`, causing record rules to be applied. This introduced extra joins (e.g. on `res_company`) and resulted in ambiguous column errors during aggregation.
```py
File "/home/odoo/src/odoo/19.0/addons/account/models/account_journal_dashboard.py", line 414, in _get_journal_dashboard_data_batched
self._fill_sale_purchase_dashboard_data(dashboard_data)
File "/home/odoo/src/odoo/19.0/addons/account/models/account_journal_dashboard.py", line 600, in _fill_sale_purchase_dashboard_data
self.env.cr.execute(sql)
File "/home/odoo/src/odoo/19.0/odoo/tests/test_cursor.py", line 79, in execute
return self._cursor.execute(*args, **kwargs)
File "/home/odoo/src/odoo/19.0/odoo/sql_db.py", line 433, in execute
self._obj.execute(query, params)
psycopg2.errors.AmbiguousColumn: column reference "currency_id" is ambiguous
LINE 1: SELECT journal_id, company_id, currency_id AS currency, invo...
^
```
Set `bypass_access=True` to match the original `_where_calc` behavior and avoid unnecessary joins.
opw-5951694
upg-3902613
[^1]: https://github.com/odoo/odoo/commit/6f95152b00df75f503f445e3b77b891b5f83c055
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#250003This update resolves an issue where users without access to a company's organization chart would encounter an error when trying to view employees in that company. The fix involves adding a necessary security check (sudo) to ensure proper access control across multiple companies within the organization chart. This ensures all users can view the correct organizational structure.
Original PR description
## Short functional explanation of the error When an employee A tries to access to the page of another employee B, if that employee has a manager belonging to a company to which employee A doesn't…
## Short functional explanation of the error When an employee A tries to access to the page of another employee B, if that employee has a manager belonging to a company to which employee A doesn't have access, the employee A will see an AccessError, even if employee A can have access to the page of employee B. ## Reproduction Steps 1. Create a second company to your database. Let's call these companies Company A and Company B. 2. Select Company A as your main company, but make sure Company B is also selected. 3. Create an Employee A. 4. Select Company B as tour main company; but make sure Company A is also selected. 5. Create an Employee B who has A as manager. 6. Create Employee C who has B as manager. 7. With a user only having access to Company B, log in and try to access Employee C's page. ### Expected behavior Employee's C page loads correctly. ### Unexpected behavior An access error occurs. ## Origin of the issue A sudo() was missing. __ opw-5910036 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247817
This update removes a problematic printing library, `python-escpos`, from the IoT drivers. While this library offered features like QR codes, it caused frequent printer issues and reliability problems. Switching to a simpler CUPS-based approach prioritizes stable printing performance, even if it means losing some advanced features.
Original PR description
Enterprise PR: https://github.com/odoo/enterprise/pull/108109 The `python-escpos` library was being used for compatible printers since it allowed easier use of features such as QR codes, as well as…
Enterprise PR: https://github.com/odoo/enterprise/pull/108109 The `python-escpos` library was being used for compatible printers since it allowed easier use of features such as QR codes, as well as letting us query the status of the printer to check if it was e.g. out of paper. However, using this library has complicated the code and caused many reliability problems when using USB printers. In particular, the printer could print garbage and then become stuck until it was restarted. This seems to be due to a multi-threading issue, as the print is interrupted half-way through when the `USBInterface` checks for devices. Since the added value is small compared to the extra maintenance and reliability costs, the `python-escpos` library is being removed in favour just using CUPS for all print jobs, as was the case in 18.0. This means we will no longer have a QR code on the status receipt or a warning when the paper is running low, but these are unimportant compared to reliability. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249819
This update fixes an issue where deactivated tax rates were still being included in vendor payment calculations. The fix ensures that inactive tax rates are no longer considered when generating payments, improving the accuracy of financial reporting. This change was implemented by adding a filter to the tax retrieval process.
Original PR description
# How to reproduce - Install the l10n_ar_withholding module - Pick a Vendor and add a Purchase Withholding tax in the accounting tab - Go into configuration and disable that tax - Create a Vendor Bill with that Vendor - Confirm the bill and create a payment # The problem The deactivated tax is still computed in the payment # Why The function that fetches the withholding taxes does not check if the taxes are active or not # The fix I though of 2 solution : - Add an override to remove the taxes from the Vendor when they are deactivated - Add a filter to the fetch function to check if the taxes are active I chose the 2nd solution as it is the least invasive one. opw-5917257 Forward-Port-Of: odoo/odoo#247831
This update resolves an error that occurred when generating the XML FatturaPA for invoices in Italian companies. The issue stemmed from a mismatch in how data was being returned, leading to a technical error. This fix ensures invoices can be correctly downloaded in the required XML format.
Original PR description
When downloading the XML FatturaPA of an invoice in an Italian company, A traceback will generate. Steps to reproduce the error: - Install ``l10n_it_edi`` module with demo data - Switch to IT Company…
When downloading the XML FatturaPA of an invoice in an Italian company, A traceback will generate. Steps to reproduce the error: - Install ``l10n_it_edi`` module with demo data - Switch to IT Company - Create a new invoice > Customer: IT Company > Add a product > Confirm > Send > Send - Actions > Print > XML FatturaPA Traceback: ```py TypeError: string indices must be integers, not 'str' ``` In commit [1], ``_get_invoice_legal_documents`` was updated to return a list instead of a dictionary. However, the ``l10n_it_edi`` module was not adapted accordingly and still returns a dictionary at [2]. If ``_get_invoice_legal_documents`` returns a dictionary instead of a list, the following logic incorrectly iterates over dictionary key which leads to the above traceback. https://github.com/odoo/odoo/blob/a74e7e2fa96a56737e9105f3b54d5db2d9c2dba3/addons/account/controllers/download_docs.py#L24-L26 [1]: https://github.com/odoo/odoo/commit/90dcd6cfe904974dfa077c2d8d9e168a09eeecf9 [2]: https://github.com/odoo/odoo/blob/a74e7e2fa96a56737e9105f3b54d5db2d9c2dba3/addons/l10n_it_edi/models/account_move.py#L399-L403 sentry-7272542156 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes issues with downloading Activitywatch, specifically adding a link for the Linux (Ubuntu) build and correcting the existing Windows link. The update also improves how the system detects the user's operating system, ensuring a smoother download experience.
Original PR description
This PR adds the download link for the Ubuntu build of activitywatch, fixes the windows link, and fixes the platform detection.
This update resolves an issue preventing users from sharing document templates with read-only fields. By separating validation logic and removing unnecessary security checks, shared templates now function as expected, improving the usability of the document sharing feature. This ensures a smoother experience for users collaborating on shared documents.
Original PR description
Currently, attempting to share a document template that contains readonly fields fails. When `_populate_constant_items` calls `_fill` to pre-fill these fields, `_fill` aggressively checks that the request state is 'sent'. Since shared links create requests in the 'shared' state, the transaction crashes. Additionally, `_fill` throws a `UserError` if not called with `sudo`, which inappropriately treats a developer/privilege error as an end-user error. This commit resolves the issue by separating concerns: - Moves the `state == 'sent'` validation out of the `_fill` helper and into `_sign` (the caller responsible for actual user signatures). - Removes the artificial `sudo` check in `_fill`, relying instead on standard ORM Access Errors to block unauthorized database writes. (only in master) Task: 5949263
This update resolves a technical issue causing emails sent by Odoo to be rejected by some email servers (like Yahoo). The fix prevents the system from folding subject headers, ensuring they comply with strict email standards and improving email delivery rates. This ensures our communications are reliably received by our customers.
Original PR description
…r rejections Yahoo and other strict mail servers reject emails with folded Subject headers containing RFC 2047 encoded-words when the folding occurs at inappropriate positions, resulting in "554…
…r rejections Yahoo and other strict mail servers reject emails with folded Subject headers containing RFC 2047 encoded-words when the folding occurs at inappropriate positions, resulting in "554 Invalid Subject header" errors. The root cause is in Python's stdlib (bpo-144156). In an ideal world we would be fixing the issue there, but experience tells us that they are very slow to fix bugs / merge PRs in the email module, and even when they do they usually don't backport the fixes in the python versions we use. This commit extends the existing IdentificationFieldsNoFoldPolicy to also prevent Subject header folding, keeping long subjects on a single line (up to 998 characters per RFC 5322 "MUST" requirement, from the 98 "SHOULD" limit). Since at it, include the other "user defined" smtp headers: to, from, ... The solution follows the same pattern already established for identification headers (Message-ID, In-Reply-To, References) where Odoo prevents folding to avoid MTAs rewriting these critical headers and breaking email threading. See-also: #243119 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
This update adds a test to ensure the employee onboarding flow within the HR module functions correctly. It's a follow-up to a previous change designed to improve the stability and reliability of the employee onboarding process. This test helps ensure a smoother experience for new employees.
Original PR description
This commit adds a test for the following related PR: https://github.com/odoo/enterprise/pull/104888 task-5779779 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
This update corrects a restriction preventing HR officers from creating new employees in Belgium. The fix utilizes 'sudo' to grant access to a specific field, allowing the correct creation process to proceed. This ensures all users can properly manage employee records.
Original PR description
Steps to reproduce: - Install l10n_be_hr_payroll - Have a user with only HR officer rights - Try to create a new employee with that user (in BE) - You have an access error on the field l10n_be_resident_situation The field `l10n_be_resident_situation` has the HR Payroll officer group. This field is used on the inverse of the is_non_resident field, which is accessible to HR officers. This commit fixes the issue by using sudo to read the field's value. task-5779779
This update resolves a technical issue related to the accurate calculation and reporting of cycle transportation declarations within the Belgian payroll module. The fix ensures compliance with Belgian tax regulations by correcting a data processing error, improving the reliability of payroll reports for businesses operating in Belgium.
Original PR description
Forward-Port-Of: odoo/enterprise#108069
This update resolves an issue where certain website snippets were unintentionally nested within other snippets, causing display inconsistencies. The changes prevent these specific snippets – related to popups, navigation tabs, and content tables – from being dropped into other snippets, ensuring a cleaner and more reliable website experience. This improves the overall presentation and stability of the website.
Original PR description
This commit prevents the following snippets to be dropped inside other snippets like tabs, toc, and more: - s_popup - s_newsletter_subscribe_popup - s_newsletter_benefits_popup - s_tabs - s_table_of_content - s_faq_horizontal task-5439635 Forward-Port-Of: odoo/odoo#242035
This update resolves an issue where the payroll sheet calculation would fail if there were minor warnings during processing. The change allows the sheet to be generated even with warnings, ensuring payroll data is always available. This improves the reliability of payroll reporting.
Original PR description
Revert https://github.com/odoo/enterprise/pull/104137 Forward-Port-Of: odoo/enterprise#108340
This update resolves a problem where test data wasn't correctly applied during the development of the HR expense reporting feature. The team identified that changes made in a previous commit weren't being recognized by the tests. The fix ensures the tests run accurately using a default test company, maintaining the stability of the expense reporting system.
Original PR description
When adding the tests, the changes in d15faf0 were not taken into account. The tests wouldn't fail as the `hr_expense_stripe_demo` module would contain the necessary data runbot-241008 Forward-Port-Of: odoo/enterprise#108307
This update fixes an issue where the default putaway strategy wasn't consistently applied in stock transfers. The change ensures that the putaway strategy defaults to the child location of a stock move, improving the accuracy and efficiency of stock management processes. This resolves a potential misdirection of materials.
Original PR description
Steps to reproduce ----- - Enable locations & by products - Create 4 locations - View A of type view (parent: Stock) - View B of type view (parent: Stock) - Storage A of type internal location…
Steps to reproduce ----- - Enable locations & by products - Create 4 locations - View A of type view (parent: Stock) - View B of type view (parent: Stock) - Storage A of type internal location (parent: View A) - Storage B of type internal location (parent: View B) - Create a "Manufacture to A" route - Rule 1: Manufacture, Stock -> Stock - Rule 2: Push To, Internal Transfer, Stock -> View A - Create a "By Products to B" route - Rule 1: Push To, Internal Transfer, Stock -> View B - Create a "Bonus" product with route "By Products to B" - Create a "Finished" product with route "Manufacture to A" - BoM with "Bonus" as by product - Create a MO for Finished, and produce it - Open the linked transfers' list view - Open the "Bonus" transfer > "Destination Location" states View B - Open the line's details (hamburger button) > "Store To" states View A/Storage A Cause ----- When retrieving the location in https://github.com/odoo/odoo/blob/26dbbdaf460a91ef4b33392c27a28951d5de2c57/addons/stock/models/stock_move_line.py#L280-L282 we pass `locations` as a context key. The problem is that `locations` contains the childs of **all** of the SMLs' locations https://github.com/odoo/odoo/blob/26dbbdaf460a91ef4b33392c27a28951d5de2c57/addons/stock/models/stock_move_line.py#L260 This means that, in `_get_putaway_strategy`, when no `putaway_location` is found, we end up defaulting to the first element of the list https://github.com/odoo/odoo/blob/26dbbdaf460a91ef4b33392c27a28951d5de2c57/addons/stock/models/stock_location.py#L370-L371 which might not be a child of the location. Solution ----- By removing the context key, locations get populated as such https://github.com/odoo/odoo/blob/26dbbdaf460a91ef4b33392c27a28951d5de2c57/addons/stock/models/stock_location.py#L328-L330 This is ok because we know the call to `_get_putaway_strategy` is made on a single record (`sml.move_id.location_dest_id`) so the default will correctly be a child of said location. ----- Ticket: opw-5359945 Forward-Port-Of: odoo/odoo#249708 Forward-Port-Of: odoo/odoo#247403
This update resolves an issue preventing proper testing of the Arabic VAT (AREDI) functionality. By using 'sudo()' when writing test data, the system now bypasses permission restrictions, ensuring reliable validation in testing environments. This improves the stability and accuracy of the AREDI module.
Original PR description
This pull request makes a minor update to the `_dummy_afip_validation` method in `account_move.py`, improving its reliability for testing environments. * Testing reliability: The method now uses `sudo()` when writing dummy AFIP fields, ensuring that the operation succeeds even if the current user lacks write permissions. Without this fix, if the user doesn't belong to group "base system", it won't be able to validate invoices in testing environment. <img width="1258" height="454" alt="image" src="https://github.com/user-attachments/assets/522bfd9d-33be-4bcd-a60b-ef4c09a8e0d6" /> Forward-Port-Of: odoo/enterprise#107937
This update resolves an issue where tasks remained linked to sales orders even after sales order items were removed. Previously, this prevented users from properly billing tasks. Now, tasks are only unlinked from sales orders when there are no associated sales order items and the task isn't a field service task, ensuring accurate billing and task management.
Original PR description
Currently, a task remains linked to its original sales order even when it has no sales order item. This prevents users to not bill a task and temporarily detach it from a sales order until it can be…
Currently, a task remains linked to its original sales order even when it has no sales order item. This prevents users to not bill a task and temporarily detach it from a sales order until it can be linked to a new one. **Steps to produce:** * Install Sales, Project * Products > Virtual Home Staging > Create On Order > Project and Task * Create and confirm quotation with that product. * Tasks > Empty the Sale Order Item Field **Observed Behavior:** * Sale Order is still linked to the task despite sale order line has been unlinked from that task. **Root cause:** * Compute method [1] only detaches the sale order if the customer has been changed. **Solution:** * Only detach the sale order when there are no sale order items and the record is not a field service task. * Field service tasks should always keep the sale order linked so materials can still be added to the existing sale order, even when the task is non-billable (i.e., no sale order line is linked). This logic is handled by the compute override at [2], which reassigns the sale order when needed. [1]: https://github.com/odoo/odoo/blob/3f4e45ecaca46a98c904536658728a1f1571bdbd/addons/sale_project/models/project.py#L916-L935 [2]: https://github.com/odoo/enterprise/blob/6658581828dcdc43ffc5823814a05cb936cd0500/industry_fsm_sale/models/project_task.py#L178-L194 Related Enterprise PR: https://github.com/odoo/enterprise/pull/103487 opw-5215989 Forward-Port-Of: odoo/odoo#249574 Forward-Port-Of: odoo/odoo#241446
This update resolves an issue where tasks remained linked to sales orders even without a related sales order item. Now, users can unlink tasks from sales orders, preventing billing issues and simplifying task management. This ensures tasks can be properly detached and re-linked when needed.
Original PR description
Currently, a task remains linked to its original sales order even when it has no sales order item. This prevents users to not bill a task and temporarily detach it from a sales order until it can be…
Currently, a task remains linked to its original sales order even when it has no sales order item. This prevents users to not bill a task and temporarily detach it from a sales order until it can be linked to a new one. **Steps to produce:** * Install Sales, Project * Products > Virtual Home Staging > Create On Order > Project and Task * Create and confirm quotation with that product. * Tasks > Empty Sale Order Item Field **Observed Behavior:** * Sale Order is still linked to the task despite sale order line has been unlinked from that task. **Root cause:** * Compute method [1] only detaches the sale order if the customer has been changed. **Solution:** * Only detach the sale order when there are no sale order items and the record is not a field service task. * Field service tasks should always keep the sale order linked so materials can still be added to the existing sale order, even when the task is non-billable (i.e., no sale order line is linked). This logic is handled by the compute override at [2], which reassigns the sale order when needed. [1]: https://github.com/odoo/odoo/blob/3f4e45ecaca46a98c904536658728a1f1571bdbd/addons/sale_project/models/project.py#L916-L935 [2] https://github.com/odoo/enterprise/blob/6658581828dcdc43ffc5823814a05cb936cd0500/industry_fsm_sale/models/project_task.py#L178-L194 Related community PR: https://github.com/odoo/odoo/pull/241446 opw-5215989 Forward-Port-Of: odoo/enterprise#107990 Forward-Port-Of: odoo/enterprise#103487
The display of available rental products on the website was incorrect when 'continue selling' was enabled. This fix ensures that the quantity shown accurately reflects the available rental units, considering the selected renting period. This improvement prevents customers from seeing inaccurate stock levels and improves the overall e-commerce experience.
Original PR description
**Issue**: The displayed available quantity on the ecommerce product page is incorrect for rental products when "continue selling" is enabled. **Steps to reproduce**: - Create a rental product…
**Issue**: The displayed available quantity on the ecommerce product page is incorrect for rental products when "continue selling" is enabled. **Steps to reproduce**: - Create a rental product tracked in stock with a quantity of 5 - Enable "continue selling" and "show available quantity below 10" - Go to the ecommerce page of this product - Rent 3 units for a given period, confirm and pay - Return to the ecommerce product page -> Whatever the selected renting period, the displayed quantity is always 2 **Cause**: The website displays `free_qty`: https://github.com/odoo/enterprise/blob/41c729e22c5fd1abb690f8335e933f793be0b319/website_sale_stock_renting/static/src/xml/website_sale_stock_renting_product_availability.xml#L15 `free_qty` is computed in: https://github.com/odoo-dev/odoo/blob/0935829ddaecd7b2b6eec9157f8f790b546d06ff/addons/website_sale_stock/models/product_template.py#L36 which leads to: https://github.com/odoo/enterprise/blob/41c729e22c5fd1abb690f8335e933f793be0b319/website_sale_stock_renting/models/website.py#L10 and ultimately relies on: https://github.com/odoo/odoo/blob/37bf1703c7478a3010b71cd60bbb43b3295a605b/addons/stock/models/product.py#L213 This computation does not take the selected renting period into account. There is a period-aware computation here: https://github.com/odoo/enterprise/blob/41c729e22c5fd1abb690f8335e933f793be0b319/website_sale_stock_renting/models/website.py#L15C17-L21C1 but it is only triggered when `product.allow_out_of_stock_order` is False (i.e. when "continue selling" is disabled). opw-[5354163](https://www.odoo.com/web#id=5354163&view_type=form&model=project.task) Forward-Port-Of: odoo/enterprise#104686 Forward-Port-Of: odoo/enterprise#103333
This update corrects a reporting issue with Italian invoices (l10n_it) by ensuring the total invoice amount (`ImportoTotaleDocumento`) is always displayed in EUR, as required by Italian tax regulations. This change aligns with government guidelines and prevents potential discrepancies in financial reporting.
Original PR description
With an `l10n_it` company: - Create an invoice in a foreign currency and export the XML. In the XML, the field `ImportoTotaleDocumento` is expressed in the invoice currency, while `Divisa` is set to…
With an `l10n_it` company: - Create an invoice in a foreign currency and export the XML. In the XML, the field `ImportoTotaleDocumento` is expressed in the invoice currency, while `Divisa` is set to the company currency. `ImportoTotaleDocumento` must be expressed in EUR, as stated in the following document: https://www.agenziaentrate.gov.it/portale/documents/20143/0/10FAQ+pubblicate+il+19+luglio+2019+(aggiornate+il+1+luglio+2021).pdf/6e8acb34-b7c5-730e-6a39-79c0a296e02b > L'art. 21, comma 2, lettera l) del d.P.R. n. 633/72 specifica che > “aliquota, ammontare dell'imposta e dell'imponibile con arrotondamento al centesimo di euro”. > Conseguentemente, se la fattura è emessa da soggetti residenti o stabiliti il codice da inserire nel campo `<Divisa>` > deve essere obbligatoriamente “EUR”. > Article 21, paragraph 2, letter (l) of Presidential Decree No. 633/72 specifies that > “the tax rate, the amount of the tax, and the taxable amount must be stated with rounding to the euro cent.” > Consequently, if the invoice is issued by resident or established taxpayers, the code to be entered in the `<Divisa>` > field must mandatorily be “EUR”. As a result, we now use the **company currency amount** for the `ImportoTotaleDocumento` field (assuming the company currency is always EUR for `l10n_it`). Ticket [link](https://www.odoo.com/odoo/project.task/5913088) opw-5913088 Forward-Port-Of: odoo/odoo#249272 Forward-Port-Of: odoo/odoo#247537
Features or functions removed from Odoo
This update eliminates redundant error messages related to IoT receipt printers. As we no longer track printer status, these warnings are no longer generated, streamlining the system and improving user experience. This change was made as part of a community contribution.
Original PR description
Community PR: https://github.com/odoo/odoo/pull/249819 As we are no longer querying the status of the receipt printer on the IoT box, some of the error messages such as being low on paper will no longer be sent by the IoT. This commit removes the messages in the JS code too. Forward-Port-Of: odoo/enterprise#108109
5 changes
Resolved issues and error corrections
This change reverses a recent update that was incorrectly removing accented characters from Mexican VAT (SAT) documents. The SAT now allows all characters, so we're restoring the original behavior, requiring users to enter the legally registered name with accents. This ensures full user control and avoids blocking legitimate transactions.
Original PR description
An accent sanitization feature was introduced in Odoo 18 [1]. It was done because it appeared the SAT replaced certain characters with their unaccented counterpart, but it's not the case. At least…
An accent sanitization feature was introduced in Odoo 18 [1]. It was done because it appeared the SAT replaced certain characters with their unaccented counterpart, but it's not the case. At least today, the SAT allows all characters (pointed out in [2]). This explains why in the past 6 months this feature has been slowly undone [3][4][5], character by character, after customers run into issues. The approach can not work, so we go back to the name with the accents the user puts on the partner. Users need to put the correct, legally registered name in Odoo. If it doesn't work then they can adapt it as needed. This way the user is in full control, and we don't block them. This reverts the whole accent sanitization saga: - Revert "[FIX] l10n_mx_edi - More accented characters accepted by SAT", this reverts commit 46cc41ddd258e80372478a746ea79d154a5931d9. - Revert "[FIX] l10n_mx_edi: Fix accents in legal name", this reverts commit dcbd8797667b5be88f48045e48da86ac42db362c. - Revert "[FIX] l10n_mx_edi: Fix accents in legal name", this reverts commit 32b8333fd3f813ec3188394c2634129e3fbfe31d. - Revert "[FIX] l10n_mx_edi: Fix accents in legal name", this reverts commit 05ed1fb9059bd1459e38dc00b041cada6bf06ac4. This also removes the unused frozendict import to make "Check Style" happy. opw-5915515 [1] https://github.com/odoo/enterprise/pull/95207 [2] https://github.com/odoo/enterprise/pull/107960 [3] https://github.com/odoo/enterprise/pull/96043 [4] https://github.com/odoo/enterprise/pull/106557 [5] https://github.com/odoo/enterprise/pull/107677 Closes odoo/enterprise#107960 Forward-Port-Of: odoo/enterprise#108189
This update fixes a discrepancy where tests weren't updated after a recent change to the Hong Kong payroll salary rule. The correction ensures that all tests accurately reflect the new rule, maintaining the integrity of the payroll calculations. This prevents potential errors in reporting and financial data.
Original PR description
In odoo/enterprise:100842 a salary rule was corrected, but the related tests were not. This will correct that mistake. Forward-Port-Of: odoo/enterprise#108241
This update corrects a rounding issue in the stock barcode functionality that was causing inaccurate stock quantities to be recorded when scanning barcodes during delivery order processing. Specifically, it ensures that stock quantities are displayed more accurately, preventing discrepancies in inventory tracking. This improves the reliability of stock management.
Original PR description
To reproduce the issue: - Create a stock quantity of product1 for example of 275.84 kg in PACK1 - Create a delivery order of 3.6 kg - Go to the delivery order on stock barcode - Scan PACK1 - The new line is created as 272.2399999999 Forward-Port-Of: odoo/enterprise#108198 Forward-Port-Of: odoo/enterprise#89300
This update corrects a minor oversight in the system's invoice matching tolerance settings. Previously, a hardcoded value wasn't updated, leading to potential inaccuracies in bank statement reconciliation. This fix ensures more reliable matching of invoices to bank transactions, improving financial reporting.
Original PR description
During this commit:https://github.com/odoo/enterprise/commit/15d26e62f14bb0224712a1712b47ebe16c3b8702 we forgot to change one part of the hardcoded tolerance. task-5952881 Forward-Port-Of: odoo/enterprise#108112
This update resolves a testing issue that prevented users from validating Arabic VAT invoices in test environments. The change uses elevated permissions to bypass typical user access restrictions, ensuring consistent and reliable testing. This improves the stability and accuracy of the Arabic VAT module.
Original PR description
This pull request makes a minor update to the `_dummy_afip_validation` method in `account_move.py`, improving its reliability for testing environments. * Testing reliability: The method now uses `sudo()` when writing dummy AFIP fields, ensuring that the operation succeeds even if the current user lacks write permissions. Without this fix, if the user doesn't belong to group "base system", it won't be able to validate invoices in testing environment. <img width="1258" height="454" alt="image" src="https://github.com/user-attachments/assets/522bfd9d-33be-4bcd-a60b-ef4c09a8e0d6" /> Forward-Port-Of: odoo/enterprise#107937
4 changes
Resolved issues and error corrections
This change reverses a recent update that was incorrectly removing accented characters from Mexican VAT (SAT) documents. The SAT now allows all characters, so Odoo is now reverting to accept the user-entered, accented names as originally intended. This ensures users can accurately input their legally registered names without being blocked.
Original PR description
An accent sanitization feature was introduced in Odoo 18 [1]. It was done because it appeared the SAT replaced certain characters with their unaccented counterpart, but it's not the case. At least…
An accent sanitization feature was introduced in Odoo 18 [1]. It was done because it appeared the SAT replaced certain characters with their unaccented counterpart, but it's not the case. At least today, the SAT allows all characters (pointed out in [2]). This explains why in the past 6 months this feature has been slowly undone [3][4][5], character by character, after customers run into issues. The approach can not work, so we go back to the name with the accents the user puts on the partner. Users need to put the correct, legally registered name in Odoo. If it doesn't work then they can adapt it as needed. This way the user is in full control, and we don't block them. This reverts the whole accent sanitization saga: - Revert "[FIX] l10n_mx_edi - More accented characters accepted by SAT", this reverts commit 46cc41ddd258e80372478a746ea79d154a5931d9. - Revert "[FIX] l10n_mx_edi: Fix accents in legal name", this reverts commit dcbd8797667b5be88f48045e48da86ac42db362c. - Revert "[FIX] l10n_mx_edi: Fix accents in legal name", this reverts commit 32b8333fd3f813ec3188394c2634129e3fbfe31d. - Revert "[FIX] l10n_mx_edi: Fix accents in legal name", this reverts commit 05ed1fb9059bd1459e38dc00b041cada6bf06ac4. This also removes the unused frozendict import to make "Check Style" happy. opw-5915515 [1] https://github.com/odoo/enterprise/pull/95207 [2] https://github.com/odoo/enterprise/pull/107960 [3] https://github.com/odoo/enterprise/pull/96043 [4] https://github.com/odoo/enterprise/pull/106557 [5] https://github.com/odoo/enterprise/pull/107677 Closes odoo/enterprise#107960 Forward-Port-Of: odoo/enterprise#108189
A recent update to the Hong Kong payroll salary rules required an update to the associated test suite. This change ensures that all tests accurately reflect the new rules, maintaining the integrity of the payroll calculations. This fix prevents potential discrepancies in reported payroll data.
Original PR description
In odoo/enterprise:100842 a salary rule was corrected, but the related tests were not. This will correct that mistake. Forward-Port-Of: odoo/enterprise#108241
This update resolves an issue where the payment QR code remained visible on the customer display after an order was completed. The fix clears relevant data when an order is finalized, ensuring the QR code automatically closes and improving the customer experience. This prevents unnecessary steps for the user.
Original PR description
Steps: --- - Configure online payment on the POS configuration. - Open a POS session and the customer display. - Add a product and an online payment line. - Validate the order and complete the payment via QR code. Issue: --- - The order is finalized, but the payment QR code remains visible on the customer display. - The QR popup must be closed manually every time. Cause: --- - The customer display popup lifecycle depends on `onlinePaymentData`. - This data was not cleared when the order was finalized. Fix: --- - Clear `onlinePaymentData` when the order is completed. task-5502344 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249932 Forward-Port-Of: odoo/odoo#244991
This update fixes an issue where deactivated tax withholdings were still being calculated in vendor payments. The fix ensures that inactive tax settings are no longer included in payment calculations, improving accuracy and preventing incorrect financial reporting. This change was implemented by adding a filter to the tax retrieval function.
Original PR description
# How to reproduce - Install the l10n_ar_withholding module - Pick a Vendor and add a Purchase Withholding tax in the accounting tab - Go into configuration and disable that tax - Create a Vendor Bill with that Vendor - Confirm the bill and create a payment # The problem The deactivated tax is still computed in the payment # Why The function that fetches the withholding taxes does not check if the taxes are active or not # The fix I though of 2 solution : - Add an override to remove the taxes from the Vendor when they are deactivated - Add a filter to the fetch function to check if the taxes are active I chose the 2nd solution as it is the least invasive one. opw-5917257 Forward-Port-Of: odoo/odoo#247831
4 changes
Resolved issues and error corrections
This update fixes a discrepancy in the automated tests for the Hong Kong payroll module. A recent salary rule correction was missed in the testing suite, and this change ensures the tests accurately reflect the updated functionality. This ensures the payroll calculations are reliable and compliant.
Original PR description
In odoo/enterprise:100842 a salary rule was corrected, but the related tests were not. This will correct that mistake. Forward-Port-Of: odoo/enterprise#108241
This update prevents users from canceling subscriptions if they don't have visibility to the associated invoices. Previously, a sales representative could cancel a subscription even without seeing the invoices, leading to potential revenue loss. Now, the system ensures cancellation is only possible when invoices are accessible to the user.
Original PR description
Before this commit, when a user had access to an invoiced subscription but not to the invoiced, he could cancel the subscription. Step to reproduce: - create a subscription in company A, with a pricelist available in company B. Sales person A belong to company A. - invoice the subscription and confirm the invoice - update the company (company B) and sales person of the subscription (B). The new salesperon don't see the invoice in the stat button. After this commit salesperson B can't cancel the subscription. task-5907345 Forward-Port-Of: odoo/enterprise#106441
This update corrects a test case within the quality control module to reflect recent changes in how Odoo handles the merging of picking moves. Specifically, the test now correctly validates that transfers only combine with existing ones when a procurement group is defined. This ensures accurate tracking and reporting of inventory movements.
Original PR description
Fix the test case to align with the updated picking move merge behavior, where the next transfer merges into an existing one only when a procurement group (group_id) is set TaskID-5242340 Forward-Port-Of: odoo/enterprise#99342
This update resolves an issue preventing accurate testing of the Arabic VAT (AREDI) invoice validation process. By using 'sudo()' when writing temporary files, the system now bypasses permission restrictions, ensuring consistent validation results in testing environments. This improves the reliability of our testing and reduces the risk of errors in live systems.
Original PR description
This pull request makes a minor update to the `_dummy_afip_validation` method in `account_move.py`, improving its reliability for testing environments. * Testing reliability: The method now uses `sudo()` when writing dummy AFIP fields, ensuring that the operation succeeds even if the current user lacks write permissions. Without this fix, if the user doesn't belong to group "base system", it won't be able to validate invoices in testing environment. <img width="1258" height="454" alt="image" src="https://github.com/user-attachments/assets/522bfd9d-33be-4bcd-a60b-ef4c09a8e0d6" /> Forward-Port-Of: odoo/enterprise#107937
17 changes
Enhancements to existing features
This update replaces a less efficient caching method (`lru_cache`) with a simpler, more reliable caching approach. This change optimizes the performance of the Delivery Ups module, leading to faster processing times and a smoother user experience. It's a routine performance enhancement.
Original PR description
On an argument-less function, `lru_cache` is strictly worse. Forward-Port-Of: odoo/enterprise#108100
Resolved issues and error corrections
This update ensures that timesheet entries with negative hours exceeding six digits are now properly validated, preventing incorrect data entry. Previously, users could add entries with excessively large negative values without any error message. This fix improves data accuracy and reliability within the timesheet tracking system.
Original PR description
Currently, a user can add a timesheet entry with a negative Hours Spent value `exceeding six digits`. **Steps to reproduce:** - Install the `timesheet_grid` module. - Open the `Timesheets` app and…
Currently, a user can add a timesheet entry with a negative Hours Spent value `exceeding six digits`. **Steps to reproduce:** - Install the `timesheet_grid` module. - Open the `Timesheets` app and click `Add a line`. - Set Hours Spent to a `negative` value with more than six digits (e.g., -1000000). **Observation:** The line is added without any warning, whereas entering a positive value with more than six digits correctly raises an `error`. **Root cause:** At [1], the constraint validates only positive values exceeding six digits. As a result, negative values with more than six digits are not checked and bypass the `UserError validation`. **Fix:** This commit updates the constraint to ensure the six-digit limit applies to both positive and negative values. [1]: https://github.com/odoo/enterprise/blob/660905872909405c0a07a8317b4eb0a42e5854ca/timesheet_grid/models/analytic.py#L46-L49 opw-5909417 Forward-Port-Of: odoo/enterprise#108182 Forward-Port-Of: odoo/enterprise#106781
This update optimizes the master production schedule (MPS) by fixing an issue where unnecessary data was being loaded during order processing. The change prevents the system from pulling in irrelevant product information, resulting in a significant speed improvement. The action replenish now completes successfully.
Original PR description
When traversing X2many fields (bom_ids, bom_line_ids) during prefetching in filtered, the _prefetch_ids data grew excessively. Prefetching bom lines pulled in IDs for lines belonging to all boms across all associated products, even though _skip_bom_line in this case only operates on the current product's context. Use prefetch() with no args to avoiding unnecessary record loading for unrelated boms. Benchmark: | |Before |After| |-----------------|-------|-----| |action_replenish |Timeout|577ms| Related ticket: opw-5928055 Forward-Port-Of: odoo/enterprise#107648
This update fixes an issue where OCR-extracted expense amounts weren't correctly converting to the company's standard currency (USD). The change ensures that the 'Total' amount accurately reflects the receipt's original currency value, using the correct exchange rate. This improves the accuracy of expense reporting.
Original PR description
Steps to reproduce: 1. Initialize an expense with a foreign currency (e.g., EUR). 2. Trigger OCR extraction on a receipt with a specific total. 3. Observe that both 'Total In Currency' and 'Total' (USD) are set to the same value. 4. The exchange rate is forced to 1.0, ignoring the system's exchange rate. Cause: The _fill_document_with_results method assigned the OCR total to both 'total_amount_currency' and 'total_amount' as a placeholder. This triggered the field's inverse logic during the write() call, causing Odoo to treat the input as a manual exchange rate override of 1:1. Solution: Remove the 1:1 placeholder assignment. The method now explicitly calculates 'total_amount' using the _convert() helper once the currency is identified, ensuring the company currency total reflects the actual system exchange rate. opw-5437611 Forward-Port-Of: odoo/enterprise#108089 Forward-Port-Of: odoo/enterprise#107534
This update fixes a bug preventing users from searching the Colombian Daily Journal (Libro Diario). The issue was caused by missing data in the journal entries, which blocked the search bar. Now, all journal entries are searchable by move, partner, account, and label.
Original PR description
Steps to reproduce: 1. Open the Colombian Daily Journal (Libro Diario). 2. Type a move name or partner in the search bar. 3. Observe that no results are returned. Cause: Report lines were generated with an empty 'name' attribute. The accounting report framework uses this field for client-side filtering. Empty names make the search bar non-functional. Solution: Populate the 'name' field with move, partner, account, and label data. This enables the frontend search bar to match against these strings. opw-5495558 Forward-Port-Of: odoo/enterprise#106179
This update prevents unnecessary errors from being raised when the Codabox sync process (CRON) encounters temporary issues. This change improves the reliability of the system by avoiding automatic disabling of the sync process due to repeated errors, ensuring data stays synchronized when servers are briefly unavailable.
Original PR description
In case of a failure/downtime from the IAP/Codabox servers, an error is currently being raised. Although this is useful when manually clicking the Fetch button to see what happens, in the context of a CRON it's much less desirable as multiple failures from a CRON will automatically disable it which is not useful as the servers might be back up later on. Now, instead, we only raise if we're not in a CRON environment. opw-5922549 Forward-Port-Of: odoo/enterprise#107798
This update resolves a crash issue that occurred when using the pivot table autofill feature with invalid data. The fix ensures that autofill functionality remains stable while preventing tooltips from causing a system-wide error. This improves the reliability of pivot table data analysis.
Original PR description
If you try to autofill a pivot cell that has an invalid relational id in its domain (eg. `=PIVOT.HEADER(1, "stage_id", 99999999)`), the autofill actually works but the tooltip make everything crash. Task: [5913754](https://www.odoo.com/web#id=5913754&cids=1&menu_id=4720&action=333&active_id=2328&model=project.task&view_type=form) Forward-Port-Of: odoo/enterprise#107807 Forward-Port-Of: odoo/enterprise#106601
This update resolves a technical issue preventing an 'add inputs' button from appearing on Swiss payroll payslips. This ensures accurate and complete payroll reporting for our Swiss clients. The fix addresses inconsistencies introduced after a recent update.
Original PR description
don't show add inputs button on payslips on the swiss localization. Forward-Port-Of: odoo/enterprise#107958
This update resolves an issue where users within the 'Planning / User' group couldn't take open shifts. The fix ensures that the 'I Take It' button is consistently displayed for this group, allowing them to seamlessly accept shifts as intended. This improves the planning process for staff.
Original PR description
## Issue In the Planning app, users within the *Planning / User* groups could not take open shifts. The button *"I Take It"* would not be displayed when clicking on the shift. ## Steps to reproduce…
## Issue
In the Planning app, users within the *Planning / User* groups could not take open shifts. The button *"I Take It"* would not be displayed when clicking on the shift.
## Steps to reproduce
1. Install the *Planning* (`planning`) app
2. In the Planning app, as an admin, create and publish an open shift
3. Log in as a *User*, open the *Planning* app, and click on the open shift
4. **The _"I Take It"_ button is not displayed**
When logging in as a user who is **not** part of the *Planning / User* group, the *I Take It* button is displayed.
## Cause
The condition for the *I Take It* button to be displayed is the following:
https://github.com/odoo/enterprise/blob/301e3c40c3272a6ae89a1eb4387d7d244e1dc52c/planning/views/planning_views.xml#L282-L283
The condition that makes the button invisible is `not context.get('my_planning_action')`. When the user is part of *Planning / User*, the schedule they see when opening the *Planning* app is the *"Schedule by Resource"*, which has the following context:
https://github.com/odoo/enterprise/blob/301e3c40c3272a6ae89a1eb4387d7d244e1dc52c/planning/views/planning_views.xml#L716
When a user who **is not** part of the *Plannig / User* group opens the *Planning* app, they see their own schedule, where the context is different than in the first case:
https://github.com/odoo/enterprise/blob/301e3c40c3272a6ae89a1eb4387d7d244e1dc52c/planning/views/planning_views.xml#L636
Because the `my_planning_action` property is in the context (and all the other conditions are respected), the button is displayed.
opw-5451282
Forward-Port-Of: odoo/enterprise#104919This update ensures the MO filter remains active in the shopfloor search bar after a user clicks on a manufacturing order's header. Previously, clicking the header would remove the filter, causing confusion. This fix maintains the correct filter context, improving usability and workflow efficiency.
Original PR description
### Steps to reproduce: - Download MRP app. - Create a product and its corresponding BOM (including at least a single operation) - Create and confirm a manufacturing order for 1 unit of that product…
### Steps to reproduce: - Download MRP app. - Create a product and its corresponding BOM (including at least a single operation) - Create and confirm a manufacturing order for 1 unit of that product - Click on the Shop Floor smart button > Click on the header of the MO - The MO filter applied on the shopfloor search bar is removed ### Issue: The MO search filter is removed after you click the header of the workorder order. This bug was introduced by another commit https://github.com/odoo/enterprise/pull/94584/changes/c83ab24a8d037a339db8067c7e9794cba5c16eab to remove the filter when a workorder's barcode is scanned. Hence, https://github.com/odoo/enterprise/blob/67ff37a830202afb8c8914da6f7bc8d4972eefd4/mrp_workorder/static/src/mrp_display/mrp_display_record.js#L289-L292 the change resulted in the filter being removed every time the header is clicked. In the case where a user clicks to start the workorder, we need to keep the filter. ### Fix: Based on https://github.com/odoo/enterprise/blob/67ff37a830202afb8c8914da6f7bc8d4972eefd4/mrp_workorder/static/src/mrp_display/mrp_display_record.xml#L6-L8 `onClickHeader()` is called every time a shopfloor record is clicked, which (based on the reference in the previous section) removes the filter, then calls `startWorking()`. By removing `this.env.searchModel.removeMOFilter()` from this method, it's ensured that clicks preserve the user's current search context. For https://github.com/odoo/enterprise/blob/67ff37a830202afb8c8914da6f7bc8d4972eefd4/mrp_workorder/static/src/mrp_display/mrp_display.js#L248-L250 since the original workflow of removing the filter in case of a barcode scan should be kept, moving `removeMOFilter()` call here with the appropriate reference of `workorder.component.env.searchModel`matches the expected behaviour. opw-5877418 Forward-Port-Of: odoo/enterprise#107121
This update optimizes the creation of global invoices in the Mexican EDI module. By changing the wizard to a 'TransientModel,' data is no longer permanently stored in the database, leading to a more efficient and streamlined process. This change resolves a previous issue and enhances performance.
Original PR description
Change to TransientModel so a wizard is not permanently stored in db when creating a global invoice. Forward-Port-Of: odoo/enterprise#107950 Forward-Port-Of: odoo/enterprise#107244
A technical problem with the Hong Kong payroll calendar was causing errors that prevented new employees from being created. This update corrects the calendar's setup to use the correct work entry types, resolving the issue and restoring functionality.
Original PR description
The resource calendar for Hong Kong doesn't work well at the moment. When the data is loaded, it picks the company from the env (usually a US one during db initialization) and the country from it. Using that country, it deduces the work entry type for the attendance_ids. At the moment, the result is that HK calendar ends up with US work entries, causing access errors in certain flow. (e.g. With hr_contract_salary installed you can no longer create employees). The solution is to explicitly set the company_ids to False as done in other countries to have the generic work entry set and bypass the issue. Forward-Port-Of: odoo/enterprise#108250
This update fixes an issue where the 'Update Rental Prices' button disappeared after saving rental orders. The fix adds a field to the view that ensures the button remains visible when a rental period is adjusted. This ensures users can always update rental prices as needed.
Original PR description
Steps to produce: --- - Install `sale_renting` module. - Rental > Open any order > Change the rental period. - Save the record. Issue: --- - After saving the order, the `Update Rental Prices` button becomes invisible. Root cause: --- - The field `show_update_duration`, which controls the visibility of the button, is not present in the view. As a result, when the record is saved, the field is not included in the form data and its value is not properly maintained, causing the button to become invisible. - The field is removed from the view in this [commit]. Solution: --- - Added the `show_update_duration` field to the view to ensure its value is properly maintained. This allows the `Update Rental Prices` button to remain visible when applicable. [commit]: https://github.com/odoo/enterprise/commit/b90bbdef10a7a37fb065626ba995811ab388c7a1 opw-5937145 --- Forward-Port-Of: odoo/enterprise#108157 Forward-Port-Of: odoo/enterprise#107621
This update resolves an accounting error in the UK and Netherlands versions of Odoo by ensuring tax receivable and payable accounts are distinct. Previously, the same account was used, leading to incorrect reporting of tax balances. This fix ensures accurate tax reporting and avoids potential accounting discrepancies.
Original PR description
Forward-Port-Of: odoo/enterprise#94191
This update ensures that payslips created on-the-fly are automatically linked to the corresponding pay run. Previously, this connection was missing, causing potential data inconsistencies. This change improves the accuracy and reliability of payroll reporting.
Original PR description
**Description:** When creating a Pay Run on the fly from an off cycle payslip, the payslip should be properly linked to the created Pay Run. **Implementation:** . Update hr_payslip create() method to link it to the on-fly created payrun task-5959481
Code cleanup and technical improvements
This update removes unnecessary URL redirects from website tour scripts. These redirects were causing delays and were redundant since the same functionality is handled elsewhere. This change streamlines the onboarding process and improves website performance.
Original PR description
The URL key in a tour's JavaScript file implies a redirect to that URL once the browser opens. If this URL is the same as the one used in `start_tour()` (Python), then it serves no purpose. It's even detrimental because it implies a redirect (and therefore a waste of time). The URL key in the JS file is (for now) only used for onboarding tours. This key will be defined later in the .xml file for onboarding tours. That's why we're removing the URL keys from the registries here.
This pull request is preparing Odoo for the upcoming Owl3 upgrade. It involves migrating code to align with Owl3's changes, primarily by updating import statements and utilizing compatibility files to ensure continued functionality. This is a necessary step to maintain compatibility with the Owl3 library.
Original PR description
This PR adds commits to prepare the support of the next version of owl. Owl3 has a lot of breaking change. A compatibility file with owl2 features that is removed or behaviour changed in owl3 is added and the features are imported from this compatibility file. The PR also adds an upgrade code file which has been used to make the current changes.
5 changes
Resolved issues and error corrections
This update reverts a previous change that was incorrectly sanitizing accents in Mexican VAT (EDI) documents. The SAT now allows all characters, so we're returning to accepting the user-entered, accented names as originally intended. This ensures users can accurately input their legally registered names without being blocked.
Original PR description
An accent sanitization feature was introduced in Odoo 18 [1]. It was done because it appeared the SAT replaced certain characters with their unaccented counterpart, but it's not the case. At least…
An accent sanitization feature was introduced in Odoo 18 [1]. It was done because it appeared the SAT replaced certain characters with their unaccented counterpart, but it's not the case. At least today, the SAT allows all characters (pointed out in [2]). This explains why in the past 6 months this feature has been slowly undone [3][4][5], character by character, after customers run into issues. The approach can not work, so we go back to the name with the accents the user puts on the partner. Users need to put the correct, legally registered name in Odoo. If it doesn't work then they can adapt it as needed. This way the user is in full control, and we don't block them. This reverts the whole accent sanitization saga: - Revert "[FIX] l10n_mx_edi - More accented characters accepted by SAT", this reverts commit 46cc41ddd258e80372478a746ea79d154a5931d9. - Revert "[FIX] l10n_mx_edi: Fix accents in legal name", this reverts commit dcbd8797667b5be88f48045e48da86ac42db362c. - Revert "[FIX] l10n_mx_edi: Fix accents in legal name", this reverts commit 32b8333fd3f813ec3188394c2634129e3fbfe31d. - Revert "[FIX] l10n_mx_edi: Fix accents in legal name", this reverts commit 05ed1fb9059bd1459e38dc00b041cada6bf06ac4. This also removes the unused frozendict import to make "Check Style" happy. opw-5915515 [1] https://github.com/odoo/enterprise/pull/95207 [2] https://github.com/odoo/enterprise/pull/107960 [3] https://github.com/odoo/enterprise/pull/96043 [4] https://github.com/odoo/enterprise/pull/106557 [5] https://github.com/odoo/enterprise/pull/107677 Closes odoo/enterprise#107960 Forward-Port-Of: odoo/enterprise#108189
This update corrects an error in how Odoo generates XML files for Swiss bank payments (pain.001). The previous version contained conflicting information about the bank, leading to invalid XML that wouldn't process correctly. This change ensures the XML is properly formatted and compliant with Swiss banking standards, allowing for accurate payment processing.
Original PR description
Steps to reproduce : - Install 'account_iso20022', 'l10n_ch' and switch to a Swiss company - Have a bank with a BIC number and an account for that bank with a clearing number - Create a vendor bill for a Swiss partner or payrun report - Pay with "Swiss ISO20022" > generate xml pain001 - Validate against xsd or any swiss pain001 test plateform > Incorrect rules usage ! not valid xml ! Cause: In the XML the field `BIC` and `ClrSysMmbId` are present for field FinInstnId for Creditor or Debitor Solution: In xml put BIC, if not available, put clearing number if not available `Othr` field. This commit put BIC by default.
This update fixes an issue where payroll reports and payment exports incorrectly displayed employee names instead of the actual bank account holder's information. The change ensures payment records accurately reflect the bank partner, improving data accuracy and compliance across various Odoo payroll modules (AU, BE, CH, IN, SA, US).
Original PR description
Steps to reproduce: 1. Setup an employee with a bank account where the account holder is different from the employee (e.g., a spouse). 2. Generate a payslip for this employee. 3. Print the payslip…
Steps to reproduce: 1. Setup an employee with a bank account where the account holder is different from the employee (e.g., a spouse). 2. Generate a payslip for this employee. 3. Print the payslip (PDF) or generate a payment export (SEPA, NACHA, ABA, CSV). 4. Observe that the employee's name is displayed instead of the account holder's information. Issue: Payroll reports and payment exports were frequently hardcoded to use the employee's legal name or work contact ID. This is incorrect when a bank account belongs to a different partner, as payment records should reflect the actual account holder. Solution: Unified logic across standard and localized payroll modules (AU, BE, CH, IN, SA, US) to prioritize the bank account's linked partner: - Updated QWeb templates to display bank.partner_id.name for account allocations. - Modified payment wizards (CSV, NACHA, ABA, SEPA) to use the bank account's partner ID. - Ensured a fallback to the employee's legal name remains in place. opw-5357652
This update resolves an issue where the payroll sheet calculation would fail if there were minor warnings during processing. The change allows the payroll sheet to be generated even with warnings, ensuring consistent payroll reporting. This improves the reliability of payroll data and reduces potential disruptions.
Original PR description
Revert https://github.com/odoo/enterprise/pull/104137
Code cleanup and technical improvements
This update replaces an older component with a newer one for handling website URLs in the live chat feature. The change improves the system's architecture and ensures consistent URL display. This update doesn't impact user functionality but is a routine maintenance update.
Original PR description
This commit replaces the use of `WebsiteUrlPicker with `BuilderUrlPicker` community PR: [226324](https://github.com/odoo/odoo/pull/226324) task-5260613
3 changes
Enhancements to existing features
This update adds tests to ensure accurate calculation of wage types on payslips, considering various employee contract details like monthly wage types and multiple leave requests across different months. These tests enhance the reliability of payroll processing for Swiss employees, particularly within the l10n_ch module.
Original PR description
This commit adds tests to the `_compute_l10n_ch_swiss_wage_ids` function to verify **Wage Types** in payslips across multiple months and with different **Monthly Wage Types** defined in an employee’s contract, as well as multiple leave requests occurring in different months. task-5906677 Forward-Port-Of: odoo/enterprise#107802
Resolved issues and error corrections
This update fixes an issue where duplicate preparation cards were created when ordering items across multiple tables in the Point of Sale (POS) system. The change ensures that only new items are sent for preparation, streamlining the kitchen workflow and preventing confusion. It's designed to improve the accuracy and efficiency of order processing.
Original PR description
Before this commit, when I Link 2 tables, add item on the new grouped tables and order it, I get duplicate preparation card. When we create a new product card, we need to ensure that only t items (not sent) are actually sent as new items to prepare. Do not bother by cancelling items from the previous preparation Think at it as if it was a preparation ticket in paper task-id: 4735631 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where duplicate preparation cards were generated when multiple items were added to a grouped order. The change ensures that only new items are sent to the kitchen, simplifying the preparation process and preventing confusion. It's designed to improve order accuracy and reduce errors in the kitchen.
Original PR description
Before this commit, when I Link 2 tables, add item on the new grouped tables and order it, I get duplicate preparation card. When we create a new product card, we need to ensure that only the new items (not sent) are actually sent as new items to prepare. Do not bother by cancelling items from the previous preparation card. Think at it as if it was a preparation ticket in paper task-id: 4735631 Community PR: https://github.com/odoo/odoo/pull/207053
8 changes
Enhancements to existing features
- CFE series now support numbers. Document numbers could have a sequence of 1 alphanumeric character + 7 digits or 2 alphanumeric + 7 digits. Users will now be expected to input a valid document number. With the new alphanumeric series, it will be difficult to support a reformatting of document number. task-5419331 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Original PR description
- CFE series now support numbers. Document numbers could have a sequence of 1 alphanumeric character + 7 digits or 2 alphanumeric + 7 digits. Users will now be expected to input a valid document number. With the new alphanumeric series, it will be difficult to support a reformatting of document number. task-5419331 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update ensures Odoo complies with recent changes from the Uruguayan tax authority (DGI) regarding Electronic Sales Reports (CFE). Specifically, a new option is added for exporting goods under a mandate, and the reporting of reference documents (credit/debit notes) now includes currency and exchange rate information when needed.
Original PR description
Purpose: The DGI introduced changes in CFE version 25. The following changes below needs to be implemented for legal compliance.
Required Changes:
- Introduce a new selection value,("91", "Export under Mandate")for field, l10n_uy_edi_cfe_sale_mode. This option is required when documenting export operation performed as a mandating entity, where the definitive export will be carried out by a third party.
- The reference document(credit note or debit note) of an existing account move will need to send:
- Amount (MntCFEref)
- Currency (TpoMonedaRef)
- Exchange Rate (TpoCambioRef) if the currency is not Uruguayan Pesos
task-5419331
task-5419331Resolved issues and error corrections
This update corrects a visual imbalance in the layout of Knowledge articles, specifically addressing an uneven gutter size in the editor. The change ensures a more balanced and professional appearance for all Knowledge articles, improving user experience. This fix addresses a minor aesthetic issue and enhances overall consistency.
Original PR description
There is a visual imbalance in the Knowledge article layout where horizontal padding is asymmetric in the editor content. How to reproduce: Open any Knowledge article and observe the horizontal spacing. The right gutter appears larger than the left one. Issue: The layout applies padding-left: var(--editor-gutter-size) and padding-right: calc(var(--editor-gutter-size) + 2rem), which creates a larger right gutter and makes the article content appear visually unbalanced. Resolution: Make the horizontal padding symmetric by applying the same offset on both sides using a logical property.This preserves sufficient spacing for floating UI elements while improving visual balance and ensuring consistency. Task-5222643
This update resolves an issue where bill creation from email users resulted in an error due to company mismatches. The fix forces the correct company association when a bill is created from an alias, ensuring compatibility and preventing the 'Incompatible companies' error. This ensures bills are created correctly when initiated via email.
Original PR description
Issue can be reproduced on a trial/SaaS db: - Have an alias [alias] set up for vendor bills journal - Create another company [company2] - Add user [user] that can only access [company2] - Add email…
Issue can be reproduced on a trial/SaaS db:
- Have an alias [alias] set up for vendor bills journal
- Create another company [company2]
- Add user [user] that can only access [company2]
- Add email [mail] as login/mail of that user
- Now from [mail] send a message, with pdf attachment, to [alias]
Issue: Mail will bounce back with an error
```
odoo.exceptions.UserError: Incompatible companies on records:
- “Draft Bill ” belongs to company “False” and “Journal” (journal_id: \'Vendor Bills\') belongs to another company.
```
This does not occur if [MAIL] is not associated with an user of company2
When the email is processed, the system recognizes the user email and
we have a minimal context.
Then, during move creation, `_compute_company_id` is called to assign
the company to the first accessible company.
However no accessible company is found because:
- current company would be the vendor bill journal's company ([company1])
https://github.com/odoo/odoo/blame/0aa729fd6492139869bab299d1091a54fd443c54/odoo/addons/base/models/res_company.py#L390
- because of the lack of `accessible_companies` in environment,
accessible companies is [user]'s company, [company2]
https://github.com/odoo/odoo/blame/0aa729fd6492139869bab299d1091a54fd443c54/odoo/api.py#L682
As result, no company is assigned to the newly created move and it
raises an error when inconsistencies are checked
A solution is to force the company whenever we detect the move is
created from an alias
[1] Full traceback
```
File "/home/odoo/src/odoo/18.0/addons/mail/models/mail_thread.py", line 1389, in message_process
thread_id = self._message_route_process(message, msg_dict, routes)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/18.0/addons/mail/models/mail_thread.py", line 1282, in _message_route_process
thread = ModelCtx.message_new(message_dict, custom_values)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/18.0/addons/account/models/account_move.py", line 5894, in message_new
move = super(AccountMove, move_ctx).message_new(msg_dict, custom_values=values)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/18.0/addons/mail/models/mail_thread.py", line 1424, in message_new
return self.create(data)
^^^^^^^^^^^^^^^^^
File "<decorator-gen-67>", line 2, in create
File "/home/odoo/src/odoo/18.0/odoo/api.py", line 479, in _model_create_multi
return create(self, [arg])
^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/18.0/addons/account/models/account_move.py", line 3125, in create
moves = super().create(vals_list)
^^^^^^^^^^^^^^^^^^^^^^^^^
File "<decorator-gen-40>", line 2, in create
File "/home/odoo/src/odoo/18.0/odoo/api.py", line 480, in _model_create_multi
return create(self, arg)
^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/18.0/addons/mail/models/mail_thread.py", line 267, in create
threads = super(MailThread, self).create(vals_list)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "<decorator-gen-0>", line 2, in create
File "/home/odoo/src/odoo/18.0/odoo/api.py", line 480, in _model_create_multi
return create(self, arg)
^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 5018, in create
records._check_company()
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 4368, in _check_company
raise UserError("\
".join(lines))
odoo.exceptions.UserError: Incompatible companies on records:
- “Draft Bill ” belongs to company “False” and “Journal” (journal_id: \'Vendor Bills\') belongs to another company.
```
opw-4232030This update fixes an issue where the X/Z report incorrectly identified refund lines based on negative quantity. Now, refund lines are correctly selected based on negative amounts, ensuring accurate reporting of returned items. This improves the reliability of sales data analysis.
Original PR description
Previously, on the X/Z report, the refund lines were the lines with a negative quantity. Now they are chosen if they have a negative amount. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update ensures that free products offered through loyalty programs are correctly applied as 100% discounts within the Point of Sale (POS) system. Previously, this behavior wasn't consistently replicated, and this fix corrects that to align with existing loyalty reward logic. This ensures accurate and consistent reward application for customers.
Original PR description
In the module sale_loyalty, a free product is handled as the reward_product from the loyalty reward with a 100% discount. We copy this behavior in the POS module. opw-4397720 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where the point-of-sale blackbox couldn't process products with negative prices, preventing easy refunds for deposit products. Now, the blackbox correctly handles both positive and negative prices within the same order, enabling seamless refund processing.
Original PR description
Previously, the blackbox did not accept the products to have a negative price. This was not allowing easy deposit products to be refunded. We now allow negative price product and mix of lines of positive and negative quantities as long as all the lines have the same price sign.
This update fixes a critical issue in the invoice processing cron job for Brazil (l10n_br_edi_services). Previously, the cron job was inefficient and prone to failure, rolling back progress and consuming IAP credits. The fix now processes invoices in smaller batches, committing progress after each, ensuring reliable and accurate invoice handling.
Original PR description
The cron searched with limit=batch_size and only retriggered when >batch_size records were found which never happens. It also ran all invoices in a single transaction so one failure rolled back all progress while IAP credits were already consumed. Search batch_size + 1 so remaining invoices are detected, and commit after each invoice to preserve progress. opw-5954211