Daily updates from Odoo
Navigate
Branch
Monday, July 7, 2025
55 changes
20 changes
Enhancements to existing features
This update modernizes how filters are handled across Documents, Planning, Project, and related industry apps. It should make internal search and filtering behavior more consistent and easier to maintain, with minimal direct impact on day-to-day users.
Original PR description
task-4280707 odoo/odoo#217132
The live chat information panel now shows more customer context, including open leads, open helpdesk tickets, chatbot answers, and conversation outcomes. This helps support and sales teams understand a visitor's situation faster and respond more effectively without switching screens.
Original PR description
Adding following features to info panel: - Display open leads in info panel - Display open tickets in info panel - Display chatbot answers in info panel - Display outcome in info panel follow up of task-4771890 Forward-Port-Of: odoo/enterprise#89573
Product cards in the online shop have been visually refreshed to provide a cleaner, more consistent shopping experience. This helps customers browse products more easily and supports a more polished storefront presentation.
Original PR description
Requires: - https://github.com/odoo/odoo/pull/214744
Helpdesk ticket stages now use consistent colors across views, making it easier for teams and customers to recognize a ticket's status at a glance. This improves visual clarity in Helpdesk and related project views without changing the underlying workflow.
Original PR description
This commit's purpose is to add a color consistency within helpdek stage. This will help to tell with one glance in which stage the ticket is.
Aged Receivable and related partner aging reports now avoid an unnecessary database lookup when calculating invoice dates. This can significantly reduce report loading time on very large accounting databases, improving day-to-day finance reporting performance without changing report results.
Original PR description
The Aged Partner reports query in `_aged_partner_report_custom_engine_common` is joining on the `account_move` table solely to get the `invoice_date` column. As this `invoice_date` is aggregated in `ARRAY_AGG(DISTINCT invoice_date)` and there's already a denormalized field `invoice_date` on `account_move_line` that is a related stored field, we can drop the join and use this field instead. This saves us the need to scan the account.move table when running the reports query. In a database with 37M amls, 10M account.move (and a really bad correlation for account_move_line.move_id), this saves us around 10 minutes for the Aged Receivable report's query. Forward-Port-Of: odoo/enterprise#89325
Labels related to the last refresh and last synchronization have been updated to make online bank synchronization terminology easier for users to understand. This helps reduce confusion when reviewing synchronization status and recent activity.
Original PR description
This commit will change the terms of the last_refresh and last_sync to make some terms on the online synch clearer for the users. task-4890067
Resolved issues and error corrections
The Payroll app no longer shows an error when users open the Payslips menu before any payslips have been created. This prevents an unnecessary interruption and lets payroll users access the menu normally in a new or empty payroll setup.
Original PR description
Related task: 4919933
Barcode reception now correctly leaves unreceived items open when only subcontracted products are validated. This prevents remaining products on the same purchase receipt from being incorrectly marked as received, improving inventory accuracy and follow-up processing.
Original PR description
Issue ----- In barcode processing reception of subcontracted products doesn't create a back order for the remaining products. Steps to reproduce ----- - Create 2 products, one subcontracted and one…
Issue ----- In barcode processing reception of subcontracted products doesn't create a back order for the remaining products. Steps to reproduce ----- - Create 2 products, one subcontracted and one storable - Create a purchase order for the 2 products & confirm it - Go to barcode and open the delivery - Only validate the reception of the subcontracted product --> No backorder is created for the remaining product, it is considered received Cause ----- Commit db8b33e changed the compute of the move's picked status to not update for subcontracted moves. So the move line has picked set to True but not the move itself. When we validate the operation in barcode, we go through this pre hook https://github.com/odoo/odoo/blob/1d256123da587d625c0527ca3a18cd82e7161df5/addons/stock/models/stock_picking.py#L1193 Since the move has a quantity but picked is still False, the full picking is being picked at once https://github.com/odoo/odoo/blob/1d256123da587d625c0527ca3a18cd82e7161df5/addons/stock/models/stock_picking.py#L1206-L1207 ----- Ticket: opw-4726229 Forward-Port-Of: odoo/enterprise#89255 Forward-Port-Of: odoo/enterprise#86979
Belgian payroll termination holiday reports now use the exercise and holiday period from the payslip instead of the employee contract. This helps ensure the reported values match the actual payslip, reducing payroll reporting errors.
Original PR description
The exercise and the holiday period should be based on the payslip instead of the contract. We use the values of the report report_termination_holidays_n and report_termination_holidays_n1 which contains the correct values. Forward-Port-Of: odoo/enterprise#89171 Forward-Port-Of: odoo/enterprise#88737
This fix stops users from accidentally creating open planning shifts from the calendar view when no resource is selected. It removes leftover behavior from an earlier multi-create implementation, helping keep schedules accurate and avoiding unassigned work entries.
Original PR description
This commit's purpose is to prevent the creation of open shifts in the calendar view of the planning. Recently, the multi-create feature was added to the calendar view, but some code of the early iteration of the task was left. This fix aim to remove the unneeded code. target saas-18.4 Forward-Port-Of: odoo/enterprise#89531
Belgian payroll now calculates worker counts much faster, reducing a process that could take around 50 seconds to under a second on odoo.com. This improves responsiveness for payroll-related operations without changing the user-facing workflow.
Original PR description
From 50 to 0.4 seconds on odoo.com Forward-Port-Of: odoo/enterprise#89408
The Work Entries Analysis report now respects the selected companies in multi-company setups. This prevents users from seeing payroll report data for companies outside their current company selection, improving accuracy and reducing confusion.
Original PR description
BUG - In multi-companies env the report shows all the companies no matter what is selected in the company selection menu Expected behavior: - Only selected company data is presented in the view FIX - add a domain to the report action to show only allowed companies data Task: 4781100 Forward-Port-Of: odoo/enterprise#89541 Forward-Port-Of: odoo/enterprise#85690
Fixes an error that could stop users from processing customer payment follow-ups when SMS reminders were enabled. The process now avoids relying on removed contact data, helping finance teams continue collections workflows without interruption.
Original PR description
When clicking the `Process Follow-ups` button after creating a due invoice, a traceback could occur due to missing data on the related records. Steps to reproduce: --- - Install `account_followup`…
When clicking the `Process Follow-ups` button after creating a due invoice, a traceback could occur due to missing data on the related records.
Steps to reproduce:
---
- Install `account_followup` module(without demo)
- Go to `Follow-up Levels` and enable SMS in `15 Days`
- Create an invoice with Invoice Date(2 months ago) and Payment terms: `15 Days`
- Now, click on the selected customer and fill in all important details
- In the action button, click `Process Follow-ups`
Traceback:
---
```
KeyError: 'mobile'
ValueError: KeyError('mobile') while evaluating
'if records:\n action = records.action_manually_process_automatic_followups()'
```
The mobile field was removed from `res.partner` (see related commit), but it was not removed from here. This commit cleans it up to avoid referencing a non-existent field.
commit- https://github.com/odoo/odoo/commit/6b820eb6fc6f782ba6a83d605d87b4a1dd2a87be
sentry-6720070075
Forward-Port-Of: odoo/enterprise#89241This update corrects how subscription and one-time sale prices are shown and applied, including hiding inactive pricelists and using the right discount basis. It also prevents confusing or invalid pricing rules from being copied automatically, making subscription sales setup more reliable for users.
Original PR description
Forward-Port-Of: odoo/enterprise#89106
Belgian payroll follow-up activities are now generated when an employee contract actually becomes active, rather than repeatedly during later contract updates. This prevents unnecessary duplicate reminders and helps payroll teams focus on the correct next actions.
Original PR description
Once the contract got running, not at each write on it. Forward-Port-Of: odoo/enterprise#89497
The UAE payroll calculation now applies the higher 30-day end-of-service compensation only after an employee completes the sixth year of service, matching the UAE government calculator. This helps businesses calculate final settlements more accurately and stay aligned with local expectations.
Original PR description
- to algin with UAE goverment eos calculator, salary rule is update to concider full 30 compensation after completing the 6th year not the 5th. Task: 4756963 Forward-Port-Of: odoo/enterprise#89468 Forward-Port-Of: odoo/enterprise#84752
This fixes an issue where highlighted shifts in Planning calendars could lose their visual emphasis after an underlying calendar method changed. Business users will again see important shifts clearly marked in the schedule, helping them spot relevant planning information quickly.
Original PR description
Before this commit, the PlanningCalendarCommonRenderer override the eventToRender method but this method has been removed in parent class. This commit changes the method overriden to make sure the class is added when some shifts have to be highlighted. Forward-Port-Of: odoo/enterprise#81770
Features or functions removed from Odoo
This update removes old Documents test files that no longer match the current app behavior. The core coverage has been rebuilt in the newer test framework, reducing maintenance noise while keeping basic feature checks in place.
Original PR description
Much of the app is completely different now as it was when these tests were running. We've re-created a test suite for basic features in hoot, we can start with that. Also, reformat `documents_pdf_manager_tests` to match the styling rules while we're here. Task-3861500
Code cleanup and technical improvements
This update replaces a risky way of clearing page content with a safer equivalent in selected enterprise web flows. It reduces unnecessary security warnings while keeping the user experience unchanged.
Original PR description
Writing on innerHTML is generally not recommended as it can lead to security issues. This is highlighted by triggering the ci/security. `setElementContent` utils is now available to safely write it on `innerHTML` by checking the content type (markup in particular). However, when writing an empty value, using `textContent` has the same effect of clearing all children. It is therefore preferable to use it instead, in order to remove direct usage of `innerHTML` in code and to avoid triggering unncessary security checks. https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent https://github.com/odoo/odoo/pull/216066
Miscellaneous changes
Currently, once a fsm task report has been sent once, the "Send report" buttons are disabled in the form view. However, the contextual server action is always available, but a check in `action_send_report` prevents the report from being sent if the buttons are disabled. This commits allows re-sending the report, which can be useful if some changes have been made after the report was first sent. opw-4818953 Forward-Port-Of: odoo/enterprise#88579 Forward-Port-Of: odoo/enterprise#87104
Original PR description
Currently, once a fsm task report has been sent once, the "Send report" buttons are disabled in the form view. However, the contextual server action is always available, but a check in `action_send_report` prevents the report from being sent if the buttons are disabled. This commits allows re-sending the report, which can be useful if some changes have been made after the report was first sent. opw-4818953 Forward-Port-Of: odoo/enterprise#88579 Forward-Port-Of: odoo/enterprise#87104
35 changes
Enhancements to existing features
Shared helper code for tax-related invoice tests was moved into a common testing area. This makes the accounting test suite easier to maintain and helps future tax changes be validated more consistently, without changing customer-facing behavior.
Original PR description
…tInvoicingCommon --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The accounting journal dashboard has been adjusted so activity information can be customized more easily by related accounting features. This supports more dynamic styling and presentation of dashboard activities, helping future enhancements appear consistently for users.
Original PR description
This commit applies the necessary changes to make the json_activity_data field of account.journal extensible. The field computation needed to be extended in account_reports to make dashboard activities styling more dynamic. More details can be found in the enterprise PR: https://github.com/odoo/enterprise/pull/89331 backport of: https://github.com/odoo/odoo/commit/dce24cd242e16afde008ac907faa5f496725ae68 task-4370133 task-4458309 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#202249
Account merging now avoids loading very large volumes of accounting entries when updating the merged account code. This reduces the risk of memory errors and makes the process much faster for companies with large accounting databases.
Original PR description
### Issue --> The final step of the `_action_merge` method updates the `code` field of the account onto which the other accounts are merged. During the write call on `code`, a dependent field…
### Issue --> The final step of the `_action_merge` method updates the `code` field of the account onto which the other accounts are merged. During the write call on `code`, a dependent field `always_tax_exigible` on `account.move` gets added to the compute chain. This causes a fetch of all `account.move` records related to journal items related to the account that is getting updated. This can lead to a MemoryError on databases with large `account.move` tables. ### Solution --> We delegate the write of the `code` field to SQL. In the account merge wizard, accounts that can be grouped are grouped by the keys --> `'account_type', 'non_trade', 'currency_id', 'reconcile', 'deprecated','name'`. Therefore, the `account_type` does not change after the merge. We can safely assume that any fields dependent on `account_type` do not need recomputation and hence, bypass the ORM for this update. ### Benchmark --> For an account with ~1.17M related `account_move_lines` and ~570k `account_moves`, | Before Fix | After Fix | |--------|--------| | TO/Memory error past TO | ~24s | #### Additional change --> Disable the prefetcher in the write call in `account.account` to optimize memory usage on databases with a large number of journal items/journal entries when writing on `code` or `account_type` in general. opw-4839985
French VAT reporting can now submit an empty declaration when there is no tax to report, reducing manual work and preventing blocked filings. If an electronic submission fails, the system creates a follow-up activity on the closing entry so users can spot and resolve the issue without logging into each company separately.
Original PR description
There were 2 missing points in the tax report export in France: 1. Not possible to send empty tax report 2. The only way to know if a tax report has an error is to connect to the company This commit solves these issues by the following: 1. Adding `zone KF` to the XML export (and showing a user a warning with `check box "déclaration néant" checked`) which allows for sending empty tax report 2. If the EDI export is in error, an activity is added to the closing entry like the following https://app.excalidraw.com/l/65VNwvy7c4X/7ed0dmqcHNM backport of: https://github.com/odoo/enterprise/commit/fecbd62eeef4e6041403bff53a3b53fb8237a0cb task-4370133 task-4458309
Colombian localization now retrieves customer name and email from the official DIAN service using only the identification type and number. This helps businesses comply with Colombian rules limiting what customer information they can request directly.
Original PR description
The Colombian government restricts the information a company can ask from their customers to only their identification type and number. The other data (name and email) is required to be fetched from the DIAN service. task: 4796355
Resolved issues and error corrections
Invoices created from sales now use the delivery date when choosing currency exchange rates. This prevents incorrect invoice amounts for Hungarian companies when delivery and invoice dates have different exchange rates.
Original PR description
### Steps to reproduce: - Install l10n_hu_edi and witch to Hungarian company - Have two different rates for EUR<->HUF - Create a pricelist in EUR - Create a quotation with the pricelist and confirm -…
### Steps to reproduce: - Install l10n_hu_edi and witch to Hungarian company - Have two different rates for EUR<->HUF - Create a pricelist in EUR - Create a quotation with the pricelist and confirm - Validate the delivery on another date (which has a different rate from today) - In the sale order click "Create Invoice" - The generated invoice has lines using the rate for today ### Cause: The field `delivery_date` was `precompute=True` but on creation of the invoice, at the time of the precompute, `line_ids` is still `False`. So the invoice is first computed without the delivery date so the currency rate used is the one of the invoice date. When the delivery date is written on the invoice, the line balance is not recomputed because it is "protected". ### Solution: As the field `delivery_date` was implemented in `account_move` for localizations including l10n_hu, there are no reason to contain the fix only to l10n_hu. So we add the value of `delivery_date` in the dictionnary used to create a new invoice from sale with the method `_create_invoices`. This way the delivery date is there on creation of the invoice and is used for the currency rate. opw-4756568
This fix ensures that when a manufacturing bill of materials is copied, its by-product lines are linked to the copied operation instead of the original one. This prevents confusion and incorrect production setup references after duplicating bills of materials.
Original PR description
### Issue: Copying a bom with an operation will not reassign the copied operation to the by product lines. ### Steps to reproduce: - In the settings enable operations and by-products - Create a bom with an operation op1 and a by product produced in op1 - Copy the bom #### > The copied by product line refer to the operation of the original bom this can be checked by archiving the copied operation which should erase its link with the copied by product line but will not ### Cause of the issue: When a bom is copied, the new operation is reassigned to the new bom lines by these lines: https://github.com/odoo/odoo/blob/9cb4230a6b2252243a8e0546a1a8f5bc52e74009/addons/mrp/models/mrp_bom.py#L230-L247 However, nothing is made for the by product lines. opw-4788252 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#216609
Company addresses with long lines now wrap correctly in document layouts instead of overlapping logos or being cut off in PDF previews and printed documents. This keeps invoices, sales orders, and other business documents looking professional and readable.
Original PR description
<b>Steps to Reproduce:</b> 1. Go to Settings > Companies > Configure Document Layout. 2. Choose layout Boxed or any layout that horizontally places the company logo and address. 3. Edit the address…
<b>Steps to Reproduce:</b> 1. Go to Settings > Companies > Configure Document Layout. 2. Choose layout Boxed or any layout that horizontally places the company logo and address. 3. Edit the address block choose long string. 4. Save the layout and click Preview Document or print SO or invoice. <b>Issue:</b> - Observe in PDF output the long text overlaps into logo or extend outside the layout bound(differ in layouts) — even though enough space is visually available <b>Cause:</b> - A previous change in [PR #201198](https://github.com/odoo/odoo/pull/201198) added the text-nowrap class to address blocks to fix a minor wrapping issue. However, this unintentionally caused layout overflow issues with long lines. <b>Solution:</b> - Added width to the address block to ensure balanced layout structure. - Removed text-nowrap from all layouts, as the original issue is now resolved by applying proper width sizing. - Removed float-end from Boxed layout, as it was contributing to misalignment. <b>Additional Notes:</b> All behaviors addressed by [PR #201198](https://github.com/odoo/odoo/pull/201198) were re-tested to ensure this fix does not reintroduce previous issues. <b>opw-4764975</b> <br> <b>[PR #201198](https://github.com/odoo/odoo/pull/201198) ISSUE : </b>  <br> <b>ISSUE after [PR #201198](https://github.com/odoo/odoo/pull/201198) FIX:</b> Folder -  Boxed -  <br> <b>After this PR FIX : </b>    
Fixes a rounding issue that could stop related stock moves from being combined during manufacturing. This prevents by-products from being recorded with inflated quantities when the produced amount exceeds the original plan, improving inventory accuracy.
Original PR description
### Steps to reproduce: - In the settings enable by-products - Create a product FP with a bill of material: - 1 operation: op 1 - 1 By-product line: cost share 3.3%, produced in op 1 - Create aand…
### Steps to reproduce: - In the settings enable by-products - Create a product FP with a bill of material: - 1 operation: op 1 - 1 By-product line: cost share 3.3%, produced in op 1 - Create aand confirm an MO for 1 unit of FP - On the by product line produce 10 instead of 1 - Produce All #### > 19 units of by products were produced: The initial by-product move was validated for 10 units and an extra move with a quantity of 9 was automatically created and validated aswell. ### Cause of the issue: Since the quantity of the by-product move exceed its initial demand, its validation will create an extra move that is expected to be merge into the main move during its confirmation: https://github.com/odoo/odoo/blob/474ac02d03c17af0274422ecb1e97ca14a3e80e7/addons/stock/models/stock_move.py#L1922 https://github.com/odoo/odoo/blob/474ac02d03c17af0274422ecb1e97ca14a3e80e7/addons/stock/models/stock_move.py#L1844-L1865 However, while `cost_share` value of the original move floats is correctly encoded as 3.3, the copied value of the extra is 3.3000000000000003. This discrepency is a well known issue of the way the orm handles float and convert them to cache as it calls the `float_round` method, which can effectively change its value: https://github.com/odoo/odoo/blob/8c22e358840f02c5b1596e1fbe0d6cf7315754f7/odoo/fields.py#L1553-L1557 In particular, the `cost_share` of both moves differs in terms of strict equality and the move will not be merged with its extra move. ### Note: The issue should not be reproducible in saas17.4+ because the float_round issues have been erased by commit 784f1511acc4352905a61f9bd90aecb78e8558ec opw-4846289 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#215372
Manufacturing orders created from make-to-stock-on-order sales now correctly show the related sales order. This keeps navigation consistent in both directions, reducing confusion for users tracking a customer order through manufacturing.
Original PR description
Currently, with an MTSO rule, the smart button from the Sale Order to the Manufacturing Order was available. However, the reverse link (from the MO to the SO) was missing. But they share the same…
Currently, with an MTSO rule, the smart button from the Sale Order
to the Manufacturing Order was available. However, the reverse link
(from the MO to the SO) was missing.
But they share the same link between object and people don't
understand. So we copy the condition to have the same SO<->MO
link.
It was missing the sale_id on the procurement group itself. Before
production.procurement_group_id.move_dest_ids.group_id.sale_id
was enough since mtso share move links but with the new MTSO it's
not the case anymore. But the sale_id is copied from a procurement
to the new ones.
Steps to reproduce:
- Enable multi-step routes in Inventory settings
- Unarchive the MTO route:
- Select the rule with the production usage
- Set its supply method to "MTSO"
- Create a storable product “P1”:
- routes: MTO + Manufacture
- Create and confirm a Sale Order with one unit of P1
- Confirm the SO
Problem:
The smart button from the SO to the MO appears correctly,
but the reverse link from the MO to the SO is missing.
opw-4619136
opw-4557138
opw-4875937
opw-4854581
opw-4887746This fix ensures MyInvois point-of-sale documents correctly calculate and assign their linked orders for every relevant record. It prevents missing order links that could cause errors or incomplete document information in Malaysia e-invoicing flows.
Original PR description
Otherwise, it causes it fails to assign value to certain records, which is unadvised. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix ensures Spanish TicketBAI electronic invoices include the required reference to the previous document when applicable. It helps maintain proper invoice chaining for compliance reporting and avoids missing data in generated XML submissions.
Original PR description
Before, the previous document chaining was not sent in the XML because with the t-if, if the variable name is unknown, it will not complain and just see it as False. (like for the first invoice that has no previous) Now, passing the correct variable name, the previous document will be included opw-4814241 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change removes duplicate test helper code in the Accounting module. It keeps the test setup cleaner and reduces maintenance risk, with no expected impact on everyday users or business workflows.
Original PR description
In 0f3a9dee5cf15 we added helpers to create test taxes in `AccountTestInvoicingCommon`, not realizing that they were already in `TestTaxCommon`. This commit removes them from `TestTaxCommon` to avoid the duplication. task-none
This update fixes an internal test setup for Malaysia POS e-invoicing so it no longer relies on an unavailable enterprise component. This helps community-only test runs complete reliably without affecting customer-facing features.
Original PR description
The test in this module imports a common setup from account_reports which is not a dependency, and is not auto installed when the test runs with community modules only. This fix replaces the setup by the community one AccountTestInvoicingCommon. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents tiny rounding differences during purchase receipts from causing exaggerated product costs. It improves the reliability of inventory valuation when partial receipts, backorders, currency conversions, or landed costs are involved.
Original PR description
## Before this commit: When calculating the `price_unit` for stock moves from purchase order lines, the `remaining_qty` and `remaining_value` could be imprecise. Standard float comparisons for these…
## Before this commit: When calculating the `price_unit` for stock moves from purchase order lines, the `remaining_qty` and `remaining_value` could be imprecise. Standard float comparisons for these remaining amounts could lead to incorrect `price_unit` calculations if, for example, `remaining_qty` was a small float near zero. This could result in inaccurate stock valuations, particularly when currency conversions were involved or when landed costs were applied. For example, 70.00000003 is rounded **up** to 70.00001 (with 5 digits), resulting in a quantity difference of 0.00001, which incorrectly inflates the unit cost. ## After this commit: Change the rounding method to 'HALF-UP' instead of the default 'UP' to improve precise result for quantities. ## Steps to reproduce: 1. Configure a product with AVCO real time. Set decimal precision for price and UoM to 5 digits. 2. Create a Purchase Order (e.g., 190 units @ $110/unit). 3. Receive 70 units and create a backorder 4. Create and post a bill for the initially received quantity. 5. Apply a landed cost to the picking of the first 70 units. 6. Create a draft bill for the remaining quantity on the PO. 7. Receive the remaining 120 units from the backorder. 8. The product's cost explodes opw-4705224 Forward-Port-Of: odoo/odoo#216661 Forward-Port-Of: odoo/odoo#208815
This fix ensures text background styling is preserved when website text animations are applied. It helps keep animated website content visually consistent and prevents design details from disappearing or rendering incorrectly.
Original PR description
... task-4285621
When an expense is re-invoiced to a customer through a sales order, its analytic distribution is now copied onto the related sales order line. This helps ensure reporting and cost allocation stay accurate without manual correction.
Original PR description
#### Step to reproduce: - Enable Analytic accounting in Accounting settings - Create a sale order - Show Analytic Distribution - Create an expense and put this sale order in the "Customer to…
#### Step to reproduce: - Enable Analytic accounting in Accounting settings - Create a sale order - Show Analytic Distribution - Create an expense and put this sale order in the "Customer to Reinvoice" field. - Add an Analytic Distribution - Create Report - Submit to Manager - Approve - Post Journal Entries #### Curent behavior: - No analytic_distribution on the sale_order #### Expected behavior: - analytic_distribution form the expense should be copied to the sale_order #### Cause: analytic_distribution was not set at the creation of the sale order from the account_move `_sale_get_invoice_price()` is called only in `_sale_create_reinvoice_sale_line()` which is only called in `_prepare_analytic_lines()`. According to [this note](https://github.com/odoo/odoo/blob/18.0/addons/sale/models/account_move_line.py#L31-L32) `_prepare_analytic_lines()` is called only on `move.line` having an `analytic_distribution`. Ticket [link](https://www.odoo.com/odoo/project/967/tasks/4710137) opw-4710137
This update fixes how the online shop verifies sale orders by reusing an existing system check instead of duplicating logic. This should make checkout-related behavior more consistent and reduce the risk of errors when validating website orders.
Original PR description
Use existing method to check Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents checkout from failing when an order contains more than one delivery charge line. It uses the delivery calculation logic designed to handle multiple delivery lines, making online purchases more reliable for affected carts.
Original PR description
Before this commit an error can appear if there two delivery line. Use method in delivery module to compute delivery amont. This method can compute if there are two line with delivery https://github.com/odoo/odoo/blob/18.0/addons/delivery/models/sale_order.py#L27 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
Fixed an issue where custom plan fields added to timesheet views could lose their selected value when a new timesheet was saved. This ensures user-entered planning information is preserved, improving reliability for teams using customized timesheet workflows.
Original PR description
### Steps to reproduce: - Navigate to a Project > View (Timesheets) - Open studio and add x_plan2_id for example to the view - Try creating a new timesheet and set a value for the field we added using studio - Save and notice the field doesn't keep its value ### Cause: This is mainly happening because when getting the plan_ids for the account we are gonna fill we just get the account in the distribution and ignore if the user is setting another value ### Fix: We check the create vals_list if a plan has value we set it before setting the account in the distribution opw-4716041
Mexican electronic invoices now report fixed-per-unit cuota taxes, such as fuel taxes, using the correct taxable quantity and rate. This helps ensure compliant invoice totals and reduces the risk of incorrect tax reporting, while related tests were reorganized to make future maintenance easier.
Original PR description
**[FIX] l10n_mx_edi: Fix wrong management of Cuota taxes** Cuota taxes are wrongly reported. For example, a GAZ cuota tax expressed as 4.6555 per quantity has to be reported as TasaOCuota=4.6555 Base=quantity Importe=TasaOCuota * Base Currently, it's reported as: TasaOCuota=abs(tax_amount_currency/base_amount_currency) Base=base_amount_currency Importe is recomputed as TasaOCuota * Base instead of tax_amount_currency task-id: 4761658 **[IMP] l10n_mx_edi: Make test suite a bit less messy** Having a single test testing all taxes combination, testing 100% discount on it + IEPS breakdown and global invoice makes the whole thing difficult to debug. Also, it forces the generation of files that are not always relevant.
The map view now opens Google Maps using the contact’s full address instead of relying on potentially imprecise stored coordinates. This helps users reach the correct location when viewing or navigating to contacts, especially when another mapping service produced less accurate coordinates.
Original PR description
**Steps to reproduce:** - Install Contact app - Create a contact with a specific address - Go to the Map View of the Contact app - Filter to view the new contact - Position in the map might be…
**Steps to reproduce:** - Install Contact app - Create a contact with a specific address - Go to the Map View of the Contact app - Filter to view the new contact - Position in the map might be slightly different from given one (when using OpenStreeMap) - Click on the position marker > `Navigate To` the address is recomputed correctly - Click on `View in Google Maps` the address given is often wrong **Issue:** Previous solution was trying to build the url used by the `View in Google Maps` button by using `partner_latitude` and `partner_longitude`. These were previously computed using the default geolocalization method. If it was set on OpenStreetMap, the coordinates were not precise enough and impacted the Google Maps results. As described in the documentation : `OpenStreetMap might not always be accurate.` But this shouldn't impact Google Place API results. **Fix:** Adapted the computation of `googleMapUrl()` to use `contact_address_complete` to ensure the addresses are recomputed properly when sent to Google Maps. opw-4649910
This update ensures the Indian GSTR-1 report export always includes the expected document issue field, even when there are no entries. It prevents automated validation failures and helps keep tax reporting exports consistent and reliable.
Original PR description
- Assigned doc_issue with empty list to comply with formatting of gstr1 json. - This prevents test failures caused by missing keys during JSON validation. runbot error: 229705
Delivery Guide XML files for Chile now show the actual quantity delivered instead of the originally planned quantity. This prevents mismatches in official electronic documents when customers receive fewer items than initially ordered.
Original PR description
**Issue** When the delivered quantity of a product is less than the originally demanded quantity, the generated Delivery Guide XML shows the demand (product_uom_qty) instead of the actual delivered…
**Issue** When the delivered quantity of a product is less than the originally demanded quantity, the generated Delivery Guide XML shows the demand (product_uom_qty) instead of the actual delivered quantity (quantity). This results in an incorrect quantity being displayed in the DTE. **Steps to Reproduce** 1. Install the Accounting module, Chilean localization, Sales module, and l10n_cl_edi_stock. 2. Create and confirm a new Sale Order. 3. Click on the Delivery smart button. 4. Adjust the delivered quantity to a value lower than the demand, save, and validate with no backorder. 5. Generate the Delivery Guide. 6. Open the generated DTE XML and observe that the quantity is incorrect. **Root Cause** The quantity displayed in the DTE is taken from product_uom_qty, which represents the planned quantity to be moved, not the actual delivered quantity. The correct field to use is quantity, which reflects the real delivered amount. **Fix** Change the XML output to use quantity instead of product_uom_qty to accurately reflect the actual delivered quantity in the DTE. Opw-4892276
Completing a field service task now correctly validates deliveries for kit products added to the related sales order. This ensures delivered quantities are updated as expected and avoids manual follow-up for kit-based field service sales.
Original PR description
**Problem:** when the product in the sale order linked to a field service task is a kit and the task is marked as done, the delivery is not validate (as it would for a non kit product) **Steps to…
**Problem:** when the product in the sale order linked to a field service task is a kit and the task is marked as done, the delivery is not validate (as it would for a non kit product) **Steps to reproduce:** - Create a product and set up a Kit-type Bill of Materials for it (with at least two components) - Create a service-type product. - Set the Invoicing Policy to Prepaid/Fixed - set the "create on order" field to Task - assign the Project to Field Service. - Create a Sales Order using the service product. - Confirm the Sales Order. - In the linked task, click on the Products smart button - add the kit-type product from step 1. - Mark the task as done. **Current behavior:** On the sale order, the delivered quantity for the kit product is 0. If you click on the delivery smart button, you'll see that the picking is not validated yet **Expected behavior:** the picking should be validated **Cause of the issue:** https://github.com/odoo/enterprise/blob/d8dc0cabd83a29d0522cb5fd25c6956968d4408b/industry_fsm_stock/models/project_task.py#L23 the orer_line is considered as an exception because the order_line product_uom_qty is smaller than total_qty (the sum of the move_ids' product_uom_qty) But this is normal in the case of a kit opw-4848444 Forward-Port-Of: odoo/enterprise#88363
UPS deliveries to customers in Mexico no longer fail because of a missing merchandise description. The connector now adds the required package-level description, helping sales and warehouse teams validate affected shipments successfully.
Original PR description
**Current behavior:** Using the UPS rest connector and trying to process a delivery to a Mexico-based customer will fail with error code: `121984 - A package in a Mexico shipment must have a Merchandise Description.` **Expected behavior:** Can process shipment. **Steps to reproduce:** 1. Create a UPS rest delivery option 2. Create an SO for some product to a Mexico-based client, add the UPS delivery, confirm, try to validate the delivery -> 400 **Cause of the issue:** For non-return shipments, the description in the Package object is `None`, but when the receiver is based in Mexico, this field is required. **Fix:** Create a package level description based on the one added here: https://github.com/odoo/enterprise/commit/a7b8673364e0ac626bcc8ded72501c4f2866564c To the UPS API spec here: https://developer.ups.com/tag/Shipping?loc=en_PE&tag=Rating#operation/Shipment!path=ShipmentRequest/Shipment/Package/Description&t=request opw-4508139
Fixed an issue that could block Sendcloud batch shipping when parcel weights were split unevenly and produced decimal average weights. Deliveries can now be validated correctly because weights are sent in the format required by Sendcloud.
Original PR description
### Steps to reproduce: - Configure the sendcloud delivery method (for instance with Bpost @home for a belgian company) and enable the `Use Batch Shipping`` option on the delivery method. - Create a…
### Steps to reproduce:
- Configure the sendcloud delivery method (for instance with Bpost @home for a belgian company) and enable the `Use Batch Shipping`` option on the delivery method.
- Create a storable product with a weight of 1 kg and a positive volume.
- Create and confirm sale order for 4 units
- Add shipping -> chose sendcloud
- Separate the delivery of 4 kg in 3 packs:
- set quantity to 1 -> put in pack
- set quantity to 2 -> put in pack
- set the quantity to 4 -> put in pack
- Try to validate the delivery
#### > invalid operation: weight: "A valid integer is required."
### Cause of the issue:
Sendcloud's api only accept integer values for the weight:

However, to evaluate the price of the parcel accurately for a batch shipping we need to compute the average weigth to provide to sendcloud. Converted to grams we tehrefore provide a value of 1333.333333 to sendcloud which raises an invalid operation:
https://github.com/odoo/enterprise/blob/72b4a223ec4e2e09fc93bebd150923abba37a8df/delivery_sendcloud/models/sendcloud_service.py#L378-L379 https://github.com/odoo/enterprise/blob/72b4a223ec4e2e09fc93bebd150923abba37a8df/delivery_sendcloud/models/sendcloud_service.py#L205-L207 https://github.com/odoo/enterprise/blob/72b4a223ec4e2e09fc93bebd150923abba37a8df/delivery_sendcloud/models/sendcloud_service.py#L44
opw-4874063
Forward-Port-Of: odoo/enterprise#89495Documents stored in subfolders under the HR folder now appear correctly when accessed from the employee smart button. This restores expected access for shared HR documents, so users can find files they are permitted to view even when those files are organized in nested folders.
Original PR description
Following this: [85156](https://github.com/odoo/enterprise/pull/85156) the domain has been incorrect, leading to some documents not showing up anymore when these should have. This PR aims to solve this issue by correcting the domain at fault Task: 4922346
Credit notes for Kenya eTIMS can now only be submitted when they are linked to an invoice that was already successfully submitted. This helps prevent rejected or non-compliant credit note submissions and improves tax reporting consistency.
Original PR description
To ensure credit notes are only submitted for invoices that have been submitted to eTIMS, we now restrict credit note submission to cases where the related invoice has already been successfully submitted. Forward-Port-Of: odoo/enterprise#89385
Field service users can now generate task reports from the customer portal without hitting an error when the optional reporting module is not installed. This prevents a broken portal experience and keeps task details accessible for customers and staff.
Original PR description
An error occurs when a user attempts to generate a report from the portal because the `industry_fsm_report` module is not installed. **Steps to reproduce:** * Install `industry_fsm` * Field Service>New Task>log time sheet using `start` button * open portal view( `/my/tasks` )> Your created task> `View details` `AttributeError: 'project.task' object has no attribute '_get_report_base_filename'` **Solution:** * Define `_get_report_base_filename` inside `industry_fsm` instead of `industry_fsm_report`. **Sentry-6685756279**
This fix stops Odoo from automatically creating a customer invoice when an employee expense bill belongs to the same company. Invoices are now only synchronized for true inter-company transactions, reducing incorrect draft invoices and accounting cleanup.
Original PR description
# [FIX] account_inter_company_rules : prevent auto invoice creation from bill (synchronize transactions) Before this fix, when the Inter-Company Transactions was set to `Synchonize invoices/bills`,…
# [FIX] account_inter_company_rules : prevent auto invoice creation from bill (synchronize transactions) Before this fix, when the Inter-Company Transactions was set to `Synchonize invoices/bills`, an invoice was created for a bill when the contact's company for an employee was the invoice's company. The invoice should be only created when there is an inter-company transaction, not an inner one. Two tests as been added to test the case with the same or another company in the contact form. ## Steps : - Create a database with 2 companies - Create an employee in company 1 - Set employee's company in Contacts to company 1 - Go in Settings with company 1 - Set Inter-Company Transactions to `Synchronize invoices/bills` - Go in Expenses and create a New one - Add what you want for title and price, then select the created employee - Use the buttons : Create Report > Submit to Manager > Approve > Post Journal Entries - A bill is created and can be accessed using the smart button 'Journal Entry' - A draft invoice can be found in Accounting opw-4818456 Forward-Port-Of: odoo/enterprise#87757
Miscellaneous changes
Steps to reproduce: 1. Connect IoT Box and any printer that accepts PDF 2. Turn on Reception Report option on Inventory Settings 3. Set configuration of Receipts to print out Reception Report and Label 4. Assign Reception Report and label to the printer 5. Create a PO and run through the Reception process (PO > Reception of Delivery) 6. Print the Reception Report under "Allocations" -> Result: Reception Report and label is downloaded as a PDF instead of being sent to the printer.
Original PR description
Steps to reproduce: 1. Connect IoT Box and any printer that accepts PDF 2. Turn on Reception Report option on Inventory Settings 3. Set configuration of Receipts to print out Reception Report and…
Steps to reproduce: 1. Connect IoT Box and any printer that accepts PDF 2. Turn on Reception Report option on Inventory Settings 3. Set configuration of Receipts to print out Reception Report and Label 4. Assign Reception Report and label to the printer 5. Create a PO and run through the Reception process (PO > Reception of Delivery) 6. Print the Reception Report under "Allocations" -> Result: Reception Report and label is downloaded as a PDF instead of being sent to the printer. The reason for this bug is that the report models were being constructed directly in the frontend, rather than being fetched from the backend. This didn't work with IoT printing because its override used to assign devices to reports is on the backend `ir.actions.report` model. The fix is to fetch the report from the backend when the component is loaded. This report is then passed down to the child components as well. opw-4790299 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#215887
Steps to reproduce: 1. Connect IoT Box and any printer that accepts PDF 2. Turn on Reception Report option on Inventory Settings 3. Set configuration of Receipts to print out Reception Report and Label 4. Assign Reception Report and label to the printer 5. Create a PO and run through the Reception process (PO > Reception of Delivery) 6. Validate the Reception of the order -> Result: Odoo will prompt the customer to select a printer, however we are not able to choose a printer in tim
Original PR description
Steps to reproduce: 1. Connect IoT Box and any printer that accepts PDF 2. Turn on Reception Report option on Inventory Settings 3. Set configuration of Receipts to print out Reception Report and…
Steps to reproduce: 1. Connect IoT Box and any printer that accepts PDF 2. Turn on Reception Report option on Inventory Settings 3. Set configuration of Receipts to print out Reception Report and Label 4. Assign Reception Report and label to the printer 5. Create a PO and run through the Reception process (PO > Reception of Delivery) 6. Validate the Reception of the order -> Result: Odoo will prompt the customer to select a printer, however we are not able to choose a printer in time as the process continues without selecting one. This in return does not send the report to the printer via IoT. The root cause of this bug is that the IoT report handler JS function returns too early, it resolves once the printer selection popup has appeared, instead of resolving once the printer has actually been selected and is starting to print. Therefore the multi-report printing code assumes the print is done and triggers the next print, which causes the popup to close before the user can select a printer. To solve this bug, we listen for a 'printer-selected' event in the handler, and resolve only once we have received this event. This fixes the flow, allowing a printer to be selected for each report that is being printed in sequence. opw-4790299 Forward-Port-Of: odoo/enterprise#88538
Currently when /iot/setup method is called if the iot box record exists we always update the record with the received data, even if the data is the same as the record's data. This PR only updates it if the data changes Forward-Port-Of: odoo/enterprise#88043
Original PR description
Currently when /iot/setup method is called if the iot box record exists we always update the record with the received data, even if the data is the same as the record's data. This PR only updates it if the data changes Forward-Port-Of: odoo/enterprise#88043
### Issue: It is possible to break the followup reports by directly creating entries in the past. ### Steps to reproduce: - Example on Belgian loca - Accounting Dashboard > Misc > new Entry with - Date far in the past (ie 2024-01-01) - Account: "400000 Customers", Partner: "test partner", Debit: 500.0 - Account: "499000 Suspense Accounts", Credit: 500.0 - Post - In Customers > Follow-up reports, the partner is marked as "In need of action" even if no due date was specified - Accou
Original PR description
### Issue: It is possible to break the followup reports by directly creating entries in the past. ### Steps to reproduce: - Example on Belgian loca - Accounting Dashboard > Misc > new Entry with -…
### Issue: It is possible to break the followup reports by directly creating entries in the past. ### Steps to reproduce: - Example on Belgian loca - Accounting Dashboard > Misc > new Entry with - Date far in the past (ie 2024-01-01) - Account: "400000 Customers", Partner: "test partner", Debit: 500.0 - Account: "499000 Suspense Accounts", Credit: 500.0 - Post - In Customers > Follow-up reports, the partner is marked as "In need of action" even if no due date was specified - Accounting Dashboard > Bank > new with Amount: 500.0 - "Save & Close" then click on it - In the page "Manual Operations" change the partner to the one from the MISC entry - Change the Account to "400000 Customers" - Validate - The follow-up report is no longer "In need of action" - Create an invoice with a due date in the future - The follow-up report is back to "In need of action" with the amount of the invoice - When sending the follow-up, the Customer statement reads "your account shows an outstanding balance of 0.00€" ### Cause: The origin of this issue is that the MISC entry and the Bank payment are not reconciled. The MISC entry is used to calculate the state of the followup making it to "In need of action" but the bank entry is balancing the amount to 0.00€. The MISC entry should not be used to compute the followup state as it has no due date specified (it makes no sense, it is never linked to any invoice). But in the code when there are no `line.date_maturity` we fallback on `line.date`. ### Solution: So we remove the fallbacks on `line.date` when `line.date_maturity` is False. Some tests needed to be adjusted as they were not using any payment terms or due date. They were working because of the fallback on `line.date`. opw-4784250 Forward-Port-Of: odoo/enterprise#87873