Wednesday, March 4, 2026
29 changes · 18.0
Resolved issues and error corrections
This update fixes a critical error that occurred when calculating time off for employees on hour-based schedules (like contractors with 0 hours). Previously, a division by zero caused server errors. Now, the system validates these cases, preventing crashes and ensuring accurate time off calculations. This resolves issues impacting client experience and avoids potential Odoo system instability.
Original PR description
Description of the issue/feature this PR addresses: Hour-based Time Off allocations use employee working hours for calculation. Contractors may have 0 hours/week as their working schedule. This caused ZeroDivisionError during time off allocation. Clients faced server errors, assuming Odoo was at fault. Current behavior before PR:  Desired behavior after PR is merged:  --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects a bug where manually adjusted tax amounts on vendor bills were incorrectly reset to the original value when a price difference was created. The fix ensures that manually set tax values remain accurate, preventing unnecessary recalculations and maintaining correct tax accounting for price differences. This improves the reliability of vendor bill tax settings.
Original PR description
When manually changing the tax amount of a vendor bill in the html input field (input above total price), if there is a price difference account move line created, the manual tax inputted will be…
When manually changing the tax amount of a vendor bill in the html input field (input above total price), if there is a price difference account move line created, the manual tax inputted will be ignored. This is due to the price difference and associated correcting account move lines having tax_ids. As such, both lines are considered taxable when they should not be and every time we create a price difference line, all taxes are recomputed and manually set tax lines are ignored. This is not the intended behavior because tax for price difference is already accounted for in the tax lines (computed before confirmation of bill) and the price difference lines themselves are just for account balancing and should not be considered taxable. Steps to reproduce bug on empty DB: 1) Install account and purchase_stock 2) Turn on automatic accounting in settings 3) Create a product category. Set inventory valuation to automated and create and set a price difference account. 4) Create a product. Set the price, set to product category to the created one, and enable track inventory. 5) Create a vendor bill with the product and set a bill date. 6) Change the price of the product in the bill lines to anything but the original price. 7) Change the tax by clicking on the input field with the pencil icon above amount total to anything but the original tax. 8) Confirm the vendor bill and notice the manually changed tax value revert back to the original value. Behavior after bug fix: Upon completing step 8, the manually changed tax value should stay and not be recomputed. opw-4854669 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update prevents mail templates from automatically deleting attachments when they are removed from the mail composer. Previously, deleting an attachment in the composer also removed it from the template, causing confusion. The fix simplifies the process by only removing attachments from the template when explicitly deleted in the composer.
Original PR description
Removing an attachment (coming from a mail template) in the mail composer wrongly removes it from the template. - Edit the "Sales: Send Quotation" mail template, add it an attachment - Go to a draft…
Removing an attachment (coming from a mail template) in the mail composer wrongly removes it from the template. - Edit the "Sales: Send Quotation" mail template, add it an attachment - Go to a draft quotation - Click on "Send", it will open the mail composer which will use the template. You should see the file you added on the template. - Now, remove that file from the composer. For instance, for this client you don't want to send it, or you want to replace it or whatever. - The mail attachment has also been deleted from the template, not only from the current mail. - Note that you don't need to send it, just deleting it in the composer is enough to have it removed on the template. Many refactoring were made in `mail` between Odoo 17 and 18, breaking this flow. Another solution would be to change that in JS side, somehow managing to call `delete()` and not `remove()` in `/mail/[..]/attachment_model.js`. The caller is in `unlink()` in `/mail/[..]/attachment_upload_service.js` which is itself called by `onFileRemove()` from `/mail/[..]/mail_composer_attachment_list.js`. That would've kept using the same attachment record as the one in the template without removing it from the template when it's removed from the composer. The python solution seems more straightforward and since it's creating new attachment no other bugs should arise. Finally, note that "ghost" attachment are garbage collected through the `_gc_lost_attachments()` autovacuum method, looking for attachment having `res_id=0` and `mail.compose.message` as model. task-4748058
This update fixes an issue where manually set prices in Point of Sale (PoS) quotations weren't correctly applied during settlement, leading to incorrect final prices. Now, PoS settlements accurately reflect user-defined prices for products, ensuring accurate revenue calculations. This improves the reliability of PoS transactions.
Original PR description
**Steps to reproduce:** - Create a product tracked by lot, set it's price to 1000 - Create a quotation add a line with the created product and change the price to 1200 - Add another line with the same product and change it's price to 600 - Go to PoS and settle this quotation - The lines' prices will be 1000 and 600 instead of 1200 and 600 **Why the fix:** In the event of a settle with a product tracked by lots, we are setting the price of all *related_lines* (lines with the same product in this case) to it's base price, not taking into account the fact that this price has been modified by the user when making the quotation. This only happens for related lines, which explains why one line's price is still 600 while the other was reverted to the base price of 1000 instead of being 1200 as it was previously set. To avoid this, we now set the price_unit back to the base one only if the price hasn't been changed manually. opw-5223463
This update fixes a performance issue in the POS self-order module that was causing delays when loading pricelists. By optimizing the database queries, the system now loads pricelists significantly faster, especially with a large number of products. This results in a smoother and more responsive POS experience for users.
Original PR description
Currently when a pricelist is set on a POS session, N+1 queries are generated when loading the data by calling `_get_product_price()` in a loop. This commit avoids the extra queries by performing the computation on the recordset using `_get_products_price()` and looping through the result instead. This commit also generally cleans up the function by removing unnecessary intermediate variables, and removing the redundant product_obj check. Benchmark opening /pos-self/data | product.product count | Before | After | Queries Before | Queries After | | --------------------- | ------ | ----- | -------------- | ------------- | | 1,500 | 2.16s | 0.72s | 1,711 | 185 | | 15,000 | 24.91s | 6.52s | 17,175 | 397 | opw-5477715
This update resolves a problem where CSV reports generated by the l10n_pe_reports module were failing due to incompatible CSV formatting settings. The fix ensures the reports generate correctly with Python 3.13 and removes unnecessary configuration steps, improving stability and efficiency. This prevents errors during report generation, particularly on automated builds.
Original PR description
Revealed when l10n modules got enabled on the "distro builds" nightly: on Trixie, `delimiter="|", lineterminator='|\n'` raises ValueError: bad delimiter or lineterminator value This is due to…
Revealed when l10n modules got enabled on the "distro builds" nightly: on Trixie, `delimiter="|", lineterminator='|\n'` raises
ValueError: bad delimiter or lineterminator value
This is due to python/cpython#113797 which added new validations to dialect definitions. For this issue, that the delimiter can not be in the line terminator. This can be fixed via a different trick, which is documented:
> The optional `restval` parameter specifies the value to be written
> if the dictionary is missing a key in `fieldnames`.
so if we add a trailing fieldname which *can not* be found in the row dicts, then `DictWriter` will always write out an empty trailing cell (the default `restval` is an empty string), which should result in the same output.
Also remove the `csv.register_dialect` calls, that's so subsequent CSV calls can easily refer to a common configuration but here two different dialects are being registered under the same name, and each one is only used for the following `DictWriter` call, so at best this is a complete waste of time and at worst this is a race condition in threaded configurations. Just pass the formatting parameters directly to the `DictWriter`.
https://runbot.odoo.com/odoo/error/240950
Forward-Port-Of: odoo/enterprise#109081A bug was causing a validation error when simultaneously updating the fiscal year's last month and last day for a company and its branches. This fix ensures that all changes are applied before the system checks for constraints, preventing the error and allowing users to correctly configure fiscal year settings. This improves the reliability of accounting configurations.
Original PR description
Having a parent company and a chid company selected, and changing both the last day and the last month of the fiscal year as the same time raises a ValidationError. This is because in this case, in the write we successively modify each changed delegated fields from root company to the branches. Then, when checking the constrains we loop through all delegated fields and check if the value of the branches are the same as the root company. This check triggers the error as all values are not set yet. By using a write on branches for all changed delegated fields instead of a simple assignation, the constrains check occurs once all the value have been updated. Steps: - Have a root company and a branch - Select both in company selector - Go to Accounting configuration - Change fiscalyear last month AND ast day at the same time - Save -> ValidationError in `_check_root_delegated_fields` opw-5431145
This update resolves a runtime error that occurred when generating the stock forecast report. Specifically, the report was failing due to an issue with how stock movements were being processed during delivery transfers. This change ensures the report generates correctly, preventing data inaccuracies.
Original PR description
This reverts commit 2b2d73df420baee4fec1c51c28250666d80b48b8. ## How to reproduce (in runbot): - Create Product P - Create Delivery transfer from 'WH/Stock/Shelf 1' - Open Forecast report: =>…
This reverts commit 2b2d73df420baee4fec1c51c28250666d80b48b8.
## How to reproduce (in runbot):
- Create Product P
- Create Delivery transfer from 'WH/Stock/Shelf 1'
- Open Forecast report:
=> RuntimeError: dictionary changed size during iteration
The original fix will be redone in another commit.
---
## Traceback:
```
File "/data/build/odoo/addons/stock/report/stock_forecasted.py", line 21, in get_report_values
'docs': self._get_report_data(product_ids=docids),
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/addons/stock/report/stock_forecasted.py", line 128, in _get_report_data
res['lines'] = self._get_report_lines(product_template_ids, product_ids, wh_location_ids, wh_stock_location)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/addons/stock/report/stock_forecasted.py", line 359, in _get_report_lines
for product_id, location_id in currents:
RuntimeError: dictionary changed size during iteration
```
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#251768This update fixes an issue where landed cost accounting for subcontracted receipts didn't accurately reflect the quantity of stock still in inventory. The fix ensures that the correct number of account move lines are created to properly account for stock movements, aligning with standard accounting practices for non-subcontracted products.
Original PR description
…lues landed cost sbc **Problem:** account move line created from a landed cost on a subcontracted receipt do not take into account already out quantity. **Steps to reproduce:** - create a tracked…
…lues landed cost sbc **Problem:** account move line created from a landed cost on a subcontracted receipt do not take into account already out quantity. **Steps to reproduce:** - create a tracked product with avco auto category - create a subcontracted bom for this product with no comp - create and confirm a PO for 10 unit of this product with the same partner as the subcontractor of the bom - validate the receipt - create and validate a delivery for 4 unit of your product - navigate to inventory/operations/adjustments/landed costs - create a new landed cost - select the receipt from the PO - add a landed cost of 10$ and validate - select the valuation smart button - a 6$ svl was created (which is correct because 6 out 10 products of the receipt are still in stock) - click on the book widget to open the account move view **Current behavior:** Only two account move lines were created both with a value of 10 One crediting sotck interim received On debiting stock valuation **Expected behavior:** 4 extra account move lines (all with a value of 4) should have been created to compensate the out quantity like it is the case for non subcontracted product. One debiting stock interim delivered One crediting stock valuation One debiting expenses One crediting stock interim delivered **Cause of the issue:** _is_in() will return false for the move of a subcontracted receipt https://github.com/odoo/odoo/blob/7462ec423e8b106a5175a71ac009176d16cdf225/addons/stock_landed_costs/models/stock_landed_cost.py#L185 This is wanted and happens because _should_be_valued() will return true when called on the subcontracted location https://github.com/odoo/odoo/blob/7462ec423e8b106a5175a71ac009176d16cdf225/addons/stock_account/models/stock_move.py#L129 As a consequence, qty_out stays 0 https://github.com/odoo/odoo/blob/7462ec423e8b106a5175a71ac009176d16cdf225/addons/stock_landed_costs/models/stock_landed_cost.py#L185-L186 and we do not append the values for the extra amls inside _create_account_move_line() https://github.com/odoo/odoo/blob/7462ec423e8b106a5175a71ac009176d16cdf225/addons/stock_landed_costs/models/stock_landed_cost.py#L465-L466 **fix:** if we make sure the the adjustment line is linked to the move of the MO instead of the move of the receipt, this problem does not happen because _is_in() returns true for the move of the MO. Also in this case we don't need _get_stock_valuation_layer_ids() which was introduced by this PR https://github.com/odoo/odoo/pull/166107 to solve the same issue. That is because the move used in button_validate is the move linked to the adjustment line, which will, after this fix, be the one of the MO, so we can directly take its stock valuation layers. opw-5723126
This update resolves a problem with the HTML Editor's automated tests. The tests were unreliable due to the toolbar being a popover, making it difficult to wait for the display to fully load. The team has increased timeouts and addressed timing issues to ensure test stability and consistent results.
This update corrects a discrepancy in the Spanish version of the abbreviated balance sheet report. It adds account code 189, required by recent Spanish accounting regulations (PGCE) to ensure accurate reporting and compliance. This ensures the financial reports generated for Spanish businesses align with current legal requirements.
Original PR description
According to last updated of PGCE https://www.boe.es/buscar/act.php?id=BOE-A-2011-18458 <img width="790" height="342" alt="image" src="https://github.com/user-attachments/assets/d5875946-d3b0-480b-bea1-8a7f4202aef7" /> @moduon MT-14017
This update fixes an issue in the batch transfer report where product lines were scattered across the document, causing operators to waste time scanning. The report now sorts move lines by product, grouping similar items together for quicker identification and reduced operational inefficiencies.
Original PR description
Issue Before This Commit: ======================= In the `batch transfer report`, move lines are ordered by the `picking's batch sequence` (picking_id.batch_sequence). When operators use the document…
Issue Before This Commit: ======================= In the `batch transfer report`, move lines are ordered by the `picking's batch sequence` (picking_id.batch_sequence). When operators use the document to pick items, they have to scan through the report to find all lines for the same product. As a result, operators `lose time scanning the document` and `risk of missing lines`. Steps to Reproduce: ======================= - Install the `stock_picking_batch` module. - Create `multiple deliveries` with several `common products`. - Add these deliveries to a batch transfer and print the batch transfer report. - Observe that product lines are ordered by location and then by picking. Cause of the issue: ======================= The batch transfer report currently sorts move lines by picking in the report `(picking_id.batch_sequence)`. When the same product exists in another picking, This causes lines for the same product to be scattered across the report instead of being grouped together, causing the product to appear in multiple places in the document. After This Commit: ======================= In the report, move line sorting by picking (picking_id.batch_sequence) has been replaced with sorting by product `(product_id.id)`. Move lines are now ordered by product, so similar products are displayed together in the document. This helps operators find products more quickly, reduces scanning effort, and makes the process more reliable. TaskID-5379367
This update corrects an issue where phone numbers on Arabic receipts were displayed in reverse (right-to-left) instead of the correct left-to-right format. The fix ensures phone numbers are correctly formatted based on the selected language, improving the user experience for Arabic-speaking customers. Alternative fixes were considered but the XML fix is the most straightforward.
Original PR description
# Steps to reproduce: - Open the company, change the language to Arabic - Go to POS, open the shop - Buy anything and click on receipt # Problem: When clicking on the receipt, you would find the…
# Steps to reproduce:
- Open the company, change the language to Arabic
- Go to POS, open the shop
- Buy anything and click on receipt
# Problem:
When clicking on the receipt, you would find the phone number is written right to left, although it should be printed left to right.
# Cause:
Normally when another language is selected, this line will adapt to it, and translate the whole block "Tel: `props.data.company.phone`" to arabic (right to left)
https://github.com/odoo/odoo/blob/5fc1e34d174f7f61d692d086d0ff65fbfc72b013/addons/point_of_sale/static/src/app/screens/receipt_screen/receipt/receipt_header/receipt_header.xml#L12
# Fix:
We need to specify the direction of the phone number to be Left to right.
```
<div>Tel:<span dir="ltr"><t t-esc="props.data.company.phone" /></span></div>
```
**Result:**
<img width="167" height="86" alt="HATEF" src="https://github.com/user-attachments/assets/4fe0bdd0-fe77-430f-9136-cd7086c4d5d9" />
There is also alternative fixes:
# First alternative fix:
Replace the '+' with '00' (there is no difference when trying to copy), and make a function in js that preserve the whole thing in a string variable.
```
get phoneText() {
return _t("Tel:") + " " + this.props.data.company.phone.replace("+", "00");
}
```
**Result:**
<img width="215" height="148" alt="hatef2" src="https://github.com/user-attachments/assets/e9cb4415-baad-4d66-a04b-ecdb308e3e72" />
**Drawback:**
- The inconsistency between how the number is stored and how we view it.
# Second alternative fix:
**File:** `/home/odoo/codebase/odoo/addons/point_of_sale/static/src/app/screens/receipt_screen/receipt/receipt_header/receipt_header.js`
```diff
import { _t } from "@web/core/l10n/translation";
import { Component } from "@odoo/owl";
+ import { localization } from "@web/core/l10n/localization";
```
```diff
+ get direction() {
+ return localization.direction;
+ }
```
**File:** `/home/odoo/codebase/odoo/addons/point_of_sale/static/src/app/screens/receipt_screen/receipt/receipt_header/receipt_header.xml`
```diff
<t t-if="props.data.company.phone">
- <div>Tel:<t t-esc="props.data.company.phone" /></div>
+ <t t-if="direction == 'ltr'">
+ <div>Tel:<t t-esc="props.data.company.phone" /></div>
+ </t>
+ <t t-elif="direction == 'rtl'">
+ <div><t t-esc="props.data.company.phone" />Tel:</div>
</t>
</t>
```
**Drawback:**
- Too much code for a small issue that probably won't bother the client.
- The need to change in multiple translation files for all RTL languages in odoo.
- Readability
opw-5881503
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update fixes a restriction in the Italian tax processing (l10n_it_edi_doi) module, allowing multiple tax lines to be added to invoices, including those with 0% taxes like Enasarco and RIT. This change aligns with Italian tax regulations that permit combining Dichiarazione d'intento with other tax withholdings on the same invoice.
Original PR description
We should be able to add more taxes with the 0% on the same line, like the Enasarco and 23% RIT. Indeed in italy it is possible to have invoices with Dichiarazione d'intento togheter with a withholding and Enasarco taxes. See also: odoo/odoo#236251 Ticket [link](https://www.odoo.com/odoo/project.task/5933699) opw-5933699 Forward-Port-Of: odoo/odoo#248586
This update resolves a minor technical issue that was preventing the correct processing of account EDI invoices, specifically related to handling country codes. The change ensures the system correctly identifies supported countries, improving the reliability of invoice generation and transmission. This fix was made as part of our ongoing commitment to stability and accuracy.
Original PR description
`('FR, DE')` was a single string instead of a tuple, causing a TypeError when `country_code` is not a string (e.g. falsy value on empty recordset). Changed to `('FR', 'DE')` so membership test is used instead of substring search.
opw-6004910
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update fixes an issue where miscellaneous journal entries weren't appearing in the printed follow-up reports, even when marked for inclusion. Now, all relevant information from these entries, including the entry itself, is accurately reflected in the reports sent to partners. This ensures partners receive a complete overview of overdue receivables.
Original PR description
…port Currently, even if users mark a miscellaneous entry to be included in the follow-up report, only its amount is counted in the total overdue; the entry itself is excluded from the printed report sent to the partner. Steps to reproduce: - Have a journal item with partner, receivable account and due date in the past - Open followup report for the partner, uncheck 'No followup' for the aml - Go back to the partner, in the followup section, hit 'Send' and send the manual followup (or wait/trigger the scheduled action) Issue: Printed followup report is missing any info on the misc entry opw-5405657
This update resolves an issue where self-order prices weren't accurately calculated when taxes and fiscal position mappings were involved. The fix ensures prices are correctly recomputed using accounting methods, leading to more accurate order totals and improved financial reporting. This impacts self-service ordering functionality.
Original PR description
Before this commit, the price of order lines from self was recomputed in the backend but for orders with price included taxes and a fiscal position mapping, the recomputation was not correct. This commit fixes the issue by recomputing the prices using compute_all method from accounting on taxes after fiscal position. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where vendor bills with foreign VAT companies were not correctly identifying the country of origin for VAT reporting. The fix ensures accurate JPK country code reporting for both invoices going out and vendor bills coming in, aligning with Polish tax regulations. This improves the accuracy of financial reporting.
Original PR description
PR #81359 fixed the country code for foreign VAT companies by adding the country code to the start. However, this was only fixed for invoices going out, not vendor bills coming in. [opw-5917264](https://www.odoo.com/odoo/project.task/5917264) Forward-Port-Of: odoo/enterprise#109080
This update resolves an issue where validating intercompany receipts could trigger an access error. The fix prevents the system from attempting to access location data from a different company during the validation process, ensuring smooth intercompany transactions. This improves reliability for users managing multi-company stock operations.
Original PR description
**Issue**: Validating a receipt with intercompany move, can lead to access right issue **Steps to reproduce**: - Create two different companies A and B - Create an inter company route with two 'pull…
**Issue**: Validating a receipt with intercompany move, can lead to access right issue **Steps to reproduce**: - Create two different companies A and B - Create an inter company route with two 'pull from' action defined: - One from Virtual Locations/Inter-company transit to A/Stock with operation type A: Receipts - One from B/stock to Virtual Locations/Inter-company transit with operation type B: Delivery Orders - Create a product P accessible from both company - Create a MO (while both company activated with company A selected) for a product that consumes 1 unit P as component and confirm it - Go to the receipt while only company B activated - Select a quantity of 1 and validate it -> A traceback is displayed **Cause**: While confirming the receipt (calling `button_validate`): https://github.com/odoo/odoo/blob/e9a8b81d4a972a57a8f46377864874190b04af2c/addons/stock/models/stock_picking.py#L1403 this will eventually runs: https://github.com/odoo/odoo/blob/e9a8b81d4a972a57a8f46377864874190b04af2c/addons/stock/models/stock_move.py#L2091 https://github.com/odoo/odoo/blob/e9a8b81d4a972a57a8f46377864874190b04af2c/addons/stock/models/stock_move.py#L2036-L2039 Since self.move_dest_ids belongs to another company, accessing the associated location_id triggers an AccessError. opw-5177369
This update resolves a minor typographical error within the account_edi_ubl_cii module. The fix ensures accurate processing of electronic invoices, preventing potential issues with data import and export. This change has no impact on core Odoo functionality.
Original PR description
--- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects inaccuracies in the XML files used for processing Swedish payments (SEPA). Specifically, it ensures the correct BIC number is used, removes a misleading placeholder value, and allows users to select the appropriate payment version even without using the SEPA payment method. This improves the accuracy and reliability of Swedish payment processing within Odoo.
Original PR description
We currently have customizations for the iso20022 xml file for payments in Sweden. But those customizations aren't correct. This commit fix multiples issues: 1) In DbtrAgt, we sometimes have bankgiro information. But this node should always contain the BIC number for Swedish payments. 2) The _get_cleaned_bic_code method was replacing the real bic code with a fake value like 'SE:Bankgiro', but this seems to be wrong. None of the SE banks ask for this BIC, so we remove it. 3) The sepa_pain_version field is supposed to tell Odoo which pain version to use. But the problem is this field is computed, and only editable once the user set the SEPA payment method, but for iso_se, we want to let the user choose as well, even if he didn't add SEPA as payment method. This commit change the invisible on the field, so it can be edited as soon as iso_se is in the journal payment methods. task-5427570
This update resolves an issue in Safari where pressing the spacebar would incorrectly move the text selection within the HTML editor. The fix manually merges adjacent text nodes to ensure the selection remains accurate, improving the editor's usability in Safari. This change enhances the user experience for Safari users.
Original PR description
Problem: In Safari, pressing space sometimes can move the selection unexpectedly. Cause: `node.normalize()` in Safari doesn't work in the same way as in Chrome or Firefox. When the selection is on a…
Problem: In Safari, pressing space sometimes can move the selection unexpectedly. Cause: `node.normalize()` in Safari doesn't work in the same way as in Chrome or Firefox. When the selection is on a text node adjacent to another and we normalize, the two text nodes will be merged but the selection will move to the parent element instead of the correct position inside the new merged text node. Example: before normalize: `<span>"ab""c[]d"</span>` after normalize: `<span>"ab[]cd"</span>` (expected) vs `<span[]>"abcd"</span>` (Safari) Solution: Instead of using `normalize`, we manually merge adjacent text nodes and properly restore the selection by computing the absolute offset before the merge and restoring it to the correct position in the merged text node. Steps to reproduce: - Have two adjacent text nodes inside a `span`. - Put the selection on the second text node in the middle. - Press space. - The selection will move to the end of the text. opw-5956709 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change reverts a previous update that incorrectly applied taxes to down payments in point-of-sale and sales orders. This ensures accurate tax calculations are applied during down payment transactions, aligning with current accounting standards. The change corrects a previous issue impacting sales order and point-of-sale tax calculations.
Original PR description
This reverts commit 6831d64b80ebc542ed814d322e8e7ec2ca3b044e. opw-5853070
This update ensures that timesheet adjustments for sale order lines accurately reflect the correct cost, regardless of the invoice policy used (ordered_prepaid, delivered_manual, or delivered_milestones). Previously, this calculation was inconsistent, leading to inaccurate sales reporting. This fix resolves a bug that has been identified and tracked in previous PRs.
Original PR description
Originally, timesheet updates for tasks associated with sale order lines would cause the cost (purchase_price) to be recomputed. However, this was prevented if the invoice policy was 'ordered_prepaid.' This should also apply to 'delivered_manual' and 'delivered_milestones.' Otherwise, any timesheet updates will recompute the sales.order.line purchase_price field. Steps to reproduce: Create a service product that creates a project/tasks Create a sales order with the product and manually set the cost Assign the timesheets of the task to an employee Have the employee update their timesheet for the task The cost on the sales order line gets recomputed to the default product price Duplicate of pr-250495 task-5902688 related-pr-205415 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251521
This update ensures that disabled user accounts are no longer incorrectly flagged as blacklisted when checking email communication. This prevents unnecessary blocking and improves the overall reliability of the system. The change was originally reported and addressed in a previous release.
Original PR description
Same as https://github.com/odoo/odoo/pull/249466, but for v17 and with tests. > When computing wether the user is blacklisted, disabled records must be ignored. > > https://www.loom.com/share/41ea437477f8416f8b50f9ef979d82bf > > > --- > I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr > > @moduon MT-13153 OPW-5952301 Forward-Port-Of: odoo/odoo#250361
This update fixes an issue where large company logos in Odoo documents were overlapping with customer address information. The PR adds a maximum width constraint to the small company logo, ensuring a cleaner and more readable document layout. This improves the overall user experience and prevents visual confusion.
Original PR description
**Description of the issue/feature this PR addresses:** Similar issue described in: https://github.com/odoo/odoo/pull/249432 Since there is no `max-width` defined for `o_company_logo_small`, if a user uploads a large logo, the customer address overlaps with the company details. This can be tested by previewing the document with a large logo. <img width="684" height="449" alt="image" src="https://github.com/user-attachments/assets/aa2ac10b-cb0f-448a-ade3-6e7bb8b1fcff" /> **Current behavior before PR:** <img width="681" height="383" alt="image" src="https://github.com/user-attachments/assets/cf7d5740-db51-43e3-b8f6-70325e9e28c0" /> **Desired behavior after PR is merged:** <img width="505" height="307" alt="image" src="https://github.com/user-attachments/assets/b175a06a-cde0-4808-a1fb-276fd96272c3" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr cc @ForgeFlow
This update resolves a technical issue where a test case incorrectly left data in an Odoo model. The fix ensures that test data is properly cleaned up after each test run, preventing persistent data from impacting subsequent tests. This improves the reliability of our testing process.
Original PR description
In a previous PR a test case was added the test if fields added via studio would export correctly, in doing so, the fields were added to the model inside the test case, but when continuing with the test case suite, the registery is not cleaned automatically so the fields were still present and have to be removed. task-none related-task-4963157
A broken link in the Odoo Point of Sale settings was directing users to a 404 error page. This update corrects a typo in the documentation URL, ensuring users can now access the correct online documentation for the Stripe payment provider. This improves usability and support for users utilizing the Stripe payment method.
Original PR description
A link (behind a small '?' icon) to online documentation for the Stripe payment provider is broken, on the `Point of Sale > Settings > Payment Terminals` page section. Versions affected: 18.0  Current behavior before PR: - The user is directed to a 404 error page. Desired behavior after PR is merged: - The Odoo online documentation for the Stripe payment provider should be displayed. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update clarifies the behavior of Helpdesk article searches when using non-root articles as the main search source. A previous change limited search results to the specific article, now the documentation has been updated to reflect this. Additionally, a minor UI issue related to dropdowns has been addressed.
Original PR description
*: website_helpdesk_knowledge **Steps to reproduce:** - Install Helpdesk/Knowledge/Website apps - Go to Knowledge - Set up a Knowledge workspace root article with some child articles to it - Go to…
*: website_helpdesk_knowledge
**Steps to reproduce:**
- Install Helpdesk/Knowledge/Website apps
- Go to Knowledge
- Set up a Knowledge workspace root article with some child articles to it
- Go to Helpdesk > Configuration > Helpdesk Teams
- Open a Helpdesk team, and go to its Help Center config
- Check Knowledge and set a non-root article as main Article
- Go to Website > Help
First issue (non-root main article):
- Type a word which is present in both the article and one of its child articles
- Only the given article match the word
- If you use the root article it will match in any descendant
Second issue (in every case):
- Type a word in the search bar
- Wait for the dropdown to appear
- Click elsewhere, dropdown is properly hidden
- Try to change the search > Traceback
**Issue:**
The domain used to find the articles to match the search uses the current id as the `root_article_id`:
`['|', ('id', '=', team_article.id), ('root_article_id', '=', team_article.id)],` which was previously working in every case as it was not possible to set a non-root article in the team setting.
This was later changed to allow any article as the default website page. As a result, when a non-root article is selected, the search domain only applies to that specific article and no longer includes its descendants.
The other issue is related to the added boostrap attribute `data-bs-toggle="dropdown"` which is not properly reset when the dropdown is removed, and triggers the creation of an empty dropdown.
**Fix:**
Doesn't seem easy to fix to allow the search on all the descendants of the given article as we can't use the article `root_article_id` and filter out the unwanted results in a clean way (and it doesn't seem doable with a direct domain). Instead clarify the situation in the help of the article.
Also manually reset the attribute for `_onFocusOut`.
related: https://github.com/odoo/enterprise/commit/ed971d4d02624f8b864ab6c37c6e7db8ba3dfe11
opw-5258607