Daily updates from Odoo
Tuesday, April 7, 2026
95 changes
25 changes
New functionality added to Odoo
This update introduces the ability to export Slovak VAT reports in XML format, aligning with government regulations. This ensures accurate and compliant reporting for our Slovakian clients, simplifying the process of submitting VAT data to the tax authorities. It's a key improvement for meeting Slovakian tax requirements.
Original PR description
Add XML export for the Slovak VAT report, following the official government format Related: https://github.com/odoo/odoo/pull/257528 task-6040973 Forward-Port-Of: odoo/enterprise#112963
Enhancements to existing features
This update simplifies user database access management by adding a dedicated 'databases' tab to the user view. Previously, administrators had to manually search for user database connections. Now, they can quickly view and manage all databases a user has access to, improving efficiency and security.
Original PR description
The aim of this commit is to allow db_manager to see the list of databases in which a specific user has access and to allow removing this access in bulk if required. Before this commit: To see the list of db in which a user has access, a db_manager would have to go to the list view and make a search on the login/name of the user, potentially matching other db_user in the process. After this commit: The list of db is available out of the box in a databases tab on the res.user view. Task-id: 5945298 Forward-Port-Of: odoo/enterprise#112645
This update improves the setup process for printers in our Point of Sale system. A new checklist document has been added to the POS form, guiding users through the necessary steps to enable LNA access for their printers via the browser. This simplifies the configuration and reduces user frustration.
Original PR description
The LNA configuration for printers is complicated for users. To help them this PR will add a check list document inside the point of sale form view which will explain all the steps the clients should do to enable LNA access for their printers in the browser. Task-[5933321](https://www.odoo.com/odoo/project/1737/tasks/5933321) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#253461 Forward-Port-Of: odoo/odoo#249226
Resolved issues and error corrections
This update corrects a discrepancy in the calculation of employment bonuses for Odoo Enterprise users in Belgium. The change reflects the latest regulations from Partena Professional, ensuring accurate bonus payments up to April 2026. This update maintains compliance with Belgian tax laws and avoids potential financial discrepancies.
Original PR description
https://www.partena-professional.be/fr/le-bonus-lemploi-au-1er-avril-2026?utm_source=sfmc&utm_medium=email&utm_campaign=InfoFlash+Daily+Mail+-+FR&utm_content=article-read-more-cta&utm_term=All%20Subscribers&utm_id=81873&sfmcContactKey=litom@odoo.com Forward-Port-Of: odoo/enterprise#112970
This update resolves an issue where the XML generated for Swiss payments (iso20022_ch) was using an outdated payment schema. The fix ensures the XML adheres to current Swiss banking standards, specifically the pain.001.001.09 format, and adds necessary validation attributes. This improves payment processing accuracy and compliance.
Original PR description
**PROBLEM** According to documentation (https://www.six-group.com/dam/download/banking-services/standardization/sps/ig-credit-transfer-sps-2025-en.pdf) PstlAdr must be structured. This isn't the case when generating a xml for the payment method iso20022_ch. **STEP TO REPRODUCE** 1. install l10n_ch and account_iso20022. 2. Create a swiss contact with a full address. And activate payment on the bank account of this contact. 3. Select the Company CH, and set a bank account in the bank journal configuration. 4. Create a vendor payment to the swiss contact. 5. Create a batch payment with it, and validate to get the xml. 6. Open the xml, and notice the PstlAdr isn't structured. Ticket [link](https://www.odoo.com/odoo/project.task/5880247) opw-5880247 Forward-Port-Of: odoo/enterprise#112273 Forward-Port-Of: odoo/enterprise#107025
This update fixes an issue where the barcode scanner was incorrectly identifying products based on the user's company settings instead of the current business context. Now, the barcode scanner accurately recognizes products based on their defined nomenclature, ensuring correct product identification and picking processes. This resolves a situation where products weren't found when scanned.
Original PR description
### Issue: The company used in the main barcode menu is the `company_id` of the user rather than the current contextual company of the session. This is problematic as we might endup using the wrong…
### Issue: The company used in the main barcode menu is the `company_id` of the user rather than the current contextual company of the session. This is problematic as we might endup using the wrong barcode nomenclature. ### Steps to reproduce: - Have 2 companies: company 1 and company 2 - Set the barcode nomenclature of company 1: default, company 2: GS1 - Incarnate a user allowed in both companies but with default company 1 - With company 2, create a product and set its barcode to 36939282410106 - From the main menu open the barcode app and scan 0136939282410106 #### > No product was found (even thought it is correct in GS1) ### Cause of the issue: Scanning from the main barcode menu will trigger a call of the `main_menu` method relying on the nomenclature of the contextual company of the request: https://github.com/odoo/enterprise/blob/804ea21c225a7a1e0763bac188f027adeb3ab78f/stock_barcode/static/src/main_menu/main_menu.js#L98-L99 https://github.com/odoo/enterprise/blob/804ea21c225a7a1e0763bac188f027adeb3ab78f/stock_barcode/controllers/stock_barcode.py#L15-L21 However, when opening the main barcode menu from the app menu, no contextual warehouse was set to the view: https://github.com/odoo/enterprise/blob/804ea21c225a7a1e0763bac188f027adeb3ab78f/stock_barcode/views/stock_barcode_views.xml#L6-L11 As such, the environment of the request will be set here: https://github.com/odoo/odoo/blob/9393b0db6791fe5a7f576cff55705e315fb3dd11/odoo/http.py#L2083 based on the company of the user rather than the one of the context: https://github.com/odoo/odoo/blob/9393b0db6791fe5a7f576cff55705e315fb3dd11/odoo/api.py#L694-L722 ### Fix: Setting the company slices the `current_company` in first position of the `allowed_company_ids`: https://github.com/odoo/odoo/blob/260c69ed64f8663b6935b9863c86aac6dbecd961/addons/web/static/src/webclient/switch_company_menu/switch_company_menu.js#L33-L39 https://github.com/odoo/odoo/blob/260c69ed64f8663b6935b9863c86aac6dbecd961/addons/web/static/src/webclient/switch_company_menu/switch_company_menu.js#L68-L81 which can be recovered from the cookies via the `_get_allowed_company_ids`: https://github.com/odoo/enterprise/blob/43f65ff2f3c6177cc69647bbb85bb40a84409457/stock_barcode/controllers/stock_barcode.py#L432-L442 precisely used by the `_get_barcode_nomenclature`: https://github.com/odoo/enterprise/blob/43f65ff2f3c6177cc69647bbb85bb40a84409457/stock_barcode/controllers/stock_barcode.py#L485-L491 Note that passing the context in the arguments of the `main_menu` JSON route will not really solve the issue by it self since the context is no longer shared with the request: c8cd1d4a83de7a5798cbb910a788fbb6fe208d2f ### Additional Issue: The type `dest_location` does not exist on barcode types: https://github.com/odoo/odoo/blob/485a64b6a1e91feb4310f282c6dd1cd021f1780b/addons/barcodes_gs1_nomenclature/models/barcode_rule.py#L16-L20 so that the type used by these lines can not work: https://github.com/odoo/enterprise/blob/1dedc5bbcee43bfd13e55206e3d7364f715ca9be/stock_barcode/controllers/stock_barcode.py#L29-L30 https://github.com/odoo/enterprise/blob/1dedc5bbcee43bfd13e55206e3d7364f715ca9be/stock_barcode/controllers/stock_barcode.py#L52-L56 ### Steps to reproduce: - In the settings enable: Multi-Steps Routes - Set the barcode nomenclature to GS1 - Set your warehouse in receipt in two steps and add a barcode to the WH/Input: 3033710074365 - From the main menu open the barcode app and scan 4133033710074365 #### > No product or picking was found (even thought it is correct in GS1 that should create an internal transfer with WH/INPUT as destination) opw-5847529 Forward-Port-Of: odoo/enterprise#112783 Forward-Port-Of: odoo/enterprise#111662
This update fixes a problem where invoices sent to the Colombian DIAN tax authority would incorrectly be marked as duplicates and rejected. The fix prevents a rollback process when the DIAN GetStatus endpoint fails, ensuring invoices are correctly accepted by DIAN and the system state is accurately updated.
Original PR description
Steps to reproduce:
- Send a Colombian DIAN invoice (SendBillSync flow)
- Simulate a non-200 response from the DIAN GetStatus endpoint during the call of _get_attached_document (see ticket)
Issue:
The invoice is accepted by DIAN but the state is never written. When trying to send the invoice a second time DIAN rejects the invoice as a duplicate (already submitted).
Cause:
`_get_response_history` returns `("", error_msg)` on non-200 status_code and when calling `_get_attached_document`
-> error and rollback and `invoice_accepted` is not written correctly
opw-5919395
Forward-Port-Of: odoo/enterprise#111349
Forward-Port-Of: odoo/enterprise#111186This update resolves a potential issue where the Autopay feature incorrectly assigned bank accounts. The change adds a check for valid account numbers before assigning sanitized account numbers, ensuring accurate and reliable Autopay setup. This improves the stability and accuracy of the HK Autopay integration.
Original PR description
. Add account_number check before assign sanitized_account_number task-6049640
This update corrects a restriction on a key field used in Belgian payroll reporting, allowing proper access to necessary data. Previously, access was limited, causing errors when retrieving payroll information. This change ensures accurate reporting and functionality for users in the l10n_be_hr_payroll module.
Original PR description
onss_expeditor_number is used to fetch dimonas and other operations on hr.version, leading to access errors since this field is restricted to base.group_system This commit changes the access rights on the field from `base.group_system` to `hr_payroll.group_hr_payroll_user` task-6094854
This update addresses an issue where the Master Production Schedule (MPS) wasn't correctly accounting for safety stock levels, leading to inaccurate demand forecasts for dependent components. The fix ensures that safety stock is considered when calculating indirect demand, resulting in more reliable production planning and reduced stockouts. This improves the accuracy of the MPS and optimizes inventory levels.
Original PR description
Steps to reproduce: ------------------- * Enable "Master Production Schedule" in Inventory settings * Create tracked Product "Child" and set up a vendor * Create tracked Product "Parent" and set up a…
Steps to reproduce: ------------------- * Enable "Master Production Schedule" in Inventory settings * Create tracked Product "Child" and set up a vendor * Create tracked Product "Parent" and set up a bom as component "Child" and Lead Time: 2 days * Create tracked Product "GParent" and set up a bom as component "Parent" and Lead Time: 2 days * Open MPS and add your three products: - Child, Parent: activate indirect demand - Parent: Safety Stock Target of 10 * Add 1 in the forecast demand for "Gparent" on third column -> Will have 20 Indirect Demand Forecast of Child in the first column and -9 on the second Observation: ------------- Usefull comment form the function : https://github.com/odoo/enterprise/blob/b332af45a46b2295797a5096f68b7953554a495b/mrp_mps/models/mrp_mps.py#L424-L447 When creating a demand from the MPS, it will always take the first date of the interval (ex: Week 10 (2-8/Mar), it will create the demand for the 2 of Mars) When calculating the production schedule. we wil we calculate each product for each date_range: https://github.com/odoo/enterprise/blob/ea805995f66e007c0aef6b473a2b16dbe54d73bc/mrp_mps/models/mrp_mps.py#L488 https://github.com/odoo/enterprise/blob/ea805995f66e007c0aef6b473a2b16dbe54d73bc/mrp_mps/models/mrp_mps.py#L509 When calculating the values for a product, we will set the indirect demand qty for it component The demand will created the demand in function of the date of when the parent need and the lead time (it will for the previous date range because of the lead time): https://github.com/odoo/enterprise/blob/ea805995f66e007c0aef6b473a2b16dbe54d73bc/mrp_mps/models/mrp_mps.py#L554 https://github.com/odoo/enterprise/blob/ea805995f66e007c0aef6b473a2b16dbe54d73bc/mrp_mps/models/mrp_mps.py#L555 If the demand is not equal to the resplensih_qty we will create another demand to compensate, it will use the first date of range minus the lead time it will send it to the previous date range: https://github.com/odoo/enterprise/blob/ea805995f66e007c0aef6b473a2b16dbe54d73bc/mrp_mps/models/mrp_mps.py#L556-L560 In our case this will create the issue, since it will try to compensate each time on the previous week. opw-5413838 Forward-Port-Of: odoo/enterprise#112811 Forward-Port-Of: odoo/enterprise#107671
This update resolves an issue where intercompany purchase orders weren't correctly transferring product variant information, leading to missing components in manufacturing orders. The fix ensures that variant data is properly retrieved from the purchase order, enabling accurate production scheduling within the intercompany process. This improves the reliability of intercompany transactions.
Original PR description
In a multicompany setting, when buying product with intercompany rule, the never variant attribute was lost. Steps to reproduce: ------------------- * Enable intercompany transaction * Enable variant…
In a multicompany setting, when buying product with intercompany rule, the never variant attribute was lost.
Steps to reproduce:
-------------------
* Enable intercompany transaction
* Enable variant grid entry
* Enable multistep routes
* Unarchive MTO
* Settings>Users & Companies>Companies
* Enable Generate Sales Orders in company A
* Create a product:
- Never variant with at least two values
- MTO and manufacture
* Create a bom,
- Company : company B
- Add a component with apply on variant: choose one of the variants
* Create and confirm a purchase order, for a never variant of the product, in company A with vendor as company B
* Confirm the sales order in company B
-> The manufacture order does not include the components that are applied on variant
Observation:
-------------
When creating a sale order for an intercompany rule, button_approve is overwritten and it calls the function "inter_company_create_sale_order.
That function will create the sale order from the data of the purchase order:
https://github.com/odoo/enterprise/blob/273528ba462f2f2b5768bf29dbdb697713a8e619/sale_purchase_inter_company_rules/models/purchase_order.py#L63-L64
When preparing the value for each order line, the attribute value for the never variant will not be retrieved:
https://github.com/odoo/enterprise/blob/273528ba462f2f2b5768bf29dbdb697713a8e619/sale_purchase_inter_company_rules/models/purchase_order.py#L63-L64
Since the attribute value is lost, it will not be retrived by the mto since it should get the value from the PO.
opw-5438723
Forward-Port-Of: odoo/enterprise#107122This update corrects a calculation error within the Belgian HR contract salary module that was impacting the accurate reporting of yearly cost sacrifices. The fix ensures that the system now correctly calculates this key financial metric, improving the reliability of HR reporting. This change primarily affects payroll and financial reporting processes.
Original PR description
Forward-Port-Of: odoo/enterprise#112723
This update corrects a bug that caused the 'Replace by Attendance' button to fail when multiple attendance work entries of the same type were created. The fix eliminates duplicate entries from a data processing step, preventing the application from crashing and ensuring the button functionality works correctly.
Original PR description
### Steps to reproduce: - Download Payroll app - From the top bar 'Employees' > 'Employees', create a new employee - From the top bar 'Work Entries' > 'Work Entries', add 2 Attendance work entries on…
### Steps to reproduce: - Download Payroll app - From the top bar 'Employees' > 'Employees', create a new employee - From the top bar 'Work Entries' > 'Work Entries', add 2 Attendance work entries on different days, with different creation days (either wait 24h between creations, or adjust one create_date in DB) - Click on any empty cell, you'll find the "Replace by Attendance" smart button replicated > If you activate debug mode and click on any cell > **UncaughtPromiseError > OwlError** ### Cause of issue: https://github.com/odoo/enterprise/blob/482b4564b3a81e914d6eead9a7b85a23b7cac3dc/hr_work_entry_enterprise/static/src/work_entries_gantt_model.js#L110-L138 `formattedReadGroup` is called with both `work_entry_type_id` and `create_date:day`. If the user has created several work entries of the same type on different days, we would get multiple group results having the same `work_entry_type_id`. These duplicated records later produce an Owl crash because the button list uses `t-key="workEntry.id"`. https://github.com/odoo/odoo/blob/72be98d705e225f663b65e289e11d0b8642ec6f8/addons/hr_work_entry/static/src/views/work_entry_calendar/work_entry_multi_selection_buttons.xml#L16-L17 ### Fix: Since the goal of the above method is to extract the favorite work entries to later use in smart buttons and `userFavoritesWorkEntriesIds.map((r) => r.work_entry_type_id?.[0]).filter(Boolean)` extracts all the entries' `work_entry_type_id` (including duplicates), the easiest way to get rid of these duplicates is to create a `Set`. opw-5953671 Forward-Port-Of: odoo/enterprise#109986 Forward-Port-Of: odoo/enterprise#109823
This update fixes an issue where tracking references weren't consistently passed through multi-step delivery processes. Now, when 'Propagate carrier' is enabled on a delivery rule, the tracking reference will automatically update to the next picking, ensuring better shipment visibility and traceability for sales orders. This enhancement improves order tracking accuracy and efficiency.
Original PR description
Steps to reproduce:
- Enable multi-step routes in Inventory settings
- Go to Warehouse Management → Operation Types
- Set Delivery to 3 steps
- Open the 3-step delivery routes and enable “Propagate carrier” on any rule
- Create a storable product P1
- Create a sales order with 1 unit of P1
- Confirm the sales order
- Open the generated picking
- Go to the Additional Info tab
- Set Tracking Reference = 123
- Confirm the picking
- Open the next picking (Pack operation)
Problem:
The tracking reference is not propagated to the next picking, even though the rule has “Propagate carrier” enabled.
Expected behavior:
The tracking reference should be propagated to the subsequent picking when carrier propagation is enabled on the rule. Even if no carrier set.
opw-6052930
Forward-Port-Of: odoo/odoo#256851This update resolves an issue impacting website performance by optimizing how product categories are checked for published products. The previous method caused excessive database queries, but this fix restores efficient performance and ensures faster website loading times. This change improves the overall user experience.
Original PR description
`has_published_products` was previously computed recursively. For recursive fields, the ORM disables prefetch optimizations. In 3ffca1961cb1671e7028dd4dceca82d2e74a2e21, the computation switched to…
`has_published_products` was previously computed recursively. For recursive fields, the ORM disables prefetch optimizations.
In 3ffca1961cb1671e7028dd4dceca82d2e74a2e21, the computation switched to `_read_group` to avoid loading all published products into cache and prevent memory issues. However, this introduced an N+1 pattern when evaluating:
```python
categories.filtered(lambda categ: categ.has_published_products)
```
As a result, query count became dependent on the number of active categories, which broke SQL performance tests when demo data were installed.
This commit updates the computation again to avoid recursion and restore ORM prefetch optimizations, making the number of queries independent of the number of active categories.
This commit also removes redundant checks already enforced by ORM `ir.rule`. For example, the following pattern evaluates `has_published_products` three times: once in the user domain, once in the access rule domain added by `search`, and once in the filter.
```python
domain = [("has_published_products", "=", True)]
categs = self.env["product.public.category"].search(domain)
categs.filtered("has_published_products")
```
runbot-234948
Forward-Port-Of: odoo/odoo#257071
Forward-Port-Of: odoo/odoo#256415This update corrects a bug where the system automatically adjusted dates on Czech tax documents that had already been processed. This was causing issues with accurate reporting related to late tax deductions, a common requirement in the Czech Republic. Now, users must manually adjust dates for posted documents to ensure correct accounting.
Original PR description
Description of the issue/feature this PR addresses: This automatic date alignment make sense in case of new document, but when you work on document that was posted. User should change it manually. In Czech republic we have something like late tax deduction and in this case there is not alignment of dates. Current behavior before PR: When you change taxable_supply_date it automatically change date Desired behavior after PR is merged: Disable this calculation od moves that hase been posted. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#257135
This update fixes an issue where a second resupply picking was being created when adding a component to a subcontracting order. The fix ensures that new components are correctly grouped with existing pickings, streamlining the inventory management process for subcontracted manufacturing. This prevents unnecessary stock movements and improves order accuracy.
Original PR description
Steps to reproduce: 1- Install Inventory, Purchase and Manufacturing 2- Enable 'multi-step routes' in the settings 3- Create Product A and create a Bill of Materials (BoM type: subcontracting,…
Steps to reproduce: 1- Install Inventory, Purchase and Manufacturing 2- Enable 'multi-step routes' in the settings 3- Create Product A and create a Bill of Materials (BoM type: subcontracting, Component A) 4- Repeat the same for Products [B,C] with components [B,C] correspondingly. 5- Assign the same subcontractor to all of them 6- Create a Purchase Order for both Product A and Product B with vendor as the subcontractor and confirm it 7- Add a new order line with Product C and save Description of issue: A second resupply picking is created Expected behavior: Should group the new product's component with the existing picking Why this happens: When assigning the resupply picking for the new product's component, the search domain for the existing picking includes production_group_id, which is different for the added product. This prevents merging of components into a single resupply picking despite sharing the same destination and purchase order Fix: We ignore production_group_id since it is not necessary in the resupply stock moves domain. opw-5906451 Forward-Port-Of: odoo/odoo#251713
This update fixes an issue where the cost of a sale order wasn't accurately calculated when using the dropshipping feature. The fix ensures that the cost reflects the purchase order price (e.g., $10) for dropshipped products, resolving a discrepancy where the cost was incorrectly displayed as $0. This improves the accuracy of financial reporting.
Original PR description
**Problem:** The cost is not correctly computed on sale order line when the product is dropshipped. **Steps to reproduce:** - enable "margins" and "dropshipping" settings - create a tracked, fifo…
**Problem:** The cost is not correctly computed on sale order line when the product is dropshipped. **Steps to reproduce:** - enable "margins" and "dropshipping" settings - create a tracked, fifo product with dropship route - add a vendor in the purchase tab - confirm a sale order for 1 unit - set a unit price of 10 in the PO and confirm it - validate the dropship picking - come back to the sale order and unhide de cost column **Current behavior:** the cost is 0 **Expected behavior:** the cost should be 10 based on the unit price of the PO **Cause of the issue:** To compute the purchase price, when there is valued moves linked to the sale order line and the product is fifo/avco, we call _get_price_unit() on the moves. https://github.com/odoo/odoo/blob/98e6e929bf8e0c34ec77fb9d07ef253e0abf681c/addons/sale_stock_margin/models/sale_order_line.py#L21 Which uses the value of the moves https://github.com/odoo/odoo/blob/98e6e929bf8e0c34ec77fb9d07ef253e0abf681c/addons/stock_account/models/stock_move.py#L237-L243 But for dropshipped move the value on the moves is always 0. So the return value will be 0 and purchase price will be 0. **fix:** - The idea of the fix is to use _get_value() instead of the move value for dropship moves. This approach is already used in the code inside _run_average_batch() https://github.com/odoo/odoo/blob/98e6e929bf8e0c34ec77fb9d07ef253e0abf681c/addons/stock_account/models/product.py#L474-L475 - In case there is not only dropship moves we need to do a weighted average opw-6051004 Forward-Port-Of: odoo/odoo#256089
This update resolves a bug where adding captions to images with a 'display:block' style incorrectly removed surrounding text blocks. The fix ensures captions are added and displayed correctly, preventing multiple captions from being added to the same image and improving the overall image editing experience.
Original PR description
Steps to reproduce: - Go to To-do - Open a demo record (e.g., "Welcome Mitchell Admin") - Click on an image - Click on "Caption" from the toolbar - Click on the image again Description of the issue:…
Steps to reproduce: - Go to To-do - Open a demo record (e.g., "Welcome Mitchell Admin") - Click on an image - Click on "Caption" from the toolbar - Click on the image again Description of the issue: - When adding a caption, the parent paragraph block of sibling nodes is removed, making them direct children of the editable area. - After adding a caption, reopening the powerbox does not show the caption button as active, allowing multiple captions to be added on the same image. Cause: - When the image has `display:block`, `closestBlock` returns the image itself as its closest block. - As a result, when a caption is added to an image, its parent paragraph block is not split around the image even if the image has sibling nodes, and when `unwrapContents` is called, both the image and its siblings get unwrapped, making them direct children of the editable area. - Since `closestBlock` is the image (and not a `<figure>`), the caption button in the toolbar is not marked as active even when a caption already exists, so clicking it again adds another caption instead of removing the existing one. Solution: - Instead of using the image's `closestBlock` directly, find the `closestBlock` of its parent element. - This ensures the correct block is found even when the image has `display:block`. task-6051549 Forward-Port-Of: odoo/odoo#256436 Forward-Port-Of: odoo/odoo#255064
This update fixes a vulnerability in the email marketing editor where users could inadvertently create checklists using a shorthand command. The change prevents pasting checklist content, ensuring that checklist creation is fully disabled as intended and improving email marketing security.
Original PR description
In email marketing, checklist creation is disabled via powerbox, toolbar, and shortcut (Ctrl+Shift+9), but it can still be created using the shorthand command ('[] ').
Disable the checklist shorthand command to ensure checklist creation is fully restricted in email marketing.
task-6048027
Forward-Port-Of: odoo/odoo#257143
Forward-Port-Of: odoo/odoo#254816This update resolves an issue where leave scheduling calculations were incorrectly skipping employee availability, leading to potential scheduling conflicts. The fix ensures that all employee work intervals are considered when determining the earliest available time for leave, resulting in more accurate and reliable leave scheduling. This improves the overall accuracy of the HR system.
Original PR description
Before this commit, in `_get_first_working_interval_batch` the `collect_employees` helper only inspected the first item of each employee's work interval. The batch calendar query starts from the global `min_dt` which is the earliest leave end across all employees in the batch. For an employee whose leave ends later, the first returned interval can therefore still fall before that employee's own threshold (`min_dts[employee_id]`). The old code would discard that interval and, since it never examined subsequent ones, silently skip the employee with no result. This commit fixes the issue by replacing the single-item check with a loop that iterates over all of the employee's intervals and picks the first start time strictly after `min_dts[employee_id]`. Forward-Port-Of: odoo/odoo#257310
This update fixes a potential inconsistency issue in the Point of Sale (POS) system. Previously, users could modify tax settings while a POS session was open, leading to discrepancies between receipts and invoices. Now, a safeguard prevents these changes, ensuring accurate financial reporting.
Original PR description
There is a safeguard in account.tax.write prevents modifying taxes as it is forbidden to modify a tax used in a POS order not posted. This guard only applies for a predefined set of fields in…
There is a safeguard in account.tax.write prevents modifying taxes as it is forbidden to modify a tax used in a POS order not posted. This guard only applies for a predefined set of fields in account_tax.py. After 18.0, the tax-included behavior is controlled through the `price_include_override` field instead of `price_include`. However, this field was not added in the forbidden fields, allowing users to modify tax inclusion while a POS session is open. This bypasses the safeguard and can lead to inconsistencies, as the POS caches tax configuration at session start. For example, changing this setting mid-session may differences between POS receipts and backend invoices. By adding `price_include_override` to the forbidden fields, the UserError can properly be raised. Additional note: test_fiscal_position_between_frontend_and_backend was updated to close the POS session before changing taxes since the safeguard now correctly blocks this. Related ticket: opw-6042367 Forward-Port-Of: odoo/odoo#257035 Forward-Port-Of: odoo/odoo#254487
This update fixes an issue where Chrome logs weren't reliably captured during shutdown, particularly when errors occurred. The changes also address Chrome's log buffering behavior and add resilience to Chrome shutdown attempts, ensuring more complete and accurate log data for troubleshooting.
Original PR description
odoo/odoo#255054 saved the chrome log at the end of a tour (logging that as `INFO` on success and `RUNBOT` on failure). However as it turns out there are a few issues with that: 1. In case of chrome error during termination (`stop`), those errors can not be in the log, since the log was already saved. 2. Chrome buffers logs a lot more than anticipated, and because `--v=0` logs are a lot less chatty than `--v=1` the logs routinely show essentially nothing (a few tour steps are logged then nothing). Also make `stop` a bit more resilient to chrome issues: - handle errors around ws shutdown - wait for chrome to shut down before we try to remove the data directory - also add a fallback *killing* chrome if it doesn't seem to be shutting down Forward-Port-Of: odoo/odoo#256656 Forward-Port-Of: odoo/odoo#256061
This update resolves a bug where the bold formatting action wasn't consistently removing bolding from selected text, particularly when `/file` components were present. The fix ensures that bolding is correctly applied or removed based on editable text nodes, improving the functionality of the HTML editor.
Original PR description
When determining whether the "bold" action is about adding bold or removing bold, non-editable text nodes are also taken into account. Because of this, if the selection contains an embedded component such as `/file`, it always considers bold was not applied on all nodes, and should therefore be applied. The action thus never removes bold. This commit fixes this by only taking into account the editable nodes. Steps to reproduce: - Go to a "To do" note - Add a few lines of text - Add a `/file` in the middle - Select all - Press Ctrl+B: bold is applied on the surrounding text - Press Ctrl+B again => Bold was not removed from the surrounding text task-5955977 Forward-Port-Of: odoo/odoo#257550 Forward-Port-Of: odoo/odoo#249816
This update fixes an issue where a browser tab change while the product configurator dialog is open would reset sales orders to their previous state. Now, changes made within the dialog are correctly saved, ensuring data integrity when switching between tabs. This improves the user experience for complex product configurations.
Original PR description
## Versions 18.0+ ## Issue When the product configurator dialog is open, a browser tab change acts like a discard on the SOL: coming back to the Odoo tab displays the dialog but the SOL has been…
## Versions
18.0+
## Issue
When the product configurator dialog is open, a browser tab change acts like a discard on the SOL: coming back to the Odoo tab displays the dialog but the SOL has been reverted to its previous state.
## Steps to reproduce
- Create a new SO for any customer:
- Add a standard (non-combo/non-variant) product (e.g. "Apple Pie");
- Save manually;
- Change the product for a combo or variant one (e.g. "Customizable Desk");
- With the opened dialog, change from browser tab then come back;
- The SOL has been reset to the standard product ("Apple Pie") and confirming the dialog has no effect).
## Cause
The `beforeVisibilityChange` hook is triggered by the tab change and saves the form without updated values. This is because the hook checks for two conditions to be true: https://github.com/odoo/odoo/blob/2f00b0085574653ca1a8f734ef91893a4a1c1a7c/addons/web/static/src/views/form/form_controller.js#L479-L483 The tab change indeed changes the document's visibility to "hidden" but the controller has never been updated with the form's display in the dialog and, therefore, `this.formInDialog` is indeed equal to zero.
## Test
No test as we cannot simulate a browser tab change then come back to the first tab.
opw-5494089
Forward-Port-Of: odoo/odoo#257846
Forward-Port-Of: odoo/odoo#24779715 changes
New functionality added to Odoo
This update introduces the ability to export Slovak VAT reports in XML format, aligning with the specific requirements of the Slovak government. This ensures accurate and compliant reporting, simplifying the process for our Slovakian clients and improving data accuracy.
Original PR description
Add XML export for the Slovak VAT report, following the official government format Related: https://github.com/odoo/odoo/pull/257528 task-6040973
Enhancements to existing features
This update simplifies database access management for users by adding a dedicated 'databases' tab to the user view. Now, administrators can easily see and manage which databases a user has access to, streamlining the process and reducing manual searching.
Original PR description
The aim of this commit is to allow db_manager to see the list of databases in which a specific user has access and to allow removing this access in bulk if required. Before this commit: To see the list of db in which a user has access, a db_manager would have to go to the list view and make a search on the login/name of the user, potentially matching other db_user in the process. After this commit: The list of db is available out of the box in a databases tab on the res.user view. Task-id: 5945298 Forward-Port-Of: odoo/enterprise#112645
Resolved issues and error corrections
This update corrects a calculation error within the Belgian HR contract salary module that was impacting the accurate determination of yearly cost sacrifice figures. The fix ensures that these figures are now calculated correctly, improving the reliability of financial reporting related to employee contracts. This change primarily affects payroll processing for Belgian entities.
This update resolves an issue preventing the launch of a Web Studio tour due to a problem with how the editor tracked changes. Additionally, a crash in the report processing system was fixed by using a more reliable architecture copy. This ensures the Web Studio functionality continues to operate smoothly.
Original PR description
These changes were made because the diff in https://github.com/odoo/odoo/pull/252844 caused a tour in *web_studio_test_ui_unit_report_tours.js* to fail Cause of issue: =============== For the tour, the powerbox wasn't opening because DOM changes weren't registered with the editor's state system. For *report.py*, after changes to the tour, the system tried loading from file using the backup key as an XML ID. Since backup keys contain dots https://github.com/odoo/enterprise/blob/7ca23bee6f84ccd0cd9c1cd747f434f3cc37861e/web_studio/controllers/report.py#L354 the XML ID parser crashed. Fix: ==== For the tour, registered the DOM mutation (span insertion in the other PR) with the editor's history, since the editor uses a MutationObserver that only processes changes it's aware of. For *report.py*, clearing arch_fs uses the already-copied architecture from arch_db instead.
This update addresses an issue where the Master Production Schedule (MPS) wasn't correctly accounting for safety stock levels when calculating indirect demand. The fix ensures that safety stock is considered, leading to more accurate production forecasts and reduced stockouts. This improves the reliability of the MPS planning process.
Original PR description
Steps to reproduce: ------------------- * Enable "Master Production Schedule" in Inventory settings * Create tracked Product "Child" and set up a vendor * Create tracked Product "Parent" and set up a…
Steps to reproduce: ------------------- * Enable "Master Production Schedule" in Inventory settings * Create tracked Product "Child" and set up a vendor * Create tracked Product "Parent" and set up a bom as component "Child" and Lead Time: 2 days * Create tracked Product "GParent" and set up a bom as component "Parent" and Lead Time: 2 days * Open MPS and add your three products: - Child, Parent: activate indirect demand - Parent: Safety Stock Target of 10 * Add 1 in the forecast demand for "Gparent" on third column -> Will have 20 Indirect Demand Forecast of Child in the first column and -9 on the second Observation: ------------- Usefull comment form the function : https://github.com/odoo/enterprise/blob/b332af45a46b2295797a5096f68b7953554a495b/mrp_mps/models/mrp_mps.py#L424-L447 When creating a demand from the MPS, it will always take the first date of the interval (ex: Week 10 (2-8/Mar), it will create the demand for the 2 of Mars) When calculating the production schedule. we wil we calculate each product for each date_range: https://github.com/odoo/enterprise/blob/ea805995f66e007c0aef6b473a2b16dbe54d73bc/mrp_mps/models/mrp_mps.py#L488 https://github.com/odoo/enterprise/blob/ea805995f66e007c0aef6b473a2b16dbe54d73bc/mrp_mps/models/mrp_mps.py#L509 When calculating the values for a product, we will set the indirect demand qty for it component The demand will created the demand in function of the date of when the parent need and the lead time (it will for the previous date range because of the lead time): https://github.com/odoo/enterprise/blob/ea805995f66e007c0aef6b473a2b16dbe54d73bc/mrp_mps/models/mrp_mps.py#L554 https://github.com/odoo/enterprise/blob/ea805995f66e007c0aef6b473a2b16dbe54d73bc/mrp_mps/models/mrp_mps.py#L555 If the demand is not equal to the resplensih_qty we will create another demand to compensate, it will use the first date of range minus the lead time it will send it to the previous date range: https://github.com/odoo/enterprise/blob/ea805995f66e007c0aef6b473a2b16dbe54d73bc/mrp_mps/models/mrp_mps.py#L556-L560 In our case this will create the issue, since it will try to compensate each time on the previous week. opw-5413838 Forward-Port-Of: odoo/enterprise#112811 Forward-Port-Of: odoo/enterprise#107671
This update fixes a bug in how leave dates are calculated for employees, ensuring accurate scheduling across the system. Previously, the system missed potential leave windows if the initial search started too early. The change improves the reliability of leave scheduling and prevents employees from being incorrectly excluded from their approved leave periods.
Original PR description
Before this commit, in `_get_first_working_interval_batch` the `collect_employees` helper only inspected the first item of each employee's work interval. The batch calendar query starts from the global `min_dt` which is the earliest leave end across all employees in the batch. For an employee whose leave ends later, the first returned interval can therefore still fall before that employee's own threshold (`min_dts[employee_id]`). The old code would discard that interval and, since it never examined subsequent ones, silently skip the employee with no result. This commit fixes the issue by replacing the single-item check with a loop that iterates over all of the employee's intervals and picks the first start time strictly after `min_dts[employee_id]`.
This update fixes an issue where carrier tracking information wasn't consistently passed through multi-step delivery processes. The change ensures that tracking references are automatically propagated to subsequent pickings, even without a specific carrier assigned, improving shipment visibility and traceability. This enhancement simplifies tracking and reporting for our users.
Original PR description
Steps to reproduce:
- Enable multi-step routes in Inventory settings
- Go to Warehouse Management → Operation Types
- Set Delivery to 3 steps
- Open the 3-step delivery routes and enable “Propagate carrier” on any rule
- Create a storable product P1
- Create a sales order with 1 unit of P1
- Confirm the sales order
- Open the generated picking
- Go to the Additional Info tab
- Set Tracking Reference = 123
- Confirm the picking
- Open the next picking (Pack operation)
Problem:
The tracking reference is not propagated to the next picking, even though the rule has “Propagate carrier” enabled.
Expected behavior:
The tracking reference should be propagated to the subsequent picking when carrier propagation is enabled on the rule. Even if no carrier set.
opw-6052930
Forward-Port-Of: odoo/odoo#256851This update resolves a bug where the bold formatting action wasn't consistently removing bolding when a `/file` component was present in the selected text. The fix ensures that bolding is correctly applied or removed based on editable text nodes, improving the reliability of the formatting tool. This prevents unexpected bolding behavior.
Original PR description
When determining whether the "bold" action is about adding bold or removing bold, non-editable text nodes are also taken into account. Because of this, if the selection contains an embedded component such as `/file`, it always considers bold was not applied on all nodes, and should therefore be applied. The action thus never removes bold. This commit fixes this by only taking into account the editable nodes. Steps to reproduce: - Go to a "To do" note - Add a few lines of text - Add a `/file` in the middle - Select all - Press Ctrl+B: bold is applied on the surrounding text - Press Ctrl+B again => Bold was not removed from the surrounding text task-5955977 Forward-Port-Of: odoo/odoo#257327 Forward-Port-Of: odoo/odoo#249816
This update fixes a bug where expected hours weren't consistently calculated for attendance records, particularly with overtime. Now, the system correctly updates expected hours after overtime is added, ensuring accurate reporting and time tracking. This resolves discrepancies in reporting views like the Attendance Pivot.
Original PR description
The expected_hours field was not always being computed for attendances. self.add_to_compute is used here to ensure that it is always recomputed. 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#251989
This update fixes an issue where combo pricing in the self-order mode was incorrect in the backend. The fix accurately calculates prices for combos with multiple quantities, ensuring consistent pricing between the frontend and backend. This improves the reliability of self-order transactions.
Original PR description
**Steps to reproduce:** - Create 2 products, set their price to 0 - Create a combo product, set it's price to 10 - The combo choices should be the 2 products created before - Go to the self order,…
**Steps to reproduce:** - Create 2 products, set their price to 0 - Create a combo product, set it's price to 10 - The combo choices should be the 2 products created before - Go to the self order, order the combo and change the qty to 3 - The price is 30, correct in the frontend - Go to the order in the backend, the price is 0 **Why the fix:** In the backend, during the price recomputation, we did not account for the fact that we could have a parent line with multiple quantity during the split between the free and the extra lines. This means that we counted too many lines, and had to put some in the extra lines. We then override the price_unit with the total_price in this code https://github.com/odoo/odoo/blob/f73c32960721b046076b91e4bc017ddb924e0837/addons/pos_self_order/models/pos_order.py#L341-L342 But the total price has been computed to zero, so the previously computed price_unit is overriden and set to zero. We now divide the line's qty by the parent line's qty to get the qty per parent line, allowing us to have a qty of more than 1 for the parent line. The same is done for the computation of the remaining amount to pay, as **child.qty** is the number of time the item is selected in the combo * the number of combo ordered, meaning it was messing up the computation. opw-6032408
This update fixes an issue where the cost of a sale order was incorrectly calculated when using the dropshipping feature. The fix ensures that the cost accurately reflects the purchase order price (e.g., $10) for dropshipped products, resolving a discrepancy in cost reporting.
Original PR description
**Problem:** The cost is not correctly computed on sale order line when the product is dropshipped. **Steps to reproduce:** - enable "margins" and "dropshipping" settings - create a tracked, fifo…
**Problem:** The cost is not correctly computed on sale order line when the product is dropshipped. **Steps to reproduce:** - enable "margins" and "dropshipping" settings - create a tracked, fifo product with dropship route - add a vendor in the purchase tab - confirm a sale order for 1 unit - set a unit price of 10 in the PO and confirm it - validate the dropship picking - come back to the sale order and unhide de cost column **Current behavior:** the cost is 0 **Expected behavior:** the cost should be 10 based on the unit price of the PO **Cause of the issue:** To compute the purchase price, when there is valued moves linked to the sale order line and the product is fifo/avco, we call _get_price_unit() on the moves. https://github.com/odoo/odoo/blob/98e6e929bf8e0c34ec77fb9d07ef253e0abf681c/addons/sale_stock_margin/models/sale_order_line.py#L21 Which uses the value of the moves https://github.com/odoo/odoo/blob/98e6e929bf8e0c34ec77fb9d07ef253e0abf681c/addons/stock_account/models/stock_move.py#L237-L243 But for dropshipped move the value on the moves is always 0. So the return value will be 0 and purchase price will be 0. **fix:** - The idea of the fix is to use _get_value() instead of the move value for dropship moves. This approach is already used in the code inside _run_average_batch() https://github.com/odoo/odoo/blob/98e6e929bf8e0c34ec77fb9d07ef253e0abf681c/addons/stock_account/models/product.py#L474-L475 - In case there is not only dropship moves we need to do a weighted average opw-6051004 Forward-Port-Of: odoo/odoo#256089
This update fixes an issue where date alignment was automatically applied to Czech tax documents after they were posted. This was causing problems with late tax deductions, which are common in the Czech Republic. Now, users must manually adjust dates for posted documents to ensure accurate reporting.
Original PR description
Description of the issue/feature this PR addresses: This automatic date alignment make sense in case of new document, but when you work on document that was posted. User should change it manually. In Czech republic we have something like late tax deduction and in this case there is not alignment of dates. Current behavior before PR: When you change taxable_supply_date it automatically change date Desired behavior after PR is merged: Disable this calculation od moves that hase been posted. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#257135
This update fixes an issue where a second resupply picking was being created when adding components to a subcontracting production order. The fix ensures that new components are correctly grouped with existing pickings based on shared purchase orders, streamlining inventory management and reducing manual effort. This improves the efficiency of our subcontracting processes.
Original PR description
Steps to reproduce: 1- Install Inventory, Purchase and Manufacturing 2- Enable 'multi-step routes' in the settings 3- Create Product A and create a Bill of Materials (BoM type: subcontracting,…
Steps to reproduce: 1- Install Inventory, Purchase and Manufacturing 2- Enable 'multi-step routes' in the settings 3- Create Product A and create a Bill of Materials (BoM type: subcontracting, Component A) 4- Repeat the same for Products [B,C] with components [B,C] correspondingly. 5- Assign the same subcontractor to all of them 6- Create a Purchase Order for both Product A and Product B with vendor as the subcontractor and confirm it 7- Add a new order line with Product C and save Description of issue: A second resupply picking is created Expected behavior: Should group the new product's component with the existing picking Why this happens: When assigning the resupply picking for the new product's component, the search domain for the existing picking includes production_group_id, which is different for the added product. This prevents merging of components into a single resupply picking despite sharing the same destination and purchase order Fix: We ignore production_group_id since it is not necessary in the resupply stock moves domain. opw-5906451 Forward-Port-Of: odoo/odoo#251713
This update fixes issues with capturing Chrome logs during shutdowns and improves the stability of the Odoo server's stop process. The changes ensure critical errors are logged, even during unexpected shutdowns, and enhance the server's resilience to Chrome-related problems.
Original PR description
odoo/odoo#255054 saved the chrome log at the end of a tour (logging that as `INFO` on success and `RUNBOT` on failure). However as it turns out there are a few issues with that: 1. In case of chrome error during termination (`stop`), those errors can not be in the log, since the log was already saved. 2. Chrome buffers logs a lot more than anticipated, and because `--v=0` logs are a lot less chatty than `--v=1` the logs routinely show essentially nothing (a few tour steps are logged then nothing). Also make `stop` a bit more resilient to chrome issues: - handle errors around ws shutdown - wait for chrome to shut down before we try to remove the data directory - also add a fallback *killing* chrome if it doesn't seem to be shutting down Forward-Port-Of: odoo/odoo#256656 Forward-Port-Of: odoo/odoo#256061
This update resolves an issue where switching browser tabs while a product configurator dialog is open would reset sales orders to their original state. Now, changes made within the dialog are correctly saved, ensuring data integrity when navigating between tabs. This improves the user experience when configuring complex products.
Original PR description
## Versions 18.0+ ## Issue When the product configurator dialog is open, a browser tab change acts like a discard on the SOL: coming back to the Odoo tab displays the dialog but the SOL has been…
## Versions
18.0+
## Issue
When the product configurator dialog is open, a browser tab change acts like a discard on the SOL: coming back to the Odoo tab displays the dialog but the SOL has been reverted to its previous state.
## Steps to reproduce
- Create a new SO for any customer:
- Add a standard (non-combo/non-variant) product (e.g. "Apple Pie");
- Save manually;
- Change the product for a combo or variant one (e.g. "Customizable Desk");
- With the opened dialog, change from browser tab then come back;
- The SOL has been reset to the standard product ("Apple Pie") and confirming the dialog has no effect).
## Cause
The `beforeVisibilityChange` hook is triggered by the tab change and saves the form without updated values. This is because the hook checks for two conditions to be true: https://github.com/odoo/odoo/blob/2f00b0085574653ca1a8f734ef91893a4a1c1a7c/addons/web/static/src/views/form/form_controller.js#L479-L483 The tab change indeed changes the document's visibility to "hidden" but the controller has never been updated with the form's display in the dialog and, therefore, `this.formInDialog` is indeed equal to zero.
## Test
No test as we cannot simulate a browser tab change then come back to the first tab.
opw-5494089
Forward-Port-Of: odoo/odoo#257846
Forward-Port-Of: odoo/odoo#2477971 change
Resolved issues and error corrections
This update corrects the calculation of employment bonuses in the Odoo Enterprise system for Belgium, aligning with new regulations announced by Partena Professional as of April 1, 2026. The change ensures accurate reporting of bonus amounts for Belgian HR and payroll processes. This update addresses a discrepancy in the previously calculated bonus figures.
Original PR description
https://www.partena-professional.be/fr/le-bonus-lemploi-au-1er-avril-2026?utm_source=sfmc&utm_medium=email&utm_campaign=InfoFlash+Daily+Mail+-+FR&utm_content=article-read-more-cta&utm_term=All%20Subscribers&utm_id=81873&sfmcContactKey=litom@odoo.com Forward-Port-Of: odoo/enterprise#112970
8 changes
Resolved issues and error corrections
This update corrects a discrepancy in the calculation of employment bonuses for Odoo Enterprise users in Belgium. The change reflects the latest regulations from Partena Professional, ensuring accurate bonus payments up to April 2026. This update maintains compliance with Belgian tax laws and avoids potential financial discrepancies.
Original PR description
https://www.partena-professional.be/fr/le-bonus-lemploi-au-1er-avril-2026?utm_source=sfmc&utm_medium=email&utm_campaign=InfoFlash+Daily+Mail+-+FR&utm_content=article-read-more-cta&utm_term=All%20Subscribers&utm_id=81873&sfmcContactKey=litom@odoo.com Forward-Port-Of: odoo/enterprise#112970
A recent update to Odoo inadvertently created a problem with purchase order confirmations. This fix corrects a field name change that was causing errors, ensuring purchase orders can be processed correctly. This resolves a rare but impactful issue that could block order confirmations.
Original PR description
A big refactor of UOM in saas-18.1 (https://github.com/odoo/odoo/pull/184131) accidentally left a reference to the `product_uom` field on `purchase.order.line`. But that field was renamed to `product_uom_id` in https://github.com/odoo/odoo/pull/186250. In rare edge-cases, if we it `supplierinfo['product_uom_id'] = line.product_uom.id` while confirming a purchase order, it will block it because of a traceback: ``` supplierinfo['product_uom_id'] = line.product_uom.id ^^^^^^^^^^^^^^^^ AttributeError: 'purchase.order.line' object has no attribute 'product_uom'. Did you mean: 'product_id'? ``` This PR fixes the issues by accounting for the field rename. OPW-6068125 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#256416
This update fixes an issue where browser tab changes while the product configurator dialog is open would reset sales orders to their previous state. Now, changes made within the dialog are correctly saved, ensuring data integrity when switching between tabs. This improves the user experience and prevents data loss.
Original PR description
## Versions 18.0+ ## Issue When the product configurator dialog is open, a browser tab change acts like a discard on the SOL: coming back to the Odoo tab displays the dialog but the SOL has been…
## Versions
18.0+
## Issue
When the product configurator dialog is open, a browser tab change acts like a discard on the SOL: coming back to the Odoo tab displays the dialog but the SOL has been reverted to its previous state.
## Steps to reproduce
- Create a new SO for any customer:
- Add a standard (non-combo/non-variant) product (e.g. "Apple Pie");
- Save manually;
- Change the product for a combo or variant one (e.g. "Customizable Desk");
- With the opened dialog, change from browser tab then come back;
- The SOL has been reset to the standard product ("Apple Pie") and confirming the dialog has no effect).
## Cause
The `beforeVisibilityChange` hook is triggered by the tab change and saves the form without updated values. This is because the hook checks for two conditions to be true: https://github.com/odoo/odoo/blob/2f00b0085574653ca1a8f734ef91893a4a1c1a7c/addons/web/static/src/views/form/form_controller.js#L479-L483 The tab change indeed changes the document's visibility to "hidden" but the controller has never been updated with the form's display in the dialog and, therefore, `this.formInDialog` is indeed equal to zero.
## Test
No test as we cannot simulate a browser tab change then come back to the first tab.
opw-5494089
Forward-Port-Of: odoo/odoo#257482
Forward-Port-Of: odoo/odoo#247797This update corrects a bug in the Point of Sale order report that incorrectly displayed margin values when orders were placed in different currencies. The fix ensures that the margin calculation and reporting now accurately reflect the currency used in the order, providing more reliable financial reporting for sales transactions. This improves the accuracy of sales analysis and reporting.
Original PR description
When making a pos order in a PoS that uses a different currency, the margin in the pos order report would not take the currency into account Steps to reproduce: ------------------- * Create a product with a price of 100€ and cost 0€ (margin = 100€) * Setup a PoS to use a different currency with a rate of 2 (so 1€=>0.5) * Create a PoS order for this product and validate it * Go to the pos order report and select the order you just made > Observation: The value of the margin is 200 expressed in the different currency, when the rest of the report is using the company currency. Why the fix: ------------ The currency was only applied on the product cost, we now apply it on the whole margin. opw-5927473 Forward-Port-Of: odoo/odoo#255344
This update resolves an issue where the 'Export XML' button for EU Standard (Peppol Bis 3.0) invoices wasn't functioning correctly. Now, users can download invoices in the expected XML format when creating invoices with this eInvoice type, ensuring proper compliance with Peppol regulations. This improves the ability to integrate with external systems.
Original PR description
Issue: Export XML button doesn't produce the same file as the send button. Steps to reproduce: - Company in Spain with Peppol (work with any Peppol country) - Partner in Croatia - Select eInvoice…
Issue: Export XML button doesn't produce the same file as the send button. Steps to reproduce: - Company in Spain with Peppol (work with any Peppol country) - Partner in Croatia - Select eInvoice Type as "EU Standard (Peppol Bis 3.0)" - Create an invoice - Confirm it - Click on the Wheel -> Download Current behavior: - without l10n_hr_edi: only "PDF" and "PDF without Payment" - with l10n_hr_edi: "Export XML" appear, but try to create an "ubl_hr" file Cause: "Export XML" button appear only if: - there is a default ubl option for the partner country - there is an XML attached to the invoice when clicked it exports the corresponding one. Whereas, the 'send' button rely on: 1) the partner defined edi format, 2) the default ubl option for the partner country 3) "ubl_bis3" To be noted: The route to download the XML doesn't keep the context of the active company and fallback to the first allowed company. As invoice_edi_format is company dependent it needs to be exported in the format defined for the company of the invoice. opw-5943500 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where Odoo incorrectly consumed stock from the wrong location when scanning serial numbers on manufacturing orders. The fix ensures the correct warehouse location is used, preventing errors in inventory tracking and improving order fulfillment accuracy. This resolves a potential problem with stock discrepancies.
Original PR description
Steps to reproduce: - Create a Manufacturing Order with a serial-tracked component. - Open the Shop Floor. - Scan the serial number barcode to register the component. - Observe which location the component was consumed from. Issue: When a product is received from a vendor, Odoo creates two quants for the same serial number — one at Partners/Vendors location and one at WH/Stock location. Because get_quant_from_barcode searched for a matching serial number with no location filter, it returned whichever quant had the lowest database ID — which was always the Partners/Vendors or Production quant created first — instead of the correct WH/Stock quant. Solution: Prevent selecting a quant from an incorrect location when multiple quants exist for the same serial number, as this can lead to consuming stock from the wrong location. opw-5974474
This update corrects errors related to Spanish Value Added Tax (IGIC) calculations, specifically for the 5% rate. It adds the necessary tax codes and fiscal positions, ensuring accurate reporting of IGIC for Spanish businesses using Odoo. This improves compliance with Spanish tax regulations.
Original PR description
- Fix also some errors on the 5% taxes, where a 3 percent was applied or the group was not the right onw @jco-odoo --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#231836
This update corrects a previous issue where the Amazon fulfillment channel within the sales module was incorrectly displayed as read-only. The change ensures users can now modify their Amazon channel settings, streamlining the process for managing Amazon sales fulfillment. This improves operational efficiency.
Original PR description
Commit 67c45d6494f082e2ee83b9a84611e8b8fe8f4fd5 intended to make `amazon_channel` editable by users. However, the field was displayed with the `badge` widget, which is read-only, so it remained uneditable. Use an editable display for `amazon_channel` so the original fix works as intended. Forward-Port-Of: odoo/enterprise#112866
2 changes
Resolved issues and error corrections
This update fixes an issue where refund orders weren't correctly included when calculating outstanding customer dues. Now, the system accurately reflects all outstanding amounts, including refunds, ensuring accurate reporting and settlement processes for customer payments. This improves the reliability of our financial data.
Original PR description
Step to reproduce - install "pos_settle_due" - have a customer, A and a pos with payment method "customer Account" - start pos, add 3 qty of product with unit price 10$ with partner A - use payment method "customer Account" i.e. of type "pay_later" (do not invoice orders) - refund 1 qty of previous order using same payment method - go to partner list, notice A has 20$ as due - click on "hamburger btn" > settle due amount Observation: - notice we only get the order amount as due i.e order with 30$ - we should have received the refund order too, so that net due of 20$ can be processed Cause: - currently, we didn't considered refunds orders at all, when settling dues Fix: - now we consider order with total < 0 i.e refund orders to be included for settlement opw-5869313
This update corrects a discrepancy in the calculation of employment bonuses for Odoo Enterprise users in Belgium. The change reflects the latest regulations from Partena Professional, ensuring accurate bonus payments up to April 2026. This update maintains compliance with Belgian tax laws and avoids potential financial discrepancies.
Original PR description
https://www.partena-professional.be/fr/le-bonus-lemploi-au-1er-avril-2026?utm_source=sfmc&utm_medium=email&utm_campaign=InfoFlash+Daily+Mail+-+FR&utm_content=article-read-more-cta&utm_term=All%20Subscribers&utm_id=81873&sfmcContactKey=litom@odoo.com Forward-Port-Of: odoo/enterprise#112970
20 changes
New functionality added to Odoo
This update adds crucial data for Belgian payroll calculations by incorporating National Insurance (NIS) codes for both countries and cities. This ensures accurate reporting and compliance with Belgian regulations, improving the payroll system's functionality within the Enterprise module.
Original PR description
Add Nis code field to res.city model and add belgian cities data Add Nis code field to res.country model and complete countries nis code data Add countries and belgian cities view in the menu of payroll app. Documentation can be found here: - Countries: https://www.socialsecurity.be/portail/glossaires/dmfa.nsf/153f48bffb0bd3cac125686200574ff3/e3a58e3ddd17115ac1258b34002c5a61/$FILE/AN2023-1-FR5.pdf - Cities: https://statbel.fgov.be/sites/default/files/Over_Statbel_FR/Nomenclaturen/REFNIS_2025.csv Task-5979510
This update introduces core functionality for calculating Belgian payroll under the CP302 scheme. It includes features like seniority tracking, various work entry types with associated premiums, and specific wage reductions for students and work clothes allowances, aligning with Belgian regulations.
This update allows businesses to track asset depreciation using different accounting ledgers, providing greater flexibility and accuracy in financial reporting. Previously, assets were limited to a single ledger, which is now expanded to accommodate diverse accounting needs and reporting requirements. This enhancement improves compliance and reporting capabilities.
Original PR description
This commit adds the ability to depreciate assets with multiple depreciation models on different ledgers. task-5961309
This update enables e-invoicing for online orders in Guatemala, ensuring compliance with local regulations. It automatically includes company issuer phrases on invoices and allows customers to select their Guatemalan identification type (NIT, CUI) at checkout. The system now generates personalized DTEs when a NIT/CUI is provided and issues standard invoices for Consumer Final purchases.
Original PR description
**PURPOSE** - Ensure invoices generated from website orders include issuer phrases and Support Guatemalan identification requirements for e-commerce. **SPECIFICATION** - Reuse backend phrase logic so website-generated invoices include company issuer phrases. - Add ID type selection (NIT, CUI, etc.) in the checkout. - If NIT/CUI is provided, issue a personalized DTE. - If empty or 'CF', issue the invoice to the Consumidor Final. task-4393611
Enhancements to existing features
This update clarifies the display of room bookings that span multiple days, making it easier for users to understand the booking duration. Previously, bookings were only shown on the start date, which could be confusing. Now, the booking shows both dates involved, preventing potential issues with editing and ensuring clarity.
Original PR description
Purpose ======= Improve the display of the bookings spanning over multiple days in the room booking sidebar. Specification ============= Currently bookings spanning over multiple days are displayed on their start date. Example: a booking starting on the 1st of January at 2PM and ending on the 2nd of January at 4PM will be displayed: Monday, January 1, 2026 2PM -> 4PM It can be really confusing for users. Improving the display to make it more explicit: Monday, January 1, 2026 - Tuesday, January 2, 2026 2PM -> 4PM Choosing to display the 2 dates instead of spliting the booking into 2 cards (like January 1, 2PM -> Midnight and January 2, Midnight -> 4PM) to make sure users understand it's one single booking and prevent introducing strange behavior when editing the booking start or end (i.e. disappearing cards). Task-5959555
This update improves the spreadsheet edition by introducing dynamic list functions, allowing for more flexible data manipulation within lists. The changes include renaming a key function and generalizing a component for reuse across various spreadsheet data sources, ultimately enhancing user productivity and data analysis capabilities.
This update enhances the payslip search functionality by allowing users to group results by employee type. The search view has been reorganized with a new 'Employee Type' filter and a refined layout for better usability. This change improves reporting and data analysis related to payroll.
Original PR description
Add `employee_type_id` as a stored related field on `hr.payslip` (via `version_id.employee_type_id`) to enable grouping by employee type. Update the payslip search view group by section: - Add "Employee Type" group by filter - Remove "Employee Record" (version_id) group by filter - Rename "Status" to "Payslip Status" - Reorder: Pay Run, Employee, Employee Type, Structure, Payslip Status, Department, Job Position, Company task-6071102
This update enhances the Discuss chat view by displaying the meeting status of participants, indicating if they are currently in a busy or accepted calendar event. This provides clearer context during conversations and helps users understand scheduling availability. Only busy and accepted calendar events are now considered.
Original PR description
Before Changes: - No meeting status was shown in discuss conversations. - Users could not see if the other participant was currently in a meeting. After Changes: - Show 'In a meeting until <time>' with calendar icon in chat view. - Only busy and accepted events are considered. - Private/Confidential and all-day events are ignored. task-3368725
This update enhances the mobile experience by allowing users to quickly access the command palette directly from the home menu. Previously hidden, the search input is now revealed with a swipe, providing a more intuitive and efficient way to find commands on touch devices. This improves usability and productivity for mobile users.
Original PR description
*: web_studio This commit introduces a native-feeling interaction to open the command palette from the home menu on mobile devices. The home menu's search input, which is normally visually hidden, is now rendered on mobile devices but initially hidden underneath the navbar using a scroll offset. Users can intuitively swipe down to reveal the input and tap it to instantly open the command palette. task-5966849
This update simplifies database access management for users within Odoo. Now, a list of databases a user has access to is readily available within the user's profile, eliminating the previous manual search process. This improves efficiency and control over user permissions.
Original PR description
The aim of this commit is to allow db_manager to see the list of databases in which a specific user has access and to allow removing this access in bulk if required. Before this commit: To see the list of db in which a user has access, a db_manager would have to go to the list view and make a search on the login/name of the user, potentially matching other db_user in the process. After this commit: The list of db is available out of the box in a databases tab on the res.user view. Task-id: 5945298 Forward-Port-Of: odoo/enterprise#112645
This update enhances the security and logging around exporting large amounts of data from Odoo spreadsheets. Specifically, it adds logging for common export actions like downloading and printing, and restricts access to frozen/XLSX downloads to authorized users. This improves data tracking and protects sensitive information.
Original PR description
Forward-Port-Of: odoo/enterprise#111405 Forward-Port-Of: odoo/enterprise#85888
Resolved issues and error corrections
This update fixes a calculation error in the payroll system related to minimum hourly wages for Belgium (CP200). Previously, the system incorrectly displayed monthly wages as the minimum hourly wage. Now, the system accurately calculates the minimum hourly wage based on the employee's wage type, ensuring accurate payroll reporting.
Original PR description
Before this commit, we don't consider calculating the minimum hourly wage in CP200. Related warning was showing a wrong value (the monthly wage). After this commit, we calculate the value of the min wage depending on the wage_type Hourly wage is calculated like this: (monthly_min_wage * 3) / 13 / hours_per_week task-6074973
This update resolves an error that prevented the General Ledger consolidation feature from functioning correctly when multiple companies were selected. The fix ensures the consolidation process now handles multi-company scenarios without crashing, improving the reliability of financial reporting.
Original PR description
### Issue before this commit: When opening the General Ledger consolidation with multiple companies selected, a traceback was displayed with a KeyError: 'account_code'. ### Steps to reproduce the…
### Issue before this commit: When opening the General Ledger consolidation with multiple companies selected, a traceback was displayed with a KeyError: 'account_code'. ### Steps to reproduce the issue: 1. Select two or more companies from multi company menu 2. Accounting / Reporting / Ledgers / General Ledger 3. Posted Entries, Accrual Basis button 4. Pick Consolidation 5. Error ### Cause of the issue: When more than one company is selected, the General Ledger consolidation groups journal entries by multiple parameters in an increasingly strict hierarchy. One of these parameters is account_code, which is required only in a multi-company context (as account_id alone is sufficient when a single company is selected). However, the SQL query was not properly adapted to handle this case. The account_code field was used as a grouping key but was not retrieved from the database, resulting in a KeyError. ### Reason to introduce the fix: To ensure that the General Ledger consolidation can be correctly displayed in a multi-company context and to prevent runtime errors. opw-5933074 Forward-Port-Of: odoo/enterprise#112738 Forward-Port-Of: odoo/enterprise#109036
This update fixes a bug where flexible schedules with different time zones were incorrectly displaying an inflated number of expected hours (48 instead of 40). The change ensures accurate hour calculations by properly accounting for time zone differences, preventing inaccurate attendance reporting.
Original PR description
__ ## Short functional explanation of the error When the time zone of an employee's schedule is different from the employee's time zone, and that the employee's time zone has more than 9 hours of…
__ ## Short functional explanation of the error When the time zone of an employee's schedule is different from the employee's time zone, and that the employee's time zone has more than 9 hours of difference with UTC. The schedule is flexible and is set to 40 hours per week. When we open the Attendances app, the expected hours for this employee show 48. ## Reproduction Steps 1. Create an employee. The time zone of the employee should be different from the one on his work schedule. To be sure to replicate the bug, set the time zone of employee's time zone to Pyongyang. 2. Open the work schedule and set it to Flexible. Set the weekly hours to 40, and the full time equivalent to 40. Set the work schedule to Europe/Brussels time. 3. Open Attendances. ### Expected behavior When we hover the name of our employee, we can see in white on green background 0/40h. ### Unexpected behavior Instead, we see 0/48h. ## Origin of the issue This line: https://github.com/odoo/odoo/blob/e49536031f61b90212eb6f0d1a8a3e15927e723d/addons/resource/models/resource_calendar.py#L419 is used to retrieve the correct date. We assume that `end_datetime` will be set at midnight, so subtracting one second gives us the day before, allowing us to ignore the date of `end_dt`, for which we don't need to compute the intervals. However, this doesn't take into account different time zones. Indeed, we compute `end_datetime_adjusted` from `end_datetime`, which has the user timezone, and not UTC, as defined here: https://github.com/odoo/odoo/blob/e49536031f61b90212eb6f0d1a8a3e15927e723d/addons/resource/models/resource_calendar.py#L402 As a result, if we set the user timezone to Pyongyang, `end_datetime` will be set at 8am, and `end_datetime_adjusted` will lead to the same date, instead of a day before. Hence, we would compute an additional interval for an additional day, which would in the end give us 48 hours expected instead of the 40 hours indicated in the contract. Therefore, we have to take into account the time zones, hours, minutes and seconds when checking the start and end dates. __ opw-5937298 Forward-Port-Of: odoo/enterprise#111332 Forward-Port-Of: odoo/enterprise#110011
This update fixes an issue where the barcode scanner was incorrectly using the user's company instead of the current business context. This resulted in incorrect barcode lookups. The fix ensures the scanner uses the correct company information, resolving the problem of incorrect product identification and enabling accurate barcode scanning across different company setups.
Original PR description
### Issue: The company used in the main barcode menu is the `company_id` of the user rather than the current contextual company of the session. This is problematic as we might endup using the wrong…
### Issue: The company used in the main barcode menu is the `company_id` of the user rather than the current contextual company of the session. This is problematic as we might endup using the wrong barcode nomenclature. ### Steps to reproduce: - Have 2 companies: company 1 and company 2 - Set the barcode nomenclature of company 1: default, company 2: GS1 - Incarnate a user allowed in both companies but with default company 1 - With company 2, create a product and set its barcode to 36939282410106 - From the main menu open the barcode app and scan 0136939282410106 #### > No product was found (even thought it is correct in GS1) ### Cause of the issue: Scanning from the main barcode menu will trigger a call of the `main_menu` method relying on the nomenclature of the contextual company of the request: https://github.com/odoo/enterprise/blob/804ea21c225a7a1e0763bac188f027adeb3ab78f/stock_barcode/static/src/main_menu/main_menu.js#L98-L99 https://github.com/odoo/enterprise/blob/804ea21c225a7a1e0763bac188f027adeb3ab78f/stock_barcode/controllers/stock_barcode.py#L15-L21 However, when opening the main barcode menu from the app menu, no contextual warehouse was set to the view: https://github.com/odoo/enterprise/blob/804ea21c225a7a1e0763bac188f027adeb3ab78f/stock_barcode/views/stock_barcode_views.xml#L6-L11 As such, the environment of the request will be set here: https://github.com/odoo/odoo/blob/9393b0db6791fe5a7f576cff55705e315fb3dd11/odoo/http.py#L2083 based on the company of the user rather than the one of the context: https://github.com/odoo/odoo/blob/9393b0db6791fe5a7f576cff55705e315fb3dd11/odoo/api.py#L694-L722 ### Fix: Setting the company slices the `current_company` in first position of the `allowed_company_ids`: https://github.com/odoo/odoo/blob/260c69ed64f8663b6935b9863c86aac6dbecd961/addons/web/static/src/webclient/switch_company_menu/switch_company_menu.js#L33-L39 https://github.com/odoo/odoo/blob/260c69ed64f8663b6935b9863c86aac6dbecd961/addons/web/static/src/webclient/switch_company_menu/switch_company_menu.js#L68-L81 which can be recovered from the cookies via the `_get_allowed_company_ids`: https://github.com/odoo/enterprise/blob/43f65ff2f3c6177cc69647bbb85bb40a84409457/stock_barcode/controllers/stock_barcode.py#L432-L442 precisely used by the `_get_barcode_nomenclature`: https://github.com/odoo/enterprise/blob/43f65ff2f3c6177cc69647bbb85bb40a84409457/stock_barcode/controllers/stock_barcode.py#L485-L491 Note that passing the context in the arguments of the `main_menu` JSON route will not really solve the issue by it self since the context is no longer shared with the request: c8cd1d4a83de7a5798cbb910a788fbb6fe208d2f ### Additional Issue: The type `dest_location` does not exist on barcode types: https://github.com/odoo/odoo/blob/485a64b6a1e91feb4310f282c6dd1cd021f1780b/addons/barcodes_gs1_nomenclature/models/barcode_rule.py#L16-L20 so that the type used by these lines can not work: https://github.com/odoo/enterprise/blob/1dedc5bbcee43bfd13e55206e3d7364f715ca9be/stock_barcode/controllers/stock_barcode.py#L29-L30 https://github.com/odoo/enterprise/blob/1dedc5bbcee43bfd13e55206e3d7364f715ca9be/stock_barcode/controllers/stock_barcode.py#L52-L56 ### Steps to reproduce: - In the settings enable: Multi-Steps Routes - Set the barcode nomenclature to GS1 - Set your warehouse in receipt in two steps and add a barcode to the WH/Input: 3033710074365 - From the main menu open the barcode app and scan 4133033710074365 #### > No product or picking was found (even thought it is correct in GS1 that should create an internal transfer with WH/INPUT as destination) opw-5847529 Forward-Port-Of: odoo/enterprise#112783 Forward-Port-Of: odoo/enterprise#111662
This update enhances the Gantt view by adding a visual warning – a danger icon – to shifts that were created to fulfill cancelled Sales Orders. This immediately highlights potential issues and ensures that team members are aware of orders that are no longer active, improving workflow efficiency. The warning remains visible in the shift's form view for additional detail.
Original PR description
Adding warnings on the Gantt view to make it more clear at a glance when a shift had it SO cancelled. ### Before Commit Behavior : 1. A Sales Order (SO) is created for a plannable service. 2. A shift is scheduled to fulfill the SO. 3. The SO is cancelled before the shift is completed. 4. No warning or icon is displayed on the shift in the Gantt view. 5. A warning is only visible in the shift's form view. ### After Commit Expected Behavior : When a shift is created to fulfill a Sales Order, and that SO is later cancelled: - A danger icon is displayed directly on the shift in the Gantt view. - A danger message is also shown in the shift preview within the Gantt view. - A warning in the shift's form view is still showed. #### Task : [4844848](https://www.odoo.com/odoo/project/4105/tasks/4844848)
This update enhances the functionality of French financial reports by transitioning from a 'hard reload' to a 'soft reload' process. This change improves the dynamic updating of report lines, leading to a smoother and more responsive user experience. It addresses a usability issue within the l10n_fr_reports module.
Original PR description
This commit will change the hard reload for a soft one, to make the usability of dynamic lines better no task id
This update simplifies the installation process for the ActivityWatch timesheet grid by adapting instructions and adding better troubleshooting tools. It also enhances the assistant's functionality with improved rule data and clearer display of activity information, ultimately making setup and usage more straightforward.
Original PR description
This PR revamps the ActivityWatch installation wizard to adapt the instructions to the new installers, as well as providing more ways to check that the server is successfully installed and running. It also provides a few other fixes related to the assistant in general. Task-6042434 Forward-Port-Of: odoo/enterprise#113098 Forward-Port-Of: odoo/enterprise#112127
This update corrects inconsistencies in how Odoo calculates certain fields, specifically related to employee data. By switching from `@api.onchange` to `@api.depends`, the system now accurately reflects changes in related data within the same transaction, preventing potential data errors. This ensures data integrity across multiple modules.
Original PR description
https://github.com/odoo/odoo/pull/257758
Code cleanup and technical improvements
This update streamlines the website search functionality across multiple Odoo modules (appointment, helpdesk, etc.) by reorganizing how search results are presented. This change improves search speed and efficiency, providing a better user experience for finding information within Odoo.
Original PR description
*: appointment, helpdesk, helpdesk_forum, helpdesk_knowledge, knowledge, sale_renting, sale_subscription This commit refactors the website search across all entry points (header search, snippets, and per-model search) by replacing the previous flat result list with a grouped, model-based architecture. task-5264317 Community: https://github.com/odoo/odoo/pull/238317 Upgrade: https://github.com/odoo/upgrade/pull/9161 Co-authored-by: Divyesh Vyas <divy@odoo.com> Co-authored-by: dtda-odoo <dtda@odoo.com> Co-authored-by: mano-odoo <mano@odoo.com>
4 changes
Enhancements to existing features
This update adds the ability to automatically upload Odoo invoices to FedEx, ensuring accurate export documentation and matching accounting records. It also introduces enhanced shipment tracking with customizable PO numbers, customer references, and invoice numbers for improved visibility. These features are optional and maintain compatibility with existing FedEx shipping configurations.
Original PR description
Add two new configurable options to the FedEx shipping integration: 1. ETD with Odoo Invoice (new documentation_type option): New 'ETD with Odoo Invoice' option in the Generate Invoice setting. When…
Add two new configurable options to the FedEx shipping integration: 1. ETD with Odoo Invoice (new documentation_type option): New 'ETD with Odoo Invoice' option in the Generate Invoice setting. When selected, the module uploads the Odoo-generated invoice PDF to FedEx Documents API (encodedmultiupload endpoint) and references it in the shipment request as an ETD attached document. This replaces the FedEx-generated commercial invoice with the actual Odoo invoice, ensuring export documents match accounting records. Requires a posted invoice on the SO before shipping. Note: FedEx Documents API uses a different base URL (documentapi.prod.fedex.com) than the Ship API. 2. Enhanced References (new Boolean field): When enabled, shipment package references include up to 3 fields: - PO Number: Customer Reference from SO (client_order_ref), or SO number if not set - Customer Reference: SO number - Invoice Number: Odoo posted invoice number When disabled, existing behavior is preserved (PO Number = SO number). Both features are opt-in via carrier configuration fields, preserving full backward compatibility with existing setups.
This update simplifies user database access management by adding a dedicated 'databases' tab to the res.user view. Previously, administrators had to manually search for user database access, now it's readily available. This improves efficiency and simplifies user permission management.
Original PR description
The aim of this commit is to allow db_manager to see the list of databases in which a specific user has access and to allow removing this access in bulk if required. Before this commit: To see the list of db in which a user has access, a db_manager would have to go to the list view and make a search on the login/name of the user, potentially matching other db_user in the process. After this commit: The list of db is available out of the box in a databases tab on the res.user view. Task-id: 5945298
Resolved issues and error corrections
This update fixes an issue where the filter for unfinished workorders would disappear after marking an operation as complete. The fix prevents the filter from being erased during the validation process, ensuring users can accurately track remaining operations. This improves the usability of the shopfloor operations module.
Original PR description
While working on a workorder from the shopfloor, if there is several operation when closing the first one, the filter will disapear Steps to reproduce: ------------------- * Create a Product * Create a BoM for that product with two operation * Create a MO for this product * Click on the smart button "Shop Floor" * Open the Operations * Mark as Done one of the operation -> the filter disappears Observation: ------------- When cliking on "mark as done" or "closing production" both goes through validate(), At the end of this function the filter is erased: https://github.com/odoo/enterprise/blob/85bd9d80a1a784f1baff1493b2eaec4a17ea9c9b/mrp_workorder/static/src/mrp_display/mrp_display_record.js#L384 opw-5959166
This update resolves an issue where users couldn't validate delivery orders through the 'To Pickup' button. The fix removes a technical restriction that prevented the form view from opening, now enabling users to correctly process and validate delivery orders within the industry_fsm_stock module.
Original PR description
Steps to reproduce: - Install `industry_fsm_stock` - Create a task and add a product - Click on the "Sale Order" button - Add another product with the Invoicing Policy set to "Delivered quantities" - Click on the "To Pickup" button Issue: Users are unable to validate the delivery order from the products pick up button. Cause: In pr https://github.com/odoo/odoo/pull/227630 the parent view is set with `editable="bottom"`, which prevents opening the form view from the list. Fix: Allow opening the form view from the list view so users can validate the delivery order. Task-5969303
14 changes
Resolved issues and error corrections
This update ensures that the expiration date from a GS1 barcode on a packaging is correctly applied when creating a new lot in Odoo. Previously, the system ignored this date, leading to inaccurate inventory tracking. This fix improves data accuracy and helps manage product shelf life effectively.
Original PR description
Issue
-----
Scanning a GS1 barcode containing:
- packaging
- lot
- due date
disregards the due date when creating the new lot.
Steps to reproduce
-----
- Enable GS1 nomenclature & packagings
- Create a product
- barcode 23456789012344
- packaging with barcode 01234567890128
- some on hand quantity
- Create a delivery for a full packaging of the product
- Open the delivery in barcode
- Scan 02 01234567890128 15 270101 10 LOT1
- Validate
- Open the lot
> Expiration date is set to today
Cause
-----
The code expects the product be scanned, there is no logic to retrieve it from the packaging when missing.
-----
Ticket:
opw-6073489This update resolves an issue where the click and collect widget didn't correctly display rental product availability. The fix ensures that rental periods are properly accounted for when calculating available quantities on the website, improving the rental experience for customers. This change impacts the website's shopping functionality.
Original PR description
Click and collect widget is not supported for rental products Steps to reproduce: ------------------- * Enable "Click and collect" in setting and set up warehouses * Create a rental product * Add a…
Click and collect widget is not supported for rental products Steps to reproduce: ------------------- * Enable "Click and collect" in setting and set up warehouses * Create a rental product * Add a unit of the product in one of the warehouses * Rent that product for a period * Go on the website>shop>the product * The available quantity for the warehouse does not account for the in start/end dates in the eCommerce product page Observation: ------------- The implementation of click and collect does not include a sale_renting module, this entails that [click and collect](https://github.com/odoo/odoo/blob/20e54e37670ffa569f47663a7e4b8d7de3a4c33c/addons/website_sale_collect/views/templates.xml#L28-L36) and [openLocationSelector](https://github.com/odoo/odoo/blob/20e54e37670ffa569f47663a7e4b8d7de3a4c33c/addons/website_sale_collect/static/src/js/click_and_collect_availability/click_and_collect_availability.js#L54) don't have any information about the rental periode The rental date range is shown when the product is possible to rent and the rental period is only set in the xml file: https://github.com/odoo/enterprise/blob/1bf7dbcfef2186ee5a08382367fe195efca033dc/website_sale_renting/views/templates.xml#L90 Since openLocationSelector don't have access to the rental period, it can't update the necessary information to work with rental products. For example, the free_qty should change depending on the rental period. opw-5365564
This update fixes an issue where the lot number was not correctly displayed in rental incoming stock movements. The fix ensures that the correct lot name is shown, improving the accuracy of rental tracking and reporting. This resolves a previous bug impacting rental order management.
Original PR description
### Issue Lot name is shown empty in rental incoming move. #### To reproduce: 1- Create a rental product tracked by lot and add a quantity with lot number. 2- Create a rental order with the created product and confirm it. 3- Validate the outgoing transfer. 4- In the incoming transfer, open stock move using the small button(the button with 4 vertical lines). 5- As you see Lot/Serial Number is shown empty. ### Cause: This is because `lot_name` is not reflecting the `lot_id.name`. Even though `lot_id` is set, we are showing the `lot_name` on return move due to: https://github.com/odoo/odoo/blob/edc56ff496059c8d38557227699d52e2034619b2/addons/stock/views/stock_move_views.xml#L192-L203 We could fix that by setting `lot_name` in rental move lines vals. opw-5435865
This update resolves an issue where Swiss bank account details were incorrectly formatted in outgoing payment XML files, leading to rejection by banks like UBS. The fix ensures all IBAN creditor accounts are consistently formatted with the `<IBAN>` tag, aligning with Swiss ISO20022 standards and preventing payment processing errors.
Original PR description
**Steps to reproduce:** * install `account_iso20022` and `l10n_ch`. * Set Swiss ISO20022 in outbound payments in the Bank journal. * Create two vendor payments: one with a Swiss QR_iban bank account…
**Steps to reproduce:** * install `account_iso20022` and `l10n_ch`. * Set Swiss ISO20022 in outbound payments in the Bank journal. * Create two vendor payments: one with a Swiss QR_iban bank account (CH...) and one with a foreign bank account (DE...). * Group them into a batch payment and download the XML. **Observed behavior:** * Swiss IBAN creditor accounts are rendered as `<CdtrAcct><Id><Othr><Id>` instead of `<CdtrAcct><Id><IBAN>`. * Foreign IBAN creditor accounts (e.g. DE) correctly use `<IBAN>`. * UBS and other Swiss banks reject the XML file due to the inconsistency. **Cause:** * `_get_CdtrAcct()` delegates to `_is_bank_account_qr_iban()` to decide between `<IBAN>` and `<Othr><Id>`. * Swiss IBANs with an IID in the range 30000–31999 are classified as QR-IBANs, causing them to fall into the `<Othr><Id>` path even when they are standard IBAN accounts eligible for the `<IBAN>` tag. **Fix:** * Override `_get_CdtrAcct()` in the Swiss ISO20022 journal model to always emit `<CdtrAcct><Id><IBAN>` for any IBAN-type account when `payment_method_code == 'iso20022_ch'`, regardless of QR-IBAN classification. * Non-IBAN accounts (e.g. postal accounts) still fall through to the base implementation using `<Othr><Id>`. Ref: https://www.bib.eu/uploads/2020/04/Payment_import.pdf opw-6061266
This update resolves a bug where only the last employee to clock in at a Point of Sale (PoS) session was successfully recorded. Previously, multiple employees attempting to clock in simultaneously would result in errors. This fix ensures all employees are correctly clocked in, improving PoS session management.
Original PR description
If you have multiple employee trying to clock in at the same time in a PoS session, only the last one will actually be clocked in. Steps to reproduce: ------------------- * Setup a PoS to use the blackbox * Activate the multi employee on the PoS * Open the PoS with employee A * Open the PoS on another device/browser with employee B * Try to add a product with employee A > Observation: You get an error saying you are not clocked in Why the fix: ------------ The `employees_clocked_ids` was used as a list of ids and not a list of employees/user. But when a session synchronisation was triggered the `employees_clocked_ids` would become a list of employee/user instead of a list of ids. This would cause `checkIfUserClocked` to fail because it was comparing employee object with ids. opw-6034985
This update fixes a problem where sale orders with SEZ GST treatment incorrectly assigned an 'Export' fiscal position instead of the correct 'Foreign State' position. The change ensures that sale orders with SEZ partners accurately reflect their international trade status, improving tax reporting and compliance. This resolves a previous error impacting sales to SEZ regions.
Original PR description
Before this commit: When creating a sale order, if the GST Treatment of partner is SEZ, then the Fiscal position is set as Export instead of SEZ. Reason: The default `foreign_state` obtained currently is searched on base of state whose country is not India, so any random state is fetched. But in the fiscal position of SEZ, we want "Foreign State", so while selecting fiscal position from `_get_fiscal_position` method, the Export fiscal gets higher ranking and gets selected. This commit fixes this issue by returning the correct Foreign State if fiscal position is set to SEZ. task-5958903 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where the total sales figures for events using foreign currencies were incorrect. The code has been updated to accurately convert sale prices from the event's currency to the company's currency, ensuring accurate reporting of event sales totals. This improves financial accuracy for event sales transactions.
Original PR description
Steps to reproduce: 1. Create a currency with a non-1 exchange rate with the company's currency (e.g. VEF with a rate of 0.000005 against USD). 2. Create a pricelist in that currency. 3. Create an…
Steps to reproduce: 1. Create a currency with a non-1 exchange rate with the company's currency (e.g. VEF with a rate of 0.000005 against USD). 2. Create a pricelist in that currency. 3. Create an event. 4. Create a sale order with the new pricelist. 5. Add a sale order line with a ticket of the event and confirm the order. 6. Go to the event's page and check the total sales smart button. 7. Check the total sales of the event: it should be equal to the sale order's total price converted to the company's currency, but it is not, because of the wrong conversion (it used the inverse of the correct exchange rate, which is 200000 instead of 0.000005 in our example). Problem: The total sales smart button in an event's page shows wrong totals when sales are in a currency other than the company's currency. Cause: The code converts the sale price from the event's currency (which is the same as the company's currency) to each sale order's currency, while it should be the other way around (from each sale order's currency to the event's currency). https://github.com/odoo/odoo/blob/3cd709172e997f5a726cf3ae85ffcb9965619fcb/addons/event_sale/models/event_event.py#L38 opw-5494790
This update fixes an issue where increasing the quantity of a service product on a sales order incorrectly generated a purchase order with an inflated quantity. The fix ensures the quantity is always calculated in the sales order's unit of measure, preventing double-counting and inaccurate purchase order generation. This improves the reliability of sales order processing for service products.
Original PR description
Steps to reproduce the bug: - Create a service product "P1": - In the Purchase tab: - Vendor: Azure Interior - Subcontract Service: True - UoM: dozen - Purchase UoM: unit - Create a sales order with…
Steps to reproduce the bug:
- Create a service product "P1":
- In the Purchase tab:
- Vendor: Azure Interior
- Subcontract Service: True
- UoM: dozen
- Purchase UoM: unit
- Create a sales order with 1 dozen of P1
- Confirm -> a purchase order with 12 units of P1 is generated
- Confirm the purchase order
- Go back to the sales order:
- Update the quantity from 1 to 2 dozen
Problem:
A new purchase order is generated, but with 144 units instead of 12
units. The quantity difference between the old SO quantity and the new
one is computed twice in the purchase order line UoM, in both
`_purchase_increase_ordered_qty` and `_purchase_service_prepare_line_values`:
https://github.com/odoo/odoo/blob/17.0/addons/sale_purchase/models/sale_order_line.py#L186
Solution:
The `quantity` parameter must be expressed in the SO line UoM, as
described in the documentation of the function `_purchase_service_prepare_line_values`.
https://github.com/odoo/odoo/blob/17.0/addons/sale_purchase/models/sale_order_line.py#L178
opw-6049106
Forward-Port-Of: odoo/odoo#255478This update fixes an issue where employees incorrectly displayed zero remaining leave days due to complex allocation rules across multiple years and expired allocations. The fix now accurately calculates remaining leave by prioritizing the latest non-expired allocation and correctly handling partial leave days across different periods, ensuring employees see their true available leave balance.
Original PR description
__Problem__ Employees could not see their remaining leave days and the view always showed 0 left days. This happened when multiple allocations existed across different years. The view relied on…
__Problem__ Employees could not see their remaining leave days and the view always showed 0 left days. This happened when multiple allocations existed across different years. The view relied on `min(id)`/earliest allocation logic and a default current-year domain. When the earliest allocation belonged to a previous year: * The record holding the remaining balance was filtered out by the year domain. * Expired allocations were still included in totals. As a result, remaining days were either incorrect or always displayed as zero. __Fix__ * compute remaining balance on the latest non-expired allocation `max(id)` * Only sum non-expired allocations when computing the available balance. * changes in leave subtraction logic: * If a leave falls entirely in a non-expired allocation → subtract fully. * If it falls entirely in expired allocations → do not subtract. * If it spans expired and non-expired allocations → subtract only the portion after the last expiry date. * When subtracting partial leaves, count only actual working days: * Use the employee’s resource calendar (`resource_calendar_attendance`) to get the weekend days * Exclude public holidays * Apply the same proportional logic to hours. __Result__ * Remaining leave days are now always visible. * Expired allocations no longer affect current availability. _Backwards compatibility note:_ * Splitting leaves across expired and non-expired allocations happens on sum(allocations) level, not on the actual leave lines level. so leaves are not split into two records when they span expired and non-expired allocations. The leave record remains whole, but only the portion that falls into non-expired allocations is counted against the available balance. __Example__ allocation 2025: 20 days (expires 31 Dec 2025) allocation 2026: 20 days (expires 31 Dec 2026) Public holidays: 2 Jan, 31 Dec weekends: Saturdays and Sundays Leave: 15 Dec 2025 to 6 Jan 2026 (15 days total) * 2025 is expired so counting starts from 1 Jan 2026 * Interval days: 1 Jan to 6 Jan = 6 days * Public holiday on 2 Jan → exclude * Weekend on 4 Jan and 5 Jan → exclude * Working days counted: 6 - 3 = 3 days subtracted from 2026 allocation. report will show: 2025: 20 days allocated, 15 days taken, 0 days left (all expired) 2026: 20 days allocated, 0 days taken (leave not split), 17 days left -opw-5169606
This update resolves an issue preventing Click & Collect from correctly displaying rental product availability. The system currently lacks integration with the rental module, so available quantities don't reflect rental periods. This fix ensures accurate product availability for rental items through the Click & Collect widget.
Original PR description
Click and collect widget is not supported for rental products Steps to reproduce: ------------------- * Enable "Click and collect" in setting and set up warehouses * Create a rental product * Add a…
Click and collect widget is not supported for rental products Steps to reproduce: ------------------- * Enable "Click and collect" in setting and set up warehouses * Create a rental product * Add a unit of the product in one of the warehouses * Rent that product for a period * Go on the website>shop>the product -> The available quantity for the warehouse does not account for the in start/end dates in the eCommerce product page Observation: --------------- The implementation of click and collect does not include a sale_renting module, this entails that click and collect and openLocationSelector has no information about the rental period. https://github.com/odoo/odoo/blob/20e54e37670ffa569f47663a7e4b8d7de3a4c33c/addons/website_sale_collect/views/templates.xml#L28-L36 https://github.com/odoo/odoo/blob/20e54e37670ffa569f47663a7e4b8d7de3a4c33c/addons/website_sale_collect/static/src/js/click_and_collect_availability/click_and_collect_availability.js#L54-L61 The rental date range is shown when the product is possible to rent and the rental period is only set in the [xml](https://github.com/odoo/enterprise/blob/1bf7dbcfef2186ee5a08382367fe195efca033dc/website_sale_renting/views/templates.xml#L90) Since openLocationSelector don't have access to the rental period, it can't update the necessary information to work with rental products. For example, the free_qty should change depending on the rental period. opw-5365564
This fix prevents a deadlock issue that occurs when a user removes a lot number from a production order (MO) that relies on lot-based valuation. Previously, attempting to correct this caused the system to freeze. Now, the system will not allow the user to erase a lot from a MO that is valued by lot, ensuring data integrity and preventing disruptions to production processes.
Original PR description
When we erase a sn/lot on a MO for a product that is tracked by lot, we will be deadlocked. ### Steps to reproduce: * Create a product tracked by lot and lot_valuated * Create a BoM for this product…
When we erase a sn/lot on a MO for a product that is tracked by lot, we will be deadlocked. ### Steps to reproduce: * Create a product tracked by lot and lot_valuated * Create a BoM for this product * Create a MO for this product * Confirm and Produce all * erase the lot and save -> the MO is deadlock, it's not possible to modify the lot number, nor it's possible to unbuild. ### Current behavior: A user is able to erase a lot/SN from a MO of a lot_valuated product. ### Expected behavior: It should not be possible to erase a lot/SN form a MO of a lot_valuated product. ### Observation: When the MO is done, its valuation will be calculated which in our case, it means, we have to have a lot number. When trying to add a lot/SN of a MO where it has been erased, we will remove the quantities from the previous lot, but in our case, since we don't have one, it will trigger the user error. https://github.com/odoo/odoo/commit/33e192de30526ea7fe320bcaa7a16dac8108feff This error is not triggered when removing the SN/lot because when we remove the value, it will be update to False which means it will skip _update_svl_quantity(): https://github.com/odoo/odoo/blob/109f829c2b461b14167e9227e42d096d4410a3b3/addons/stock_account/models/stock_move_line.py#L35-L36 https://github.com/odoo/odoo/blob/109f829c2b461b14167e9227e42d096d4410a3b3/addons/stock_account/models/stock_move_line.py#L62-L65 This use case is also protected when creating a product tracked by lot but not lot_valuated: https://github.com/odoo/odoo/commit/4963103e5587d36364b8df84d0b3407a1977efdf opw-6039885
This update fixes an issue where sales orders with fully delivered and returned products incorrectly displayed as 'Fully Invoiced'. The fix ensures the invoice status accurately reflects zero delivered and invoiced quantities after a customer returns a product, preventing incorrect invoicing and improving order accuracy.
Original PR description
### Issue before this commit: When a sales order with a product invoiced on delivered quantities is fully delivered and then completely returned the delivered quantity is reset to zero. In this…
### Issue before this commit: When a sales order with a product invoiced on delivered quantities is fully delivered and then completely returned the delivered quantity is reset to zero. In this situation, where nothing has been invoiced and nothing remains to be invoiced, the invoice status of the sales order line is incorrectly set to "Fully Invoiced" instead of "Nothing to Invoice". ### Steps to reproduce the issue: 1. Create a new quotation for a storable product. 2. Confirm the order. 3. Validate the delivery of the product. 4. Perform a return for the product 5. Validate that return to simulate a customer return. 6. The sales order details correctly reflect that the delivered quantity and invoiced quantity are both zero. Despite these values—which indicate there is nothing to invoice—the invoice status on the quotation erroneously displays as "fully invoiced". ### Cause of the issue: The invoice status computation includes a fallback logic that marks a sales order line as "invoiced" when all related stock moves are either done or cancelled. However, this logic does not verify whether any quantity remains effectively delivered. As a result, after a full return, even when qty_delivered = 0, the condition is still met and the line is incorrectly marked as fully invoiced. ### Reason to introduce the fix: A fully returned sales order line with no delivered and no invoiced quantity should not be considered fully invoiced. The fix ensures that the fallback to "invoiced" only applies when there is a strictly positive delivered quantity, preventing incorrect invoice status after full customer returns. opw-6014772 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#254871
This update resolves an issue where QR codes generated for Swiss invoices were being rejected by banks. The fix filters out unauthorized Unicode characters from the QR-Bill, ensuring compliance with Swiss regulations which limit the QR code character set to 324 specific characters. This prevents invoice processing delays and ensures smooth banking transactions.
Original PR description
**Description of the issue/feature this PR addresses:** QR code is rejected by the bank, when it contains an invalid character `U+202F`. **Current behavior before PR:** Unauthorized Unicode characters are encoded in the QR-Bill, and it is rejected on the receiving part. **Desired behavior after PR is merged:** Any Unicode codepoint which is not in the subset of 324 allowed codepoints has to be filtered out. > spec of QR-bill allows only a subset of characters, a precise list of 324 Unicode codepoints (section 4.1.1, page 30 of the Swiss Implementation Guidelines for the QR-bill) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#256335 Forward-Port-Of: odoo/odoo#254980
This update resolves an issue where the search panel displayed an error message ('Too many items to display') when dealing with large datasets. By adding a filter to limit the number of records shown, the search panel now correctly displays data without the error, improving the user experience for searching through large amounts of information.
Original PR description
Have a search view with searchpanel having a filter or a category with a limit. For exemple in sale.order:
```
<searchpanel>
<field name="partner_id" icon="fa-filter" groupby="parent_id" limit="80" enable_counters="True"/>
</searchpanel>
```
On a database with a lot of data, in the category partner of search panel, there is an error 'Too many items to display.'.
Now in the search view, add a filter to restrict the number of records, and hence the number of partners in the search panel below the limit.
Before this commit, the error was still displayed. Now, it isn't, and the data are properly displayed.
Closes #257749
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#2578216 changes
Resolved issues and error corrections
This update corrects a bug that prevented users from editing the Amazon fulfillment channel in the Odoo Enterprise system. The issue was due to a read-only display widget. Now, the channel is correctly editable, allowing for accurate management of Amazon sales fulfillment.
Original PR description
Commit 67c45d6494f082e2ee83b9a84611e8b8fe8f4fd5 intended to make `amazon_channel` editable by users. However, the field was displayed with the `badge` widget, which is read-only, so it remained uneditable. Use an editable display for `amazon_channel` so the original fix works as intended.
This update addresses an issue where delivery confirmations were failing due to missing tracking data from Easypost. The fix prevents errors when the 'tracker' object is null, ensuring picking validation and correct carrier tracking URLs. Easypost support suggested a slight delay between order placement and data retrieval as a potential workaround.
Original PR description
Problem: 'tracker' object in response from GET /orders/:id request can sometimes be null. This means that when the mail template 'mail_template_data_delivery_confirmation' is sent, a traceback occurs…
Problem: 'tracker' object in response from GET /orders/:id request can sometimes be null. This means that when the mail template 'mail_template_data_delivery_confirmation' is sent, a traceback occurs with error: TypeError: 'NoneType' object is not subscriptable. As a result the picking is not validated in odoo but a shipping has succesfully been created in the easypost backend. Solution: Prevent traceback form happening, picking gets correctly validated and carrier_tracking_url field is empty. Transcript from Easypost support: << I'm also seeing the tracker showing as null when reviewing the response. I'll go ahead and create a ticket for the engineering team to investigate. I can see that the tracking code is being returned in the request, but the full tracking object is not. Since this appears to be happening on a case-by-case basis, you may want to allow more time between the BUY and the GET requests, as I noticed they are being triggered very close together. I'm not certain if that's related, but it may be worth trying as a troubleshooting step while we have this under review. >> opw-5402415
This update resolves an issue where negative values in the Mod 390 tax report were not being properly marked with the 'N' indicator, as required by Spanish tax regulations. The fix adds a necessary parameter to ensure accurate reporting and compliance with official documentation, preventing potential discrepancies with the Agencia Tributaria.
Original PR description
### Issue: Negative values in the Mod 390 report were not properly marked with the N indicator for several fields ### Cause: The parameter `signed=True` was missing on some fields where negative values should include the N indicator in the BOE export ### Note: According to the official specification, negative amounts must be explicitly marked with N Latest documentation: https://sede.agenciatributaria.gob.es/static_files/Sede/Disenyo_registro/DR_300_399/archivos_25/dr390e2025.xlsx ### Steps to reproduce: - Install `l10n_es_reports` with demo data and switch to the ES company - Create a Bill (Price: 100, Taxes: 21% G) - Go to Tax Report and select Tax Report (Mod 390) (ES) for the full year - Open the VAT Deductible tab - The last line (65) should be negative - Export the BOE file using the gear menu - Check the last value of section 4 in the file ### Before the fix: Negative values were not marked with N opw-5482706
This update corrects a flaw in how the digest KPI for connected users is calculated. Previously, it only considered a user's default company, leading to inaccurate counts. Now, the KPI correctly accounts for users working across multiple companies, providing a more reliable measure of user engagement.
Original PR description
**Problem:** Currently, the digest KPI for connected users checks the "company_id" field (as with all other models), but this field corresponds to "Default Company" on res.users, meaning a user can only be considered for one company when computing the digest KPI. This can cause misleading digest KPIs if users work in multiple companies, or mainly in a company that isn't their default company. **Solution:** Instead of always using the "company_id" field, we use the "company_ids" field if present on the model. opw-5404940
This update fixes an issue where sales orders with fully delivered and returned products incorrectly displayed as 'Fully Invoiced'. The fix ensures the invoice status accurately reflects zero delivered and invoiced quantities after a customer return, preventing incorrect invoicing and improving order accuracy.
Original PR description
### Issue before this commit: When a sales order with a product invoiced on delivered quantities is fully delivered and then completely returned the delivered quantity is reset to zero. In this…
### Issue before this commit: When a sales order with a product invoiced on delivered quantities is fully delivered and then completely returned the delivered quantity is reset to zero. In this situation, where nothing has been invoiced and nothing remains to be invoiced, the invoice status of the sales order line is incorrectly set to "Fully Invoiced" instead of "Nothing to Invoice". ### Steps to reproduce the issue: 1. Create a new quotation for a storable product. 2. Confirm the order. 3. Validate the delivery of the product. 4. Perform a return for the product 5. Validate that return to simulate a customer return. 6. The sales order details correctly reflect that the delivered quantity and invoiced quantity are both zero. Despite these values—which indicate there is nothing to invoice—the invoice status on the quotation erroneously displays as "fully invoiced". ### Cause of the issue: The invoice status computation includes a fallback logic that marks a sales order line as "invoiced" when all related stock moves are either done or cancelled. However, this logic does not verify whether any quantity remains effectively delivered. As a result, after a full return, even when qty_delivered = 0, the condition is still met and the line is incorrectly marked as fully invoiced. ### Reason to introduce the fix: A fully returned sales order line with no delivered and no invoiced quantity should not be considered fully invoiced. The fix ensures that the fallback to "invoiced" only applies when there is a strictly positive delivered quantity, preventing incorrect invoice status after full customer returns. opw-6014772 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where the 'Too many items to display' error appeared in the search panel when dealing with large datasets, specifically when filtering by partners. By adding a limit to the search panel's data display, the error is now prevented, ensuring a smoother and more reliable user experience.
Original PR description
Have a search view with searchpanel having a filter or a category with a limit. For exemple in sale.order:
```
<searchpanel>
<field name="partner_id" icon="fa-filter" groupby="parent_id" limit="80" enable_counters="True"/>
</searchpanel>
```
On a database with a lot of data, in the category partner of search panel, there is an error 'Too many items to display.'.
Now in the search view, add a filter to restrict the number of records, and hence the number of partners in the search panel below the limit.
Before this commit, the error was still displayed. Now, it isn't, and the data are properly displayed.
Closes #257749
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