Daily updates from Odoo
Wednesday, April 15, 2026
95 changes
19 changes
New functionality added to Odoo
This update adds a basic accounting package specifically tailored for businesses in Uzbekistan. It includes essential features like charts of accounts, tax management, and demo data, along with Uzbek language support and Uzbekistan state information. This expands Odoo's capabilities to meet the unique accounting needs of companies operating in Uzbekistan.
Original PR description
This **PR** introduces basic accounting package including Demo Data, Chart of Accounts, Account Groups, Taxes and Tax Groups for Uzbekistan. Additionally, it also introduces Uzbek language and Uzbekistan states to support `l10n_uz`. task-3927927 Enterprise PR - https://github.com/odoo/enterprise/pull/103136 Forward-Port-Of: odoo/odoo#258855 Forward-Port-Of: odoo/odoo#241811
Enhancements to existing features
This update ensures Odoo's Singapore tax calculations align with the latest GST rates and InvoiceNow requirements. Key changes include updated tax rates, fiscal positions, and report formulas to accurately reflect Singapore's tax regulations.
Original PR description
Improves tax data and report to comply with the changes in Singapore GST rates. The improvement is also in compliance to GST InvoiceNow requirements. Key changes: - Taxes: drop outdated GST rates; add 0% NA and 0% TXNA; add fiscal positions; misc. updates - Tax Groups: drop some of tax groups - Fiscal Position: new data - Tax Report: modification to box 1's and box 14's formulas; drop unnecessary aggregate formulas (total amount) for the line sections [Task-6025634](https://www.odoo.com/odoo/my-tasks/6025634) Forward-Port-Of: odoo/odoo#258277
Resolved issues and error corrections
A recent update caused a type error during sign request processing, preventing users from accessing the sign functionality. This fix reorders the checks to ensure the existence of the sign item is verified before type comparisons, resolving the error and restoring normal operation.
Original PR description
This issue occurs because, in the recent [commit], `sign_request` was changed to `sign_item`, but the `sign_item.exists()` check is performed after the type comparison, resulting in a `TypeError`.…
This issue occurs because, in the recent [commit], `sign_request` was changed to `sign_item`, but the `sign_item.exists()` check is performed after the type comparison, resulting in a `TypeError`.
Traceback:
```py
File "/home/odoo/src/odoo/saas-19.2/odoo/addons/base/models/ir_http.py", line 415, in _dispatch
result = endpoint(**request.params)
File "/home/odoo/src/odoo/saas-19.2/odoo/http/routing_map.py", line 207, in route_wrapper
result = endpoint(self, *args, **params_ok)
File "/home/odoo/src/enterprise/saas-19.2/sign/controllers/main.py", line 708, in get_sign_request_items
if not sign_request.exists() or not consteq(sign_item.access_token, token) or not sign_item.exists() or not sign_item.signer_email:
TypeError: unsupported operand types(s) or combination of types: 'bool' and 'str'
```
Solution:
We first perform the existence check and then compare the types.
[commit]: https://github.com/odoo/enterprise/pull/111786/changes/f40082f4e6f50dccbfa639edbef08428868cb31d
sentry-7376866293
Forward-Port-Of: odoo/enterprise#112659This update fixes a calculation error in the employment bonus payments for Belgian businesses. The change ensures that bonus calculations now precisely align with the requirements outlined by the Belgian Social Security authorities, as detailed in their official documentation. This correction improves accuracy and compliance for payroll processing.
Original PR description
The employment bonus computation was missing two roundings steps that are explicitely asked for in the following documentation: https://www.socialsecurity.be/employer/instructions/dmfa/fr/latest/instructions/deductions/workers_reductions/workbonus.html Forward-Port-Of: odoo/enterprise#113776
This update fixes an issue where global invoices generated from customer invoices weren't correctly using the issued address's zip code in the XML file. The fix ensures that the 'LugarExpedicion' field accurately reflects the shipping address, improving compliance with Mexican tax regulations. This impacts invoicing accuracy for Mexican customers.
Original PR description
**STEP TO REPRODUCE** 1. install l10n_mx_edi_extended. 2. Add an issued address on the customer invoice journal, with a zip code. 3. Create invoices, and create a global invoice with them. 4. download the xml, and notice the field LugarExpedicion is not using the zip from the issued address while it should. opw-5956837 Forward-Port-Of: odoo/enterprise#112523 Forward-Port-Of: odoo/enterprise#108732
This update fixes an issue where kit products were incorrectly included in stock valuation calculations, leading to inflated inventory values. The change ensures that only the individual components of a kit are accounted for, providing accurate inventory reporting. This resolves a discrepancy between the reported inventory value and the actual cost of the kit.
Original PR description
Currently, when a user creates a kit, the price of the kit itself is included in stock valuation. ## Steps to produce: * Install `mrp_account` without demo data. * Create a product with inventory…
Currently, when a user creates a kit, the price of the kit itself is included in stock valuation. ## Steps to produce: * Install `mrp_account` without demo data. * Create a product with inventory tracking enabled. * Create a BoM of type kit for that product. * Add component products with a defined cost and on-hand quantity greater than 0 to the BoM. * Recompute the kit product’s cost from its BoM on the product page. * Go to Inventory > Reporting > Stock. ## Observed Behavior: The cost of the kit is currently being included in the stock valuation. For example, consider a kit product called **“Computer”** that is composed of the following components: | Product | Quantity | Cost | |--------|--------|--------| | CPU | 1 | $300 | | Motherboard | 1 | $300 | The total cost of the Computer kit is therefore $600. Since the Computer is made up of the CPU and Motherboard, the total inventory value should be $600. However, the system is currently calculating the total inventory value as $1,200 , which is incorrect because it is counting both the kit and its components. ## Root cause: This behavior started after the refactor in [1], where the `_compute_value_svl` function was replaced by the `compute_value` function to calculate both average and total value for inventory valuation. With this change, the new compute function in [2] now also includes kit products when calculating inventory valuation based on their costing method. In earlier versions, this did not occur because `_compute_value_svl` depended on valuation layer groups. Kit products were excluded at [3] through the `_get_valuation_layer_groups()` call, as illustrated in image [4]. [2]- https://github.com/odoo/odoo/blob/1b9937a702fbeb47cd6d42d8119cead5828fd3fe/addons/stock_account/models/product.py#L139-L169 [3]- https://github.com/odoo/odoo/blob/a9d2e54201173d1d2d5ab97de0904d63a4b6b82b/addons/stock_account/models/product.py#L284 ## Solution: To ensure correct total inventory valuation, kit products should be excluded from valuation and only their individual components should be calculated. This can be achieved by modifying the domains used in 'action_product_stock_view` and `_get_accounts_by_product` to exclude the kits so that the kit products get filtered out, allowing the report to consider only its components. **Before:** <img width="1857" height="938" alt="image" src="https://github.com/user-attachments/assets/bbd4eb94-ba1a-429a-a61c-afbe33729ac0" /> **After:** <img width="1915" height="883" alt="image" src="https://github.com/user-attachments/assets/c93d55c8-8197-4e57-9f87-b2159fe67d87" /> [1]: https://github.com/odoo/odoo/pull/222169/commits/6e694b79b8892d693117f6c79df1a2d3a4759f4f [4]: https://drive.google.com/file/d/1g4BzGscCW2K0rf5iDKrq-psYRlKhYkDP/view?usp=sharing opw-5462515 Forward-Port-Of: odoo/odoo#244030
This update resolves a bug in Odoo's accounting module that caused users to receive validation errors when attempting to reconcile payments across different companies. The fix ensures the 'Outstanding Credits/Debits' widget only displays relevant payments for the current invoice's company, improving usability and preventing errors.
Original PR description
The invoice outstanding credits/debits widget currently displays all reconcilable items for a partner across the same account, regardless of the company they belong to. In multi-company environments,…
The invoice outstanding credits/debits widget currently displays all reconcilable items for a partner across the same account, regardless of the company they belong to. In multi-company environments, specifically when accounts have been merged, this allows users to see and try to reconcile payments from Company A into an invoice from Company B. This action eventually triggers a validation error stating that entries must belong to the same company. This commit adds a company filter to the widget's logic to ensure only relevant outstanding payments are suggested, preventing cross-company reconciliation errors and improving UX. **Description of the issue/feature this PR addresses:** This PR fixes a validation error in multi-company environments where the invoice_outstanding_credits_debits_widget suggests payments or credit notes belonging to a different company than the current invoice. The issue typically arises when a partner has outstanding transactions in multiple companies and the accounts (e.g., Account Receivable) have been merged, allowing the widget to query lines that are not valid for the current record's company context. **Current behavior before PR:** When viewing an invoice for Company A, the "Outstanding Credits/Debits" widget displays all reconcilable account.move.line records for that partner that match the account type, regardless of their company_id. If a user clicks "Add" on a payment that belongs to Company B, Odoo attempts to reconcile them, resulting in a traceback or a validation error: "Invalid Operation: All tracebacks/entries must belong to the same company." This creates confusion for the end-user, as they are presented with "ghost" credits that cannot actually be applied. **Desired behavior after PR is merged:** The invoice_outstanding_credits_debits_widget (and the underlying logic in account.move) will strictly filter the suggested outstanding items by self.company_id. Users will only see and be able to reconcile payments, credit notes, or debits that belong to the same company as the invoice they are currently processing. This ensures data integrity and a seamless UX in multi-company setups. **Steps to reproduce:** 1) Enable Multi-Company: Ensure you have at least two companies (e.g., Company A and Company B) active in your database. 2) Chart of Accounts Setup: In both companies, use the same account for Receivables (or merge them so they share the same ID/Code if testing a migrated environment). 3) Ensure the account is marked as Allow Reconciliation. 4) Create a Payment in Company B: 5) Post the payment so it remains as an "Outstanding Receipt". 6) Create an Invoice in Company A 7) Confirm/Post the invoice. 8) Check the Widget: Scroll down to the bottom of the Invoice form in Company A. 9) Observe the "Outstanding Credits" widget. The Error: The payment from Company B will appear as an available credit for the invoice in Company A. 10) Click on "Add". A validation error (UserError) will pop up: "All entries must belong to the same company." **video** https://drive.google.com/file/d/1PfBxupP8t-t21wsP2FIgNXFnTP0Zq140/view --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#255875
This update fixes a problem where self-order kiosks using payment terminals would display errors despite successful payments. The fix allows payment data in kiosk mode, validates the order type to prevent fraud, and updates a Viva.com integration for improved functionality. This ensures seamless transactions for kiosk-based self-order payments.
Original PR description
Since odoo/odoo#249455 the order payload from the self order frontend is being checked to ensure the data is valid. However, these checks did not account for the situation where payment data is…
Since odoo/odoo#249455 the order payload from the self order frontend is being checked to ensure the data is valid. However, these checks did not account for the situation where payment data is included, as is the case when using a self order kiosk with a payment terminal connected. The result was that using the kiosk with a payment terminal would result in an error even though the payment was successful on the terminal. Steps to reproduce: - Configure a self order kiosk POS - Connect a payment terminal (Adyen, Stripe, Viva etc.) - Try to pay for an order from the kiosk EXPECTED: - The order is made successfully. ACTUAL: - A generic error message is shown and the order fails. The payment goes through successfully on the payment terminal. The fix is to allow a payment to be included in the self order data, but only in Kiosk mode and only if the payment amount is valid. We also now validate that the self ordering type is correct, this ensures that a kiosk payment cannot be spoofed for a mobile self order POS. Finally, there is also a small change for Viva.com to use the PoS config name instead of UUID, since UUID is no longer loaded in self order. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#256042
This update fixes an issue where increasing the quantity of a purchase order after cancellation would create a new order instead of updating the existing one. The change ensures that when a purchase order is cancelled and the associated sales order demand is increased, the system correctly updates the existing purchase order to reflect the new quantity needed. This prevents duplicate purchase orders and streamlines inventory management.
Original PR description
### Steps to reproduce: - In the settings enable: Multi-Steps Routes - Inventory > Configuration > Warehouse Management > Routes - Unarchive MTO - Create a storable product with a vendor using the…
### Steps to reproduce: - In the settings enable: Multi-Steps Routes - Inventory > Configuration > Warehouse Management > Routes - Unarchive MTO - Create a storable product with a vendor using the MTO route - Create and confirm an SO for 1 unit of that product - Cancel and reset to draft the associated draft PO - Update the SO demand from 1 to 2 units #### > A new draft PO is created rather than updating the existing one. ### Cause of the issue: Both the confirmation and the demand updates of the SO call the `_action_launch_stock_rule` to generate the related PO. The procurement and PO generated in both cases including the `stock_reference_ids` of the SO: https://github.com/odoo/odoo/blob/3891dd471d64629634644c0b022a171bbaa65b49/addons/sale_stock/models/sale_order_line.py#L277-L289 However, cancelling the PO will remove its assocaited stock reference: https://github.com/odoo/odoo/blob/3891dd471d64629634644c0b022a171bbaa65b49/addons/purchase_stock/models/purchase_order.py#L201-L202 As such, when the second procurement is run, the `_run_buy` will not consider the existing PO without reference as a valid candidate to update: https://github.com/odoo/odoo/blob/3891dd471d64629634644c0b022a171bbaa65b49/addons/purchase_stock/models/stock_rule.py#L370-L372 An it will therefore create a new one: https://github.com/odoo/odoo/blob/3891dd471d64629634644c0b022a171bbaa65b49/addons/purchase_stock/models/stock_rule.py#L101-L115 opw-5940590 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258696
This update ensures that negative discount values are consistently displayed in both the Sale Order preview (portal view) and the generated PDF reports. Previously, the PDF displayed negative discounts while the portal preview did not, due to a discrepancy in how discounts were filtered. This change aligns the reporting output with the user interface for a more accurate representation of sales data.
Original PR description
Steps to produce: --- - Install the `Sales` module. - Enable discounts from settings. - Create a Sale Order with a negative discount on an order line. - Preview the Sale Order and click on the view…
Steps to produce: --- - Install the `Sales` module. - Enable discounts from settings. - Create a Sale Order with a negative discount on an order line. - Preview the Sale Order and click on the view details button. Issue: --- - Negative discount values are not shown in the preview (portal view), but they are displayed in the generated PDF. Root cause: --- - At [1], the portal template includes a condition to display discounts only when they are greater than 0, while the report templates lack this check, leading to inconsistent behavior. Solution: --- - Applied the same condition in the report templates to align the PDF output with the portal preview behavior. Before: --- <img width="787" height="136" alt="image" src="https://github.com/user-attachments/assets/d32311be-4aec-4d6f-b905-d5e52f712ba4" /> After: --- <img width="775" height="139" alt="image" src="https://github.com/user-attachments/assets/2614a8ad-dca6-49ca-b720-5c234aa91cf6" /> [1]https://github.com/odoo/odoo/blob/0f463fd247d2f5da79d6ec2b6bec18774f6f600b/addons/sale/views/sale_portal_templates.xml#L539 Enterprise PR: https://github.com/odoo/enterprise/pull/111916 opw-6061568 Forward-Port-Of: odoo/odoo#258981 Forward-Port-Of: odoo/odoo#255735
This update corrects a reporting issue where employee leave balances didn't correctly reflect current department assignments. Previously, allocations were tied to the department at creation, leading to duplicate entries in reports. The fix ensures leave balances always align with the employee's current department, improving report accuracy.
Original PR description
Steps to reproduce: ------------------------- 1. Install the Time Off module. 2. Go to Time Off > Management > Allocations, create an allocation for an employee, and approve it. 3. Go to Reporting >…
Steps to reproduce: ------------------------- 1. Install the Time Off module. 2. Go to Time Off > Management > Allocations, create an allocation for an employee, and approve it. 3. Go to Reporting > Balance and apply the filter Department > Employee. 4. Change the employee’s department. 5. Create an allocation for the same employee and approve. 6. Apply the Department > Employee filter again. Observed behaviour: ---------------------------- After a department change: * Existing allocations keep the old department * New allocations use the new department As a result, duplicate employee entries appear in the report Cause: ---------- It is using allocation.department_id. Allocations store the department at creation time, which may differ from the employee’s current department, causing an incorrect report filtering. Solution: ------------ Fetch department_id from hr_version instead of hr_leave_allocation in the hr_leave_employee_type_report. This ensures: * Leave balances always follow the employee’s current department * Correct aggregation when grouping by Department → Employee opw-5220577 Before: <img width="1238" height="857" alt="image" src="https://github.com/user-attachments/assets/15e1293b-dc50-4067-a12f-079c046c2074" /> After: <img width="1247" height="824" alt="image" src="https://github.com/user-attachments/assets/feea32de-0d9c-4eef-9ae5-639f4658560c" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258562
This update fixes a bug where accrual calculations weren't automatically calculating allocation duration when using allocation modes other than 'By Employee'. The fix ensures that accrual plans correctly determine the number of days allocated for employees, regardless of the chosen allocation mode, improving the accuracy of holiday tracking.
Original PR description
### Steps to reproduce: - Create an accrual plan of one level to give 20 days at the start of the year - Create an allocation with different mode than 'By Employee' - Set the accrual plan for the…
### Steps to reproduce: - Create an accrual plan of one level to give 20 days at the start of the year - Create an allocation with different mode than 'By Employee' - Set the accrual plan for the allocation and date from 1st Jan - Notice the Allocation number of days doesn't get automatically calculated ### Cause: This is happening because when trying to process the accrual plan we won't have any records in the field employee_id https://github.com/odoo/odoo/blob/bcdd12d13d73915e565fd2c8478b936a16efb9f4/addons/hr_holidays/models/hr_leave_allocation.py#L892-L893 And since employee_id is computed field when computing it we don't handle the case of any other mode other than 'By Employee'. https://github.com/odoo/odoo/blob/bcdd12d13d73915e565fd2c8478b936a16efb9f4/addons/hr_holidays/models/hr_leave_allocation.py#L259-L270 ### Fix: If we have different mode in the allocation we fetch the employees in this mode (Department, Company, Employee Tag) and set them as the allocation employee_ids so when computing the employee_id we will have a record in the field and it won't be null P.S. In the forward port we will have to introduce another fix for the multi allocation wizard opw-5888023 Forward-Port-Of: odoo/odoo#258520 Forward-Port-Of: odoo/odoo#247091
This update removes a distracting blur from message highlights, making them easier to see. The change also corrects issues with scrolling behavior that occurred during highlights, ensuring a smoother user experience. Previously, the system incorrectly displayed a 'Welcome to conversation' message during highlights, causing scroll issues.
Original PR description
Before this commit, the message highlight was too distracting. This was improved [1] so that highlighted message doesn't have the vertical translation during the highlight duration. To make the…
Before this commit, the message highlight was too distracting. This was improved [1] so that highlighted message doesn't have the vertical translation during the highlight duration. To make the message more visible than the other messages, other messages have their opacity reduced. While reduced opacity is good, there was an extra blur, which is more distracting. This commit fixes it by removing it. Also at the end of message highlight, the scroll position of message list was changing when this shouldn't. This happens for 2 reasons: 1. The "Welcome to conversation" message was mistakenly displayed during the message highlighting, thus when message highlight ended its removal would substract some scrollTop and move scroll up. 2. The "Load More" was temporarily not shown during the message highlight. This is a problem because when message highlight ended, this was adding slightly more scollTop and move scroll down. The "Welcome to conversation" should not be shown when there's logically a "Load more", which this commit fixes. The hiding of "Load More" was intended to avoid their triggering when opening conversation [2], but the logic around these triggers had been improved [3] therefore this is no longer necessary. This commit relaxes the showing of "Load more" to display them even during a message highlighting. Task-6121035 [1]: https://github.com/odoo/odoo/pull/246989 [2]: https://github.com/odoo/odoo/pull/181392 [3]: https://github.com/odoo/odoo/pull/216776 Before / After _(before visual artifacts come from GIF recorder that doesn't like blur)_  
This update resolves an issue where the live chat composer would intermittently disable after a page reload. The fix ensures the system correctly identifies available agents by using 'sudo' to access the chatbot data, preventing the frontend from incorrectly determining that no operator was assigned.
Original PR description
When a livechat visitor reloads the page, `/mail/data` serializes the chatbot state again from the discuss channel / message store data. In that flow, the visitor cannot read `livechat_agent_partner_ids` directly, so `operatorFound` was computed as false even when an agent had already been assigned. This made the frontend think no operator was available which led to UI bugs like disabled composer. Use sudo when checking whether a livechat agent exists so the store data keeps returning the correct chatbot forwarding state for visitors. task-[6102389](https://www.odoo.com/odoo/project/1519/tasks/6102389)
This update fixes a bug that prevented Peppol invoices from importing correctly. Previously, changing the Peppol journal type to non-purchase would cause import failures. This change ensures that Peppol invoices are always processed as purchase documents, improving invoice import reliability.
Original PR description
Prevent changing a Peppol journal to a non-purchase type, to avoid import errors when receiving Peppol invoices. Step to reproduce: - Setup a company with Peppol - Change the Peppol reception journal type to non-purchase - Try to run Peppol cron to import invoice, it fails with "Cannot create a purchase document in a non purchase journal" opw-6071992 opw-6064502 Forward-Port-Of: odoo/odoo#258673 Forward-Port-Of: odoo/odoo#256823
This update fixes an issue where alternative purchase orders were calculating prices incorrectly. When using 'Purchase Alternatives,' the system was misinterpreting tax settings, resulting in an inflated total price. This change ensures accurate price calculations for alternative purchase orders, improving financial reporting.
Original PR description
[FIX] purchase: set the correct price in alternative PO Steps to reproduce the bug: - Enable "Purchase Alternatives" in settings - Go to Accounting > Configuration > Taxes: - Configure a 15% purchase…
[FIX] purchase: set the correct price in alternative PO
Steps to reproduce the bug:
- Enable "Purchase Alternatives" in settings
- Go to Accounting > Configuration > Taxes:
- Configure a 15% purchase tax:
- Advanced Options tab:
- Included in Price: enabled
- Create a storable product "P1":
- Tax: 15%
- In the Purchase tab, add vendors:
- "Azure Interior": price = $10, min qty = 1
- "Deco Addict": price = $15, min qty = 1
- Create a purchase order for "Azure Interior":
- Order 100 units → total price is automatically computed as $1000
- Create an alternative purchase order:
- Vendor: "Deco Addict"
- Copy products: enabled
Problem:
The price is $1360, instead of $1500
When the alternative purchase order is created and the product is set
on the purchase order line, the required onchange methods are not
triggered:
https://github.com/odoo/odoo/blob/ad253ef4c2cb06536b99bb919a3e01ed980d2e96/addons/purchase/models/purchase.py#L1169
As a result, both the unit price and the taxes are missing on the
purchase order line. When `_compute_price_unit_and_date_planned_and_name`
is triggered, it attempts to compute the `price_unit`.
https://github.com/odoo/odoo/blob/fb24ad03fc47a303fa8719c0795e1afa9a7eb821/addons/purchase/models/purchase_order_line.py#L345-L346
At this point, it checks whether the purchase order has a vendor.
Since "Deco Addict" is set, it calls `_fix_tax_included_price_company`
using:
- the supplier price ($15)
- the supplier tax (15%)
However, since no taxes are yet set on the purchase order line,
`_fix_tax_included_price_company` incorrectly assumes the price is
tax-included and converts it to a tax-excluded price
(~13.04 instead of 15).
https://github.com/odoo/odoo/blob/7076b4f4d0d933d93b24e8e4c7cf21ef0b0008e5/addons/account/models/account_tax.py#L571-L573
Then, a 15% tax is applied on top of this incorrect base price, leading
to the wrong total.
opw-6047004
Forward-Port-Of: odoo/odoo#258154This update ensures that the price of a combo order is accurately applied to any additional items added as extras. Previously, when all sub-combos had zero free quantities, the extra items were incorrectly priced at the base price, leading to lost revenue. This fix mirrors the existing logic to correctly distribute the parent combo's list price to these extra lines.
Original PR description
When all sub-combos have qty_free=0, no child lines were classified as free, leaving remaining_total (= parent list price) undistributed. Extra lines were priced at base_price only, silently dropping the parent combo price. Fix by mirroring the JS computeComboItems logic: before processing extra lines, compute their proportional denominator and allocate remaining_total to each extra line as a share of parent_lst_price, with a per-unit rounding correction on the last line. opw-6045562 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#255867 Forward-Port-Of: odoo/odoo#254665
This update fixes an issue where kit costs were incorrectly calculated when components used within a kit had different unit of measure (UoM) settings than the base component. The fix ensures accurate cost calculations for kits sold through POS, preventing discrepancies in order totals. This improves the reliability of pricing and inventory management.
Original PR description
When selling a kit that use component with different UoM than the base component UoM, no conversion was done to compute the correct qty of component used in the kit, which lead to a wrong total cost on the pos order. Steps to reproduce: ------------------- * Create a component A with a cost of 12000€ * Set the UoM for the component A to "dozen" * Create a kit product K with a BoM the use 1 "unit" of A * At this point the cost of the kit K should be 1000€ * Now make a PoS order for 1 K and validate it > Observation: The total cost of the kit is not correctly computed, it should be 1000€ Why the fix: ------------ When computing the qty_per_kit, we were not doing the conversion between the product UoM and the BoM line UoM. opw-6039809 Forward-Port-Of: odoo/odoo#258774 Forward-Port-Of: odoo/odoo#257068
This update resolves an issue where the system wasn't properly assigning filenames to imported SDI E-invoices. By adding a field to store the filename alongside the XML file, the system now correctly exports invoice documents and avoids errors. This ensures seamless invoice processing and data accuracy.
Original PR description
PR #212726 removed a Many2One field and replaced it with an existing binary field (`l10n_it_edi_attachment_file`) and a new Char field (`l10n_it_edi_attachment_name`) to store E-invoice files as…
PR #212726 removed a Many2One field and replaced it with an existing binary field (`l10n_it_edi_attachment_file`) and a new Char field (`l10n_it_edi_attachment_name`) to store E-invoice files as XMLs. This change was made for security reasons. This pre-existing binary field was already used for importing SDI documents, which caused errors resolved in PR #252806. The new char field was not set during the SDI import process in PR #212726. This can cause errors when exporting invoice documents, as our code sees content in the binary field and expects the name to also be present. See [`_get_invoice_legal_documents()`](https://github.com/odoo/odoo/blob/f48f221c91b8d123bcaf1c4d8ed6c7dfba763ae6/addons/l10n_it_edi/models/account_move.py#L411). This commit ensures that the name of an imported SDI document is set in the move's `l10n_it_edi_attachment_name` field. opw-6023263 [link](https://www.odoo.com/odoo/my-tasks/6023263) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258882 Forward-Port-Of: odoo/odoo#257586
16 changes
New functionality added to Odoo
This update adds a guided tour for Worldline payment terminals when used with kiosks. This ensures seamless and correct payment processing, addressing a potential issue with kiosk integration and improving the overall user experience for customers using these payment methods.
Original PR description
We add a tour to ensure worldline payment terminals work correctly with kiosk. Forward-Port-Of: odoo/enterprise#105478
Enhancements to existing features
This update ensures Odoo complies with the latest Singapore GST rates and InvoiceNow requirements. It includes updated tax data, fiscal positions, and report formulas to accurately reflect Singapore's tax regulations. This improves financial reporting accuracy for users in Singapore.
Original PR description
Improves tax data and report to comply with the changes in Singapore GST rates. The improvement is also in compliance to GST InvoiceNow requirements. Key changes: - Taxes: drop outdated GST rates; add 0% NA and 0% TXNA; add fiscal positions; misc. updates - Tax Groups: drop some of tax groups - Fiscal Position: new data - Tax Report: modification to box 1's and box 14's formulas; drop unnecessary aggregate formulas (total amount) for the line sections [Task-6025634](https://www.odoo.com/odoo/my-tasks/6025634) Forward-Port-Of: odoo/odoo#258277
This update enhances the accuracy of product imports by making product name searches case-insensitive and utilizing a similarity ratio (90%) to reduce incorrect matches. This prevents issues like mis-matching products due to capitalization or similar names, leading to more reliable data import and improved inventory management.
Original PR description
Before this commit: - Product retrieval during import relied on exact name match and substring (ilike) search. - Exact name search was case sensitive, so values like `Network Cable` would not match…
Before this commit: - Product retrieval during import relied on exact name match and substring (ilike) search. - Exact name search was case sensitive, so values like `Network Cable` would not match `Network cable`. - Substring matching could return unrelated products (e.g. `Wireless bluetooth speaker` gets matched with `Wireless bluetooth speaker battery`), leading to unrelated matches. After this commit: - Exact name search is now case insensitive, allowing matches such as `Network Cable` and `network cable`. - Substring based matching has been replaced with a similarity ratio (90%) to reduce false positives and improve matching reliability against customer database product names. Technical: - Replaced `=` with `=ilike` in the exact name search domain to make the lookup case insensitive. - Similarity ratio is computed using Python's `difflib.SequenceMatcher` on product names, with a minimum threshold of 90% to qualify as a match. - Added system parameter for configurable product name similarity threshold. task-5951469 Forward-Port-Of: odoo/odoo#257538 Forward-Port-Of: odoo/odoo#252147
Resolved issues and error corrections
This update corrects a bug in how Odoo calculates depreciation for companies with non-standard fiscal years (e.g., May-December). The fix ensures that depreciation entries are correctly generated for all months, regardless of the company's fiscal year start date, preventing missed accounting periods.
Original PR description
When a company has a shortened fiscal year defined via account.fiscal.year (e.g. May-December), the depreciation board computation for degressive assets incorrectly computes the start of the next…
When a company has a shortened fiscal year defined via account.fiscal.year (e.g. May-December), the depreciation board computation for degressive assets incorrectly computes the start of the next fiscal year using `date_from + 1 year` instead of querying the actual next fiscal year. This causes entries for the months between the wrong and correct FY start (e.g. January-April) to be skipped entirely. Step to reproduce: - Create a company with a fiscal year starting in May (e.g. May 1st 2025 to 31st December 2025) - Create an asset with a start date in the 1 December 2025, with a 24 months duration and degressive method - Compute the board and observe that entries from January to April 2026 are missing Fix the FY boundary detection in _recompute_board to query the fiscal year containing the day after the current period end, revert the effective_start_date logic in _compute_board_amount that was masking the root cause, and move the prorata date clamping to _create_move_before_date where it is needed for disposal. opw-6016834 Forward-Port-Of: odoo/enterprise#113521
This update fixes a calculation error in the employment bonus payments processed for Belgian employees. The change ensures that the bonus calculations now fully comply with specific requirements outlined by Belgian social security regulations, as detailed in the provided documentation. This correction improves accuracy and compliance with local laws.
Original PR description
The employment bonus computation was missing two roundings steps that are explicitely asked for in the following documentation: https://www.socialsecurity.be/employer/instructions/dmfa/fr/latest/instructions/deductions/workers_reductions/workbonus.html Forward-Port-Of: odoo/enterprise#113776
This update fixes an issue where kit products were incorrectly included in stock valuation calculations. Previously, the total cost of a kit was added to its components, resulting in inflated inventory values. The fix ensures that only the individual components of a kit are valued, providing accurate inventory reporting.
Original PR description
Currently, when a user creates a kit, the price of the kit itself is included in stock valuation. ## Steps to produce: * Install `mrp_account` without demo data. * Create a product with inventory…
Currently, when a user creates a kit, the price of the kit itself is included in stock valuation. ## Steps to produce: * Install `mrp_account` without demo data. * Create a product with inventory tracking enabled. * Create a BoM of type kit for that product. * Add component products with a defined cost and on-hand quantity greater than 0 to the BoM. * Recompute the kit product’s cost from its BoM on the product page. * Go to Inventory > Reporting > Stock. ## Observed Behavior: The cost of the kit is currently being included in the stock valuation. For example, consider a kit product called **“Computer”** that is composed of the following components: | Product | Quantity | Cost | |--------|--------|--------| | CPU | 1 | $300 | | Motherboard | 1 | $300 | The total cost of the Computer kit is therefore $600. Since the Computer is made up of the CPU and Motherboard, the total inventory value should be $600. However, the system is currently calculating the total inventory value as $1,200 , which is incorrect because it is counting both the kit and its components. ## Root cause: This behavior started after the refactor in [1], where the `_compute_value_svl` function was replaced by the `compute_value` function to calculate both average and total value for inventory valuation. With this change, the new compute function in [2] now also includes kit products when calculating inventory valuation based on their costing method. In earlier versions, this did not occur because `_compute_value_svl` depended on valuation layer groups. Kit products were excluded at [3] through the `_get_valuation_layer_groups()` call, as illustrated in image [4]. [2]- https://github.com/odoo/odoo/blob/1b9937a702fbeb47cd6d42d8119cead5828fd3fe/addons/stock_account/models/product.py#L139-L169 [3]- https://github.com/odoo/odoo/blob/a9d2e54201173d1d2d5ab97de0904d63a4b6b82b/addons/stock_account/models/product.py#L284 ## Solution: To ensure correct total inventory valuation, kit products should be excluded from valuation and only their individual components should be calculated. This can be achieved by modifying the domains used in 'action_product_stock_view` and `_get_accounts_by_product` to exclude the kits so that the kit products get filtered out, allowing the report to consider only its components. **Before:** <img width="1857" height="938" alt="image" src="https://github.com/user-attachments/assets/bbd4eb94-ba1a-429a-a61c-afbe33729ac0" /> **After:** <img width="1915" height="883" alt="image" src="https://github.com/user-attachments/assets/c93d55c8-8197-4e57-9f87-b2159fe67d87" /> [1]: https://github.com/odoo/odoo/pull/222169/commits/6e694b79b8892d693117f6c79df1a2d3a4759f4f [4]: https://drive.google.com/file/d/1g4BzGscCW2K0rf5iDKrq-psYRlKhYkDP/view?usp=sharing opw-5462515 Forward-Port-Of: odoo/odoo#244030
This update corrects a reporting issue where employee leave balances incorrectly displayed outdated department information. The fix ensures that leave balances always reflect the employee's current department, preventing duplicate entries in reports and providing accurate data for management. This improves the reliability of our time-off reporting.
Original PR description
Steps to reproduce: ------------------------- 1. Install the Time Off module. 2. Go to Time Off > Management > Allocations, create an allocation for an employee, and approve it. 3. Go to Reporting >…
Steps to reproduce: ------------------------- 1. Install the Time Off module. 2. Go to Time Off > Management > Allocations, create an allocation for an employee, and approve it. 3. Go to Reporting > Balance and apply the filter Department > Employee. 4. Change the employee’s department. 5. Create an allocation for the same employee and approve. 6. Apply the Department > Employee filter again. Observed behaviour: ---------------------------- After a department change: * Existing allocations keep the old department * New allocations use the new department As a result, duplicate employee entries appear in the report Cause: ---------- It is using allocation.department_id. Allocations store the department at creation time, which may differ from the employee’s current department, causing an incorrect report filtering. Solution: ------------ Fetch department_id from hr_version instead of hr_leave_allocation in the hr_leave_employee_type_report. This ensures: * Leave balances always follow the employee’s current department * Correct aggregation when grouping by Department → Employee opw-5220577 Before: <img width="1238" height="857" alt="image" src="https://github.com/user-attachments/assets/15e1293b-dc50-4067-a12f-079c046c2074" /> After: <img width="1247" height="824" alt="image" src="https://github.com/user-attachments/assets/feea32de-0d9c-4eef-9ae5-639f4658560c" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258562
This update resolves a validation error that occurred when users attempted to reconcile payments from different companies within Odoo's accounting system. The change ensures the 'Outstanding Credits/Debits' widget only displays relevant payments for the current invoice's company, improving user experience and preventing errors.
Original PR description
The invoice outstanding credits/debits widget currently displays all reconcilable items for a partner across the same account, regardless of the company they belong to. In multi-company environments,…
The invoice outstanding credits/debits widget currently displays all reconcilable items for a partner across the same account, regardless of the company they belong to. In multi-company environments, specifically when accounts have been merged, this allows users to see and try to reconcile payments from Company A into an invoice from Company B. This action eventually triggers a validation error stating that entries must belong to the same company. This commit adds a company filter to the widget's logic to ensure only relevant outstanding payments are suggested, preventing cross-company reconciliation errors and improving UX. **Description of the issue/feature this PR addresses:** This PR fixes a validation error in multi-company environments where the invoice_outstanding_credits_debits_widget suggests payments or credit notes belonging to a different company than the current invoice. The issue typically arises when a partner has outstanding transactions in multiple companies and the accounts (e.g., Account Receivable) have been merged, allowing the widget to query lines that are not valid for the current record's company context. **Current behavior before PR:** When viewing an invoice for Company A, the "Outstanding Credits/Debits" widget displays all reconcilable account.move.line records for that partner that match the account type, regardless of their company_id. If a user clicks "Add" on a payment that belongs to Company B, Odoo attempts to reconcile them, resulting in a traceback or a validation error: "Invalid Operation: All tracebacks/entries must belong to the same company." This creates confusion for the end-user, as they are presented with "ghost" credits that cannot actually be applied. **Desired behavior after PR is merged:** The invoice_outstanding_credits_debits_widget (and the underlying logic in account.move) will strictly filter the suggested outstanding items by self.company_id. Users will only see and be able to reconcile payments, credit notes, or debits that belong to the same company as the invoice they are currently processing. This ensures data integrity and a seamless UX in multi-company setups. **Steps to reproduce:** 1) Enable Multi-Company: Ensure you have at least two companies (e.g., Company A and Company B) active in your database. 2) Chart of Accounts Setup: In both companies, use the same account for Receivables (or merge them so they share the same ID/Code if testing a migrated environment). 3) Ensure the account is marked as Allow Reconciliation. 4) Create a Payment in Company B: 5) Post the payment so it remains as an "Outstanding Receipt". 6) Create an Invoice in Company A 7) Confirm/Post the invoice. 8) Check the Widget: Scroll down to the bottom of the Invoice form in Company A. 9) Observe the "Outstanding Credits" widget. The Error: The payment from Company B will appear as an available credit for the invoice in Company A. 10) Click on "Add". A validation error (UserError) will pop up: "All entries must belong to the same company." **video** https://drive.google.com/file/d/1PfBxupP8t-t21wsP2FIgNXFnTP0Zq140/view --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#255875
This update fixes an issue where the delivered quantity for kit products with dropshipped components was incorrectly calculated. The fix ensures accurate delivery tracking by addressing a flaw in the system's logic related to dropshipping routes and warehouse configurations. This ensures accurate reporting of delivered goods for kits.
Original PR description
### Steps to reproduce: - In the settings Dropshipping - Put you warehouse in 2 steps delivery - Create a kit product with 2 components: COMP1, COMP2 - Set a vendor on COMP2 and the dropship route -…
### Steps to reproduce: - In the settings Dropshipping - Put you warehouse in 2 steps delivery - Create a kit product with 2 components: COMP1, COMP2 - Set a vendor on COMP2 and the dropship route - Create and confirm an SO for 1 unit of your kit - Validate the ship and pick for COMP1 - Confirm the PO for COMP2 and validate the associated dropship #### > The qty_delivered on the sol is still at 0 ### Cause of the issue: The `delivered_qty` is computed via the `_prepare_qty_delivered`: https://github.com/odoo/odoo/blob/9b9ff3ddcba6f0c9d37d08fb4fb900bed3b396a4/addons/sale/models/sale_order_line.py#L887-L902 However, since at least on of the component is dropshipped, the qty_delivered is computed by this condition: https://github.com/odoo/odoo/blob/9b9ff3ddcba6f0c9d37d08fb4fb900bed3b396a4/addons/sale_mrp/models/sale_order_line.py#L54-L63 Which is 0 since the pick `location_dest_id.usage` is not `customer`. ### Additional issue: The delivered quantity of a Kit with at least one dropshipped component can only be 0 or the full demand. - In the settings enable Dropshipping - Create a kit product with 2 components: COMP1, COMP2 - Set a vendor on COMP2 and the dropship route - Create and confirm an SO for 3 unit of your kit - Validate the delivery for COMP1 for 2 units and backorder - Confirm the PO for COMP2 and validate the associated dropship for 1 unit and do not backorder #### > The qty_delivered on the sol is 0 instead of 1 - Cancel the backorder for COMP1 ### > The qty_delivered on the sol is 3 instead of 1 ### Cause of the issue: This is caused by the exact same dropship computation: https://github.com/odoo/odoo/blob/9b9ff3ddcba6f0c9d37d08fb4fb900bed3b396a4/addons/sale_mrp/models/sale_order_line.py#L63-L66 ### Note: The behavior should be consistent if the components are fully dropshipped or MTO buy and as such they should not be considered to be in all or nothing shipping policy. opw-6040640 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#257617
This update resolves an issue preventing administrators from editing their profiles on mobile devices. The team corrected a technical error where a missing mobile view component was causing a system error. The fix ensures a consistent and functional profile editing experience across all device types.
Original PR description
# How to reproduce - Install the eLearning module - On the website, go to the Courses tab - View a user (Administrator for example) - In mobile view, click on Edit # The problem An traceback is shown and the user cannot edit their profile # Why This commit (https://github.com/odoo/odoo/commit/69785c1a64d61f2831804bcdcc4887ad43d27fbb) improved the profile edition. It is mentioned that they moved away from the simple bootstrap modal and used an OWL view instead. However, for the mobile view, they left a call to a modal that does not exist. This fix removes the call to the undefined modal and replaces it with the same OWL Dialog used in the desktop view (thanks to the .o_wprofile_editor class) opw-5960586 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251503
This update fixes a problem where multiple email aliases could lead to duplicate records being created when emails are processed concurrently. The change adds a temporary lock to ensure only one record is created for each email, improving data accuracy and reliability. This resolves a potential issue with helpdesk teams receiving duplicate notifications.
Original PR description
Concurrent processing of emails with the same `Message-Id` can create duplicate records. ### Steps to reproduce 1. Configure multiple mail aliases (e.g., two helpdesk teams). 2. Send one email with…
Concurrent processing of emails with the same `Message-Id` can create duplicate records. ### Steps to reproduce 1. Configure multiple mail aliases (e.g., two helpdesk teams). 2. Send one email with both aliases as recipient. The Mail Transfer Agent may invoke `odoo-mailgate.py` once per recipient, resulting in concurrent processing of the same email in separate transactions. We expect one record per alias/team, but duplicates may be created. ### Cause This is a race condition in the `Message-Id` deduplication logic, caused by concurrent transactions and PostgreSQL snapshot isolation. Odoo uses the `REPEATABLE READ` isolation level. This means that each transaction takes a snapshot of the database at its first query and cannot see changes committed by other concurrent transactions. When two concurrent transactions process the same email: 1. Both enter `message_process` and take their snapshot. 2. Both search for the `Message-Id`. Because their snapshots don't include each other's work, both find nothing. 3. Both create records. Even if one transaction commits before the other performs the check, the second transaction still uses its original stale snapshot and create duplicates. ### Fix After the initial duplicate check, attempt to acquire a transactional advisory lock on a hash of the `Message-Id` using `pg_try_advisory_xact_lock`. If another transaction is already processing the same email and holds the lock, the call returns false and the email is treated as a duplicate. If the lock is acquired, processing continues as normal. opw-5116492 Forward-Port-Of: odoo/odoo#258847 Forward-Port-Of: odoo/odoo#250027
This update fixes an issue where refund orders paid with eWallet top-ups (resulting in a net total of $0) were incorrectly processed. The change ensures accurate invoice generation and tax calculations for these refund flows, preventing errors in accounting documents. It improves the reliability of refund processing for a key POS feature.
Original PR description
[FIX] point_of_sale: detect refund+eWallet orders as refunds for invoice signs Refund orders paid through eWallet top-up can have a net total of 0, which made refund detection based only on negative…
[FIX] point_of_sale: detect refund+eWallet orders as refunds for invoice signs Refund orders paid through eWallet top-up can have a net total of 0, which made refund detection based only on negative totals inconsistent. As a result, some refund flows were treated as normal invoices and refund tax/invoice signs were incorrect. Steps to reproduce: ------------------- * Configure an eWallet program in POS. * Create and pay a POS order for one product, then invoice it. * Refund that order and choose eWallet as refund payment method (refund + top-up). * Validate and inspect the generated accounting document. > Observation: The refund flow may not be consistently treated as a refund when the order’s net amount is 0, causing incorrect invoice move type/sign handling and wrong tax booking behavior. Why the fix: ------------ Refund detection now also relies on `refunded_order_id` in key paths: * `_compute_prices`: apply refund factor when order is linked to a refunded order (or already negative), so totals/taxes keep refund semantics. * `_prepare_invoice_vals`: create `out_refund` when the order is linked to a refunded order (or has negative total), ensuring a credit note is produced. * `_prepare_base_line_for_taxes_computation`: consider refund context with `is_refund` or negative total for tax base sign consistency. This keeps existing negative-total refund behavior while correctly handling refund+eWallet cases where the arithmetic total can be 0. opw-5426818 Forward-Port-Of: odoo/odoo#247948
This update fixes an issue where increasing the quantity of a purchase order after cancellation would create a new order instead of updating the existing one. The change ensures that when a purchase order is cancelled and the associated sales order demand is increased, the system correctly updates the existing purchase order to reflect the new quantity needed. This prevents duplicate orders and streamlines the procurement process.
Original PR description
### Steps to reproduce: - In the settings enable: Multi-Steps Routes - Inventory > Configuration > Warehouse Management > Routes - Unarchive MTO - Create a storable product with a vendor using the…
### Steps to reproduce: - In the settings enable: Multi-Steps Routes - Inventory > Configuration > Warehouse Management > Routes - Unarchive MTO - Create a storable product with a vendor using the MTO route - Create and confirm an SO for 1 unit of that product - Cancel and reset to draft the associated draft PO - Update the SO demand from 1 to 2 units #### > A new draft PO is created rather than updating the existing one. ### Cause of the issue: Both the confirmation and the demand updates of the SO call the `_action_launch_stock_rule` to generate the related PO. The procurement and PO generated in both cases including the `stock_reference_ids` of the SO: https://github.com/odoo/odoo/blob/3891dd471d64629634644c0b022a171bbaa65b49/addons/sale_stock/models/sale_order_line.py#L277-L289 However, cancelling the PO will remove its assocaited stock reference: https://github.com/odoo/odoo/blob/3891dd471d64629634644c0b022a171bbaa65b49/addons/purchase_stock/models/purchase_order.py#L201-L202 As such, when the second procurement is run, the `_run_buy` will not consider the existing PO without reference as a valid candidate to update: https://github.com/odoo/odoo/blob/3891dd471d64629634644c0b022a171bbaa65b49/addons/purchase_stock/models/stock_rule.py#L370-L372 An it will therefore create a new one: https://github.com/odoo/odoo/blob/3891dd471d64629634644c0b022a171bbaa65b49/addons/purchase_stock/models/stock_rule.py#L101-L115 opw-5940590 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258696
This update prevents users from changing the type of Peppol journal to non-purchase, which was causing import errors when receiving Peppol invoices. This ensures that invoices are correctly processed and imported, maintaining accurate accounting records. The change addresses a technical issue related to Peppol integration.
Original PR description
Prevent changing a Peppol journal to a non-purchase type, to avoid import errors when receiving Peppol invoices. Step to reproduce: - Setup a company with Peppol - Change the Peppol reception journal type to non-purchase - Try to run Peppol cron to import invoice, it fails with "Cannot create a purchase document in a non purchase journal" opw-6071992 opw-6064502 Forward-Port-Of: odoo/odoo#258673 Forward-Port-Of: odoo/odoo#256823
This update improves how E-invoices are imported from SDI documents. Previously, a critical detail was missing, causing issues with exporting invoices. This change ensures the file name is correctly associated with the imported XML file, preventing errors and maintaining accurate invoice data.
Original PR description
PR #212726 removed a Many2One field and replaced it with an existing binary field (`l10n_it_edi_attachment_file`) and a new Char field (`l10n_it_edi_attachment_name`) to store E-invoice files as…
PR #212726 removed a Many2One field and replaced it with an existing binary field (`l10n_it_edi_attachment_file`) and a new Char field (`l10n_it_edi_attachment_name`) to store E-invoice files as XMLs. This change was made for security reasons. This pre-existing binary field was already used for importing SDI documents, which caused errors resolved in PR #252806. The new char field was not set during the SDI import process in PR #212726. This can cause errors when exporting invoice documents, as our code sees content in the binary field and expects the name to also be present. See [`_get_invoice_legal_documents()`](https://github.com/odoo/odoo/blob/f48f221c91b8d123bcaf1c4d8ed6c7dfba763ae6/addons/l10n_it_edi/models/account_move.py#L411). This commit ensures that the name of an imported SDI document is set in the move's `l10n_it_edi_attachment_name` field. opw-6023263 [link](https://www.odoo.com/odoo/my-tasks/6023263) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#257586
This update fixes an issue where newly created stock move lines in the picking operations view would disappear after a refresh. The fix ensures that all move lines associated with a picking remain visible, improving the user experience and preventing data loss when updating the picking details.
Original PR description
**Problem:** When creating a new stock.move.line in the moves view (accessed via smart button from a picking), the newly created line disappears after any refresh action (manual refresh or triggering…
**Problem:**
When creating a new stock.move.line in the moves view (accessed via smart button from a picking), the newly created line disappears after any refresh action (manual refresh or triggering "Put in Pack").
**Steps to reproduce:**
1. Open a receipt/picking operation
2. Click on the "Moves" smart button to open the detailed operations view
3. Create a new stock.move.line record
4. Click "Put in Pack" or manually refresh the page
5. Observe that the newly created line disappears
**Current behavior:**
The newly created stock.move.line disappears from the view after refresh, and only reappears if you navigate back to the picking and then return to the moves view.
**Expected behavior:**
The newly created stock.move.line should remain visible in the view after refresh or any action that triggers a view reload.
**Cause of the issue:**
The action_detailed_operations method uses a static domain [('id', 'in', self.move_line_ids.ids)] that captures a snapshot of move line IDs at the moment the action is opened.
https://github.com/odoo/odoo/blob/22ac818970f104a732cc7d24afc440cf0e6d74bd/addons/stock/models/stock_picking.py#L1204-L1212 When a new stock.move.line is created in this view, its ID is not included in the original static list. Any refresh (manual or triggered by operations like "Put in Pack") re-applies this static domain, filtering out the newly created lines because their IDs weren't captured in the initial list.
**Fix:**
Using a dynamic domain based on picking_id ensures all move lines belonging to the picking are always visible, regardless of when they were created. This aligns with the expected behavior of showing "all move lines for this picking" rather than "only the move lines that existed when the view was opened". The relational lookup [('picking_id', '=', self.id)] is re-evaluated on each refresh, automatically including any newly created lines that have the correct picking_id set.
opw-5398620
Forward-Port-Of: odoo/odoo#251619
Forward-Port-Of: odoo/odoo#2471704 changes
Resolved issues and error corrections
This update fixes an error in how Odoo calculates depreciation for companies with non-standard fiscal years. Previously, depreciation entries were incorrectly skipped for months within the wrong fiscal year. The fix ensures accurate depreciation calculations, particularly for companies using shortened fiscal years like May-December.
Original PR description
When a company has a shortened fiscal year defined via account.fiscal.year (e.g. May-December), the depreciation board computation for degressive assets incorrectly computes the start of the next…
When a company has a shortened fiscal year defined via account.fiscal.year (e.g. May-December), the depreciation board computation for degressive assets incorrectly computes the start of the next fiscal year using `date_from + 1 year` instead of querying the actual next fiscal year. This causes entries for the months between the wrong and correct FY start (e.g. January-April) to be skipped entirely. Step to reproduce: - Create a company with a fiscal year starting in May (e.g. May 1st 2025 to 31st December 2025) - Create an asset with a start date in the 1 December 2025, with a 24 months duration and degressive method - Compute the board and observe that entries from January to April 2026 are missing Fix the FY boundary detection in _recompute_board to query the fiscal year containing the day after the current period end, revert the effective_start_date logic in _compute_board_amount that was masking the root cause, and move the prorata date clamping to _create_move_before_date where it is needed for disposal. opw-6016834 Forward-Port-Of: odoo/enterprise#113521
This update resolves an issue where users without administrator privileges accessing invoices created from email aliases with CFDI attachments would encounter an access error. The fix ensures that attachment records are properly configured, allowing the system to correctly fetch and display the attached XML files.
Original PR description
When accessing a bill created from an email alias with a user that is not system administrator, we get an access error if there is an xml attachment. Steps: - Configure an email alias for the…
When accessing a bill created from an email alias with a user that is not system administrator, we get an access error if there is an xml attachment. Steps: - Configure an email alias for the purchase journal - Receive a mail wth an xml attached - Create a user with group_user role and administrator right on accounting - log in with new user - access the created bill -> Access Error The root of the issue is that we don't attach xml files when we receive them from an email alias. To do so, we set res_model and res_id fields to False/0 (see `AccountDocumentImportMixin._fix_attachments_on_record`) Then, when trying to access the bill the method `AccountMove._get_mail_thread_data_attachments` add the `l10n_mx_edi_cfdi_attachment_id` to the attachments to fetch. Then the fetch method get a query from the `_search` method or `ir.attachment` and because the attachment has no res_id or res_model and user is not system (see https://github.com/odoo/odoo/blob/8f7807a763e7e272347e9c1622be862700409c34/odoo/addons/base/models/ir_attachment.py#L564-L578) we don't fetch the record and we end up with an access error (https://github.com/odoo/odoo/blob/8f7807a763e7e272347e9c1622be862700409c34/odoo/orm/models.py#L3497-L3500) Fix: Adding res_model and res_id to the `l10n_mx_edi_cfdi_attachment_id` record in its compute method opw-5953578
This update resolves a crash that occurred when confirming rental orders with kit products containing multiple components in different locations. The change uses a safer method to handle multiple pick transfers, preventing a common error related to assigning return IDs. This ensures rental orders with kits can be processed reliably.
Original PR description
Problem: When you confirm a rental order that has a kit product whose components use two different pack locations Odoo crashes with a singleton error. You get this singleton error because Odoo tries…
Problem: When you confirm a rental order that has a kit product whose components use two different pack locations Odoo crashes with a singleton error. You get this singleton error because Odoo tries to assign both picks as the `return_id` because they share the same `sale.order.line` here: https://github.com/odoo/enterprise/blob/2212b3f3f3d90894dd6351defe0d3ca090584955/sale_stock_renting/models/sale_order_line.py#L404
Purpose: Use [:1] to safely handle the case where multiple pick transfers are created, avoiding a crash when assigning return_id which expects a single record.
Steps to Reproduce on Runbot:
1. Enable mutli-step routes and rental transfers.
2. Set the warehouse to 3-step delivery.
3. Copy the existing packing location.
4. Copy the existing pick operation type and set the destination location to the new packing location.
5. Create a new route.
6. Create new rules on this new route with the following configurations:
1. Rule 1
1. Action: Pull
2. Source location: WH/Stock
3. Destination location: Partners/Customers
4. Operation type: The new pick operation type
2. Rule 2
1. Action: Push
2. Source location: New pack location
3. Destination location: WH/Output
4. Operation type: Pack
3. Rule 3
1. Action: Push
2. Source location: WH/Output
3. Destination location: Partners/Customers
4. Operation type: Delivery
7. Create 2 component products tracked by inventory, and apply the new route on one of the component products.
8. Create a new rental product with a kit, which has the 2 component products.
9. Create a new rental order for the kit product and confirm it.
opw-6026918
Forward-Port-Of: odoo/enterprise#112543This update corrects a flaw in how Odoo calculates the available capacity for appointments booked through Google Reserve. The previous system incorrectly reserved the full party size, leading to potential overbooking. This fix ensures accurate capacity allocation, improving the reliability of appointment scheduling.
Original PR description
The current logic inside the appointment google reserve controller to compute reserved and used capacity per resource was incorrect. It was reserving the full party size for each resource instead of properly computing how much spots we are reserving for each. The code was fixed and a test was adapted for proper coverage. Task-6120016 Forward-Port-Of: odoo/enterprise#113805
9 changes
Enhancements to existing features
This update simplifies the generation of Spanish tax reports (303 and 347) for users. Specifically, the 'exonerated from 390' field is now automatically displayed on the print BOE wizard for relevant periods, eliminating manual setup. Additionally, the annual report 347 now groups data by move type and date for enhanced audit capabilities.
Original PR description
In this PR: - In tax report 303, the 'exonerated from 390' boolean field is now visible on the print BOE wizard , when period is either last month or last quarter so that user does not have to enable it manually on the AEAT page. - In the annual tax report 347, when a user clicks to audit the operations of the entity, a new group by is added in context to group the reports by move type and date(quarter). task-5863744 Forward-Port-Of: odoo/enterprise#113644 Forward-Port-Of: odoo/enterprise#108057
Resolved issues and error corrections
This update fixes an issue where MyInvois was receiving incorrect invoice amounts for individual POS transactions. The change ensures the Total Amount Payable accurately reflects the e-document's total value, aligning with MyInvois requirements and preventing payment discrepancies. This improves data accuracy for tax reporting.
Original PR description
For individual POS e-invoices, the PrePayment Amount was mapped to the payment linked to the invoice. This incorrectly decreased the Total Amount Payable to 0, since POS orders are already paid at the counter. MyInvois tax officer and helpdesk requires that the Total Amount Payable (cbc:PayableAmount) to reflect the total amount of the issued e-document, regardless of prior payments. This commit forces the PaidAmount to 0 for individual POS e-invoices, ensuring the PayableAmount correctly matches the TaxInclusiveAmount as expected by the MyInvois API. task-6057187 Forward-Port-Of: odoo/odoo#258824
This update fixes an error in how Odoo calculates depreciation for companies with non-standard fiscal years. Previously, depreciation entries were incorrectly skipped for months within the wrong fiscal year. The fix ensures accurate depreciation calculations, particularly for companies using shortened fiscal years like May-December.
Original PR description
When a company has a shortened fiscal year defined via account.fiscal.year (e.g. May-December), the depreciation board computation for degressive assets incorrectly computes the start of the next…
When a company has a shortened fiscal year defined via account.fiscal.year (e.g. May-December), the depreciation board computation for degressive assets incorrectly computes the start of the next fiscal year using `date_from + 1 year` instead of querying the actual next fiscal year. This causes entries for the months between the wrong and correct FY start (e.g. January-April) to be skipped entirely. Step to reproduce: - Create a company with a fiscal year starting in May (e.g. May 1st 2025 to 31st December 2025) - Create an asset with a start date in the 1 December 2025, with a 24 months duration and degressive method - Compute the board and observe that entries from January to April 2026 are missing Fix the FY boundary detection in _recompute_board to query the fiscal year containing the day after the current period end, revert the effective_start_date logic in _compute_board_amount that was masking the root cause, and move the prorata date clamping to _create_move_before_date where it is needed for disposal. opw-6016834 Forward-Port-Of: odoo/enterprise#113521
This update ensures the 'send by Peppol' option in the accounting send wizard is only available for companies that are actually registered on the Peppol network. Previously, it was enabled automatically, which was misleading and inaccurate. This change improves data accuracy and aligns with registration requirements.
Original PR description
Previously, the send wizard would automatically enable the send "by Peppol" option whenever Peppol was available for the company's country. This behavior was misleading, as it didn't check whether the company was actually registered on Peppol. This commit ensures the option is only enabled for companies that are registered on Peppol. task-6044073 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#255791 Forward-Port-Of: odoo/odoo#254671
This update resolves a validation error that occurred when users attempted to reconcile payments from different companies within Odoo's multi-company accounting system. The fix ensures the 'Outstanding Credits/Debits' widget only displays relevant payments for the current invoice's company, improving user experience and preventing errors.
Original PR description
The invoice outstanding credits/debits widget currently displays all reconcilable items for a partner across the same account, regardless of the company they belong to. In multi-company environments,…
The invoice outstanding credits/debits widget currently displays all reconcilable items for a partner across the same account, regardless of the company they belong to. In multi-company environments, specifically when accounts have been merged, this allows users to see and try to reconcile payments from Company A into an invoice from Company B. This action eventually triggers a validation error stating that entries must belong to the same company. This commit adds a company filter to the widget's logic to ensure only relevant outstanding payments are suggested, preventing cross-company reconciliation errors and improving UX. **Description of the issue/feature this PR addresses:** This PR fixes a validation error in multi-company environments where the invoice_outstanding_credits_debits_widget suggests payments or credit notes belonging to a different company than the current invoice. The issue typically arises when a partner has outstanding transactions in multiple companies and the accounts (e.g., Account Receivable) have been merged, allowing the widget to query lines that are not valid for the current record's company context. **Current behavior before PR:** When viewing an invoice for Company A, the "Outstanding Credits/Debits" widget displays all reconcilable account.move.line records for that partner that match the account type, regardless of their company_id. If a user clicks "Add" on a payment that belongs to Company B, Odoo attempts to reconcile them, resulting in a traceback or a validation error: "Invalid Operation: All tracebacks/entries must belong to the same company." This creates confusion for the end-user, as they are presented with "ghost" credits that cannot actually be applied. **Desired behavior after PR is merged:** The invoice_outstanding_credits_debits_widget (and the underlying logic in account.move) will strictly filter the suggested outstanding items by self.company_id. Users will only see and be able to reconcile payments, credit notes, or debits that belong to the same company as the invoice they are currently processing. This ensures data integrity and a seamless UX in multi-company setups. **Steps to reproduce:** 1) Enable Multi-Company: Ensure you have at least two companies (e.g., Company A and Company B) active in your database. 2) Chart of Accounts Setup: In both companies, use the same account for Receivables (or merge them so they share the same ID/Code if testing a migrated environment). 3) Ensure the account is marked as Allow Reconciliation. 4) Create a Payment in Company B: 5) Post the payment so it remains as an "Outstanding Receipt". 6) Create an Invoice in Company A 7) Confirm/Post the invoice. 8) Check the Widget: Scroll down to the bottom of the Invoice form in Company A. 9) Observe the "Outstanding Credits" widget. The Error: The payment from Company B will appear as an available credit for the invoice in Company A. 10) Click on "Add". A validation error (UserError) will pop up: "All entries must belong to the same company." **video** https://drive.google.com/file/d/1PfBxupP8t-t21wsP2FIgNXFnTP0Zq140/view --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#255875
This update fixes a technical issue preventing the REAGYP compensation amount from being accurately reported to the Spanish tax authority (AEAT). By including the necessary data in the SII JSON payload, the system now correctly calculates and transmits the deductible amount, ensuring compliance with Spanish tax regulations. A related test has also been updated to reflect the new calculation.
Original PR description
Currently, the deducible amount for REAGYP is not passing through to the AEAT. This happens because the REAGYP compensation amount (ImporteCompensacionREAGYP) was missing from the total deductible quota calculation in the SII JSON payload. To fix this, we add 'sujeto_agricultura' to the list that cheks if the tax value for l10n_es is in the list task-6072773 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258932 Forward-Port-Of: odoo/odoo#256586
This update resolves a crash that occurred when confirming rental orders with kit products using multiple pick locations. The change utilizes a safer method to handle multiple pick transfers, preventing a common error that caused the system to fail. This ensures rental order confirmations are more reliable and stable.
Original PR description
Problem: When you confirm a rental order that has a kit product whose components use two different pack locations Odoo crashes with a singleton error. You get this singleton error because Odoo tries…
Problem: When you confirm a rental order that has a kit product whose components use two different pack locations Odoo crashes with a singleton error. You get this singleton error because Odoo tries to assign both picks as the `return_id` because they share the same `sale.order.line` here: https://github.com/odoo/enterprise/blob/2212b3f3f3d90894dd6351defe0d3ca090584955/sale_stock_renting/models/sale_order_line.py#L404
Purpose: Use [:1] to safely handle the case where multiple pick transfers are created, avoiding a crash when assigning return_id which expects a single record.
Steps to Reproduce on Runbot:
1. Enable mutli-step routes and rental transfers.
2. Set the warehouse to 3-step delivery.
3. Copy the existing packing location.
4. Copy the existing pick operation type and set the destination location to the new packing location.
5. Create a new route.
6. Create new rules on this new route with the following configurations:
1. Rule 1
1. Action: Pull
2. Source location: WH/Stock
3. Destination location: Partners/Customers
4. Operation type: The new pick operation type
2. Rule 2
1. Action: Push
2. Source location: New pack location
3. Destination location: WH/Output
4. Operation type: Pack
3. Rule 3
1. Action: Push
2. Source location: WH/Output
3. Destination location: Partners/Customers
4. Operation type: Delivery
7. Create 2 component products tracked by inventory, and apply the new route on one of the component products.
8. Create a new rental product with a kit, which has the 2 component products.
9. Create a new rental order for the kit product and confirm it.
opw-6026918
Forward-Port-Of: odoo/enterprise#112543This update optimizes the process for Saudi Arabian companies using the l10n_sa_edi_pos module. Previously, generating PDFs was a significant bottleneck, slowing down order processing. Now, PDFs are only created on demand, improving speed and cashier efficiency.
Original PR description
For SA companies, wkhtmltopdf PDF generation was accounting for ~47% of the sync_from_ui response time (~3.1s out of ~6.5s total), blocking the cashier at every order. The PDF is not needed during checkout: ZATCA requires only the signed XML and returns the QR code. The PDF can be generated on demand when the invoice is first viewed or downloaded. opw-6019994 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#257311 Forward-Port-Of: odoo/odoo#253641
This update fixes an issue where stock quantities were incorrectly displayed for a company when a purchase order was processed by a different company in a multi-company setup. The change ensures stock quantities are accurately linked to the product's original company, preventing errors and improving data consistency. This resolves a reporting discrepancy.
Original PR description
**Purpose:** Since a stock.quant is a combination of the stock move lines of a product and a location, it should be restricted by the product's company. **Before this commit:** In a multi-company…
**Purpose:** Since a stock.quant is a combination of the stock move lines of a product and a location, it should be restricted by the product's company. **Before this commit:** In a multi-company environment. If a purchase order with product from company 1 is being confirmed, received, and validated when company 2 is being selected as the primary active company while company 1 is also checked. It will create a stock.quant that is searchable for company 2. However, it will raise an error when company 2 is trying to access it. **After this commit:** Even if the stock.quant is created when company 2 is the primary active company, it will not be searchable for company 2 since the product's company is company 1. **Steps to Reproduce on Runbot:** - Create a storable product exclusive to Company A - Create & validate a receipt for that product in Company A. - Switch to Company B -> Reporting > Locations > Remove all filters: The negative quant for the product in Partners/Vendors is visible. opw-6082330 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#259195 Forward-Port-Of: odoo/odoo#257211
7 changes
Enhancements to existing features
This update simplifies the creation of Spanish tax reports (303 and 347) for users. Specifically, the 'exonerated from 390' field is now automatically displayed on the print wizard for recent periods, eliminating manual steps. Additionally, the annual report 347 now groups data by move type and date for enhanced audit capabilities.
Original PR description
In this PR: - In tax report 303, the 'exonerated from 390' boolean field is now visible on the print BOE wizard , when period is either last month or last quarter so that user does not have to enable it manually on the AEAT page. - In the annual tax report 347, when a user clicks to audit the operations of the entity, a new group by is added in context to group the reports by move type and date(quarter). task-5863744 Forward-Port-Of: odoo/enterprise#108057
Resolved issues and error corrections
This update fixes an error in how Odoo calculates depreciation for companies with non-standard fiscal years. Previously, depreciation entries were incorrectly skipped for months within the wrong fiscal year. This change ensures accurate depreciation calculations, particularly for companies using shortened fiscal years like May-December.
Original PR description
When a company has a shortened fiscal year defined via account.fiscal.year (e.g. May-December), the depreciation board computation for degressive assets incorrectly computes the start of the next…
When a company has a shortened fiscal year defined via account.fiscal.year (e.g. May-December), the depreciation board computation for degressive assets incorrectly computes the start of the next fiscal year using `date_from + 1 year` instead of querying the actual next fiscal year. This causes entries for the months between the wrong and correct FY start (e.g. January-April) to be skipped entirely. Step to reproduce: - Create a company with a fiscal year starting in May (e.g. May 1st 2025 to 31st December 2025) - Create an asset with a start date in the 1 December 2025, with a 24 months duration and degressive method - Compute the board and observe that entries from January to April 2026 are missing Fix the FY boundary detection in _recompute_board to query the fiscal year containing the day after the current period end, revert the effective_start_date logic in _compute_board_amount that was masking the root cause, and move the prorata date clamping to _create_move_before_date where it is needed for disposal. opw-6016834 Forward-Port-Of: odoo/enterprise#113521
This update resolves a problem where EPD bills weren't correctly marked as paid after a payment was recorded. The fix ensures that payment states accurately reflect the transaction status, preventing delays in financial reporting. This improves the reliability of our accounting processes.
Original PR description
Steps to reproduce: - Create an early payment term. - Create a Vendor Bill with EPD and post it. - Register a payment for this bill (no outstanding account set on journal => no move created). - Create a bank transaction fully paying the bill. - Reconcile the transaction with the bill. Issue: Access the payment of the bill. The payment state remains 'in_process' instead of 'paid'. opw-5881976 Backport of https://github.com/odoo/enterprise/commit/3dc53e00600c9030fc5e85f2e0ca448fa135e9b1 Forward-Port-Of: odoo/enterprise#113546
This update resolves an issue where the checkout process became unresponsive when using Brazilian tax calculations (AVATax) with the website sale module. The previous implementation unnecessarily called external tax APIs, leading to errors. This fix removes the redundant API call, improving checkout stability and performance.
Original PR description
Issue: --- The extra external_tax call introduced in odoo/enterprise#101579 is causing multiple issues: 1- It doesn't catch errors while `_get_and_set_external_taxes_on_eligible_records` easily raises errors, causing uncatch errors in `website_sale`. 2- Extra unnecessary external api call in non-express checkout methods which is not desirable. Steps to reproduce: --- 1- Install l10n_br_avatax_sale, website_sale 2- Using a public user, add a product to cart and got to checkout. 3- In the address form, use CPF identification type. Outcome: The confirm button is unresponsive. Cause: --- This is due to uncatch error raised by external tax call, while it was not necessary at this step of this flow to call external tax api. opw-6005767 Forward-Port-Of: odoo/enterprise#113705 Forward-Port-Of: odoo/enterprise#112515
This update corrects a flaw in how Odoo's Google appointment booking system calculates resource availability. Previously, it reserved the entire party size, leading to overbooking. The fix ensures accurate spot allocation, preventing double-booking and improving the scheduling process. This enhancement ensures a smoother and more reliable booking experience for users.
Original PR description
The current logic inside the appointment google reserve controller to compute reserved and used capacity per resource was incorrect. It was reserving the full party size for each resource instead of properly computing how much spots we are reserving for each. The code was fixed and a test was adapted for proper coverage. Task-6120016 Forward-Port-Of: odoo/enterprise#113805
This update resolves a crash that occurred when confirming rental orders with kit products containing multiple components in different locations. The change uses a safer method to handle multiple pick transfers, preventing a 'singleton error' and ensuring rental orders can be processed correctly. This improves the stability and reliability of the rental product functionality.
Original PR description
Problem: When you confirm a rental order that has a kit product whose components use two different pack locations Odoo crashes with a singleton error. You get this singleton error because Odoo tries…
Problem: When you confirm a rental order that has a kit product whose components use two different pack locations Odoo crashes with a singleton error. You get this singleton error because Odoo tries to assign both picks as the `return_id` because they share the same `sale.order.line` here: https://github.com/odoo/enterprise/blob/2212b3f3f3d90894dd6351defe0d3ca090584955/sale_stock_renting/models/sale_order_line.py#L404
Purpose: Use [:1] to safely handle the case where multiple pick transfers are created, avoiding a crash when assigning return_id which expects a single record.
Steps to Reproduce on Runbot:
1. Enable mutli-step routes and rental transfers.
2. Set the warehouse to 3-step delivery.
3. Copy the existing packing location.
4. Copy the existing pick operation type and set the destination location to the new packing location.
5. Create a new route.
6. Create new rules on this new route with the following configurations:
1. Rule 1
1. Action: Pull
2. Source location: WH/Stock
3. Destination location: Partners/Customers
4. Operation type: The new pick operation type
2. Rule 2
1. Action: Push
2. Source location: New pack location
3. Destination location: WH/Output
4. Operation type: Pack
3. Rule 3
1. Action: Push
2. Source location: WH/Output
3. Destination location: Partners/Customers
4. Operation type: Delivery
7. Create 2 component products tracked by inventory, and apply the new route on one of the component products.
8. Create a new rental product with a kit, which has the 2 component products.
9. Create a new rental order for the kit product and confirm it.
opw-6026918
Forward-Port-Of: odoo/enterprise#112543This update addresses a requirement from Mexican tax authorities (SAT) that prevents signing payments if they are registered in the future. The code now filters out future payments, removing the 'Update Payments' button when only future payments are present. This ensures compliance with regulations and avoids potential issues.
Original PR description
To sign a payment registered in the future is not allowed by the government. See http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/Guia_llenado_pagos.pdf Steps: - Create a PDD invoice (the due date should be at least 1 month later than the invoice date) - Send it to CFDI - Register a payment in the future -> We have the 'Update payments' button that appear on the invoice view, if you clik on it the payment will be signed With this commit, we filter out the payments with a future date, that way we don't have the 'Update Payments' button if there are only future payments, or the future payments won't be taken into account when clicking on the button. opw-5934753 Forward-Port-Of: odoo/enterprise#112320
23 changes
New functionality added to Odoo
This update introduces support for Flexi-Jobs, a key feature in Belgium's payroll system. It implements two crucial rules: a percentage-based remuneration deduction (flexi-pecule) and an exemption from ONSS and withholding taxes for the first €18,440 of annual earnings. This enhancement simplifies payroll processing for employees in flexible work arrangements.
This update adds a new Balance Sheet report specifically designed to meet the requirements of Mexican financial regulations (NIF B-6). This ensures accurate reporting for Mexican businesses using Odoo Enterprise, aligning with local accounting standards.
Original PR description
Added new Balance Sheet report compliant with Mexican NIF B-6 regulation. task-5943953 target: master
This update enhances the calculation of Belgian holiday pay by introducing configurable limits for employee time-off durations based on their Joint Committee. It automatically flags allocations exceeding these limits, providing a warning and allowing for review, ensuring accurate payroll processing and compliance with Belgian regulations. This improves the accuracy and reliability of holiday pay calculations.
Original PR description
This PR extends the changes in Odoo Community by introducing a rule-parameter-based
configuration for Belgian brief holidays and related payroll warnings.
- Configure maximum allowed allocation durations per Joint Committee using
`hr.rule.parameter` and `hr.rule.parameter.value`, with values defined as
dictionaries mapping JC codes to durations.
- Implement logic on `hr.leave.allocation` to:
- Retrieve the maximum allowed duration from rule parameters based on the
leave type and employee’s Joint Committee.
- Detect when an allocation exceeds this duration.
- Display a warning message on the allocation form.
- Add a Payroll dashboard warning highlighting allocations that exceed the
authorized duration, with a smart action to review them on the list view.
TaskID-5375069This update introduces a new salary structure specifically designed for casual employees within the Odoo Enterprise system. This change allows for accurate payroll calculations and reporting for this previously unsupported employee type, ensuring compliance with Hong Kong regulations. It impacts payroll processing and reporting related to casual staff.
Original PR description
Add a new salary structure for casual employees. task-5366390
Enhancements to existing features
This update seamlessly connects the Documents app with Project Tasks, automatically syncing attachments and providing easy access via a new 'Documents' button. A key addition is a warning system to alert users about potential access rights changes when linking documents to tasks, ensuring data security and preventing unintentional data exposure.
Original PR description
Previously, there was no connection between the Documents app and Project Tasks (`project.task`). Attachments added to a task via the chatter were not synced to the Documents app, and documents…
Previously, there was no connection between the Documents app and Project Tasks (`project.task`). Attachments added to a task via the chatter were not synced to the Documents app, and documents manually saved from the chatter lacked a link back to the corresponding task. This PR bridges that gap. Implementation Details: - Automated Syncing: Inherited `documents.mixin` on `project.task`. Now, whenever an attachment is added to a task via the chatter, the system automatically creates a corresponding Document and links it back to the task. - Improved Navigation: Added a 'Documents' stat button to the task form view, giving users one-click access to all files associated with that task. - Access Rights UI Warning: Added a visual warning in `documents_details_panel`. When a user links a document to a specific record, the UI now warns them that this action may broaden the document's visibility (since the linked attachment inherits the access rights of the parent record). This prevents users from unknowingly exposing sensitive data to portal users or unauthorized internal users. task-5941719
This update enhances the accuracy of Dimona declaration reporting within Odoo Enterprise. Two new warnings have been implemented to identify missing employee information and unpaid payslips, ensuring compliance and providing clearer insights for users. The changes also include improved data storage for employee details within the Dimona declaration.
This update improves the creation of financial reports by allowing external data to be directly linked to existing Odoo records. This eliminates manual data entry, reducing errors and saving users significant time when generating reports like the 'Liasse Fiscale'. The change also corrects a previous issue with string-based external values, ensuring accurate reporting.
Original PR description
External values should be linkable to an existing model. For example, in the french accounting report "Liasse Fiscale", users have to manually fill a lot of fields. For that purpose, external values are used. However, sometimes, the required info are already known in Odoo. Users currently need to rewrite everything manually. It comes with a high risks of errors and time lost encoding data. As those type of forms will become more and more frequent in Odoo, we improve it in generic for everyone. task-5951888
This update allows administrators to set payment tolerance specifically for each journal, addressing previous limitations where a single global setting impacted all accounts. It also introduces a new option to prioritize matching invoices based on either the oldest or newest date when multiple invoices share the same details, leading to more accurate reconciliation processes.
Original PR description
Before: - Payment tolerance for bank fees was managed globally through a system parameter. - It was difficult for users to adjust and applied to all journals. - If multiple invoices matched, the system selected the invoice with the closest prior or equal date. After: - Added payment tolerance to journal settings under Advanced Settings. - Tolerance is now configured per journal. - Added a matching order option to choose whether reconciliation should match the oldest or newest invoice when multiple invoices share the same partner and amount. Impact: - Allows configuring payment tolerance per journal. - Improves reconciliation behavior when multiple invoices have the same amount for the same partner. Related PR-https://github.com/odoo/upgrade/pull/9806 taskID-5985965
This update enhances how approval notifications are handled in Odoo. It introduces a new message subtype for both approved and rejected approvals, making it easier to filter and manage these notifications. This improves the clarity and organization of approval-related messages within the system.
Original PR description
Adds a message subtype to approval added via studio, when they are approved / rejected for easy message filtering. BEFORE: The message type from an approval notification was a note. NOW: The message type from an approval notification is a validated approval or a rejected approval. WHY: Allows filtering of approval message by subtypes in ` Settings > Technical (debug) > Messages`, Community PR: https://github.com/odoo/odoo/pull/252759 task#5961149
This update improves room booking functionality by limiting users' views to only the companies they are authorized to use. Previously, users could see bookings across all companies. This change aligns with existing multi-company rules and enhances data security and user experience.
Original PR description
Currently, users can see room bookings from all companies. After this PR, users will only see bookings from their allowed companies. Technical: Add an ir.rule record to restrict room.booking records based on the user's allowed companies, consistent with the existing multi-company rules for room.room and room.office.
This update implements the core functionality for CP302 (Joint Committee 302) in Belgian payroll, a key regulatory requirement. It includes features like seniority calculations, various work entry types with premium adjustments, and specific allowances for students and work clothes. This ensures Odoo Enterprise continues to meet Belgian tax and labor law standards.
Original PR description
In this commit, we introduced the basics implementation of CP302 (Joint Committee 302) for Belgian Payroll - Add employee seniority field with automatic calculation - Add work entry types: night work, Sunday/holiday work, flexible work with seniority-based premiums - Add student wage reductions and work clothes allowance - Add CP302 salary scales, Crew/Chef de Partie contract templates task-3081508
This update enhances the pickup delivery process by updating how pickup locations are retrieved, aligning with recent changes in Odoo. It ensures accurate pickup location data is used, streamlining the order fulfillment workflow and improving delivery accuracy. This change was driven by a community enhancement to address data retrieval issues.
Original PR description
*: website_delivery_sendcloud, website_sale_fedex This PR adds several improvements to pickup delivery feature. All details are in community PR. Community PR: odoo/odoo#160187 Upgrade PR: odoo/upgrade#6315 Task-3645144
This update allows employees to use fuel cards for private vehicle use, offering a more flexible transportation benefit. The system now splits fuel card expenses between taxable private rides (for ONSS and withholding taxes) and non-taxable daily commutes (affecting only withholding taxes). This simplifies benefit administration and provides greater employee choice.
Original PR description
Allow employees to have a fuel card without requiring a company car. This enables more flexible transportation benefits where employees can use a fuel card for private vehicles. Changes: - Add fuel_card_private_ride field to split fuel card between private rides (subject to ONSS and withholding taxes) and daily commute (only impacts withholding taxes) - Create new salary rules FUEL.CARD.PRIV and FUEL.CARD.COMMUTE to handle the split taxation - Remove dependency between fuel_card and transport_mode_car in views and onchange methods - Include fuel card private ride in gross salary calculation The private ride portion is taxable for both ONSS and withholding taxes, while the commute portion only affects withholding taxes. task-5486140
This update adjusts how invoices are handled for Colombian tax reporting (DIAN) to align with current regulations. It now allows non-service products to use mandates and enables different principals for individual invoice lines. This simplifies compliance and supports a wider range of product types.
Original PR description
Allow non-service products as mandate contracts since DIAN no longer restricts this. Remove the mandate principal field from the invoice header and use the standard partner_id field on the lines instead. This way individual invoice lines can have different principals. task-5498047
This update enhances the timesheet assistant by adding icons next to each rule type in the views. This provides a clearer visual representation for users configuring rules, making the process more intuitive and efficient. Additionally, a bug fix has been implemented to prevent issues with default scope settings when selecting rule types.
Original PR description
Task-6094928
This update introduces a new, more flexible way to connect to Avalara, leveraging Odoo's IAP proxy. Users can now choose between using their existing Avalara credentials or creating a new account directly within Odoo. This simplifies the integration process and enhances reliability.
Original PR description
Allow connecting to Avalara through Odoo's IAP proxy ("Avalara Included") as an alternative to direct API credentials ("Avalara Direct"). Users can either create a new Avalara account from within Odoo or migrate an existing direct account to the IAP-backed flow.
The `AvataxClient` now dispatches requests through the IAP proxy or directly based on the chosen connection method. Ping also fetches company info and nexus locations.
task-5259842Resolved issues and error corrections
This update corrects the employment bonus calculations in Odoo's Belgian payroll module (l10n_be_hr_payroll) to reflect the latest regulations from Partena Professional, effective April 1, 2026. This ensures accurate payroll processing for Belgian employees and maintains compliance with local tax laws.
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 ticket submissions with emails in different cases (e.g., 'Partner@mail.com' vs. 'partner@mail.com') incorrectly created a new partner. Now, the system correctly identifies and uses the intended partner, preventing duplicate entries and ensuring accurate ticket assignment.
Original PR description
**Steps to reproduce** - Create a first partner (name: "Partner", email: "partner@mail.com", phone: "123"). - Go to the website form of a helpdesk team, and submit a ticket using "Partner@mail.com"…
**Steps to reproduce**
- Create a first partner (name: "Partner", email: "partner@mail.com", phone: "123").
- Go to the website form of a helpdesk team, and submit a ticket using "Partner@mail.com" as email (notice the different capitalization) and "456" as phone number.
Behavior without this fix: a new partner is created, but the ticket is assigned to the orignal partner ("partner@mail.com") and its phone number is updated.
Behavior after this fix: no partner is created.
**Causes**
- the partner search was case sensitive
- the created partner was not used as the `partner_id` of the ticket as it was added to the params but needs to be in the kwargs passed to `handle_website_form` in order to be found used by `extract_data`. The original partner was found in `_find_or_create_partner` by the call to
`_mail_find_partner_from_emails` (case-insensitive)
Note: this commit also ensures consistency between the partner's company and the ticket's company (same as in `_find_or_create_partner` of `helpdesk.ticket`).
Also, avoid allowing modifying existing partner's phone via this form.
opw-5914064
Forward-Port-Of: odoo/enterprise#113613
Forward-Port-Of: odoo/enterprise#109393This update fixes an issue where subscription discounts were incorrectly calculated due to how the base plan price was used. The fix ensures accurate discount calculations by dividing the base plan price by its unit, leading to more reliable pricing on subscription product pages. This improves the consistency and accuracy of subscription offerings.
Original PR description
### Steps to reproduce: - Install Subscriptions and eCommerce modules - Create 3 recurring plans (3 months, 6 months, Yearly) - Create a service subscription product with the created recurring plans - Check the product's page on website - Notice each pricing has a discount tag and with incorrect numbers ### Cause: When calculating the discount we normally use the fixed price of the base plan as the price to compare with. This sometimes introduce inconsistencies if the base plan is not just one unit from the period (>1 week/month/year) ### Fix: We divide the base_plan_price by the unit of the plan so we can get the price of just one plan unit. opw-6048278 Forward-Port-Of: odoo/enterprise#112305
This update resolves an issue where bank statement lines were incorrectly defaulting to 'upload bills.' Now, the system accurately distinguishes between positive and negative bank statements, presenting the appropriate 'upload bills' or 'upload invoices' option. This ensures accurate reconciliation processes.
Original PR description
Fixed an issue where the default for positive and negative bank statement lines were upload bills, now it distinguishes between positive and negative bank statement lines and shows upload bills/invoices accordingly.
This update fixes a calculation error in the employment bonus payments for Belgian businesses. The change ensures that the bonus calculations now fully comply with the specific rounding requirements outlined by Belgian social security regulations, as detailed in the official documentation. This ensures accurate and compliant bonus payments for employees.
Original PR description
The employment bonus computation was missing two roundings steps that are explicitely asked for in the following documentation: https://www.socialsecurity.be/employer/instructions/dmfa/fr/latest/instructions/deductions/workers_reductions/workbonus.html Forward-Port-Of: odoo/enterprise#113776
This update fixes an issue where global invoices generated from customer invoices weren't correctly incorporating the issued address's zip code into the XML file. The change ensures that the 'LugarExpedicion' field in the XML accurately reflects the customer's shipping address, improving compliance with Mexican tax regulations. This resolves a reported problem (opw-5956837) and ensures accurate invoice data.
Original PR description
**STEP TO REPRODUCE** 1. install l10n_mx_edi_extended. 2. Add an issued address on the customer invoice journal, with a zip code. 3. Create invoices, and create a global invoice with them. 4. download the xml, and notice the field LugarExpedicion is not using the zip from the issued address while it should. opw-5956837 Forward-Port-Of: odoo/enterprise#112523 Forward-Port-Of: odoo/enterprise#108732
A recent update removed essential COA buttons from the l10n_mx_reports trial balance report for Mexican businesses. This fix restores these buttons, ensuring users can generate required COA documents as mandated by Mexican accounting regulations. This resolves a critical issue impacting report functionality.
Original PR description
After https://github.com/odoo/enterprise/pull/103445, the multiple mx modules reports were merged into one, on that transition it seems that the buttons required to print the COA documents were removed. As these are a necessary documents in MX localization, we add them again since they should not be removed. How to reproduce: - Install l10n_mx_reports module with demo data - Change to INNOVACION VALOR Y DESARROLLO SA SA company - Go to accounting app and select Trial Balance under reporting menu - Click on gear button. - COA SAT and SAT buttons don't appear. target: master
8 changes
Enhancements to existing features
This update simplifies the Balance Sheet report to clearly separate Earnings and Equity, enhancing financial reporting clarity. The changes improve the charts of accounts to better show how earnings are allocated, providing a more straightforward view of key financial metrics. This impacts both the standard and US versions of the report.
Original PR description
Simplifying the structure of the Balance Sheet in order to distinguish clearly **Earnings** and **Equity**, in the generic and US balance sheet. Improving the generic and us charts of accounts to better highlight the account pair for the allocation of earnings. task-6053852
Resolved issues and error corrections
This update resolves a problem where navigating back in the documents module (specifically in kanban and list views) caused the page to reload unnecessarily. The fix ensures correct page restoration and avoids reopening the same folder after a back navigation, improving the user experience. This prevents data inconsistencies and frustration for users.
This update fixes a calculation error in the employment bonus payments for Belgian companies using the l10n_be_hr_payroll module. The change ensures that bonus calculations now precisely align with the requirements outlined by Belgian social security regulations, as detailed in the official documentation. This correction guarantees accurate and compliant bonus payments.
Original PR description
The employment bonus computation was missing two roundings steps that are explicitely asked for in the following documentation: https://www.socialsecurity.be/employer/instructions/dmfa/fr/latest/instructions/deductions/workers_reductions/workbonus.html
This update fixes an issue where refunds weren't correctly reflected when calculating outstanding balances in the POS system. Previously, only regular orders were considered, leading to inaccurate due amounts. Now, refund orders with negative totals are included, ensuring accurate due calculations and a better user experience.
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 Forward-Port-Of: odoo/enterprise#113458 Forward-Port-Of: odoo/enterprise#107883
This update corrects a bug in how Odoo calculates depreciation for assets with shortened fiscal years. Previously, the system incorrectly skipped months during depreciation, particularly in the transition between fiscal years. This fix ensures accurate depreciation calculations for companies using non-standard fiscal year cycles.
Original PR description
When a company has a shortened fiscal year defined via account.fiscal.year (e.g. May-December), the depreciation board computation for degressive assets incorrectly computes the start of the next…
When a company has a shortened fiscal year defined via account.fiscal.year (e.g. May-December), the depreciation board computation for degressive assets incorrectly computes the start of the next fiscal year using `date_from + 1 year` instead of querying the actual next fiscal year. This causes entries for the months between the wrong and correct FY start (e.g. January-April) to be skipped entirely. Step to reproduce: - Create a company with a fiscal year starting in May (e.g. May 1st 2025 to 31st December 2025) - Create an asset with a start date in the 1 December 2025, with a 24 months duration and degressive method - Compute the board and observe that entries from January to April 2026 are missing Fix the FY boundary detection in _recompute_board to query the fiscal year containing the day after the current period end, revert the effective_start_date logic in _compute_board_amount that was masking the root cause, and move the prorata date clamping to _create_move_before_date where it is needed for disposal. opw-6016834 Forward-Port-Of: odoo/enterprise#113521
This update fixes an error in how invoice periods are calculated for subscriptions with 'Align to Period Start' enabled. Previously, invoices displayed an incorrect date range. Now, invoice periods accurately reflect the subscription's start date and end on the last day of the month, ensuring accurate billing.
Original PR description
Steps to reproduce: ------------------------------------- 1. Install the Subscription module. 2. Go to Subscription > Configuration > Recurring Plans. * Open a Monthly recurring plan and enable Align…
Steps to reproduce: ------------------------------------- 1. Install the Subscription module. 2. Go to Subscription > Configuration > Recurring Plans. * Open a Monthly recurring plan and enable Align to Period Start. 3. Create a new Subscription: * Select the configured monthly plan. * Add any subscription product. * In the Other Info tab, set a Start Date in the past on the 1st day of a month (e.g., 01/11/2025). 4. Confirm the subscription. 5. Create a draft invoice. Observation: ----------------------------------- In the invoice line, you see the message: `61 days 11/01/2025 to 12/31/2025` It should be: `1 Month 11/01/2025 to 11/30/2025` Issue: ----------------------------------- https://github.com/odoo/enterprise/blob/a5a76de5f25483afa5432ed333c48d78832f128c/sale_subscription/models/sale_order_line.py#L376-L378 In `_get_invoice_line_parameters`, the computation attempts to find the next 1st day of the month However, `new_period_stop` already includes the billing period. When `new_period_stop` is in the past, an extra month is added through `new_period_stop + relativedelta(months=1)`, resulting in an incorrect period range Solution: ----------------------------------- Use `new_period_start` as the anchor point for period computation. Ensure the billing period ends on the last day of the starting month when Align to Period Start is enabled For upsell orders, the fix is NOT applied because for upsells, `new_period_stop` is already set to the parent subscription's `next_invoice_date`, which represents the correct billing boundary. opw-5920036
This update resolves an issue where the AI composer was causing instability in the base mail composer. The fix ensures that focus events are correctly passed, preventing a crash when the AI composer triggers focus. This improves the overall reliability of the AI composer within the Enterprise module.
Original PR description
**Purpose of this PR:** The AI composer patch overrides `Composer.onFocusin()` but did not forward the focus event to the base handler. This used to be harmless while the base mail composer focus handler did not use the event. Since odoo/odoo#258974, the mail composer now uses the event to stop `focusin` propagation, so dropping it makes the base handler crash when AI composer focus is triggered. This commit fixes the AI composer patch by forwarding the focus event to the base handler, preserving the expected handler contract. Related: odoo/odoo#258974 Task-5954657 Forward-Port-Of: odoo/enterprise#113763
This update resolves a crash issue that occurred when confirming rental orders with kit products using multiple pick locations. The change utilizes a safer method to handle multiple pick transfers, preventing a 'singleton error' and ensuring rental orders can be processed correctly. This improves the reliability of the rental product functionality.
Original PR description
Problem: When you confirm a rental order that has a kit product whose components use two different pack locations Odoo crashes with a singleton error. You get this singleton error because Odoo tries…
Problem: When you confirm a rental order that has a kit product whose components use two different pack locations Odoo crashes with a singleton error. You get this singleton error because Odoo tries to assign both picks as the `return_id` because they share the same `sale.order.line` here: https://github.com/odoo/enterprise/blob/2212b3f3f3d90894dd6351defe0d3ca090584955/sale_stock_renting/models/sale_order_line.py#L404
Purpose: Use [:1] to safely handle the case where multiple pick transfers are created, avoiding a crash when assigning return_id which expects a single record.
Steps to Reproduce on Runbot:
1. Enable mutli-step routes and rental transfers.
2. Set the warehouse to 3-step delivery.
3. Copy the existing packing location.
4. Copy the existing pick operation type and set the destination location to the new packing location.
5. Create a new route.
6. Create new rules on this new route with the following configurations:
1. Rule 1
1. Action: Pull
2. Source location: WH/Stock
3. Destination location: Partners/Customers
4. Operation type: The new pick operation type
2. Rule 2
1. Action: Push
2. Source location: New pack location
3. Destination location: WH/Output
4. Operation type: Pack
3. Rule 3
1. Action: Push
2. Source location: WH/Output
3. Destination location: Partners/Customers
4. Operation type: Delivery
7. Create 2 component products tracked by inventory, and apply the new route on one of the component products.
8. Create a new rental product with a kit, which has the 2 component products.
9. Create a new rental order for the kit product and confirm it.
opw-6026918
Forward-Port-Of: odoo/enterprise#1125435 changes
Resolved issues and error corrections
This update ensures that the date range used to fetch transactions from iap is always accurate. Previously, incorrect dates could be used, leading to inaccurate data. Now, the system uses the latest statement or statement line date, prioritizing the lock date to guarantee correct transaction retrieval.
Original PR description
To fetch transactions from iap, we have to give a date from. Before this commit, it was possible to have a date from prior the lock date which is not supposed to happen. This commit will do the max between the lock date the last date of either the statement or the statement line. task-6019584
This update resolves an issue where a new document was repeatedly created when a user removed their Peppol journal. Previously, acknowledgements weren't sent, leading to a loop of duplicate document generation. This change ensures proper document handling and acknowledgement transmission, improving the reliability of Peppol integrations.
Original PR description
When a user removes its journal on its Peppol configuration, when receiving one, a new document would be created but the acknowledgement would never be sent to IAP. Everytime the user tries to retrieve new documents, the same document would then be created again.
This update addresses a regulatory requirement from the Mexican government (SAT) regarding CFDI payments. The system now prevents users from registering payments with future dates, eliminating the 'Update Payments' button when future payments are present. This ensures compliance and avoids potential issues with payment signing.
Original PR description
To sign a payment registered in the future is not allowed by the government. See http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/Guia_llenado_pagos.pdf Steps: - Create a PDD invoice (the due date should be at least 1 month later than the invoice date) - Send it to CFDI - Register a payment in the future -> We have the 'Update payments' button that appear on the invoice view, if you clik on it the payment will be signed With this commit, we filter out the payments with a future date, that way we don't have the 'Update Payments' button if there are only future payments, or the future payments won't be taken into account when clicking on the button. opw-5934753 Forward-Port-Of: odoo/enterprise#112320
This update fixes an issue where the table menu options weren't updating when the selected cell changed. The fix ensures that the menu accurately reflects the current target cell by updating values in real-time. This improves the user experience and data accuracy within the table editor.
Original PR description
After this commit [1], setup is executed only on the initial mount of the table menu and not on subsequent target cell changes. As a result, colItems, rowItems, and other values found in setup become stale, causing the menu to display options that do not reflect the current target cell. This commit moves the necessary values from setup into useEffect so they update correctly when the target cell changes. task-6111986 [1]: https://github.com/odoo/odoo/commit/7d523d6402c9bff3c2e4bcd0329f486a2d0f45ec Backport of Commit https://github.com/odoo/odoo/commit/729c45ddf3d1e377507d93997c5ca45984d64d75
This update resolves an issue where a Peppol document would repeatedly be created when a user removed their journal configuration. The fix ensures that acknowledgements are properly sent to IAP, preventing data duplication and improving the reliability of Peppol document processing. This ensures accurate data exchange and avoids unnecessary system load.
Original PR description
When a user removes its journal on its Peppol configuration, when receiving one, a new document would be created but the acknowledgement would never be sent to IAP. Everytime the user tries to retrieve new documents, the same document would then be created again.
4 changes
Enhancements to existing features
This update switches from a problematic VIES check to a more reliable IAP server for validating EU Tax IDs. This resolves frequent errors, particularly with French Tax IDs, and ensures partners can accurately process intra-com transactions. Security measures, including HMACs and cron polling, are implemented for secure data updates.
Original PR description
Currently, when changing the Tax ID of a partner that is another EU country, we perform a VIES check to know whether it is valid (i.e. can do intra-com). However, it is often the case that the VIES check fails because of an internal error on their side (timeout, max concurrent update, ...), especially for France. Instead, we will now use the IAP server which stores the validity of a Tax ID for some time. If the IAP server does not have the info (because VIES is down), we will not actively wait. Instead, IAP will perform a push to a webhook on the client database once it has the information. For security purposes, an HMAC is generated and sent to IAP so that only IAP can contact the db with the up-to-date info, and not anyone on the internet that calls this new webhook. There is also a cron for polling for OnPrem instances that cannot be contacted via the webhook. task-5977584
Resolved issues and error corrections
This update addresses a regulatory requirement in Mexico regarding electronic payments (CFDI). The system now prevents users from registering payments with future dates, which are not permitted by government regulations. This ensures compliance and avoids potential issues with payment processing.
Original PR description
To sign a payment registered in the future is not allowed by the government. See http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/Guia_llenado_pagos.pdf Steps: - Create a PDD invoice (the due date should be at least 1 month later than the invoice date) - Send it to CFDI - Register a payment in the future -> We have the 'Update payments' button that appear on the invoice view, if you clik on it the payment will be signed With this commit, we filter out the payments with a future date, that way we don't have the 'Update Payments' button if there are only future payments, or the future payments won't be taken into account when clicking on the button. opw-5934753
This update resolves an issue where Mercado Pago webhooks with invoice references containing slashes (like INV/2026/00001) were not being correctly processed, resulting in 404 errors. The fix allows the webhook to handle these references, ensuring accurate processing of Mercado Pago payments. This improves the reliability of payment integrations.
Original PR description
Currently, the mercado_pago_webhook http route only takes into consideration 1 url segment. This means that invoices with references like INV/2026/00001 don't match any defined route and the server returns a 404. /payment/mercado_pago/webhook/S00001 => OK /payment/mercado_pago/webhook/INV/2026/00001 => KO This commit allows references with slashes to be matched by the route by capturing the entire remaining url path including the slashes. /payment/mercado_pago/webhook/S00001 => OK /payment/mercado_pago/webhook/INV/2026/00001 => OK opw-6035161 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue preventing credit notes with currency exchange differences from being posted correctly. The fix bypasses a validation error that occurred when automatic exchange moves didn't include the required analytic plan distribution. This ensures credit notes with exchange moves can now be successfully processed.
Original PR description
**Issue:** When a user posts a credit note with a currency exchange difference relative to the reversed move, the resulting exchange move lines lack the mandatory analytic distribution. This triggers…
**Issue:** When a user posts a credit note with a currency exchange difference relative to the reversed move, the resulting exchange move lines lack the mandatory analytic distribution. This triggers a validation error, preventing the credit note from being posted. **Steps to reproduce:** - Set "mandatory" applicability on any analytic plan. - Set two different currency rates on two different dates for any foreign currency. - Create and post an invoice on the first date (ensure the mandatory analytic distribution is set). - Create a credit note from that invoice using the second date. - Click on the post button on the credit note. Result: A validation error occurs even though the credit note itself has the mandatory analytic plan set, because the auto-generated exchange move does not. **Fix:** Since the context key validate_analytic is set to True by the post button action, it must be manually set to False during the automatic creation of exchange difference moves to bypass the mandatory plan check. OPW-6081632