Tuesday, May 5, 2026
12 changes · saas-18.4
Resolved issues and error corrections
Manufacturing orders now correctly include every component from a bill of materials, even when it has more than 40 lines. This prevents missing material movements and helps ensure production orders reflect the full list of required parts.
Original PR description
Bug introduced in: https://github.com/odoo/odoo/commit/14d3893c763f6413581e7f36099cee0adb2caa83 Steps to reproduce the bug: - Create a BoM with more than 40 components - Create a manufacturing order with this BoM Problem: Only the first 40 components are taken into account and their moves are created; the remaining ones are not created. opw-6186544 Forward-Port-Of: odoo/odoo#262692
This fixes an issue where files uploaded in the chatter could be attached to the wrong record if a user moved to another record before the upload finished. Uploads are now tied to the record where they started, reducing the risk of misplaced attachments and confusing record histories.
Original PR description
Currently, when uploading a bunch of attachments or a big one to the chatter, if you click on the pager (e.g. next) before the upload is complete, the attachments that have not yet been uploaded are uploaded to the next record. Due to the persistence of the Chatter component during record navigation and the fact that the `FileUploader` logic is tied to `state.thread`, an async callback that finishes after a record switch will attempt to update the currently active thread rather than the one that initiated the upload. With this change we tie uploader lifecycle to a specific record and ensure the completion callback only affects that record. task-5119290 Forward-Port-Of: odoo/odoo#261552
This fix ensures employees cannot receive a time off allocation that deducts overtime unless they have enough overtime available, even when the time off type is changed after the allocation is first created. It also prevents duplicate overtime adjustments, keeping leave balances and overtime records accurate.
Original PR description
Steps to reproduce: ------------------------------------- 1. Install `hr_holidays_attendance` module 2. Time off > configurations > Time off types 3. Create new time off type as follows: * Set…
Steps to reproduce: ------------------------------------- 1. Install `hr_holidays_attendance` module 2. Time off > configurations > Time off types 3. Create new time off type as follows: * Set Approval to Approved by time off officer * Change Take time off In to Hours 4. Save the record and enable Deduct Extra Hours 5. Go to Management > Allocations 6. Create new allocation with created time off type and select 'Audrey Peterson' in Employee 7. Try to save record > Validation Error > Discard changes 8. Change time off type to Paid Time Off > add 'Audrey Peterson' > save record 9. Now change Time Off type to Created Time Off type > Save Observation: ------------------------------------- No Validation Error raised, as the employee and time off type are still the same as they were during creating allocation. Issue: ------------------------------------- In `write` method, there was no any check for the employee if it has enough overtime hours when we change Time off type (`holiday_status_id`) to overtime-deductible leave type. Check was only present in the `create` method: https://github.com/odoo/odoo/blob/a95c639db68f98351c7162de58a041a1c0ee13c5/addons/hr_holidays_attendance/models/hr_leave_allocation.py#L39-L49 Solution: ------------------------------------- 1. Create new function for validate overtime and to create adjustment 2. Added that function to `create` as well as in `write` method 3. Prevents creating a duplicate overtime adjustment for an allocation that already has one opw-5937185 Forward-Port-Of: odoo/odoo#261917 Forward-Port-Of: odoo/odoo#249793
This fix ensures invoice lines in branch companies correctly recalculate product unit prices when tax-included taxes are changed by a fiscal position. It prevents invoices from overstating the pre-tax unit price, improving billing accuracy in multi-company branch setups.
Original PR description
When operating in a multi-company branch environment, the unit price of a product with price-included taxes is not correctly recalculated when applying a fiscal position. Steps to reproduce: - Create a tax that is included in the price (e.g., 10% incl). - Assign this tax to a product (e.g., Product A). - Create a fiscal position that maps this 10% tax to a different tax. - Create a branch (child company) of your main company. - Create an invoice in the new branch using the fiscal position and add an invoice line for Product A. Issue: The unit price of the product on the invoice line remains the full tax-included amount rather than being reduced to exclude the original 10% tax. opw-5931302 Forward-Port-Of: odoo/odoo#262190 Forward-Port-Of: odoo/odoo#256897
This fixes an issue where website-booked appointments could be missed by the scheduled Outlook synchronization. Businesses using Outlook calendar integration can now rely on website appointments being created in Outlook even when synchronization runs only in the background.
Original PR description
Before this change, the "Outlook: synchronization" cron would not create calendar events on Outlook's side in _sync_odoo2microsoft due to a filter for calendar.events written to within 5 minutes of…
Before this change, the "Outlook: synchronization" cron would not create calendar events on Outlook's side in _sync_odoo2microsoft due to a filter for calendar.events written to within 5 minutes of microsoft_last_sync_date, when _sync_data is not called when a calendar.event is created, such as through website.appointment. microsoft_last_sync_date was set to datetime.now() at the beginning of _sync_microsoft_calendar, which would skip a large period of time between the last sync and now, if the only syncs were triggered through cron, and not _sync_data (by opening the calendar app). To reproduce, Default "Outlook: synchronization" is ran every 12 hours. 1) Calendar event is synced through "Outlook: synchronization" cron at 00:00, setting microsoft_last_sync_date to 00:00 2) A website.appointment is created for a resource with Outlook calendar sync enabled any time between 00:01 - 11:54. 3) "Outlook: synchronization" runs again at 12:00, which sets microsoft_last_sync_date to 12:00, and filters out calendar.events based on their write_dates in _extend_microsoft_domain that need syncing outside of 11:55 to 12:00. This change removes setting of microsoft_last_sync_date at the beginning of _sync_microsoft_calendar, where we need to use the old value before setting it at the end of _sync_microsoft_calendar. opw-5212908 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261935 Forward-Port-Of: odoo/odoo#245964
The mail fetching service now rotates through incoming mail servers based on urgency, so lower-priority servers are no longer skipped when many servers are configured. This helps ensure all incoming mail accounts are checked regularly while still giving faster attention to higher-priority servers.
Original PR description
[FIX] mail: ensure all mailservers are fetched by fetchmail service The Scheduled Action Mail: Fetchmail Service sometimes ignored incoming mail servers when there were many servers. Steps to…
[FIX] mail: ensure all mailservers are fetched by fetchmail service The Scheduled Action Mail: Fetchmail Service sometimes ignored incoming mail servers when there were many servers. Steps to reproduce: -Ensure mail is installed -Create at least 15 incoming mail servers -Set one server to priority 10 (the default priority is 5) -Run the Mail: Fetchmail Service Scheduled Action multiple times -Observe that when it takes longer than 10 seconds to check all mail servers, we never check low priority servers. This commit introduces a method to sort servers in order of urgency, which ensures all servers are checked while respecting priority. Priority difference: We calculate the priority difference by taking the log of the number of servers. For example, 10 servers will have a difference of 1 minute between priority levels, while 50 servers will have a difference of 1.7 minutes between levels. We use the current fetchmail cron interval as the base interval. This base interval is used as the target interval for priority 1 servers, while the target interval for priority n servers = base interval + ((n - 1) * priority difference). The logarithmic scaling ensures that the priority difference grows with the number of servers without becoming too large. For example, given a base interval of 5 minutes and a priority difference of 1 minute, a priority 1 server has a target interval of 5 minutes, while a priority 10 server has a target interval of 5 + (9 * 1) = 14 minutes. Urgency ratio: The urgency ratio for a server is calculated by comparing the time since the server was last checked to the server's target interval. For example, a priority 1 server that was checked 5 minutes ago with a target interval of 5 minutes has an urgency ratio of 5 / 5 = 1.0. Meanwhile, a priority 10 server that was last checked 15 minutes ago with a target interval of 14 minutes has an urgency ratio of 15 / 14 = 1.07. The urgency ratio of 1.07 puts the priority 10 server as more urgent than the priority 1 server with an urgency ratio of 1.0. The urgency-based queue reacts well under load: if we experience a delay of 10 minutes, the priority 1 server now has an urgency ratio of 15 / 5 = 3.0, which we will check before the priority 10 server that now has an urgency ratio of 25 / 14 = 1.79. opw-5344968
This fixes Viva.com referenced refunds in Point of Sale by sending the original payment session information again. Businesses can now reverse the intended original payment reliably, reducing failed or incorrect refund handling.
Original PR description
Referenced refunds in Viva.com require the session ID of the original payment to be sent, resulting in that payment being reversed. Unfortunately this functionality was broken when a forward-port PR (odoo/odoo#236004) mistakenly removed the `parentSessionId` field from the request. This commit restores the `parentSessionId` field, fixing the issue. It also adds a tour to test the full payment and referenced refund flow. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#262475
Fixes an issue where settling a sales order in Point of Sale could double the quantity for lot-tracked products after a two-step warehouse delivery. This prevents incorrect product quantities and lot information from being loaded into POS orders, improving order accuracy for businesses using pick-then-deliver workflows.
Original PR description
When settling a sale order in POS after validating the delivery, quantities and lots were wrong for lot-tracked products with warehouse "Pick then Deliver (2 steps)": quantity doubled when loading…
When settling a sale order in POS after validating the delivery, quantities and lots were wrong for lot-tracked products with warehouse "Pick then Deliver (2 steps)": quantity doubled when loading SN/Lots. Steps to reproduce: ------------------- * Create a product with Tracking by lots * In Inventory, set warehouse Outgoing Shipments to "Pick then Deliver (2 steps)" * Create a quotation with the product and confirm it * Validate the delivery * In POS, settle the sale order from Quotation/Order * When asked "Do you want to load the SN/Lots linked to the Sales Order?", click Yes > Observation: Quantity doubled. Why the fix: ------------ read_converted() used move_line_ids from all moves linked to the sale line. With 2-step, both pick and delivery moves have move_line_ids with the same lots, so quantities were counted twice. We now use move lines from exactly one picking and filter by sale_line_id. opw-6001585 Forward-Port-Of: odoo/odoo#262122 Forward-Port-Of: odoo/odoo#253539
Imported invoices now preserve discount values without unwanted rounding, preventing small subtotal differences between the source file and Odoo. This improves accuracy for Italian electronic invoice imports and related accounting records.
Original PR description
**PROBLEM** When importing an invoice, we don't want to round the discounts, to avoid discrepancy between the subtotal computed by Odoo, and the subtotal of the file we import. To do this, we change the decimal precision of discount to 100 digits when importing files. However, float_round wasn't built with this in mind, in float round, we add a small epsilon to fix some rounding issue. This small epsilon changes the amount of the discount (50.0 -> 0.5000000000004) and this changes the subtotal. **STEP TO REPRODUCE** 1. Install l10n_edi_it. 2. Change the VAT number of IT Company to 05098540288 (to match the one on the file to import). 3. Import the file present in the bug ticket. 4. Notice the subtotal of the line doesn't match what's in the invoice. **FIX** We skip rounding of the discount on import. Ticket [link](https://www.odoo.com/odoo/project.task/6046324) opw-6046324 Forward-Port-Of: odoo/odoo#262562 Forward-Port-Of: odoo/odoo#256037
This fix prevents Odoo from automatically recalculating manually adjusted tax totals when confirming a supplier bill linked to a purchase order with partial quantities already delivered or consumed. It helps ensure accounting staff can keep intentional tax corrections on bills instead of having them unexpectedly reset during validation.
Original PR description
**Steps to reproduce:** - create a storable product avco auto - make sure that a purchase tax is set in 'General Information' - create and confirm a PO for 30 quantities with a price of 0 - receive…
**Steps to reproduce:** - create a storable product avco auto - make sure that a purchase tax is set in 'General Information' - create and confirm a PO for 30 quantities with a price of 0 - receive the products - create and validate a delivery for 10 units of the product - from the PO create the bill - set a date and save - set a price of 100 - on the Bill set the total tax at 500 (it's bellow 'untaxed amount' on the bottom right of the bill and should be 450 before you change it, if the tax is 15%) - confirm the bill **Current behavior:** The total tax was reset to 450 **Expected behavior:** It should stay 500 as it was manually set **Cause of the issue:** The total tax amount is computed based on the tax lines in Journal Items https://github.com/odoo/odoo/blob/2744396733bb3ad60813e9e093d67192c0d38b36/addons/account/models/account_move.py#L1171 So the problem is actually that a recomputation of the balance of the tax account.move.line (the one with the account "tax paid" in journal items) is triggered when we confirm the Bill. That's because : When we confirm the bill, because the price is different than the one on the PO, _apply_price_difference does 2 things : (1) it creates an svl (with corresponding amls) for the quantities that are still in stock (here 20) (2) it adds amls on the bill (crediting stock interim received and debiting expense) to compensate the cogs deficit for the already out of stock quantities (here 10). cf https://github.com/odoo/odoo/pull/126536 for more details When we create those amls from (2), the create method from account.move.lines calls super() inside a context manager calling _sync_dynamic_lines(). https://github.com/odoo/odoo/blob/5583cbcebae00d8122dce5ce929b650929966a90/addons/account/models/account_move_line.py#L1628-L1635 the yield of sync_dynamic_lines() is inside a context manager calling _sync_tax_lines. https://github.com/odoo/odoo/blob/5583cbcebae00d8122dce5ce929b650929966a90/addons/account/models/account_move.py#L3250 Therefore, the first half of sync_tax_lines() (untill the yield) is ran before the call to super and the rest (from the yield) is ran after the call to super. Because we added two lines in the account.move, get_changed_lines will return those 2 new line and because there is a tax_ids on the new lines round_from_tax will be False. https://github.com/odoo/odoo/blob/5583cbcebae00d8122dce5ce929b650929966a90/addons/account/models/account_move.py#L3034-L3041 Therefore we won't reach continue. https://github.com/odoo/odoo/blob/73d73c5c6606e0b34c754bfc4de035840951dd3b/addons/account/models/account_move.py#L3055-L3059 And the tax line will be recomputed using _prepare_tax_line() https://github.com/odoo/odoo/blob/73d73c5c6606e0b34c754bfc4de035840951dd3b/addons/account/models/account_move.py#L3065 Here is why there is a tax_ids on the new lines : The field is precompute so if we don't set a value for it, _compute_tax_ids will be ran to compute it. As the account move on which the lines are added is a bill, the tax_ids will the supplier_tax_id of the product. https://github.com/odoo/odoo/blob/73d73c5c6606e0b34c754bfc4de035840951dd3b/addons/account/models/account_move_line.py#L898-L901 **Fix:** There is no need for a tax_ids on these lines as they are not meant to (and should'nt) impact the taxes. opw-5413798 Forward-Port-Of: odoo/odoo#261559
This update resolves an issue where Amazon's stock synchronization was failing due to incorrect fulfillment channel data. The system now uses a new API field to accurately determine channel availability, defaulting to FBM when necessary to ensure stock updates continue. The change also improves how user-specific configurations are handled during synchronization.
Original PR description
During the upgrade from XML-based feeds to the new JSON Listings API for stock management, we chose to use Amazon's API to fetch a listing's fulfillment channel information. However, Amazon does not…
During the upgrade from XML-based feeds to the new JSON Listings API for stock management, we chose to use Amazon's API to fetch a listing's fulfillment channel information. However, Amazon does not provide a clear answer for a given listing. After some research, we assumed an offer was FBM when the listing contained a `merchant_shipping_group`, because this setting is specific to FBM listings. See also e6d620e4b200cadabb00ce37ab03289cfeb4ae58. This assumption was flawed: Amazon can keep the shipping group even after a listing switches to FBA, which can block stock synchronization. This commit uses the `fulfillmentAvailability` field from the Listings API instead. This field stores the available quantity for each fulfillment channel in which the listing is sold. When multiple fulfillment channels are present, the offer defaults to FBM so stock synchronization can continue. The `sale_amazon_channel_management` module can then be installed to manually select and disambiguate the channel. This commit also upgrades the patching method used to update the FBM stock to ensure user specific configuration aren't overriden during the synchronization. opw-6064896 opw-5152359 Forward-Port-Of: odoo/enterprise#114473
This update resolves an issue causing incorrect rounding when importing purchase orders processed through OCR. The fix restores the original rounding precision, which was designed for EDI, rather than the OCR process, ensuring accurate financial data. This prevents potential discrepancies in purchase order totals.
Original PR description
Since commit odoo/odoo@86463ce, there could be rounding issues when importing a purchase order matched through the OCR. A first attempt at fixing this was done in commit odoo/odoo@5dbb814, but it was eventually reverted as deemed too risky for a stable branch. More information about how the rounding error occurred is available in that commit description. This second fix should be much safer, we simply don't disable the rounding precision when the OCR is used, as this was intended for EDI in mind in the first place, not the OCR. opw-[6113387](https://www.odoo.com/odoo/my-support-tasks/6113387) Forward-Port-Of: odoo/enterprise#116021