Daily updates from Odoo
Monday, May 18, 2026
261 changes
19 changes
Enhancements to existing features
This update removes a restriction on the fiduciary VAT field within the connection wizard. This change provides more flexibility for users managing fiduciary accounts, allowing for adjustments as needed. The change is intended to improve the user experience and streamline processes related to VAT configuration.
Original PR description
This commit will remove the readonly on the fiduciary_vat in the connection wizard. It will give more flexibility for fiduciary. task-6148930 Forward-Port-Of: odoo/enterprise#115752
Resolved issues and error corrections
This update fixes a bug that prevented multi-day shift records from appearing on the live map. Now, technicians' locations and shifts are accurately displayed, and the map views (Gantt and Calendar) are optimized to show shifts on a daily basis, improving usability.
Original PR description
This commit changes the domains for the "My Map" and "Map By Resource" to only include shifts with a partner. Previously, it was including 'today' as part of the domain, which is incorrect as users may still want to view other days' shifts. task-6180159
This update ensures that all employee groups, regardless of their type, receive the correct employer-paid rent posting account in payroll. Previously, this setup was limited to a single group, leading to inconsistencies. This change maintains accurate and predictable payroll accounting.
Original PR description
Before this commit, the employer-paid rent setup was only applied to one employee group. This could leave other employee groups without the expected rent posting account. After this commit, the same rent posting setup is applied for each available employee group. This keeps payroll accounting behavior consistent. Task-6175007
A test was failing due to inconsistencies in how account reports were loaded during automated testing. This update ensures the test accurately reflects the system's behavior by generating the necessary account reports within the test itself. This resolves a runbot error and maintains the stability of the account reporting functionality.
Original PR description
Previously, embedded account reports always loaded the global account report. A fix introduced in version 19.0 changed this behavior so that the system now loads the most appropriate audit report,…
Previously, embedded account reports always loaded the global account report. A fix introduced in version 19.0 changed this behavior so that the system now loads the most appropriate audit report, specifically, the account report corresponding to the audit report's company (see: odoo/enterprise#101377). In version 19.1, a test was added to validate account report options. However, this test assumed that embedded account reports would always load the global account report (i.e., `account_reports.balance_sheet`). When tests run on runbot, demo data is not loaded. In that context, no report variants exist in the database, so the system falls back to the global account report, causing the test to pass. In environments where demo data is loaded, a report variant does exist, and the system correctly selects it instead of the global report. As a result, the test assertions are no longer valid and fail, leading to runbot errors. To address the issue, we will generate the account reports within the `setup` method of the test. This ensures that the assertions remain consistent, regardless of whether demo data is present. runbot-error-id~242235 Forward-Port-Of: odoo/enterprise#117075 Forward-Port-Of: odoo/enterprise#112486
This update fixes an issue where the departure date wasn't correctly displayed when an employee has multiple versions (e.g., contract and notice period). The change ensures the system accurately reflects the employee's departure date, improving payroll and reporting accuracy. This impacts how employees' end dates are tracked.
Original PR description
__ ## Short functional explanation of the error When we set the departure of an employee. The version is retrieved using the dismissal date. However, employees can work after their dismissal date,…
__ ## Short functional explanation of the error When we set the departure of an employee. The version is retrieved using the dismissal date. However, employees can work after their dismissal date, until their departure (in the case of a notice, for example). Therefore, the departure date should be chosen instead. ## Reproduction Steps 1. Go to Employees and create a new employee. In the Payroll tab, set a start date for their contract. Hit save. 2. This will create a version. You can see it top right, with the contract date. Click on the '+' next to it and set a date later. 3. Click on the cog in the top left and click End of Collaboration. Set an End Reason. Set the Dismissal Date to occur during the first version and the Departure Date to occur during the second version. Then, click Schedule. ### Expected behavior The Departure tab should appear when clicking on the second version, top right. ### Unexpected behavior The departure tab appears on the first version. ## Origin of the issue To select the version on which the departure occurs, we use this line of code: https://github.com/odoo/odoo/blob/be8b1bbad757fda27df579ce36cbc97324f58f62/addons/hr/models/hr_employee_departure.py#L117 `departure_date` should be used instead. __ opw-6079675 Forward-Port-Of: odoo/odoo#264667
This update ensures that employees on leave, even those in companies a user doesn't have access to, now correctly display a 'leave' icon in channel listings and avatar cards. Previously, the system was restricted by company access, leading to inaccurate status indicators. This change improves the user experience by providing a more complete and reliable view of employee availability.
Original PR description
* = hr_holidays Before this commit, when displaying the IM status icon for employees on leave of companies the user does not have access to, we would not display the `fa-plane` icon or the "Back on"…
* = hr_holidays Before this commit, when displaying the IM status icon for employees on leave of companies the user does not have access to, we would not display the `fa-plane` icon or the "Back on" indicator. Steps to reproduce: - Create a new company X - Create a new employee Y (with user) in company X - With a user who does not have access to company X open the General channel member list -> no leave icon, open the avatar card -> no icon This happens because since [1] the leave IM status icon is computed client side using the employee information, rather than computed on the `im_status` field itself. This however causes problem in a multi-company context due to the field `employee_ids@ResUsers` having a field-level domain restricting to the requesting user's active companies. This commit fixes the issue by fetching all of the user's employee_ids regardless of active company. [1] https://github.com/odoo/odoo/pull/210189 task-6191367 Forward-Port-Of: odoo/odoo#263024
This update resolves an issue where the chatbot restart button on the feedback panel could fail, leaving the live chat in an error state. Now, the button is disabled when the chatbot hasn't completed its process, preventing errors and ensuring a smoother user experience. This improves chatbot reliability.
Original PR description
Before this commit, it was possible to restart the chatbot on the feedback panel when closing the chat window. This was actually failing when the chatbot was stopped before the last step was completed and left the livechat state in error. Now, the button is simply disabled on feedback when we did not reach the end of the chatbot to avoid any issue. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258601 Forward-Port-Of: odoo/odoo#257891
This change fixes an issue where products were incorrectly displayed on the website when a user's website company was set to a different company than the product's assigned company. The update ensures product searches accurately reflect the user's current company setting, preventing incorrect product visibility and potential sales order errors. This improves data accuracy and sales process reliability.
Original PR description
# Setup Have 2 companies : A & B # How to reproduce - Set your website's company to Company B - Create product X : - Company : Company A - Published - Name : xyz - Go to Users > Any User > Acces…
# Setup
Have 2 companies : A & B
# How to reproduce
- Set your website's company to Company B
- Create product X :
- Company : Company A
- Published
- Name : xyz
- Go to Users > Any User > Acces Rights > Allowed Companies => leave only Company A
- Connect as that user on the website
- Go to the Shop tab and search xyz
# The problem
The product X is displayed, even though we currently use the company B's website and the product is limited to company A.
This causes problem later when Sales Order are created using that product.
If you set the Allowed Companies of the user to both Company A and Company B, then the product is correctly hidden
# Why
When you search something in the search bar, the server does a `_search_with_fuzzy()` that ends up calling a simple `model.search()`.
In our case, this search should not return product X because there is an `ir.rule` that hides product not in the current company :
https://github.com/odoo/odoo/blob/0bb5ac6c1a87367c1ebb343ad6e6e6e56188cf13/addons/product/security/product_security.xml#L34-L38
But the `website` module has some particular rule about setting the current company :
https://github.com/odoo/odoo/blob/0bb5ac6c1a87367c1ebb343ad6e6e6e56188cf13/addons/website/models/ir_http.py#L249-L261
So, in our case, since the user does not have company B in its allowed companies, then
`allowed_company_ids` = Company A. So `('company_id', 'parent_of', company_ids)` is trucy and the product is displayed
# Proposed solution
Doing the search with `with_company` raise an AccessError because the company is not present in the allowed_companies. Chaging the allowed companies logic seems risky because it
may lead to unintended side effects.
We instead enforce the website's company in the search's domain
opw-6115647
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#262635
Forward-Port-Of: odoo/odoo#260138This update fixes an issue where payroll account merges incorrectly combined employee analytic distributions, leading to inaccurate financial reporting. The change ensures that each employee's specific distribution is preserved, preventing the overwriting of percentage allocations when multiple employees use the same accounting account. This improves the accuracy of payroll accounting and financial data.
Original PR description
Steps to reproduce 1. Enable "Batch Account Move Lines" in the Payroll settings. 2. Configure two employees' versions with an analytic distribution on the same analytic account but with different…
Steps to reproduce
1. Enable "Batch Account Move Lines" in the Payroll settings.
2. Configure two employees' versions with an analytic distribution on the
same analytic account but with different percentages (e.g. {acc: 50}
for the first employee and {acc: 70} for the second).
3. Generate a payslip run containing both employees and validate it.
Issue
The generated account move aggregates the two payslips into a single
line whose analytic_distribution matches only the last employee being
processed; the other employee's percentage is silently lost.
`_get_existing_lines` decides whether an incoming line can merge into an
already accumulated one. When the incoming line has an analytic
distribution, the merge condition delegates to
`_check_partially_matching_accounts`:
https://github.com/odoo/enterprise/blob/e4a1326c7a8a74da7970aeaa9900c19d01634e31/hr_payroll_account/models/hr_payslip.py#L254-L271
https://github.com/odoo/enterprise/blob/e4a1326c7a8a74da7970aeaa9900c19d01634e31/hr_payroll_account/models/hr_payslip.py#L273-L283
That helper returns True as soon as any analytic account of the new
line appears anywhere in the existing line's distribution dict, without
comparing percentages. Two distributions such as {acc: 50} and
{acc: 70} share the same account, so the helper returns True, the
lines are merged, and whichever distribution ends up on the merged line
overwrites the other — the total amount is correct but the analytic
split is wrong.
The logic introduced in commit https://github.com/odoo-dev/enterprise/commit/e40a3166286a6bc546e9543b935233d2a110dc52 successfully addressed merging for rule-level distributions
with composite keys (e.g., {'13,7,12': 40}). However, that implementation is overly inclusive for employee-specific distributions.
It fails to differentiate between cases where the same analytic account is utilized across various employees but with different percentage allocations.
Because it only checks for an account overlap rather than a perfect distributional match, it incorrectly aggregates distinct financial dimensions into a single journal line
Solution
Compare the full analytic_distribution dict by strict equality. Lines
merge only when the distribution is identical (same keys AND same
percentages), keeping the batch feature anonymizing identically
configured employees while preserving one line per distinct
distribution.
opw-6102508
Forward-Port-Of: odoo/enterprise#114156This update corrects a minor visual glitch where overlays (like dialog boxes) sometimes appeared twice when initially displayed. The change improves the stability and reliability of the user interface by preventing unnecessary re-renders, resulting in a smoother user experience.
Original PR description
Before this commit, sometimes an overlay such as Dialog could flicker and render twice on mount. This comes from implementation details for detecting whether the overlay comes from shadow DOM or…
Before this commit, sometimes an overlay such as Dialog could flicker and render twice on mount. This comes from implementation details for detecting whether the overlay comes from shadow DOM or website, to determine which overlay container should decide to display the overlay [1]. The code relies on presence of the root id in the DOM and overlay container was relying on presence of `ref.el` to get the root id from DOM. This was motivated by `isVisible(overlay)` whose computation was also relying on the ref [2] but this has the drawback that `ref.el` was sometimes not yet available immediately on 1st rendering. Solution of [1] was to re-renderer whenever `ref.el` is set, but another solution that prevents a re-render is to have the root id in the `env`. This commit changes the solution of [1] by instead `rootId` in the `env`. The new solution has the benefit to not require a re-render of the overlay container, which prevents undesirable flickers that may happen on mounting an overlay for the 1st time. [1]: odoo#169264 [2]: odoo#154349 Forward-Port-Of: odoo/odoo#263860
This update fixes an issue where the average inventory cost calculation in the 'Inventory at Date' report was inaccurate. Specifically, when using the AVCO cost method, the calculation was incorrectly influenced by the standard price instead of actual costs, leading to incorrect reported values. This ensures accurate inventory valuation reports.
Original PR description
When we open the Stock report at date, we filter out moves anterior to that date and, if the cost method is AVCO, Odoo recompute the `avg_cost` up to that point of time with `_run_average_batch`. However, when iterating over the moves, `move._get_value(at_date)` might return a value calculated from the current standard_price if the move is not associated with any accounting entry or PO/SO. Steps to reproduce the issue: 1. Create a new product with AVCO cost method 2. On the product form, set the cost to 5$ 3. Manually adjust the inventory to 5 units 4. Create a PO and receive 5 products at a unit cost of 10$ > Total value: 75$ > Total quantity: 10 units > avg_cost: 7.5$ 5. Navigate to Stock report and run "Inventory at Date" at current time 6. avg_cost is 8.75$ instead of 7.5$ Ticket: opw-5951072 Forward-Port-Of: odoo/odoo#257705 Forward-Port-Of: odoo/odoo#253659
This update resolves an issue where livechat conversations wouldn't automatically mark as read after ending. Now, the system correctly triggers the 'read' state when a conversation is in focus, ensuring agents see accurate read statuses for closed chats. This improves agent efficiency and provides a clearer view of ongoing interactions.
Original PR description
**Description of the issue this PR addresses:** Previously, when a livechat conversation ended, it was never automatically marked as read. The existing `mark_as_read` mechanism depends on the…
**Description of the issue this PR addresses:** Previously, when a livechat conversation ended, it was never automatically marked as read. The existing `mark_as_read` mechanism depends on the composer being focused, but ended livechat conversations hides the composer, and the chat window does not focus the thread automatically (focus only happens on explicit click). This made it impossible for the read state to be triggered through the normal path, leaving agents with persistent unread indicators on closed livechat conversations. **Desired behavior after PR is merged:** - Focus the composer when present. - Focus the conversation otherwise. This ensures the read state is correctly triggered when the conversation is effectively in focus. task-[5900038](https://www.odoo.com/odoo/project/1519/tasks/5900038) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#263607 Forward-Port-Of: odoo/odoo#253609
This update fixes a technical issue related to how Point of Sale orders are created. Specifically, it allows for the inclusion of important data during order generation, streamlining the process and ensuring more complete order information. This change is related to a larger effort to improve the Enterprise version of Odoo.
Original PR description
In this commit: ================ This commit allows `getEmptyOrder()` to receive `data` and apply it when creating an order. Task-6217580 Related Ent PR-https://github.com/odoo/enterprise/pull/117378
This update resolves an issue where depositing money in Point of Sale orders incorrectly triggered a preset selection popup. The change ensures that deposit orders are immediately identified as 'settling accounts,' preventing the popup and streamlining the deposit process. This improves the user experience for cash transactions.
Original PR description
Before this commit: ==================== depositing money for a partner in PoS with presets enabled could incorrectly trigger the preset selection popup. This happened because the order was not marked as is_settling_account early enough, so the preset selection logic did not ignore deposit orders. After this commit: ===================== is_settling_account is initialized during order setup and seeded immediately when the deposit order is fetched or created. As a result, deposit orders correctly bypass the preset selection flow. Task-6217580 Related Comm. PR-https://github.com/odoo/odoo/pull/264572
This update fixes an issue where Colorado state income tax calculations resulted in a positive value on payslips, which is incorrect. The fix aligns with established payroll tax principles, ensuring that taxes are always withheld from employee paychecks, not reported as refunds. This ensures accurate payroll reporting.
Original PR description
## Issue When generating a payslip for an employee of a company located in Colorado, the *CO State Income Tax* could end up positive. ## Steps to reproduce 1. Install *United States - Payroll*…
## Issue
When generating a payslip for an employee of a company located in Colorado, the *CO State Income Tax* could end up positive.
## Steps to reproduce
1. Install *United States - Payroll* (`l10n_us_hr_payroll`)
2. Set the current company's State to Colorado
3. Create an employee and a contract
- Wage: $0
- (Set the contract's status to *Running*)
- (In the payroll tab) State Withholding Allowance: $1000
4. Create a Payslip for the employee
- Structure: *"United States: Regular Pay"*
5. Compute Sheet
6. **In the _Salary Computation_ tab, the _CO State Income Tax_ line has a positive value**
## Justification
This fix is similar to the one applied for the AL(abama) state income tax by https://github.com/odoo/enterprise/commit/f0eeb55f1e3cf965c6a409675813d4a699e5fca6. That modification was justified by CAS (PO of US localizations for Payroll) in opw-5137280:
> *"Payroll taxes are always funds withheld from employee's paychecks, if there is a positive value it means the tax is a refund, not a withholding. Refunds happen when individuals file their income."*
## Note to reviewer
The test [`test_069_al_state_tax_0_income`](https://github.com/odoo/enterprise/blob/219d2a797ee2099c9d77c2defc9c9c5e1d504ffe/test_l10n_us_hr_payroll_account/tests/test_salary_rules.py#L957-L989) (added by the aforementioned commit https://github.com/odoo/enterprise/commit/f0eeb55f1e3cf965c6a409675813d4a699e5fca6) is wrongly indented and thus never executed. The test passes with the dedicated fix, and fails without it, as expected. Let me know if you want me to indent it correctly (in this commit or in an additional one).
opw-5999856
Forward-Port-Of: odoo/enterprise#117232
Forward-Port-Of: odoo/enterprise#112724This update corrects a bug where the 'Purchase Orders' button disappeared when changing an Analytic Account's plan. The fix adjusts how the system identifies purchase orders linked to analytic accounts, ensuring the button remains visible regardless of the plan setting. This ensures users can always access purchase order details linked to their accounts.
Original PR description
# How to reproduce - Enable the analytic accounting in the settings - Create a PO - Add a PO line - Set the Analytic Distribution of that PO line to an Analytic Account of your choice - Confirm the…
# How to reproduce
- Enable the analytic accounting in the settings
- Create a PO
- Add a PO line
- Set the Analytic Distribution of that PO line to an Analytic Account of your choice
- Confirm the PO
- Create a Vendor Bill from that PO and confirm the VB
- Go to the Analytic Account chosen before
- Change the Plan of that Analytic Account
# The problem
When the Plan is not set to the "Project Plan", the Purchase Orders smart button disappears
# Why
The Purchases Orders smart button is invisible if the variable purchase_order_count is equal to 0. That field is computed by a function that does a search with the following domain :
```py
[('order_line.invoice_lines.analytic_line_ids.account_id', '=', account.id)]
```
When we change the Plan of the Analytic Account, analytic_line_ids.account_id is set to NULL, so the search return nothing.
Why is that field set to NULL ?
Well, to reference its plan, an Analytic Line does not use a python-defined field. In fact, each time a new Analytic Plan is added to the database, a new column is added to the Analytic Line model. That column's name is x_plan{plan.id}_id or, for the specific case of the "Project Plan", it is account_id
When the Plan of an Analytic Account is changed, it takes every Analytic Line associated with that Plan and switch which column containing the id of the Analytic Account.
Take for exemple the following Analytic Line :
```
(account_id = NULL, x_plan2_id = NULL, x_plan3_id = 1)
```
When the associated Analytic Account's Plan is changed to the "Project Plan", it becomes :
```
(account_id = 1, x_plan2_id = NULL, x_plan3_id = NULL)
```
So, we need to adapt to search so that it uses the right plan's name.
opw-5897037
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#263652
Forward-Port-Of: odoo/odoo#248236This update corrects a bug where the payment button was incorrectly displayed, preventing users from completing transactions. Previously, the system relied on an outdated check for KYC completion, now the system correctly determines if payment initiation is active, ensuring the payment flow functions properly.
Original PR description
Currently, is_payment_enabled is used to determine whether the payment button should be displayed. However, this field only indicates that the TPP / institution allow payment initiation, not that it's active. Since 19.2, `/initiate_payment` no longer checks whether the KYC flow has been completed before initiating a payment. As a result, users can now reach a blocked state where the payment flow is exposed but cannot actually proceed. No task ID
This update fixes a potential issue where multiple payslips for the same month (specifically for employees not on contract) could incorrectly double-count worked hours when calculating the employment bonus. The change ensures accurate bonus calculations by only considering worked hours once, improving payroll accuracy for this employee group.
Original PR description
In the case of out of contract payslips, we might have multiple payslips with worked day lines for the same month. In that case, we need to be careful to not count these hours twice when computing the employment bonus, which depends on the total "workable" hours for the month. task-6208125
This update ensures Odoo correctly sets the `toStateCode` field for SEZ transactions when generating e-waybills. Previously, this was missing, causing API errors and preventing shipments from being processed. This fix ensures compliance with e-waybill regulations and avoids disruptions to international trade.
Original PR description
For SEZ transactions, the e-waybill API requires `toStateCode` to be set to 99. Previously, this value was not enforced, leading to API errors: - 373 for export transactions - 641 for supply and CKD/SKD/lots supply This fix updates the logic to derive `toStateCode` based on the invoice's GST treatment. When the transaction is identified as SEZ, `toStateCode` is correctly set to 99, ensuring compliance with e-waybill requirements and preventing API failures. task-6117694 Forward-Port-Of: odoo/odoo#259327
13 changes
Enhancements to existing features
This update aligns the subheaders and numerical data within Odoo's financial reports, ensuring a more professional and consistent visual appearance. Previously, the formatting was uneven, and this change corrects that to improve readability and user experience. This is a minor improvement to the reporting system.
Original PR description
Before this commit, subheaders of numeric columns were centered, while the figures in the columns were aligned to the end. This commit ensures that both the subheader and the figures are aligned the same way (center or end). task-6197223 Forward-Port-Of: odoo/enterprise#116578
Resolved issues and error corrections
This update resolves an issue where the payroll report would fail if a new employee didn't have a start date defined. The fix ensures the report checks for a start date before attempting comparisons, preventing errors and improving report reliability. This ensures accurate payroll processing.
Original PR description
If there is no start date on the veriosn, the report will fail as it'll try to compare a bool with a datetime. So we check first that there is a start date
This update ensures the reprint button is consistently visible and functional on all devices sharing the same Point of Sale session. Previously, the reprint button was only available on the device that initially sent the order to the preparation printer. This change improves the user experience and streamlines order fulfillment.
Original PR description
When sending an order to a preparation printer, the reprint button was invisible on any device other than the one that originally sent the order. This happened because `lastPrints` was stored in the order's `uiState`, which is local to each device. Moving it to `last_order_preparation_change` — which is shared across devices in the same session — fixes the issue. The reprint button is now visible and functional on all devices sharing the same session. --- Task: https://www.odoo.com/odoo/project/1737/tasks/6196913 Forward-Port-Of: odoo/odoo#263094
This update ensures that when reserving stock with packaged items, the system correctly considers the total quantity available, regardless of how it's divided into full packaging units. Previously, large stock levels were incorrectly limiting reservation quantities. This fix improves the accuracy of stock availability calculations and prevents over-reservation issues.
Original PR description
Issue ----- Forced full packaging reservation setting is ignored when there is a big quant in stock. Steps to reproduce ----- - Enable packagings - Create a product category "Super Category" -…
Issue
-----
Forced full packaging reservation setting is ignored when there is a big quant in stock.
Steps to reproduce
-----
- Enable packagings
- Create a product category "Super Category"
- Reserve Packagings: Reserve Only Full Packagings
- Create a stored product "AAA"
- Product Category: Super Category
- 50 units on hand
- Packaging: 6-Pack (6 units)
- Create a delivery for 15 units of AAA
> Reservation is made for 15 units
Cause
-----
The rounding to a multiple of the packaging quantity takes the stock quant into account. For our example case, we have 8 full 6-Packs on hand, so the `available_quantity` gets set to 48 when doing
https://github.com/odoo/odoo/blob/5e458236ca2ff2ab92c4893495e7a721be902c40/addons/stock/models/stock_quant.py#L923-L925
This leads to the reservation quantity being min(15, 48) = 15
https://github.com/odoo/odoo/blob/5e458236ca2ff2ab92c4893495e7a721be902c40/addons/stock/models/stock_quant.py#L927
-----
Ticket:
opw-5974333
Forward-Port-Of: odoo/odoo#263114
Forward-Port-Of: odoo/odoo#257342This update fixes an issue where list markers with trailing empty lines weren't correctly styled, and ensures font sizes are applied consistently across list items regardless of how they were created (inline styles, dropdowns, or links). It also resolves conflicts between background and font colors within lists.
Original PR description
### Steps to reproduce: **Issue 1:** - Create a list with multiple items and leave the last item empty. - Press Ctrl + A to select all content. - Apply a text color from the toolbar. - The list…
### Steps to reproduce: **Issue 1:** - Create a list with multiple items and leave the last item empty. - Press Ctrl + A to select all content. - Apply a text color from the toolbar. - The list marker of the last item does not receive the color. **Issue 2:** - Create a list and type some text. - Press Ctrl+A to select all. - Apply a font size via the font-size input (inline style=`font-size: ...`). - Then apply a font size via the font-size dropdown (class-based). - Font size from the dropdown is not applied. **Issue 3:** - Create a list item and type some text. - Convert the text into a link. - Copy the link. - Press Enter and paste the link. - Select the entire list using the mouse. - Apply font size & observe that font size is not applied to some list items. **Issue 4:** - Go to Todo and create a list. - Select all items (Ctrl + A). - Apply a background color class from the toolbar. - Apply a font color using inline styling. - Observe that the font color is not visible. ### Description of the issue/feature this PR addresses: - Full-selection detection relied on Range.isPointInRange() checks on list item leaf nodes. When a list item ended with a trailing empty line, the selection often stopped on the `<li>` element and did not include the `<br>` placeholder. As a result, such list items were not considered fully selected when applying text color, and their markers remained unstyled. - Applying a font-size class on a fully-selected list item could leave existing inline font-size on list item, so new class didn’t take effect. - Creating links inside list items & repeated copy-paste operations left empty text nodes (feff cleanup). Manual selection doesn't include these nodes, `areNodeContentsFullySelected` reports that list item is not fully selected. As a result, some list items were not considered fully selected, and font size was not applied. - Background color `(bg-*)` classes also define a color property. When a font color is applied, the color is set on the `<li>`, but the nested `font.bg-*` element’s color takes precedence, causing the applied font color to be overridden. ### Desired behavior after PR is merged: - List items with trailing empty line are now treated as fully selected, even when selection ends before the `<br>` placeholder. - Clear any existing font-size styles on the list item before applying the new font-size class, so the dropdown font size applies correctly. - Empty text nodes are removed before applying font size, ensuring full list item selection and consistent font-size application. - When a list item (li) has a text color (inline style or text-* class), and nested font element has only a background color class then font element now inherits the color from the li. task - 5454639 Forward-Port-Of: odoo/odoo#264586 Forward-Port-Of: odoo/odoo#241827
This update fixes a UI inconsistency where the ‘Add Property’ button wasn’t reliably visible during property editing, especially when switching between records. Now, the button correctly resets to ‘Edit Properties’ when switching records or creating new ones, ensuring a smoother and more intuitive user experience for property editing.
Original PR description
Before this commit: - The “+ Add Property” button was not visible when switching between notebook pages if it was present initially. - when we are doing edit properties from the cog menu and without doing save properties if we are creating new record or switch to other record at that time button still shows “Save Properties.” leading to inconsistent UI behavior. After this commit: - The “+ Add Property” button remains visible when switching between pages. - When in property edit mode, switching records or creating a new record now correctly resets the button state back to “Edit Properties”, ensuring consistent UI behavior. task-6051322 ENT PR: https://github.com/odoo/enterprise/pull/113248 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a UI inconsistency in the worksheet property editor. Previously, the ‘Add Property’ button would remain visible even when switching between records or creating new ones. Now, the button correctly resets to ‘Edit Properties’ ensuring a smoother and more reliable editing experience for users.
Original PR description
Before this commit: - The “+ Add Property” button was not visible when switching between notebook pages if it was present initially. - when we are doing edit properties from the cog menu and without doing save properties if we are creating new record or switch to other record at that time button still shows “Save Properties.” leading to inconsistent UI behavior. After this commit: - The “+ Add Property” button remains visible when switching between pages. - When in property edit mode, switching records or creating a new record now correctly resets the button state back to “Edit Properties”, ensuring consistent UI behavior. task-6051322
This update clarifies the display of extra prices when customers select combo items in the POS system. Previously, customers were confused about additional costs, leading to inquiries about 'too much' charges. This change ensures transparent pricing and avoids customer confusion, improving the overall checkout experience.
Original PR description
The display for the extra price during the combo selection was not very clear. The customer were not aware of the additional cost that were applied when choosing some elements that were not included but extra. This led to customer asking cashier if there was a problem because they were paying "too much" when the computation was actually correct but not clear enough. task-id: 6142095 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261264 Forward-Port-Of: odoo/odoo#260705
This update fixes an inconsistency in how leave durations are calculated for employees using credit time calendars. Previously, the system miscalculated leave times when attendance was split between regular and credit time periods. This change ensures accurate leave duration tracking, particularly for employees with complex work schedules.
Original PR description
purpose: when creating leaves for employees with credit time calendar, the duration computation is differnet with similar configrations (regular attendance in the morning then credit time in the afternoon and the opposite) backporting the fix done in this commit which overrides `_work_intervals_batch` to exclude intervals that count as absense: https://github.com/odoo/odoo/pull/239420/changes/0168eb28d8986969c30a08ef41de8eff9aaa765a task-id: 6212942 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a performance issue related to payroll processing in Hong Kong. The change moves a key calculation to the standard Odoo environment, streamlining the process and improving overall system speed. This ensures accurate and efficient payroll calculations for Hong Kong users.
Original PR description
backporting the fix done in this commit which moves `_work_intervals_batch` to std: https://github.com/odoo/enterprise/pull/101790/changes/70bfc31c3917d3bd96db63b2543937fb151670a1 task-id: 6212942
This update corrects a bug that prevented users from selecting additional Service-type Sale Order Lines (SOLs) when creating timesheets linked to Sales Orders. The fix ensures that timesheets can now correctly associate with all relevant SOLs, regardless of the default SOL selection. This improves the accuracy and usability of timesheet reporting.
Original PR description
Steps to reproduce: - Install sale_timesheet - Create a Sales Order with multiple Service-type Sale Order Lines - Create a timesheet from the Sales Order stat button or from the Timesheets app Issue: It is not possible to select another SOL. If the default SOL is removed. Cause: The so_line domain does not include SOLs with `qty_delivered_method = 'timesheet'`. Fix: Include timesheet SOLs in the domain. Task-5969200
This update corrects a bug where the 'Purchase Orders' button disappeared when changing an Analytic Account's plan. The fix adjusts how the system identifies purchase orders linked to analytic accounts, ensuring the button remains visible regardless of the plan setting. This ensures users can always access purchase order information related to their accounts.
Original PR description
# How to reproduce - Enable the analytic accounting in the settings - Create a PO - Add a PO line - Set the Analytic Distribution of that PO line to an Analytic Account of your choice - Confirm the…
# How to reproduce
- Enable the analytic accounting in the settings
- Create a PO
- Add a PO line
- Set the Analytic Distribution of that PO line to an Analytic Account of your choice
- Confirm the PO
- Create a Vendor Bill from that PO and confirm the VB
- Go to the Analytic Account chosen before
- Change the Plan of that Analytic Account
# The problem
When the Plan is not set to the "Project Plan", the Purchase Orders smart button disappears
# Why
The Purchases Orders smart button is invisible if the variable purchase_order_count is equal to 0. That field is computed by a function that does a search with the following domain :
```py
[('order_line.invoice_lines.analytic_line_ids.account_id', '=', account.id)]
```
When we change the Plan of the Analytic Account, analytic_line_ids.account_id is set to NULL, so the search return nothing.
Why is that field set to NULL ?
Well, to reference its plan, an Analytic Line does not use a python-defined field. In fact, each time a new Analytic Plan is added to the database, a new column is added to the Analytic Line model. That column's name is x_plan{plan.id}_id or, for the specific case of the "Project Plan", it is account_id
When the Plan of an Analytic Account is changed, it takes every Analytic Line associated with that Plan and switch which column containing the id of the Analytic Account.
Take for exemple the following Analytic Line :
```
(account_id = NULL, x_plan2_id = NULL, x_plan3_id = 1)
```
When the associated Analytic Account's Plan is changed to the "Project Plan", it becomes :
```
(account_id = 1, x_plan2_id = NULL, x_plan3_id = NULL)
```
So, we need to adapt to search so that it uses the right plan's name.
opw-5897037
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#263652
Forward-Port-Of: odoo/odoo#248236This update fixes an issue where the total working hours weren't being displayed correctly in the Planning Gantt view when the view wasn't grouped by resources. The change ensures accurate working hour calculations are reflected in the total row, regardless of grouping settings, improving planning accuracy.
Original PR description
Issue: ---------------------------------------- In the Planning Gantt view when we don't group by resources, the total row is not considering the working hours. Steps to reproduce:…
Issue: ---------------------------------------- In the Planning Gantt view when we don't group by resources, the total row is not considering the working hours. Steps to reproduce: ---------------------------------------- - Open Planning - Remove the default group by resources - Have at least a planning slot for a non-flexible employee - The total row doesn't take the working schedule into account Cause: ---------------------------------------- Since [an improvement,](https://github.com/odoo/enterprise/commit/cc35e1a4729453e4f788034a94402ab048eadfcb) the working hours data in given to the `PlanningGanttRenderer` through the progress bars data. This is an issue because the progress bars are only there if we group by resources. ([src](https://github.com/odoo/enterprise/blob/423ab064847dd41d36778a812390e3bec53ba4dc/planning/models/planning_slot.py#L2669-L2678)) Solution: ---------------------------------------- In this commit we partially revert the commit adding the working intervals in the progress bars. Instead of doing it in `_gantt_progress_bar_resource_id()` we create a new method `_get_gantt_planning_data()` which is called directly in `get_gantt_data()` and returns useful information even when there are no progress bars. opw-5507063 Forward-Port-Of: odoo/enterprise#116824 Forward-Port-Of: odoo/enterprise#112522
17 changes
Enhancements to existing features
This update enhances the Windows IoT version tracking by automatically recording the build date in a VERSION file, mirroring the format used for Raspberry Pi IoT images. Additionally, the Windows version is now logged upon startup, providing clearer identification of the installed version. This ensures consistent versioning across IoT deployments.
Original PR description
Before this commit, the Windows IoT version was hardcoded to '23.11'. After this commit, the installer now writes a VERSION file to the IoT install directory (which will remain between git checkouts). This file contains the build date in `YYYY.MM.DD` format, the same as the current Raspberry Pi IoT images. In addition, the Windows version is now logged on startup. task-6196801 **Image version:** <img width="306" height="39" alt="image" src="https://github.com/user-attachments/assets/f0252d44-4b5c-4bb5-aac8-4b8f56dc6ee2" /> **Windows version:** > INFO ? odoo.addons.iot_drivers.main: Windows version: Windows-11-10.0.26100-SP0 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#263089
Resolved issues and error corrections
This update fixes an issue where the call preview overlay overlapped with call actions on smaller screens, making it difficult to use. The change ensures the preview content remains readable and accessible, improving the user experience for all users. This resolves a previous bug reported in #235707.
Original PR description
Purpose of this PR: Since #235707, the call preview content could overlap the call actions on small screens. This commit prevents the overlap and keeps the preview readable. Before/After: <table> <tr> <td> <img width="398" height="691" alt="image" src="https://github.com/user-attachments/assets/da7eaf5b-387e-439f-80bb-cb6dd8c07454" /> <td> <img width="391" height="691" alt="image" src="https://github.com/user-attachments/assets/384a08d1-6b51-490a-8b57-267a3bb1b3d5" /> </table> task-[6201269](https://www.odoo.com/odoo/project/1519/tasks/6201269) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a bug that prevented users from opening the payroll module when creating overtime attendance records. The fix addresses an issue where the system was receiving duplicate overtime data, causing an error. This ensures payroll processing functions correctly for all attendance scenarios.
Original PR description
Steps to reproduce: - Install `hr_work_entry_attendance` module - Create an Employee and set contract date - Attendance > Create attendance for Employee(eg: [image](https://www.awesomescreenshot.com/image/58801595?key=ecc9a2f5ec51cb569432e5bf580540f9)) - Add a new line in Overtime Details (eg: [image](https://www.awesomescreenshot.com/image/58801650?key=f5a886217299bca8bbece27839377bf4)) - Try to open `Payroll` Traceback: `ValueError: Expected singleton: hr.attendance.overtime.line(309, 310)` At [1], this error occurs because we are getting multiple records of `hr.attendance.overtime.line` in `overtime_intervals`. [1]: https://github.com/odoo/enterprise/blob/62f59f87a513a86a61f871ca743e7f7b04926a82/hr_work_entry_attendance/models/hr_version.py#L82 sentry-7251235434
This update fixes a problem where users without sufficient accounting permissions would encounter errors when retrieving component data from purchase orders created by others. The change ensures proper access rights are granted, allowing all users to accurately scrape component information, regardless of who created the original order. This improves data visibility and reporting.
Original PR description
When scraping the component of a MO created by another user you could get an access error saying you don't have write access on account analytic lines. Steps to reproduce: ------------------- *…
When scraping the component of a MO created by another user you could get an access error saying you don't have write access on account analytic lines. Steps to reproduce: ------------------- * Install timesheet_grid and project_mrp_account * Create product A, storable * Create product B with a cost of 20 and also storable * Update the available quantity of product B * Create a BoM for product A, it should only require one product B * Update Marc Demo access right and make sure he doesn't have access to any accounting stuff and he has atleast timesheet approver * Create a first MO for 1 product A and produce it * Create a second MO for 1 prodcuct A but just confirm it * Login as Marc Demo and try to scrap the component of the second MO > Observation: You get an access error here https://github.com/odoo/odoo/blob/d98afdc08b46bf458eaa287ea882cc7663286a59/addons/stock_account/models/analytic_account.py#L95 opw-5954989 Forward-Port-Of: odoo/odoo#261588 Forward-Port-Of: odoo/odoo#255824
This update fixes inconsistencies in the XML structure used for Swedish bank payments (l10n_se_bban). Specifically, it ensures the correct format for bank identification details, enhancing compatibility with Swedish payment systems and improving data accuracy. This resolves a technical issue related to ISO 20022 compliance.
Original PR description
Here is few fixes added to the swedish iso 20022 XML: - CdtrAgt seems to be always mandatory, change the condition in `_skip_CdtrAgt` to always use the CdtrAgt if payment_method is iso20022_se - The `_is_se_bban` is too restrictive, this should be always True when payment method is swedish iso - The `FinInstnId` node can either contain BIC or ClrSysMmbId. But as ClrSysMmbId seems to change from one bank to another, it's more relevant to always use the BIC. opw-5395736 Forward-Port-Of: odoo/enterprise#114662
This update fixes an issue where self-order receipts incorrectly displayed 'Service at Table' instead of 'Pickup At Counter' when a customer selected a counter service without identification. This ensures accurate receipt information for self-order transactions, improving the customer experience and order accuracy.
Original PR description
When selecting a preset with a service at counter but without identification, after a self order the receipt header was wrongly showing "Service at Table" instead of "Pickup At Counter". This is now fixed. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#264115
This update corrects a bug where the 'Purchase Orders' button disappeared when changing an Analytic Account's plan. The fix adjusts how the system identifies purchase orders linked to analytic accounts, ensuring the button remains visible regardless of the plan setting. This ensures users can always access purchase order details based on their accounting setup.
Original PR description
# How to reproduce - Enable the analytic accounting in the settings - Create a PO - Add a PO line - Set the Analytic Distribution of that PO line to an Analytic Account of your choice - Confirm the…
# How to reproduce
- Enable the analytic accounting in the settings
- Create a PO
- Add a PO line
- Set the Analytic Distribution of that PO line to an Analytic Account of your choice
- Confirm the PO
- Create a Vendor Bill from that PO and confirm the VB
- Go to the Analytic Account chosen before
- Change the Plan of that Analytic Account
# The problem
When the Plan is not set to the "Project Plan", the Purchase Orders smart button disappears
# Why
The Purchases Orders smart button is invisible if the variable purchase_order_count is equal to 0. That field is computed by a function that does a search with the following domain :
```py
[('order_line.invoice_lines.analytic_line_ids.account_id', '=', account.id)]
```
When we change the Plan of the Analytic Account, analytic_line_ids.account_id is set to NULL, so the search return nothing.
Why is that field set to NULL ?
Well, to reference its plan, an Analytic Line does not use a python-defined field. In fact, each time a new Analytic Plan is added to the database, a new column is added to the Analytic Line model. That column's name is x_plan{plan.id}_id or, for the specific case of the "Project Plan", it is account_id
When the Plan of an Analytic Account is changed, it takes every Analytic Line associated with that Plan and switch which column containing the id of the Analytic Account.
Take for exemple the following Analytic Line :
```
(account_id = NULL, x_plan2_id = NULL, x_plan3_id = 1)
```
When the associated Analytic Account's Plan is changed to the "Project Plan", it becomes :
```
(account_id = 1, x_plan2_id = NULL, x_plan3_id = NULL)
```
So, we need to adapt to search so that it uses the right plan's name.
opw-5897037
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#263652
Forward-Port-Of: odoo/odoo#248236This update resolves an issue where intercompany invoices were flagged with an incorrect tax validation error. The fix ensures that taxes are correctly recalculated when processing invoices between companies with different fiscal positions, improving the accuracy of intercompany accounting. This prevents disruptions to cross-border transactions.
Original PR description
**Steps to reproduce:** * Install the *Accounting* module. * Install localisation modules for two different regions: * *Belgium* (**l10n_be**) * *Luxembourg* (**l10n_lu**) * Configure two companies,…
**Steps to reproduce:** * Install the *Accounting* module. * Install localisation modules for two different regions: * *Belgium* (**l10n_be**) * *Luxembourg* (**l10n_lu**) * Configure two companies, each assigned to one of the above regions. * Create fiscal positions: * In the Belgium company, create a fiscal position for Luxembourg. * In the Luxembourg company, create a fiscal position for Belgium. * Go to *Accounting > Configuration > Settings*. Enable *Inter-Company Transactions*. Enable synchronization of *Vendor Bills and Invoices* for both companies. * Create an invoice in the Luxembourg company. Select a partner belonging to the Belgium company. Add a product with applicable taxes. **Observed behavior:** * A validation error is raised: 'This entry contains taxes that are not compatible with your fiscal position. Please check the country set in the fiscal position and in your tax configuration.' **Cause:** * During intercompany bill creation, a foreign fiscal position is applied before recomputing taxes. * If no mapped foreign taxes exist, the system keeps domestic purchase taxes. * This leads to a mismatch between taxes and fiscal position, triggering the validation error. **Fix:** * Add a safeguard in *_inter_company_create_invoices()*. * After *_inter_company_sync_invoice_line_taxes()* recomputes taxes, *_inter_company_has_incompatible_fiscal_position_taxes()* checks whether the fiscal position is incompatible. * If incompatible, the fiscal position is removed and taxes are recomputed without it. opw-6103671 Forward-Port-Of: odoo/enterprise#117450 Forward-Port-Of: odoo/enterprise#115085
This update fixes a minor issue where some work entry names within the HR module were displaying incorrect spellings. The team corrected the data files to ensure accurate and consistent naming conventions, improving the overall user experience. This change was driven by a reported issue (opw-6090081).
Original PR description
Issue: ---------------------------------------- Some work entry names are wrong. Solution: ---------------------------------------- Change the data files. opw-6090081
This update fixes an error in the Italian Annual VAT Report that was incorrectly calculating the balance amount for line VF25. The fix ensures the report accurately reflects the total taxable base as required by Italian tax regulations. This ensures compliance with Italian tax reporting standards.
Original PR description
### Issue before this commit: In the Italian Annual VAT Report, the balance (base amount) for line VF25 displays incorrect values. Instead of computing the sum of the taxable bases for the passive…
### Issue before this commit: In the Italian Annual VAT Report, the balance (base amount) for line VF25 displays incorrect values. Instead of computing the sum of the taxable bases for the passive operations, the report erroneously mixes tax amounts into the balance column. ### Steps to reproduce the issue: 1. Download Accounting and l10n_it 2. Go to Tax Report and visualize the Annual Tax Report (IT) 3. Go to VF VAT Report 4. See the VF25 is mixing taxes and balances ### Cause of the issue: The root cause lies in the aggregation_formula definition for the tax_annual_report_line_VF25 record. The formula was incorrectly configured to aggregate the .tax expressions for lines VF1 to VF13 (VF1.tax + VF2.tax + ...) instead of their respective .balance expressions, while correctly using .balance for the remaining lines (VF17 to VF24). https://github.com/odoo/odoo/blob/878c08cf522a3278b4e6ff5f3d18444989e9998d/addons/l10n_it/data/tax_report/annual_report_sections/vf.xml#L286-L299 It's just a typo in this commit: https://github.com/odoo/odoo/pull/164064/changes/f292ba119d6376dbfb3c1fac4960c9c56a74d938 ### Reason to introduce the fix: From documentation https://www.agenziaentrate.gov.it/portale/documents/20143/9602686/IVA_ANNUALE_2026_istr.pdf/2a42fb92-1b76-229a-d0f5-06069d79b514?t=1768504755711 : > Rigo VF25, colonna 1, va indicato il totale degli imponibili determinato sommando gli importi riportati ai righi da VF1 a VF23, colonna 1, diminuito dell’importo di cui al rigo VF24. In colonna 2 va indicato il totale delle imposte determinato sommando gli importi delle colonne 2 dei righi da VF1 a VF13. opw-6172791 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#264379
This update fixes an issue where users without write access to the Fiskaly Point of Sale (PoS) module would receive an access error when attempting to authenticate with an expired token. The fix ensures that the correct error message is displayed, improving the user experience for AT companies using the Fiskaly integration.
Original PR description
When trying to auth directly from the PoS when the token expires, if you are logged in with a user that doesn't have write access to the PoS. You would get an access error. Steps to reproduce: ------------------- * Setup Fiskaly in an AT company * Open PoS and try to make a sale * To fake the token expiration I modified the code so that the request always return 401 status code > Observation: You get an access error opw-5925203 Forward-Port-Of: odoo/enterprise#112474
This update corrects a technical issue where an approval rule was being applied incorrectly due to a duplicate XML ID. By renaming the duplicate ID, we've ensured that approval rules are applied correctly based on user and manager roles, improving the reliability of the approval process. This resolves a potential inconsistency in how approvals were handled.
Original PR description
The XMLID `approval_approver_manager` was defined twice, causing the rule to be applied with the last evaluated access configuration for both `group_approval_user` and `group_approval_manager`. This commit renames the first occurrence of the duplicated XMLID to `approval_approver_user` to restore the intended separation between user-level and manager-level approval access rules. task-6095010 Forward-Port-Of: odoo/enterprise#113480
This update clarifies the Sale Order process for subcontracted products by hiding a confusing Manufacturing Order button. This prevents users from navigating to unnecessary back-end manufacturing details, streamlining the workflow managed through Purchase Orders and Subcontracting Receipts.
Original PR description
The Manufacturing Order (MO) smart button on a Sale Order is confusing when the product is subcontracted. In a subcontracting flow, the user manages the process via the Purchase Order and the Subcontracting Receipt. This commit ensures the MO smart button is hidden when the fulfillment is handled through subcontracting to prevent user confusion and unnecessary navigation to back-end manufacturing documents. Task-id: 6173877 Forward-Port-Of: odoo/odoo#263105
This update resolves a restriction in the l10n_mx_edi module that prevented credit notes (out-refunds) from using Payment Policy Defaults (PPD). Previously, the Mexican SAT portal required PPD for certain credit note types, but this functionality was not available within Odoo. This change aligns Odoo with SAT requirements, streamlining the process for Mexican businesses.
Original PR description
Currently, credit notes cannot be PPD (payment_policy), however, SAT portal allows it. **STEP TO REPRODUCE** 1. Install the l10n_mx_edi module. 2. Create an invoice with PPD (either changing it or through payment terms). 3. After send CFDI, generate a credit note and try to set PPD **FIX** Allow move_type = 'out_refund' to be PPD. Task-6049654 Forward-Port-Of: odoo/enterprise#114886
This update resolves an issue where Point of Sale orders would fail if a product used an archived unit of measure. We've now implemented a fix to load archived UOMs during the POS order process, ensuring accurate product handling and preventing order errors.
Original PR description
If a product uses an archived UOM and an order is then created in the POS with this product, an error would occur because it could result in trying to use a UOM that wasn't loaded in the POS since it was archived. To fix this issue, we now load archived UOMs in the POS. --- Task: https://www.odoo.com/odoo/project/1737/tasks/6197465 Forward-Port-Of: odoo/odoo#264441 Forward-Port-Of: odoo/odoo#263838
This update resolves an issue that occurred when menus were deleted from the Odoo database. Specifically, the system would fail during a menu loading process. This change ensures the system continues to function correctly even after menus have been removed, improving stability and preventing potential disruptions.
Original PR description
to reproduce issue: 1) make a database in 18.3 . 2) delete the menu/menus. 3) it will fail on _load_menus_blacklist. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#262824
This update resolves an issue where deleting menus in the Enterprise version of Odoo would cause a critical error. The fix ensures the system correctly handles the absence of menus, preventing a crash and maintaining stability. This improves the overall reliability of the Enterprise module.
Original PR description
to reproduce issue: 1) make a database in 18.3 . 2) delete the menu/menus. 3) it will fail on _load_menus_blacklist. Forward-Port-Of: odoo/enterprise#116498
5 changes
Resolved issues and error corrections
This update fixes issues with the XML structure used for Swedish bank payments (l10n_se_bban). Specifically, it ensures the correct format for mandatory fields and prioritizes using BIC codes for bank identification, enhancing compatibility with Nordea and other Swedish banks. This improves the accuracy and reliability of payment processing.
Original PR description
Here is few fixes added to the swedish iso 20022 XML: - CdtrAgt seems to be always mandatory, change the condition in `_skip_CdtrAgt` to always use the CdtrAgt if payment_method is iso20022_se - The `_is_se_bban` is too restrictive, this should be always True when payment method is swedish iso - The `FinInstnId` node can either contain BIC or ClrSysMmbId. But as ClrSysMmbId seems to change from one bank to another, it's more relevant to always use the BIC. opw-5395736 Forward-Port-Of: odoo/enterprise#114662
This update resolves an error that occurred when generating the SD Worx report under specific circumstances – namely, when a company had a public holiday without a defined working schedule. The fix ensures the report correctly handles employees without schedules, preventing a system error and improving report reliability.
Original PR description
## Steps to reproduce: - Install l10n_be_hr_payroll_sd_worx module - Create a public holiday in one company without a working schedule - Create an employee that doesn't have a working schedule nor a contract - Try to generate the sd worx report - A traceback will pop-up ## Cause: Since we fetch all employees if we have a public holiday with no schedule, this puts us in a scenario where we try to access a key in that doesn't exist and it will trigger a KeyError ## Fix: Make sure we fallback on an empty recordset in case we don't have the employee in the key list of the dict we are checking opw-5500070 Forward-Port-Of: odoo/enterprise#117268
This update resolves an issue where users without write access to the Fiskaly Point of Sale (PoS) module would receive an access error when attempting to authenticate with a token that had expired. The fix ensures that the correct error message is displayed, preventing disruptions to sales transactions.
Original PR description
When trying to auth directly from the PoS when the token expires, if you are logged in with a user that doesn't have write access to the PoS. You would get an access error. Steps to reproduce: ------------------- * Setup Fiskaly in an AT company * Open PoS and try to make a sale * To fake the token expiration I modified the code so that the request always return 401 status code > Observation: You get an access error opw-5925203 Forward-Port-Of: odoo/enterprise#112474
This update resolves a limitation in the l10n_mx_edi module, allowing credit notes (out-of-funds) to be configured with Payment Policy Details (PPD) as required by the Mexican SAT portal. Previously, this configuration was restricted, causing potential issues with VAT refund processing. This change ensures compliance and streamlines the credit note generation process for Mexican businesses.
Original PR description
Currently, credit notes cannot be PPD (payment_policy), however, SAT portal allows it. **STEP TO REPRODUCE** 1. Install the l10n_mx_edi module. 2. Create an invoice with PPD (either changing it or through payment terms). 3. After send CFDI, generate a credit note and try to set PPD **FIX** Allow move_type = 'out_refund' to be PPD. Task-6049654 Forward-Port-Of: odoo/enterprise#114886
This update corrects a technical issue where an approval rule was being applied incorrectly due to a duplicate XML ID. The change ensures that approval rules are applied correctly based on user and manager roles, improving the reliability of the approval process. This resolves a potential inconsistency in how approvals were handled.
Original PR description
The XMLID `approval_approver_manager` was defined twice, causing the rule to be applied with the last evaluated access configuration for both `group_approval_user` and `group_approval_manager`. This commit renames the first occurrence of the duplicated XMLID to `approval_approver_user` to restore the intended separation between user-level and manager-level approval access rules. task-6095010 Forward-Port-Of: odoo/enterprise#113480
19 changes
New functionality added to Odoo
This update allows users to correctly account for VAT credits carried forward from previous months when preparing their French tax returns. Specifically, it adds the ability to adjust for information appearing on line 25 of the return, ensuring accurate reporting of VAT credits. This improves compliance with French tax regulations.
Original PR description
This commit will add the possibility to do an adjustment on the line 25. Useful when you start using Odoo but have a VAT credit carried forward from the previous month (which should appear in box 25 of your return). task-6072474 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#256107
Enhancements to existing features
This update adds a test to ensure the payment data sent to Odoofin remains consistent. This safeguards against unexpected changes that could disrupt payment processing and highlights the need for corresponding updates on the Odoofin side. It’s a preventative measure to maintain reliable payment functionality.
Original PR description
Add a test asserting the payment payload structure sent to Odoofin. The goal is to safeguard against unintended payload changes that are not handled on Odoofin's side by making such changes explicit during testing, and reminding developers that corresponding updates may also be required there. No task ID Forward-Port-Of: odoo/enterprise#117260
Resolved issues and error corrections
This update resolves an issue where the Danish EC Sales List CSV export incorrectly used 'LIST' instead of the required 'LISTE' column name. This change aligns with official Skat documentation and prevents file rejection by tax authorities. The fix was previously implemented in 19.0 and is now being re-applied.
Original PR description
### Issue: When exporting the Danish EC Sales List to CSV, the column name is `LIST` instead of `LISTE` According to the official documentation: https://info.skat.dk/data.aspx?oid=392&chk=217608 The correct value is `LISTE`, with a fixed length of 5 characters This cause rejection of the file This was already fixed in 19.0 when the two modules were merged: https://www.odoo.com/odoo/unassigned-tasks/4826286 ### Cause: The value `LIST` is hardcoded in the export https://github.com/odoo/enterprise/blob/b9e4fc1ba08db22dafd10f62a7d9159f963dc949/l10n_dk_reports/models/account_sales_report.py#L104-L107 ### Steps to reproduce: - Install `l10n_dk_reports` - Switch to DK Company - Go to EC Sales List - Download the CSV in the dropdown menu The column name should be LISTE opw-6127427 Forward-Port-Of: odoo/enterprise#116554
This update ensures Odoo correctly sets the `toStateCode` field for SEZ transactions when generating e-waybills. Previously, this was missing, causing API errors related to export and supply transactions. This fix ensures compliance with e-waybill regulations and prevents disruptions to these key business processes.
Original PR description
For SEZ transactions, the e-waybill API requires `toStateCode` to be set to 99. Previously, this value was not enforced, leading to API errors: - 373 for export transactions - 641 for supply and CKD/SKD/lots supply This fix updates the logic to derive `toStateCode` based on the invoice's GST treatment. When the transaction is identified as SEZ, `toStateCode` is correctly set to 99, ensuring compliance with e-waybill requirements and preventing API failures. task-6117694 Forward-Port-Of: odoo/odoo#259327
This update resolves an issue where archived sales teams were appearing in opportunity dropdowns. The fix removes a redundant setting that was causing this behavior, ensuring archived teams are accurately reflected when selecting a team for a new opportunity. This improves the user experience and data accuracy within the CRM.
Original PR description
When you open a contact, click the Opportunities smart button, then click New and open the Sales Team dropdown, archived sales teams show up in the list. The same thing happens for the user, tags and…
When you open a contact, click the Opportunities smart button, then click New and open the Sales Team dropdown, archived sales teams show up in the list. The same thing happens for the user, tags and stage dropdowns. Creating an opportunity from the CRM app does not have this issue.
`res.partner.action_view_opportunity` sets `active_test: False` in the action context so archived opportunities show up in the list view. That context is passed down to the form opened from the action, and to every search the form runs to fill its dropdowns. So the dropdowns also return archived records.
The action's domain already has `('active', 'in', [True, False])`, which is enough to keep archived opportunities in the list on its own (the ORM only adds the "active = True" filter when `active` is not already in the domain). So we can just remove `active_test: False` from the context. This is what 18.0 was doing before https://github.com/odoo/odoo/commit/59feed9f26937ae8e2cab5cd7d2b6743ab6c0717 put the context flag back in.
The override in `website_crm_partner_assign` was setting `active_test: False` back on the action context for the same reason (so its extra search for assigned leads picks up archived ones). The flag is now applied locally on the `crm.lead` handle used for those searches, so archived leads are still found without polluting the action's context.
Steps to reproduce:
1. Archive a Sales Team in CRM > Configuration > Sales Teams
2. Open the Contacts app and pick any contact
3. Click the Opportunities smart button
4. Click "New" and open the Sales Team dropdown
=> Archived teams appear in the dropdown
Ticket [link](https://www.odoo.com/odoo/project.task/6134801)
opw-6134801
Forward-Port-Of: odoo/odoo#261300This update resolves an issue where Point of Sale orders would fail if a product used an archived unit of measure. We've now implemented a fix to load archived UOMs during the POS order process, ensuring orders can be created smoothly regardless of UOM status. This improves the reliability of the POS system.
Original PR description
If a product uses an archived UOM and an order is then created in the POS with this product, an error would occur because it could result in trying to use a UOM that wasn't loaded in the POS since it was archived. To fix this issue, we now load archived UOMs in the POS. --- Task: https://www.odoo.com/odoo/project/1737/tasks/6197465 Forward-Port-Of: odoo/odoo#264441 Forward-Port-Of: odoo/odoo#263838
This update fixes an issue where HR leave requests with dual approval ('both') didn't send notifications to the designated responsible parties (e.g., Time Off Officer). The change ensures that notifications are consistently sent as intended, improving the accuracy and reliability of the leave request process. This prevents delays and ensures proper communication regarding leave approvals.
Original PR description
…cer') no fallback for responsible_ids
Issue:
When ('both','By Employee's Approver and Time Off Officer') is selected on a new HR Leave Type it does not fall back to the responsible_ids or “Notify HR”.
Steps:
1) Setup a neutralized outgoing mail server
2) install hr_holidays
3) make a new hr.leave.Type (Approval) with ('both','By Employee's Approver and Time Off Officer') and select a 'Notified Time Off Officer'(responsible_ids) 4) select an emplyee with a reelated user and remove the coach, manager, and responsible 'Time Off'. 5) save
6) Sign in as the employee, make a time off request under the new Type 7) No email
Fix:
Add a conditional with the lowest priority to fall back to responsible_ids
opw-6101637
Forward-Port-Of: odoo/odoo#263399
Forward-Port-Of: odoo/odoo#261853This update resolves a recurring error that prevented accurate reconciliation of inventory transactions involving kit components. The issue stemmed from how the system processed valuation adjustments, leading to duplicate reconciliation attempts. This fix ensures correct accounting and reporting for sales and purchases of kits containing components.
Original PR description
Steps to reproduce ----- - Modules: Sale, Purchase, Mrp, Accounting - Enable automatic accounting & anglo-saxon valuation - Create an AVCO Product category (AVCO automatic valuation) - Create a Kit…
Steps to reproduce
-----
- Modules: Sale, Purchase, Mrp, Accounting
- Enable automatic accounting & anglo-saxon valuation
- Create an AVCO Product category (AVCO automatic valuation)
- Create a Kit product storable & AVCO
- Kit bom
- Comp as a component (storable & AVCO)
- Settings > Decimal Accuracy > Product Price > set to 4 digits
- Purchase 3 units of Comp at 3.3333 piece & validate reception
- Make 2 sales for 1 unit of Comp each & validate both deliveries
- Create a SO for 1 Kit and 1 Comp & confirm
- Create & confirm invoice
- Go to the delivery, force quantity on the component and try to validate delivery
> Error message: "You are trying to reconcile some entries that are already reconciled."
/!\ Fun(?) fact: this error doesn't occur if the order of the moves is inverted.
Cause
-----
When the purchase delivery is validated, a stock valuation layer is created for 3 units with a value of 10. As they are sold individually, these 3 units generate a valuation layer for 3.33 per unit summing to 9.99.
When we validate the last delivery, the 0.01 difference is detected and an adjustment is made on the valuation layer in `_prepare_out_svl_vals`.
However this adjustment is made for the product when the invoice line concerns the kit. As a result, the first reconciliation fails and the line is added to the list to be reconciled later.
Then, when handling the line for COMP2, it will successfully reconcile the lines while it is still in the pool to be reconciled, resulting in an error when attempting to reconcile it later.
This is caused by `_stock_account_anglo_saxon_reconcile_valuation` where the `product_stock_moves` only contains the kit move when called with the kit product as argument, but it contains both moves when called with the component itself as argument. This leads to the same AML being reconciled twice.
https://github.com/odoo/odoo/blob/f0b9f4c234cd0101f5cb259e58620e1cf65bb2b7/addons/stock_account/models/account_move.py#L222-L225
-----
Ticket:
opw-5722072
Forward-Port-Of: odoo/odoo#263418
Forward-Port-Of: odoo/odoo#258013This update fixes a discrepancy in how contract type IDs are defined within Odoo's payroll modules, specifically impacting the Belgium localization. The definitions have been standardized to ensure accurate reporting and calculations for Belgian employees. This change ensures consistent data across all payroll versions.
Original PR description
[IMP] hr_contract_salary: fix contract_type_id definition The definitions of the contract_type_id in hr_contract_salary_offer and l10n_be_hr_contract_salary/hr_contract_salary_offer should be same I converted the definition of contract_type_id in the base module to the Belgium one. Also, the contract_type_id was inserted to the view in Belgium one as well, I deleted that part to prevent double appearance. This task is only for v.17, after this version I will open a new PR to handle them. Do not forward the task after v.17 (only for v.17) task - 6101717 Forward-Port-Of: odoo/enterprise#117224 Forward-Port-Of: odoo/enterprise#113244
This update resolves a confusing user experience where discount codes wouldn't re-apply after being discarded. Now, users can successfully re-apply a discarded code, ensuring rewards are correctly reflected without creating unintended side effects. This improves the overall usability of the loyalty program.
Original PR description
Issue: --- ### Steps to reproduce: 1- Create a `Discount Code` program. 2- In SO, use `Coupon Code` wizard and use the code. 3- After available rewards are shown, discard the wizard. 4- Re-apply the code. Validation Error: The promo code is already applied. As the reward is not applied, this is functionally confusing. At this point We can see the reward only inside the rewards wizard view. If we allow re-apply the code in case no reward line is created for the `rule.program_id`, we can still see the reward by re-applying the same code, without any side effects. opw-6164198 Forward-Port-Of: odoo/odoo#264105 Forward-Port-Of: odoo/odoo#261950
This update resolves an issue that prevented the correct CSV export of general ledger reports, particularly when dealing with large datasets or foreign currencies. The fix ensures accurate currency formatting and avoids errors related to inactive currencies, resulting in more reliable and complete financial reports.
Original PR description
Follow-up to 8dfe4c0, addressing four issues in `_generate_csv_lazy_export`: 1. `AttributeError: 'int' object has no attribute 'id'` when `col['currency']` is a raw integer on aggregate lines returned by `_get_lines` with `no_format=True`. 2. `KeyError` on `decimal_places_per_cur_id` when a foreign currency account uses an inactive currency. The currency lookup was built with the default `active_test=True`, excluding archived currencies. opw-5994050 Forward-Port-Of: odoo/enterprise#116853 Forward-Port-Of: odoo/enterprise#112500
This update corrects an issue where the 'Send an Email' form would display an error if the Subject field was hidden. The fix changes the field's requirement status, ensuring the form correctly validates input and prevents empty subject submissions. This improves the user experience and data integrity.
Original PR description
Cause: ====== Commit [1] kept model-required fields enabled when conditionally hidden so their default value is still submitted (needed e.g. for the "Create an Opportunity" action where the Subject…
Cause: ====== Commit [1] kept model-required fields enabled when conditionally hidden so their default value is still submitted (needed e.g. for the "Create an Opportunity" action where the Subject field has to reach the server). The Subject field of the "Send an Email" form was incorrectly flagged as `modelRequired`, but `mail.mail.subject` is not actually required on the server. As a side effect of the above commit, hiding the Subject field through visibility conditions left the empty input enabled, which then triggered the client-side "Please fill in the form correctly" error (when no default value was set) or sent an empty subject. Solution: ========= Mark the field as `required` instead of `modelRequired`: it stays required for the user when visible, but when conditionally hidden it is disabled like any other non-model-required field and excluded from submission. Steps to reproduce: =================== 1. Drop a Form snippet on a page (default action: Send an Email). 2. Edit the Subject field, set a visibility condition that is not met. 3. Save and submit the form. => "Please fill in the form correctly". [1]: https://github.com/odoo/odoo/commit/c00508f9d29d opw-6199682 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an error that occurred when generating the SD Worx report due to a missing employee record. The fix ensures the report correctly handles public holidays without schedules, preventing a critical error and ensuring accurate report generation. This improves the reliability of payroll reporting.
Original PR description
## Steps to reproduce: - Install l10n_be_hr_payroll_sd_worx module - Create a public holiday in one company without a working schedule - Create an employee that doesn't have a working schedule nor a contract - Try to generate the sd worx report - A traceback will pop-up ## Cause: Since we fetch all employees if we have a public holiday with no schedule, this puts us in a scenario where we try to access a key in that doesn't exist and it will trigger a KeyError ## Fix: Make sure we fallback on an empty recordset in case we don't have the employee in the key list of the dict we are checking opw-5500070 Forward-Port-Of: odoo/enterprise#117268
This update resolves an issue with the XML structure used for Swedish payments (l10n_se_bban). The changes ensure accurate transmission of payment data to banks like Nordea, addressing a previous incompatibility with their specific requirements. This improves the reliability of payment processing for Swedish customers.
Original PR description
Here is few fixes added to the swedish iso 20022 XML: - CdtrAgt seems to be always mandatory, change the condition in `_skip_CdtrAgt` to always use the CdtrAgt if payment_method is iso20022_se - The `_is_se_bban` is too restrictive, this should be always True when payment method is swedish iso - The `FinInstnId` node can either contain BIC or ClrSysMmbId. But as ClrSysMmbId seems to change from one bank to another, it's more relevant to always use the BIC. opw-5395736 Forward-Port-Of: odoo/enterprise#114662
This update resolves an issue where newly created product categories weren't automatically using the latest expense account settings. The fix ensures that changes to company expense accounts are correctly reflected in new product categories, maintaining accurate financial reporting. This improves the consistency and reliability of product costing.
Original PR description
**Steps to reproduce:** - Accounting > Configuration > Settings > Default Accounts > Product Accounts - Change the default expense account (and income account) - Create a new product category -…
**Steps to reproduce:** - Accounting > Configuration > Settings > Default Accounts > Product Accounts - Change the default expense account (and income account) - Create a new product category - category still proposed the old accounts Affected versions: from 18.2 till 19.2 **Cause:** `ir.default` for `product.category` (`property_account_expense_categ_id` and `property_account_income_categ_id`) was not updated when `res.company.expense_account_id` / `income_account_id` changed, so new categories kept using stale defaults. and in 19.0 https://github.com/odoo/odoo/blob/894281f2a3e313fc239529572b5cc8c06a3511f7/addons/account/models/company.py#L490 and https://github.com/odoo/odoo/blob/894281f2a3e313fc239529572b5cc8c06a3511f7/addons/account/models/company.py#L753 calls https://github.com/odoo/odoo/blob/894281f2a3e313fc239529572b5cc8c06a3511f7/addons/account/models/company.py#L1136-L1139 However, when stock_account is installed https://github.com/odoo/odoo/blob/894281f2a3e313fc239529572b5cc8c06a3511f7/addons/stock_account/models/res_company.py#L361-L366 this gets called, without calling super, that's why it didn't work although the fix is there, we will need to adapt another fix in 19.0+ **Solution:** Call `_set_category_defaults()` in `res.company.write()` so `ir.default` stays aligned with the company's current product default accounts. opw-6145491 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261594
This update fixes an error in the Italian Annual VAT Report that was incorrectly mixing tax and balance amounts on line VF25. The change ensures the report accurately reflects the total taxable base as required by Italian tax regulations, aligning with the official Agenzia delle Entrate guidelines. This correction guarantees accurate VAT reporting for Italian businesses.
Original PR description
### Issue before this commit: In the Italian Annual VAT Report, the balance (base amount) for line VF25 displays incorrect values. Instead of computing the sum of the taxable bases for the passive…
### Issue before this commit: In the Italian Annual VAT Report, the balance (base amount) for line VF25 displays incorrect values. Instead of computing the sum of the taxable bases for the passive operations, the report erroneously mixes tax amounts into the balance column. ### Steps to reproduce the issue: 1. Download Accounting and l10n_it 2. Go to Tax Report and visualize the Annual Tax Report (IT) 3. Go to VF VAT Report 4. See the VF25 is mixing taxes and balances ### Cause of the issue: The root cause lies in the aggregation_formula definition for the tax_annual_report_line_VF25 record. The formula was incorrectly configured to aggregate the .tax expressions for lines VF1 to VF13 (VF1.tax + VF2.tax + ...) instead of their respective .balance expressions, while correctly using .balance for the remaining lines (VF17 to VF24). https://github.com/odoo/odoo/blob/878c08cf522a3278b4e6ff5f3d18444989e9998d/addons/l10n_it/data/tax_report/annual_report_sections/vf.xml#L286-L299 It's just a typo in this commit: https://github.com/odoo/odoo/pull/164064/changes/f292ba119d6376dbfb3c1fac4960c9c56a74d938 ### Reason to introduce the fix: From documentation https://www.agenziaentrate.gov.it/portale/documents/20143/9602686/IVA_ANNUALE_2026_istr.pdf/2a42fb92-1b76-229a-d0f5-06069d79b514?t=1768504755711 : > Rigo VF25, colonna 1, va indicato il totale degli imponibili determinato sommando gli importi riportati ai righi da VF1 a VF23, colonna 1, diminuito dell’importo di cui al rigo VF24. In colonna 2 va indicato il totale delle imposte determinato sommando gli importi delle colonne 2 dei righi da VF1 a VF13. opw-6172791 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#264379
This update fixes a validation error that occurred when using cash basis accounting with payable or receivable accounts. The change restricts users from selecting these account types as transition accounts, ensuring consistent and accurate accounting configurations. This prevents errors during invoice creation and move generation.
Original PR description
## **Issue** When a cash basis tax is configured with a payable/receivable transition account, tax journal items are generated on that account without a due date. Since payable/receivable accounts…
## **Issue** When a cash basis tax is configured with a payable/receivable transition account, tax journal items are generated on that account without a due date. Since payable/receivable accounts require a due date on journal items, this leads to a validation error during move creation: "Any journal item on a payable account must have a due date and vice versa." ## **Steps to reproduce:** 1. Install the Accounting and Inter-Company modules. 2. Create an additional company so that there are a total of two companies, then switch to Company 1. 3. Create a product with a price and assign a tax to it. 4. Navigate to Accounting → Configuration → Settings and enable Cash Basis accounting. 5. Go to Accounting → Configuration → Taxes and open the purchase tax (or the tax assigned to the product). 6. In the Tax Computation section, ensure that Group of Taxes is not selected. 7. Under the Advanced Options tab, set Tax Exigibility to Based on Payment. 8. Set the Cash Basis Transition Account to a payable account. 9. Open Company Settings, select Company 1, go to the Inter-Company Transactions section, and enable Synchronize invoices/bills. 10. Switch to Company 2 and create an invoice using the same product. Select the contact that is the partner of Company 1. 11. Confirm the invoice. The following error is raised: "Any journal item on a payable account must have a due date and vice versa." ## **With This Commit:** Added a domain on the Cash Basis Transition Account field to prevent users from selecting payable or receivable accounts, avoiding invalid configurations and runtime validation errors. opw-6189615 Forward-Port-Of: odoo/odoo#263792
This update clarifies error messages when sending invoices via Peppol. Previously, users received a generic "no VAT" error, which was confusing. Now, the system accurately identifies the missing required Peppol VAT information (like a Belgian Company Registry or French SIRET), guiding users to correct the data and ensure successful invoice delivery.
Original PR description
When a user sends a move via Peppol to a customer that has a VAT number set but not a Peppol endpoint, we show the user a generic error ("no VAT").
This makes the user confused, as he already filled the VAT field of his customer, It's the Peppol VAT that is missing (it could be: Belgian Company Registry, France SIRET, ...etc, depending on the customer's country)
This PR makes the error message more accurate by showing exactly the missing required field.
task-5499707
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#263685
Forward-Port-Of: odoo/odoo#245915This update resolves an issue causing the FatturaPA import in the Italian tax module to fail when the necessary account module isn't installed. The fix duplicates helper functions from another Odoo module to ensure compatibility and stability, preventing errors related to missing dependencies.
Original PR description
The FatturaPA import in `l10n_it_edi/models/account_move.py` calls `self.env['account.edi.common']` for the partner and the bank account. That model belongs to `account_edi_ubl_cii`, which `l10n_it_edi` does not depend on. Without that module installed, the import dies with a `KeyError`. It is not correct to add that dependency. PR #254505 (`63926d9d`) introduced the two calls and removed the search-only lookups that lived there before. ### Fix Copied `account.edi.common._import_partner` to `_l10n_it_edi_import_partner` Copied `account.edi.common._import_partner_bank` to `_l10n_it_edi_import_partner_bank` Fixes: https://github.com/odoo/odoo/issues/264306 Forward-Port-Of: odoo/odoo#264478 Forward-Port-Of: odoo/odoo#264326
4 changes
Resolved issues and error corrections
This update fixes a problem where users accessing bank reconciliation within a child company couldn't correctly determine the currency. The fix adds a temporary 'sudo' command to access the necessary currency information, ensuring accurate bank reconciliation functionality for all company setups, including those with child companies.
Original PR description
The bug is easy to reproduce, but niche. 1. Have a company set up with a child company 2. Have a non admin user with administration rights for accounting 3. Create a bank statement in a journal with no set currency_id and fully reconcile it 4. While only in the child company, try to access the bank reconciliation widget -> access error The error occurs because of how journal_currency_id is computed on the bank rec widget. The fallback value for the currency is derived from the journal_id.company_id.currency_id which is inaccessible from the child company. To circumvent this, we just add sudo() to the call. Forward-Port-Of: odoo/enterprise#117005
This update fixes an issue where Knowledge articles appeared in a narrow, unreadable format when printed on larger screens. The fix specifically targets the Knowledge editor's form view, preventing a default CSS rule from causing this layout problem. Now, articles print correctly in a standard format.
Original PR description
Currently, a CSS rule forces the form container width to 1px to ensure that the nested list view can correctly compute its size. See: ```scss .o_form_view.o_xxl_form_view { .o_form_view_container {…
Currently, a CSS rule forces the form container width to 1px to ensure that the nested list view can correctly compute its size.
See:
```scss
.o_form_view.o_xxl_form_view {
.o_form_view_container {
width: 1px; /* List view needs a width value to recompute the size correctly */
}
}
```
However, since the Knowledge editor is implemented as a form view, this rule also affects Knowledge. When zooming out, the `o_xxl_form_view` class is added to the form view container, causing the rule to apply. If an article is printed while this class is present, it is constrained to an extremely narrow column, making it unreadable.
Steps to reproduce:
1. Open an article in Knowledge
2. Zoom out using `Ctrl` + `-`
3. Open the kebab menu and select "Export"
=> The article is rendered in a very narrow column.
To address this issue, we override this rule specifically for Knowledge. With this change, articles are now rendered correctly when printed or exported as PDF.
Task-5999878
Forward-Port-Of: odoo/enterprise#103259This update resolves an issue where the SD Worx report would fail when generating reports for employees without a working schedule, particularly when combined with company public holidays. The fix ensures the report gracefully handles missing employee data, preventing errors and improving report reliability.
Original PR description
## Steps to reproduce: - Install l10n_be_hr_payroll_sd_worx module - Create a public holiday in one company without a working schedule - Create an employee that doesn't have a working schedule nor a contract - Try to generate the sd worx report - A traceback will pop-up ## Cause: Since we fetch all employees if we have a public holiday with no schedule, this puts us in a scenario where we try to access a key in that doesn't exist and it will trigger a KeyError ## Fix: Make sure we fallback on an empty recordset in case we don't have the employee in the key list of the dict we are checking opw-5500070 Forward-Port-Of: odoo/enterprise#117268
This update fixes inconsistencies in the XML structure used for Swedish payments (ISO 20022). Specifically, it ensures the correct format for key data fields like the bank identifier, enhancing compatibility with Swedish banking systems and improving payment processing accuracy. This resolves a technical issue impacting the reliable transmission of payment data.
Original PR description
Here is few fixes added to the swedish iso 20022 XML: - CdtrAgt seems to be always mandatory, change the condition in `_skip_CdtrAgt` to always use the CdtrAgt if payment_method is iso20022_se - The `_is_se_bban` is too restrictive, this should be always True when payment method is swedish iso - The `FinInstnId` node can either contain BIC or ClrSysMmbId. But as ClrSysMmbId seems to change from one bank to another, it's more relevant to always use the BIC. opw-5395736 Forward-Port-Of: odoo/enterprise#114662
10 changes
New functionality added to Odoo
This update establishes the foundational setup for processing payroll in Oman, aligning with local labor laws. It includes a demo company, employee data, a standard working schedule, and a new salary structure with rules for bonuses, allowances, and social contributions. This provides a base for future payroll enhancements and testing within the Omani market.
Original PR description
[ADD] l10n_om_hr_payroll: base setup for Oman payroll localization [ADD] l10n_om_hr_payroll: accrual plan, SPF, Overtime, & EOS salary rules Introduce the foundational setup for the Oman payroll…
[ADD] l10n_om_hr_payroll: base setup for Oman payroll localization
[ADD] l10n_om_hr_payroll: accrual plan, SPF, Overtime, & EOS salary rules
Introduce the foundational setup for the Oman payroll localization based on Oman's Labor Law. This serves as the base for subsequent enhancements and related tasks.
The setup includes demo data, a standard working schedule, and an Omani salary structure with standard and specific rules aligned with local requirements.
The goal of this change is to establish an initial framework for the Omani localization, enabling consistent development and functional testing. Providing demo data for the company and employees facilitates immediate use and demonstration of payroll features, while the defined 9–5 working schedule (Sunday–Thursday, Asia/Oman timezone) reflects local business practices.
Technical summary:
- **Added demo company:** “My Omani Company”.
- **Added demo employees:** Linked to the company with localized education and contract data.
- **Defined standard working schedule:** (9:00–17:00, split morning/afternoon, Sunday–Thursday, Asia/Oman timezone).
- **Introduced salary structure “Oman: Monthly Pay”:** Includes standard salary rules and the following additions:
- **Bonus:** Added as an Other Input.
- **Other Allowance:** Salary input at employee level with a corresponding rule under category “Allowances”.
- **Total Wage:** New parent category grouping “Allowances” and “Basic Salary”.
- **Expenses Reimbursement:** Added as an Other Input.
- **Renamed “Taxable Salary” to “Gross”:** To align with local terminology.
- **Social Protection Fund (SPF):** Added fields and logic for Employee and Employer contributions covering Old Age, Disability and Death , Unemployment, Work Injury, Sick Leave, and Maternity.
- **End of Service (EOS):** Introduced an EOS eligibility toggle on the employee record and a "Provision Payout" salary rule category.
- **Leave Accrual:** Added an "Oman Employee Plan" with a monthly accrual of and annual sick leaves.
- **Overtime Rules:** Defined rules for Daytime, Nighttime, and Rest Day overtime within the attendance and work entry.
task-5189116
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prEnhancements to existing features
This update simplifies the generation of 281.XX payroll reports by centralizing the process and improving the user interface. The changes consolidate report creation, standardize data formats, and enhance error handling, resulting in a more efficient and reliable payroll reporting system.
Original PR description
**Container, Mixin & Generation** * 281_xx is now the single entry point for all 281.xx reports. * Introduced a shared mixin (`l10n_be.281.mixin`) to centralize common logic (employee validation,…
**Container, Mixin & Generation** * 281_xx is now the single entry point for all 281.xx reports. * Introduced a shared mixin (`l10n_be.281.mixin`) to centralize common logic (employee validation, payslip filtering) and enforce a standard structure across all 281.xx forms. * Child reports (281.10, 281.45) are systematically created and linked to the container. * Forms are only generated for employees who require them (e.g., skipping 281.45 if the employee has no IP). * XML generation is centralized at the container level: subreports provide data, while the container defines header-level information. * Record names are adapted to include the year and a suffix sequence (e.g., `YEAR_281_suffix`). **UI & View Simplification** * Removed dedicated 281.10 and 281.45 form views, consolidating them into a unified container using tabs instead of smart buttons. * Updated list view to display the year as the first column, and expose reference, form types, sending type, treatment type, and state. * Introduced a shared employee declaration list view used across all 281 report types. **Sequence, Error Handling & Finalization** * The container holds the state (Draft, Error, Ready, Done). Draft state allows generating test XML; Ready state corresponds to final XML. * Validation errors from subreports are aggregated and set the container to an "Error" state, blocking the XML generation. * Confirmation wizard sets the final Belcotax reference, triggers the PDF generation, and sends the documents to the employees. Task: 5911065
This update introduces a new report required by the Slovak Financial Administration, enabling businesses to accurately file their VAT Control Statement (KVDPH). The report covers key sales and purchase data, automating calculations and ensuring compliance with Slovak tax regulations. It includes features like XML export and bad debt flagging for improved accuracy and efficiency.
Original PR description
*=l10n_eu_oss_reports This commit introduces the VAT Control Statement report (Kontrolný výkaz DPH) as required by the Slovak Financial Administration. The report covers all eight sections of the…
*=l10n_eu_oss_reports This commit introduces the VAT Control Statement report (Kontrolný výkaz DPH) as required by the Slovak Financial Administration. The report covers all eight sections of the KVDPH: - A.1: standard issued invoices to registered entities - A.2: domestic reverse-charge sales (§69) with commodity codes - B.1: reverse-charge purchases (EU acquisitions, triangular, imports) - B.2: standard domestic purchases with VAT deduction - B.3.1/B.3.2: simplified invoices (split by €3,000 threshold) - C.1/C.2: corrections to issued/received supplies (credit & debit notes) - D.1/D.2: e-KASA aggregates and other supplies (manual entry) Each section uses a custom SQL engine that handles grouping by move, partner, tax rate, and commodity tag depending on the section context. Sections A.2 and C.1 resolve product commodity codes (TK) and goods types (TD) from account tags defined in XML data. Also adds: - XML export following the KVDPH_2025 XSD schema - `l10n_sk_is_bad_debt` field on `account.move` for bad debt flagging - `l10n_sk_uom` selection on account.move.line for KVDPH unit of measure - product tag data for 54 commodity codes and 2 goods types - views to expose the new fields on invoices, journal items and products - Added dedicated return type and submission wizard with direct XML download Documentation: https://www.financnasprava.sk/sk/podnikatelia/dane/dan-z-pridanej-hodnoty/kontrolny-vykaz-dph Related: https://github.com/odoo/odoo/pull/241860 Related: https://github.com/odoo/upgrade/pull/9102 task-5213902
This update allows administrators to exclude specific employees from payruns directly within the payrun version list. When an employee's payslip is excluded from a payrun version, the payslip itself is also removed, providing greater control over payroll processing and ensuring accurate reporting.
Original PR description
This commits adds a button to the versions list in payruns to allow users to exclude employees from the payrun. If the employee has a payslip for that payrun, the payslip will also be excluded. Task-5955126
This update streamlines the calculation of prices on the website, particularly for subscription-based products. By directly using recurring plan prices when available, the system now computes prices faster and more accurately, leading to a better customer experience. The changes also incorporate updates from the Odoo community.
Original PR description
* website_sale_subscription: speed up prices computation when the plan is known When the cart already holds a recurring product (and therefore a recurring plan), it can be forwarded to the price computation logic to directly compute the right unit price (instead of the sales price). * Adapt to community changes
Resolved issues and error corrections
This update resolves an issue where opening the historical payslip view for Indonesian employees was failing. The change involved updating a key reference and correcting a data structure update to ensure the view functions correctly and accurately displays payroll information.
Original PR description
The xml_id `hr_payroll.act_contribution_reg_payslip_lines` was removed in bd2a0767079, so opening the "historical lines" view from an Indonesian employee raised `ValueError: External ID not found`. Replace it with `hr_payroll.hr_payslip_line_action_report` and rename the stale context key `search_default_category_id` to `search_default_category_ids` to match the current search view's filter (the field became M2M). task-6208698
This update corrects an issue where the Website Studio XML editor incorrectly used translations for all websites, regardless of the active one. The change ensures that translations are only applied within the Website Studio's HTML/CSS editor when a specific website is selected, improving the user experience and preventing unintended translation conflicts.
Original PR description
Problem: When opening the Studio XML editor when Website is installed, the translation terms corresponding to the Default Language of the first website in the database are used. This behavior should…
Problem: When opening the Studio XML editor when Website is installed, the translation terms corresponding to the Default Language of the first website in the database are used. This behavior should only be applied to the HTML/CSS Editor in Website. Purpose: Modify Website's override of get_related_views to only return translated views when called with a specific website in context. This is done here by adding a context flag, as to not interfere with customizations made in stable versions. This will be changed for master. Steps to Reproduce in Runbot: 1. Activate a non-English (US) language. 2. Add this language to the Website with the lowest ID in the database, then set it to the Default Language of the Website. 3. While in debug mode, enter Studio and navigate to a view that has translation terms (ex. Sale Order Form view), then open the XML editor. opw-5136124 Foward Port of https://github.com/odoo/enterprise/pull/110418 Forward-Port-Of: odoo/enterprise#116771
This update corrects a visual issue where a 'compute' button was incorrectly displayed for payslips that have already been finalized. The fix ensures this button is only shown for active payslips, improving the user experience and reducing potential confusion. This change was made to streamline the payroll process.
Original PR description
The Bug : Compute button appearing when payslips are in "done" state
The Reason : The action name of the compute button has been updated at the view level, but not the controller level,
given that the updated name doesn't appear in this list `displayHeaderButtonsTransitions`, The function
`displayButton` always return True (always displays it).
The Fix : updated the action name inside `displayHeaderButtonsTransitions`.
task - 6212789This update enhances the system's ability to accurately track employee attendance by now considering officially designated non-working days as absences. This ensures more precise reporting and analysis of employee time, leading to better workforce management decisions. The change improves the reliability of attendance data.
Original PR description
…non-working days as absence Task: 5076624
This update resolves an issue where tours in the Enterprise module were behaving inconsistently. The team refined tour triggers to ensure a more predictable and reliable user experience. This improves the overall usability and stability of the system for users.
Original PR description
Fix undeterministic tours by making some triggers more precise in a few steps.
2 changes
New functionality added to Odoo
This update implements the required Belgian fiscal reporting specifications for certified POS restaurant systems, ensuring compliance with FPS Finance regulations. It manages communication with the blackbox device, automatically generates fiscal receipts, and provides robust error handling for accurate transaction recording. The module includes features for training mode, debugging, and handling network outages to maintain data integrity.
Original PR description
Implement the Belgian Registered Cash Register (Caisse Enregistreuse Certifiée) v2 specification as required by FPS Finance for certified POS restaurant systems. The implementation is split into a…
Implement the Belgian Registered Cash Register (Caisse Enregistreuse Certifiée) v2 specification as required by FPS Finance for certified POS restaurant systems. The implementation is split into a core module and five bridge modules: l10n_be_pos_blackbox (main module): - FDM (Fiscal Data Module) communication layer that signs every fiscal event by sending a structured message to the blackbox device and receiving a hash + VSC counter in return. M110 (sale), M111 (refund), M112 (partial refund), M121 (order), M122 (cost-centre change), M123 (pre-bill), M130 (money in/out), M131 (drawer open), M140/M141 (work in/out), M150 (invoice), M160 (copy), M180/M181 (X/Z turnover report), M182/M183 (user X/Z report), UC230 (sale correction). M160 (copy), M180/M181 (X/Z turnover report), M182/M183 (user X/Z report), UC230 (sale correction). - Input generator that encodes all line-level fiscal data (PLU hash, VAT groups, price rounding, grouping IDs) according to the spec. - Fiscal receipt template (XML) that renders the blackbox hash, VSC counter, POS system identifier, and event sequence number on every printed receipt. - X/Z daily report views with fiscal totals per VAT category. - Training-mode support: activates the FDM training flag so the device does not count test transactions. - Inspect popup (debug) for examining raw FDM messages. - Error/warning popup system with traceback messages from the device. - LocalStorage queue to replay pending mutations after a network outage. - pos_config / pos_session overrides: enforce blackbox constraints (only EUR, no rounding, mandatory restaurant mode, etc.), manage device pairing, and accumulate per-session fiscal counters. - Extensive unit-test suite: >6 000 lines covering the input generator's grouping-ID logic, price-consistency rules, and every mutation type against golden JSON fixtures. - Browser tour tests (oracle + regression tours). l10n_be_pos_blackbox_hr: - Clock-in / clock-out flows for employees trigger M140/M141 work in/out mutations; employee INSZ/NISS number is required and stored on hr.employee; pos_session accumulates per-employee work records. l10n_be_pos_blackbox_loyalty: - Gift-card and discount reward lines are mapped to the correct MPV fiscal codes (UC260/UC261); loyalty products are flagged so the input generator can calculate their contribution to the signed total correctly. l10n_be_pos_blackbox_self_order: - Intercepts self-order confirmation on kiosk screens to sign the order with the FDM before the confirmation page is shown; adds a controller to expose the required blackbox data to the kiosk frontend. l10n_be_pos_blackbox_settle_due: - Handles the "settle due" payment flow: products used to represent deferred payments are flagged and treated as zero-VAT lines in the signed message. l10n_be_pos_blackbox_urban_piper: - Patches the Urban Piper ticket-screen and pos_store so that online orders routed through Urban Piper are also signed before finalisation. task-id: 5864870 community PR: https://github.com/odoo/odoo/pull/229692
Resolved issues and error corrections
This update fixes a problem where the POS feedback screen displayed incorrect order totals. The change ensures that order prices are calculated and displayed accurately, even when requests are delayed. It also prevents the POS from finalizing orders with errors, improving the overall transaction process.
Original PR description
We now call manually `setOrderPrices` on order validation to ensure `amount_total` is set on the order before displaying the feedback screen which depends on it. The issue is that requests to the FdM delay the call to this method, making the PoS display `0` as the amount is `undefined` in the meantime. We also ensure the PoS doesn't finalize the validation if an error occurs. see odoo/odoo#244298
10 changes
Resolved issues and error corrections
This update resolves an issue where combo products weren't opening their configurator dialogs when viewed on mobile devices. The fix utilizes a different widget to enable configurator logic and barcode scanning, ensuring a seamless experience for mobile users creating quotations with combo products. This improves usability and allows mobile sales teams to accurately configure complex product combinations.
Original PR description
Steps to reproduce 1. Create a Combo Product with some combo items. 2. Open Odoo on a mobile device or simulate mobile view (isSmall=true). 3. Create a new Quotation and add the Combo Product via the…
Steps to reproduce
1. Create a Combo Product with some combo items.
2. Open Odoo on a mobile device or simulate mobile view (isSmall=true).
3. Create a new Quotation and add the Combo Product via the "Add product"
button in the order lines kanban.
Issue
The combo product is added directly to the order lines with a price of
0.00, and the Combo Configurator dialog never opens.
On mobile, the 'product_id' field in the 'sale.order.line' inline form
view uses the generic 'many2one_barcode' widget. This widget is a
standard Many2one with barcode support but lacks the specific logic in
'SaleOrderLineProductField'
(https://github.com/odoo/odoo/blob/d1ab74aebc356537dd2a7df43fb40150580802ea/addons/sale/static/src/js/sale_product_field.js#L74-L92)
that detects combo/configurable products and opens the appropriate
configurator dialog. On desktop, the 'sol_product_many2one' widget
handles this, but it was not used on mobile because it lacks barcode
scanning features.
Solution
The inline form view now uses 'sol_product_many2one' with
options="{'can_scan_barcode': True}" instead of 'many2one_barcode'.
This leverages the existing 'can_scan_barcode' option on Many2OneField
(https://github.com/odoo/odoo/blob/7ba46d2cea7f522e17ffe04c4051469fb0320a76/addons/web/static/src/views/fields/many2one/many2one_field.js#L390),
giving the field both configurator logic and barcode support. The fields
needed for combo state ('selected_combo_items', 'virtual_id') are also
added to the mobile views.
opw-6062731This update resolves an issue where renaming inherited custom fields in Odoo could cause data inconsistencies. The fix ensures that generated inherited fields are removed from the database before renaming, preventing errors and maintaining data integrity. This improves the reliability of custom field management.
Original PR description
When renaming a custom field that is inherited, first remove the generated inherited fields from the database. backport of https://github.com/odoo/odoo/pull/240603 opw-6148175
This update fixes an issue where WhatsApp channel avatars were incorrectly displaying the default Discuss avatar after a member was added. Now, avatars are correctly pulled from the channel's WhatsApp member, ensuring accurate representation and a better user experience within the WhatsApp sidebar.
Original PR description
WhatsApp sidebar avatars should be resolved from the channel's whatsapp member, not from an arbitrary non-self member. Before this fix, adding a member to a WhatsApp channel caused the default Discuss avatar to be displayed instead of the actual WhatsApp member's avatar. This happened because the correspondent was not correctly computed for channels of type whatsapp. task-[5879840](https://www.odoo.com/odoo/project/1519/tasks/5879840)
This update resolves an issue where the Studio report editor was unintentionally using default theme colors. By preventing the use of these colors, the report editor now offers greater control and consistency for users creating reports. This ensures reports align better with brand guidelines and user preferences.
Original PR description
This commit will add a new props to ColorSelector to disable default theme colors to allows studio to not use them opw-6167143 linked to https://github.com/odoo/enterprise/pull/109206 enterprise https://github.com/odoo/enterprise/pull/117555
This update fixes an issue where the report editor in Odoo Studio was unintentionally influenced by default theme colors. The change prevents users from customizing report styles with these theme colors, ensuring consistency and preventing potential styling conflicts. This improves the report editor's reliability and simplifies report design.
Original PR description
Before this commit, there was no way to tell the ColorPicker to not use the DEFAULT_THEME_COLOR_VARS (ie classes of the form o-color-[n] with n some integer) Those colors are a bit special (see full…
Before this commit, there was no way to tell the ColorPicker to not use the DEFAULT_THEME_COLOR_VARS (ie classes of the form o-color-[n] with n some integer)
Those colors are a bit special (see full discussion on the opw)
Their existence is described in module web
Their CSS definition is implemented in module html_editor
Reports don't use them at all We probably don't want reports' style
to be influenced by the presence or lack thereof of the html_editor
module, which was originally made to customize the interface.
Those architecture issues should be solved downstream in master, but they are practically endemic in Odoo.
This commit addresses the fact that Studio's report editor should not allow those colors as possible customization by offering the components and plugins in the chain a props to disable them.
After this commit (and more broadly the PR bundle), the default theme colors are not available in studio's report editor.
see odoo/odoo#251446
backport of https://github.com/odoo/enterprise/pull/109206
opw-6167143
community: https://github.com/odoo/odoo/pull/264917This update resolves an issue where incorrect tax rates were being applied when importing invoices in the account_edi_ubl_cii module. Specifically, it ensures that only taxes matching the invoice's fiscal position are considered, improving the accuracy of financial reporting. This change was backported from a previous issue.
Original PR description
Backport of #263872 OPW-6022540 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an error that occurred when generating the SD Worx report due to a missing employee record. The fix ensures the report gracefully handles cases where an employee isn't associated with a working schedule or company, preventing a system crash. This improves report reliability and data accuracy.
Original PR description
## Steps to reproduce: - Install l10n_be_hr_payroll_sd_worx module - Create a public holiday in one company without a working schedule - Create an employee that doesn't have a working schedule nor a contract - Try to generate the sd worx report - A traceback will pop-up ## Cause: Since we fetch all employees if we have a public holiday with no schedule, this puts us in a scenario where we try to access a key in that doesn't exist and it will trigger a KeyError ## Fix: Make sure we fallback on an empty recordset in case we don't have the employee in the key list of the dict we are checking opw-5500070 Forward-Port-Of: odoo/enterprise#117268
This update fixes a potential error in Odoo's cash basis accounting setup. Previously, using a payable or receivable account as a transition account for taxes could cause validation errors. This change restricts users from selecting these account types, ensuring accurate accounting configurations and preventing runtime issues.
Original PR description
## **Issue** When a cash basis tax is configured with a payable/receivable transition account, tax journal items are generated on that account without a due date. Since payable/receivable accounts…
## **Issue** When a cash basis tax is configured with a payable/receivable transition account, tax journal items are generated on that account without a due date. Since payable/receivable accounts require a due date on journal items, this leads to a validation error during move creation: "Any journal item on a payable account must have a due date and vice versa." ## **Steps to reproduce:** 1. Install the Accounting and Inter-Company modules. 2. Create an additional company so that there are a total of two companies, then switch to Company 1. 3. Create a product with a price and assign a tax to it. 4. Navigate to Accounting → Configuration → Settings and enable Cash Basis accounting. 5. Go to Accounting → Configuration → Taxes and open the purchase tax (or the tax assigned to the product). 6. In the Tax Computation section, ensure that Group of Taxes is not selected. 7. Under the Advanced Options tab, set Tax Exigibility to Based on Payment. 8. Set the Cash Basis Transition Account to a payable account. 9. Open Company Settings, select Company 1, go to the Inter-Company Transactions section, and enable Synchronize invoices/bills. 10. Switch to Company 2 and create an invoice using the same product. Select the contact that is the partner of Company 1. 11. Confirm the invoice. The following error is raised: "Any journal item on a payable account must have a due date and vice versa." ## **With This Commit:** Added a domain on the Cash Basis Transition Account field to prevent users from selecting payable or receivable accounts, avoiding invalid configurations and runtime validation errors. opw-6189615 Forward-Port-Of: odoo/odoo#263792
This update resolves a restriction in the l10n_mx_edi module, allowing credit notes (out-refunds) to be configured with Payment Policy Details (PPD) as required by the Mexican SAT portal. Previously, this functionality was unavailable, creating a discrepancy between Odoo and SAT regulations. This change ensures accurate VAT refund processing for Mexican businesses.
Original PR description
Currently, credit notes cannot be PPD (payment_policy), however, SAT portal allows it. **STEP TO REPRODUCE** 1. Install the l10n_mx_edi module. 2. Create an invoice with PPD (either changing it or through payment terms). 3. After send CFDI, generate a credit note and try to set PPD **FIX** Allow move_type = 'out_refund' to be PPD. Task-6049654 Forward-Port-Of: odoo/enterprise#114886
This update fixes an issue where invoices generated for non-Polish customers incorrectly included the country code in the VAT number field. This ensures compliance with KSeF regulations, preventing potential errors and delays in invoice processing. The change ensures the correct format is used for all invoices, regardless of the customer's location.
Original PR description
Currently, an incorrect VAT format is used in the generated `FA3 XML` for non-Polish partners, where the VAT number includes the country code. **Steps to reproduce:** - Install the `l10n_pl_edi`…
Currently, an incorrect VAT format is used in the generated `FA3 XML` for non-Polish partners, where the VAT number includes the country code. **Steps to reproduce:** - Install the `l10n_pl_edi` module and switch to a `PL Company`. - Go to Settings and enable `Allow KSeF integration` (refer to [1]). - Create and confirm an invoice for a customer (e.g., Azure Interior). - Send the invoice using `by KSeF (e-Faktura)`. **Observation:** In the generated XML file, the `NrID` field contains the VAT number `with the country code` for non-Polish partners. **Root Cause:** At [2], `get_vat_number` sets the VAT number using `compact` from `stdnum.pl.nip`, which only works for Polish VAT numbers. At [3], `get_vat_number` correctly formats Polish VAT numbers without the country code in the `if condition`. However, in the fallback (else) case, it returns the VAT number as it is, including the country code. **Fix:** This commit ensures that for non-Polish VAT numbers, the country code is removed before setting the `NrID` or `NrVatUE` values in the XML, aligning the format with KSeF requirements. Ref: https://ksef.podatki.gov.pl/media/4u1bmhx4/information-sheet-on-the-fa-3-logical-structure.pdf (Page no.: 19) [1]: https://www.odoo.com/mail/message/1057847327 [2]: https://github.com/odoo/odoo/blob/d73e5662a0af7c549008661f743ba5d51f765339/addons/l10n_pl_edi/models/account_move.py#L257 [3]: https://github.com/odoo/odoo/blob/d73e5662a0af7c549008661f743ba5d51f765339/addons/l10n_pl_edi/data/fa3_template.xml#L67-L82 opw-6120118
1 change
Resolved issues and error corrections
This update corrects a technical issue where an approval rule was being applied incorrectly due to a duplicate XML ID. By renaming one of the duplicate IDs, the system now correctly distinguishes between user-level and manager-level approval access, ensuring accurate and reliable approval workflows. This resolves a potential inconsistency in how approvals were handled.
Original PR description
The XMLID `approval_approver_manager` was defined twice, causing the rule to be applied with the last evaluated access configuration for both `group_approval_user` and `group_approval_manager`. This commit renames the first occurrence of the duplicated XMLID to `approval_approver_user` to restore the intended separation between user-level and manager-level approval access rules. task-6095010