Thursday, July 2, 2026
28 changes · saas-19.4
Enhancements to existing features
This change removes technical e-reporting fields from the main invoice screen to reduce clutter for regular users. Important e-reporting status updates and blocking issues are still recorded in the invoice chatter, with a direct link to the related flow for easier follow-up.
Original PR description
E-reporting technical fields were displayed directly on invoices, adding noise for regular invoicing users. Hide the e-reporting status columns and technical block from the standard invoice views. Log the relevant e-reporting flow, status and blocking errors in the invoice chatter instead, with a link to the related flow. Also avoid reporting address validation errors on B2C invoices, as they are not required for Flux 10 e-reporting. Task-6273226 Forward-Port-Of: odoo/odoo#271865
This update strengthens the process of exporting the French Liasse Fiscale report by implementing crucial data checks. Specifically, it verifies that key information about the writer, debtor, and associated partners is complete and accurate before the report is generated. This improves data reliability and reduces potential errors in financial reporting.
Original PR description
while exporting liasse fiscale, no chceks were done before the export and there were no account returns checks before sending it, this commit add account return checks to the liasse fiscale: -writer and debtor have the necessary informations on their record -partners mentionned in the reports have the necessary fields completed on their records -for some line, we have to choose between some values task-6127270 Forward-Port-Of: odoo/enterprise#115812
Resolved issues and error corrections
This update makes work order durations reflect only the time that was actually spent on productive work, instead of counting downtime or blocked periods. It also prevents overlapping time entries from being counted twice, which improves the accuracy of costing and reporting.
Original PR description
[[FIX] mrp: calculate real duration excluding non-productive intervals](https://github.com/odoo/odoo/pull/248381/changes/fac6b2540a32a015f56085c2c27ba4281eb659cf) and deduplicating overlaps * Current…
[[FIX] mrp: calculate real duration excluding non-productive intervals](https://github.com/odoo/odoo/pull/248381/changes/fac6b2540a32a015f56085c2c27ba4281eb659cf) and deduplicating overlaps * Current Situation: Currently real duration is total duration of each time tracking which is not consistent with the time that use to calculate the cost for valuation , see https://github.com/odoo/odoo/pull/205154 .The real duration of a work order was incorrectly summing all time tracking entries regardless of their loss type, and using simple addition which double-counts overlapping intervals. * Solution: - Filter time entries to only 'productive' and 'performance' loss types, excluding 'availability' and 'quality' as they represent downtime/blocking time, not actual work duration. - Pool all productive and performance entries into a single Intervals call so that overlaps across both types are merged in one pass. Note: the enterprise17 implementation groups time entries by loss_type into separate buckets before calling Intervals, which means overlaps between 'productive' and 'performance' entries are not merged and get double-counted. Pooling both types together before the Intervals call avoids this. * This also fix: - Fix _set_duration to ensure newly created time entries start after the latest existing entry's end date. Without this, calling _set_duration twice in quick succession (e.g. in tests) produces two entries with overlapping timestamps, which Intervals correctly merges into one, causing the computed duration to be half the expected value. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#270809 Forward-Port-Of: odoo/odoo#248381
When a new company is created, its employee documents folder will now be created in the company’s main Documents area instead of appearing in My Drive. This keeps employee folders organized in the expected company-level location and avoids clutter in personal storage.
Original PR description
Steps to reproduce =================== - Install documents_hr. - Log in with admin. - Create a new company `Test`. - Go to Document and choose the new company (top right). - Go to `My Drive`: a folder named `Employees - Test` has been created. This new folder should be created in the `Company` root instead of the `My Drive,` which will hold all the employee folders. Technical =========== When the main employee folder is created via `_generate_employee_documents_main_folders` `owner_id` falls back to the current user, which leads to computing the `user_folder_id` as `My drive,` and so that's why the newly created folder starts appearing there instead of the `Company` root. This PR addresses the issue and sets the `owner_id` to False, which leads to show the main employee folder in the company root. Task-6267352 Forward-Port-Of: odoo/enterprise#120677
This change prevents an error that could appear when managers create a time off request for multiple employees at once. It ensures the process still works even when no work time type has been configured, avoiding a blocked or broken user experience.
Original PR description
Currently, an error occurs when a user tries to create a group time off. **Steps to Reproduce:** - Install the `hr_presence` module without demo data. - Go to `Employees` > `Configuration` > `Working…
Currently, an error occurs when a user tries to create a group time off. **Steps to Reproduce:** - Install the `hr_presence` module without demo data. - Go to `Employees` > `Configuration` > `Working Times` > `Time Types` and delete all records. - Make sure there are at least `two employee` records. - Go to `Employees` and switch to the `list view`. - Select `both employees` > click `Presence Control` > click `Create a Time Off`. **Error1:** `TypeError: unsupported operand types in: hr.work.entry.type() | None` **Error2:** `AttributeError: 'NoneType' object has no attribute 'ids'` When a user creates a group time off record and the wizard is opened, it computes the valid work entry types. If no work entry type exists, accessing the `True` key (`requires_allocation`) from the empty dictionary returns None [1]. Later, when performing a union (|) between an empty work entry type recordset and None, it raises the first error [2]. Additionally, accessing ids on None raises the error [3]. This commit ensures that when no work entry type exists, accessing key(requires_allocation) from an empty dictionary returns an empty work entry type record instead of None. [1]- https://github.com/odoo/odoo/blob/374f48cfba75ff98f53d8c3fcc51847711bd406a/addons/hr_holidays/wizard/hr_leave_generate_multi_wizard.py#L144-L145 [2]- https://github.com/odoo/odoo/blob/374f48cfba75ff98f53d8c3fcc51847711bd406a/addons/hr_holidays/wizard/hr_leave_generate_multi_wizard.py#L146 [3]: https://github.com/odoo/odoo/blob/374f48cfba75ff98f53d8c3fcc51847711bd406a/addons/hr_holidays/wizard/hr_leave_generate_multi_wizard.py#L148 sentry-7552717400 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#270302
This fix ensures that when a document is signed through eMSigner, the completed file stored in Odoo is the actual signed PDF returned by the service. Previously, some users could download the original unsigned document instead, which caused confusion and an incorrect final record of the signing process.
Original PR description
Version: - saas-19.3 Steps to reproduce: - Create a sign request using the eMSigner authentication method. - Complete the signing process. - Download the completed document. Issue: - Users received the original uploaded PDF instead of the signed PDF after completing the signing process through eMSigner. Cause: - After the BinaryValue migration, the completed document was initialized with the original document (document.raw) and only replaced with the eMSigner response for large compressed files. As a result, non-compressed responses stored the original document instead of the signed PDF returned by eMSigner. Fix: - Always use the signed document returned by eMSigner (decrypted_data) to create the completed document. Decode the base64 response and, for large files, decompress it before storing it as binary content. task-6329040 Forward-Port-Of: odoo/enterprise#121628
This change improves how overtime time is stored so very small time differences are not lost. It helps ensure overtime pay is calculated more accurately by keeping sub-second precision instead of rounding too early.
Original PR description
Overtime duration computed as fractional hours was rounded to 3 decimal places before being stored on the overtime line. Since 1 decimal hour = 3600 seconds, this gives only 3.6 seconds of precision and the rounding can go in the wrong direction due to floating-point representation. The fix consists in replacing the duration rounding to 4 decimals when building overtime work entries so stored durations keep sub-second precision needed for money computation. task-6212231 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#270417 Forward-Port-Of: odoo/odoo#268889
This change prevents an error that could appear when users open the Stock report after removing Manufacturing. It restores the stock report setup during uninstall so the report continues to open normally even when MRP is no longer installed.
Original PR description
Currently an error occurs when user opens stock report after uninstalling mrp. Steps to replicate: - Install mrp. - Uninstall mrp and open `Stock > Reporting > Stock`. Error: ``` ValueError: Invalid…
Currently an error occurs when user opens stock report after uninstalling mrp.
Steps to replicate:
- Install mrp.
- Uninstall mrp and open `Stock > Reporting > Stock`.
Error:
```
ValueError: Invalid field product.product.is_kits in condition ('is_kits', '=', False)
```
Cause:
- The `mrp` module overrides the `stock.action_product_stock_view` window action domain with `is_kits` field referenced inside [1].
- When mrp is uninstalled, the `is_kits` field is removed from `product.product` but the overridden action domain remains stored in the database. Opening the action then tries to evaluate a domain referencing a non-existent field, resulting in this error.
Solution:
- Restore the original `stock.action_product_stock_view` domain during mrp uninstallation to remove the `is_kits` condition.
[1]: https://github.com/odoo/odoo/blob/c8390638cae4b4dafb805bc0d3a4149fb5194934/addons/mrp/views/product_views.xml#L164-L166
sentry-7332688253
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#269512This change prevents an access error that could block delivery validation when the delivery is linked to a sales order owned by another salesperson. It ensures the system can check the needed subscription information without exposing other sales data, so warehouse operations continue smoothly.
Original PR description
## **Issue:** When validating a delivery, users with Sales: Own Documents Only and Inventory Administrator access rights can encounter an access error if the delivery belongs to a sale order owned by…
## **Issue:** When validating a delivery, users with Sales: Own Documents Only and Inventory Administrator access rights can encounter an access error if the delivery belongs to a sale order owned by another salesperson. ## **Steps to reproduce:** - Install sale_subscription_stock. - Create a user with Sales: Own Documents Only and Inventory Administrator access rights. - Create a sale order as another user. - Validate the delivery with the restricted user. ## **Solution:** During _action_done(), [This line](https://github.com/odoo/enterprise/blob/19.0/sale_subscription_stock/models/stock_picking.py#L45) is checking subscription_state. Since the user does not have read access to the sale order, reading this field raises an access error and prevents the delivery from being validated. As the method only needs to read the subscription state, access the field with sudo() to avoid the unnecessary access error while preserving the existing business logic. Runbot Video : [Video](https://drive.google.com/file/d/1d7U2jTCxaaVk2YJcy3bi2SlYuT-yXMsu/view?usp=drive_link) OPW - 6295712 Forward-Port-Of: odoo/enterprise#122420
When a new file is uploaded in Documents, its available actions are now shown immediately. This fixes the previous behavior where users had to click away and reselect the file before the actions became visible.
Original PR description
Bug === When uploading a new file in documents, it's selected, but the actions are not visible (we need to unselect - select the record to see the actions). Task-5408471 Forward-Port-Of: odoo/enterprise#122396 Forward-Port-Of: odoo/enterprise#114770
This fix makes the “Change Layout” dialog close as soon as a call ends. It prevents users from interacting with an outdated dialog and avoids errors if the call was already removed in the background.
Original PR description
Opening "Change Layout" during a call adds a dialog via the dialog service. When the call was removed by the server (e.g. the `discuss.channel.rtc.session/ended` notification tears down the call and runs `endCall()`), the dialog stayed open. Clicking any option then ran `onSelectLayout`, which operates on the now-gone call (`channel.setAsDiscussThread()`, `rtc.enterFullscreen()`), and crashed. The action's `isSelfInCall` condition only gates opening a new dialog, never dismisses one already up. Close the dialog reactively when the user is no longer in the call, using Owl's reactive effect on `channel.isSelfInCall`, the same way `MessageReactionMenu` closes itself once its message loses all reactions. task-6352477 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes two issues in expense handling. Employees can now submit an expense even when they do not have a manager assigned, and they can continue adding comments or attachments on their own submitted expenses when questions or extra proof are needed.
Original PR description
# [FIX] hr_expense: Submitting an expense without a manager doesn't work If a user tries to submit an expense without having a manager, this will fail with "You are neither a Manager nor a HR Officer". To fix this, we are not going to check when the manager is the user that expense is linked to. --------- # [FIX] hr_expense: Employee cant use chatter on his own expenses An employee that created his expense was only able to add attachments and post message in the chatter when the expense was in draft. After this, it will still be able to attach attachment and post message without having the right to edit the expense. This is better as the employee will be able to answer questions that have been asked or add more proof if required. [task-4966942](https://www.odoo.com/odoo/all-tasks/4966942) Forward-Port-Of: odoo/odoo#273183 Forward-Port-Of: odoo/odoo#224575
This fix prevents the system from crashing when it encounters a session entry that does not include a trusted flag. It matters because some existing sessions can be missing this information, and the update makes those sessions continue to work normally instead of failing.
Original PR description
Some devices may not have a `trusted` key in their entry. This is the case for sessions created between these two commits: - https://github.com/odoo/odoo/commit/b6c2aafae2112ef98edca8a7f027716d9c15be11 - https://github.com/odoo/odoo/commit/61f22175ef3df37087887e7419dac54a620bbd55 Task-6348650 Forward-Port-Of: odoo/odoo#273062
Invoices sent through Viettel S-Invoice could fail when the returned ZIP file was structured differently than expected. This update makes Odoo correctly find the XML in both simple and nested ZIP packages, preventing errors and allowing invoice processing to complete normally.
Original PR description
Description of the issue/feature this PR addresses: The actual XML extraction hardcoded the double-zipped case by reading only the first entry of the outer zip (`zip_file.infolist()[0]`), assuming it…
Description of the issue/feature this PR addresses: The actual XML extraction hardcoded the double-zipped case by reading only the first entry of the outer zip (`zip_file.infolist()[0]`), assuming it was always a nested zip containing the XML. This made it fail when: - The XML was directly in the outer zip (single-zipped). - The zip contained multiple files and the first nested zip didn't hold the XML. Current behavior before PR: After sending an Invoice to Viettel S-Invoice, the e-Invoicing platform would return a ZIP containing one XML file. The XML File being double-unzipped, a traceback is raised. Desired behavior after PR is merged: The fix rewrites _recursive_zip_xml_file_data to actually be recursive. Invoices can be sent to Viettel S-Invoice without raising a traceback. opw-[6249929](https://www.odoo.com/odoo/project.task/6249929?debug=1) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#272643 Forward-Port-Of: odoo/odoo#268482
This update adds descriptive text to language selector flag images when the flag is the only visible indicator. It improves accessibility for screen reader users and gives search engines better context for the language options.
Original PR description
Steps to reproduce: 1. Enable the language selector in the website header. 2. Enable the "Inline" and "Flag" options. 3. Inspect the flag images rendered in the inline variant. Issue: Flag images in the list items have an empty `alt=""` attribute in "Flag only" mode, where the flag is the sole visual indicator of the language, making the selector inaccessible to screen readers and providing no context for search crawlers. Expected behavior: Inline + Flag should have a descriptive ALT tag since there is no adjacent text or code to identify the language, the flag is not decorative. opw-6246464 Forward-Port-Of: odoo/odoo#273025 Forward-Port-Of: odoo/odoo#271362
This update ensures that customers retain the delivery and invoice addresses they select during checkout, even after clicking 'Skip' to proceed with payment. Previously, the system reset these addresses, causing inconvenience. The fix prevents the system from overwriting manually selected addresses, improving the checkout experience.
Original PR description
Steps to reproduce: =================== 1. Add several delivery addresses & billing addresses 2. Add a product to the cart and go to checkout. 3. Select a specific delivery address and a different…
Steps to reproduce: =================== 1. Add several delivery addresses & billing addresses 2. Add a product to the cart and go to checkout. 3. Select a specific delivery address and a different invoice address. 4. Pay and click "Skip" immediately on that page. 5. Open the resulting sales order. => The delivery address is reset to the company's first delivery child instead of the one selected during checkout. Root cause: =========== `partner_shipping_id` and `partner_invoice_id` are stored computed fields (compute + store + readonly=False) that depend on `partner_id`. Any write that includes `partner_id`, even writing the same value, retriggers the compute and overwrites a manually selected address with the result of `partner_id.address_get()`. `_get_and_cache_current_cart` resurrects the customer's draft cart when it is no longer referenced in the session and re-runs `_update_address(partner, ['partner_id'])` on it to refresh the pricelist and fiscal position. Clicking "Skip" runs `sale_reset()`, which clears the session cart key while the order is still draft, so the next cart access takes that abandoned-cart branch and the redundant `partner_id` write discards the selected delivery/invoice address. Waiting a few seconds lets the order reach the 'sale' state first, so the draft search no longer matches and the address is kept, which is why the issue is timing dependent. Fix: ==== In `_update_address`, when partner_id is written, keep the delivery and invoice addresses already set on the cart if they still belong to the new partner's company (same `commercial_partner_id`) by writing them in the same `write()` so the recompute does not override them. Addresses that do not belong to the new partner are still recomputed to the partner's defaults. opw-6267188 Forward-Port-Of: odoo/odoo#272814 Forward-Port-Of: odoo/odoo#270300
This update corrects an issue where the ETA form generated for payroll reports was corrupted due to incorrect file encoding. Additionally, a warning related to missing employee data was resolved by adding a dependency to automatically recompute warnings when values change, ensuring accurate reporting.
Original PR description
Issue 1: Steps to Reproduce: -> Create Payslip for Employee -> Once payslip is validated, Click Pay, and for Mode Choose ETA Form 2 -> Download and open the File it throws Formatting error Cause: The Excel workbook was base64-encoded before being written to the binary field, which expects raw bytes. Fix: Save raw binary data directly and update the test case to load it using `io.BytesIO` on binary field content Issue 2: Steps to Reproduce: -> Create a payslip for an employee missing (like EG Social Insurance Number) -> A warning is raised that field is missing. -> Even if the field is filled, the warning does not disappear. Cause: There is no compute dependency to recompute warnings when value changed. Fix: Added dependency in `_issues_dependencies` so it recomputes when value changes. task-**6292194** Forward-Port-Of: odoo/enterprise#120544
A recent change removed a delay in the portal's homepage tour, causing it to fail and users to experience a blank screen. This fix ensures the website framework is fully loaded before the tour begins, preventing the tour from getting stuck and improving the overall user experience. This resolves a script timeout issue.
Original PR description
Since #256698, the `undeterministicTour_doNotCopy` flag was removed. Without this artificial delay, the `portal_load_homepage` tour executes steps faster than the website frontend JavaScript can finish initializing and binding event handlers to the form. Leaving the tour stuck on a blank text screen after Saving and causing a script timeout. Fix this by ensuring the frontend framework is fully initialized before interacting with the form fields. [Runbot-242298](https://runbot.odoo.com/odoo/runbot.build.error/242298) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#273043
This update fixes an issue where customer names weren't being correctly displayed in Odoo bookings created through Reserve with Google. Previously, booking information was defaulting to the customer's email address instead of their full name. This change ensures that customer names are accurately reflected in booking details, improving the user experience.
Original PR description
When a customer books through Reserve with Google, the createBooking payload carries the booker given_name and family_name next to the email, but the handler passed only the normalized email to…
When a customer books through Reserve with Google, the createBooking payload carries the booker given_name and family_name next to the email, but the handler passed only the normalized email to _mail_find_partner_from_emails. The new res.partner was therefore created with its name falling back to the email, see https://github.com/odoo/odoo/blob/aa7b5921191a0ff53ef1cc32af99fe458c45c0da/addons/mail/models/res_partner.py#L177 That name then flows into the calendar.event name, the attendee common_name and the contact details, all showing the email instead of the customer name. The module has read neither field since it was added in https://github.com/odoo/enterprise/commit/2e855b910173b56e8501d0ebe9ee6f83ac5845bc. Build the booker name from given_name and family_name and pass it with the email through formataddr in google_reserve_booking_create, so a newly created partner is named after the customer. A partner matched on an existing email keeps its current name. Steps to reproduce: 1. Enable Reserve with Google on an appointment type. 2. Book a slot from Google Maps with given name John and family name Doe. 3. Open the created booking and its contact in Odoo. => the contact name is the email instead of John Doe Ticket [link](https://www.odoo.com/odoo/project/49/tasks/6232318) opw-6232318 Forward-Port-Of: odoo/enterprise#120604
This update fixes an issue where flexible employee schedules were incorrectly calculating weekly hours, leading to inaccurate hour projections. By aligning the week start day with the user's locale setting (e.g., Sunday), the system now accurately reflects the employee's available working hours, ensuring accurate planning and scheduling.
Original PR description
**Steps to reproduce** - Install planning - Switch to English (UK) and change the "First day of the week" to Sunday in the technical settings - Have an employee with a flexible schedule with a total of 40h/week, average 8h/day - In the planning app, after creating a shift to display the employee in the gantt view, notice that when hovering over the progress bar on the left, 48 worked hours are expected for the current week, which is more than what is defined in the employee's calendar **Cause** The displayed week, starting on Sunday, could accumulate more hours than the weekly cap due to the Sunday being part of another week with the locale default first day (Monday). opw-6110395 Forward-Port-Of: odoo/odoo#272900 Forward-Port-Of: odoo/odoo#259600
This update resolves an issue where the payrun chatter window would unexpectedly close, disrupting the user workflow. The fix ensures the chatter remains open and functional during payrun updates, preventing data loss and improving the user experience. This change enhances the reliability of the payroll process.
Original PR description
The payslip run aside chatter was keyed on a revId counter that _updatePayRun bumps on every payrun update (view button actions, the HR_PAYROLL:UPDATE_PAYRUN bus, the step bubble refresh). Changing a t-key makes Owl destroy and recreate the whole chatter, which resets composerType to false. When a refresh landed while the log note composer was open, the composer input disappeared. In the payrun tour this happens right after continuing a pay run, so posting the third note timed out waiting for .o-mail-Composer-input. Remove the t-key and refresh its messages through the MAIL:RELOAD-THREAD bus that the Thread already listens to. The server posted status messages still show up without throwing away the composer. https://runbot.odoo.com/odoo/error/941272
This update fixes a potential issue where users could refund an order line more times than allowed, leading to incorrect financial reporting. The change now ensures that a line can only be refunded up to its original refundable quantity, improving the accuracy of sales transactions and reducing the risk of financial errors. This resolves issue OPW-6340931.
Original PR description
Before this commit, if an order line was already refunded, it was possible to refund it again. opw-6340931 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#272408
This update resolves critical issues impacting the Cashmatic payment module's certification. Specifically, it addresses a token revocation issue during long payments, a missing payment confirmation popup after cancellation, and slow data fetching when the device was unavailable. These fixes ensure smoother and more reliable payment processing for our users.
Original PR description
First issue: While paying if a user takes more than 15min the token is revoked. Second issue: When cancelling a payment where a user has already inserted money and there is an issue with giving back the money, no popup was shown on the PoS. Third issue: Fetch took too long when the device was not reacheable. 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#268296
This update fixes an issue where Italian withholding tax returns incorrectly combined balances with regular tax returns. The fix ensures that withholding tax return balances are calculated independently, accurately reflecting the actual tax owed. This improves the accuracy of Italian tax reporting.
Original PR description
Steps to reproduce: - setup an Italian company - make an invoice (for example in May) with a withholding tax and make a transaction to pay it - generate tax returns (opening date in June so that it generates from May) - validate regular tax return for May - validate withholding tax return for May -> The withholding tax return shows an amount to pay with a balance that is a combination of both the regular tax return and the withholding one, while it should be independent of the regular one. task-6116304 Forward-Port-Of: odoo/enterprise#121254 Forward-Port-Of: odoo/enterprise#119375
This update fixes a reporting issue where GSTR-1 returns incorrectly displayed foreign currency invoice values (USD) instead of the company's standard currency (INR). The change ensures that SEZ invoices in foreign currencies are accurately reported in INR, aligning with Indian tax regulations. This improves the accuracy of GST returns.
Original PR description
Currently, when generatign GSTR-1 return spreadshee, SEZ invoices issued in a foreign currency are exported with their totals in the foreign currency rather than the company currency (INR) Steps to reproduce: - Create a B2B SEZ invoice in foreign currency - Go to Accounting > Reporting > [India] GST Return periods - Generate the GSTR-1 report for the period Issue: In the resulting spreadsheet, the "Invoice Value" column takes the invoice total in USD rather then INR opw-6292913 Forward-Port-Of: odoo/enterprise#121972 Forward-Port-Of: odoo/enterprise#121157
This update resolves a problem where backorders weren't being correctly accounted for in MRP production, specifically when using multi-step routes. The fix ensures that expected quantities from backorders are properly considered during production planning, preventing validation errors and ensuring accurate inventory tracking. This improves the reliability of the manufacturing process.
Original PR description
### Steps to reproduce: - In the settings enable: Multi-Steps Routes - Set your warehouse to manufacture in 2 steps (pick then manufacture). - Create a final product (FP) with a BOM in flexible…
### Steps to reproduce: - In the settings enable: Multi-Steps Routes - Set your warehouse to manufacture in 2 steps (pick then manufacture). - Create a final product (FP) with a BOM in flexible consumption: - 1 x COMP (lot tracked) - Create and confirm an MO for 1 units of FP - Set the quantity producing on the MO to 1 > The consumed qty was updated to 1 unit - Set a lot on the pre-production pikcing and validate #### > The lot is not transfered to the MO which you are not able to validate since the registered component is lot less ### Cause of the issue: The issue is caused by https://github.com/odoo/odoo/commit/3223deb871ca4cb4ac0381e4321f2dbf79a60189 as the `qty_waiting` is based on the reservation state of the move origin of the move rather than its actual demand: https://github.com/odoo/odoo/blob/00118002bd6eab2f4c34a32e993a9219fded06ac/addons/mrp/models/mrp_production.py#L1419-L1426 In particular, since the backorder of the pre-production picking was not reserved (since nothing was available in stock), it was not taken into account as it should have been. Issue 2: Steps to reproduce: - In the settings Enable Multi-Steps Routes - Unarchive MTO - Create 3 products: - Final Product: Tracked by SN with a BOM: 1 X Super Component - Super Component: Tracked by SN, MTO with a BOM: 1 X Component - Basic Component: Put 10 units in stock - Create and confirm an MO for 3 units of Final Product > This should create an MO for 3 units of Super Component - Go to the Child MO > Cogs wheel > Split in 3 MO's - Click "Generate serial" on each Child MO and validate the first one - On the MO for Final Product > Cogs wheel > Split in 3 MO's - On the first MO, click "Generate Serial" > Error: Reserving a negative quantity is not allowed. ### Cause of the issue: The `action_generate_serial` calls in turn the `set_qty_producing`: https://github.com/odoo/odoo/blob/9fac1400fe5a8e665732c2ee3701c17c3495318f/addons/mrp/models/mrp_production.py#L1601 However, since the main MO was split the Super component demand is of 1 but each child MO provide an origin quantity of 1 so that the `new_qty` will be set to a negative one here: https://github.com/odoo/odoo/blob/9fac1400fe5a8e665732c2ee3701c17c3495318f/addons/mrp/models/mrp_production.py#L1418-L1426 But, since the first child MO was validated, there is already a move line associated to the Super component move and the `_set_quantity_done` will therefore try to adapt the reservation to a negative quantity which leads to the error: https://github.com/odoo/odoo/blob/9fac1400fe5a8e665732c2ee3701c17c3495318f/addons/stock/models/stock_move_line.py#L469-L470 opw-6128575 opw-6317083 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#273168 Forward-Port-Of: odoo/odoo#271123
This update fixes an issue where the cost of goods sold (COGS) for products manufactured using the MTO (Make-to-Order) production route wasn't accurately reflecting the FIFO (First-In, First-Out) inventory method. The fix ensures that the invoice COGS uses the correct lot cost, improving financial reporting accuracy.
Original PR description
### Steps to reproduce: - Create a storable product P tracked by SN, fifo perpetual lot valuated using the MTO route and with a BOM: 1 x COMP - Create, confirm and validate an MO for 10 unit of P…
### Steps to reproduce: - Create a storable product P tracked by SN, fifo perpetual lot valuated using the MTO route and with a BOM: 1 x COMP - Create, confirm and validate an MO for 10 unit of P using COMP's at 10$ (by setting its standard price). - Create and confirm a Sales Order for 1 unit of P > This generate an MO - Validate this MO for a new serial say SN011 using a COMP at 20$. - Validate the Delivery Order using SN011 - Create and post the customer invoice #### > The invoice COGS uses Std Price rather than the 20$ lot's fifo value ### Cause of the issue: The cogs value are generated based on the moves returned by the `_get_stock_moves` call of the acount.move.line: https://github.com/odoo/odoo/blob/6a356cb0640ce20c71f20a8bd64ef99e76a82489/addons/stock_account/models/account_move_line.py#L66-L68 Currently, if an account.move.line is linked to a sale.order.line, this methods returns the entire pull of stock moves linked to the sol: https://github.com/odoo/odoo/blob/79c9e7de6764e7f8e47709b827df6eee81e72637/addons/sale_stock/models/account_move.py#L155-L156 However, these moves include both, the delivery move and the `move_finished_ids` of the MTO prodcution. This is problematic since the delivery move is considered as positive cogs qty and the MO is considered as incoming cogs qty leading to a sum of 0 cogs qty which in turns make the cogs price unit fall back to the product standard price instead of the fifo cost of the produced lot.: https://github.com/odoo/odoo/blob/6a356cb0640ce20c71f20a8bd64ef99e76a82489/addons/stock_account/models/stock_move.py#L257-L271 opw-6292048 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#272815 Forward-Port-Of: odoo/odoo#271018
This update fixes an issue where the sales details report incorrectly inflated discounts when refund lines were included. Previously, refunds were causing an overstatement of discounts, leading to inaccurate reporting. This change ensures that refunds are properly accounted for, providing a more accurate view of sales discounts.
Original PR description
The sales details report computes a line discount as `original_price - price_subtotal_incl`. On a refund line the quantity is negative, so `original_price` is negative, while `price_subtotal_incl` is stored positive. Subtracting the two then inflates the discount instead of cancelling it, understating "discount_amount" by `2 * price_subtotal_incl` for every refunded discounted line. opw-6281752 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#271008 Forward-Port-Of: odoo/odoo#270592