Daily updates from Odoo
Thursday, February 12, 2026
83 changes
22 changes
New functionality added to Odoo
This update ensures Odoo's Point of Sale system in Guatemala complies with local regulations. It automatically sets a default customer and prevents invoices from being generated for unidentified customers exceeding a defined threshold, avoiding rejection by the Guatemalan tax authority (SAT).
Original PR description
Purpose: This module links the `point_of_sale` module with the `l10n_gt_edi` module. It is required in Guatemala to comply with Guatemalan Point of Sale legislation. Before this commit: - POS orders…
Purpose: This module links the `point_of_sale` module with the `l10n_gt_edi` module. It is required in Guatemala to comply with Guatemalan Point of Sale legislation. Before this commit: - POS orders had no default customer. - Invoices generated for unidentified customers exceeding the legal threshold, leading to SAT rejections after submission. - GT Phrases configured on company were missing on the invoices generated through POS causing the electronic document to be rejected by SAT. After this commit: - Consumidor Final is set as the default customer on POS orders. - POS invoices cannot be generated for unidentified customers when the total exceeds the legal threshold (currently Q2500). - GT phrases configured on the company are now applied to POS invoices, ensuring valid electronic document submission to SAT. Technical Details: - Added a configurable legal threshold field on POS configuration. - Added validation to block invoicing when an unidentified customer exceeds the configured threshold. - Added a missing `super()` call in `l10n_mx_edi_pos` to ensure proper method chaining when multiple POS localizations are installed. related PR https://github.com/odoo/odoo/pull/242985 task-4393614 Forward-Port-Of: odoo/enterprise#103767
Enhancements to existing features
This update ensures Odoo's Spanish tax reporting (l10n_es_report) complies with the latest requirements from the BOE (Agencia Tributaria) regarding the Modelo 347. A change was made to the export format to align with recent regulations, specifically addressing a lack of subsidy number data by adding placeholder zeros. This update is crucial for accurate tax reporting in Spain.
Original PR description
reference: https://www.boe.es/buscar/doc.php?id=BOE-A-2025-25390 considering the modelo 347 As we do not have anything for the subsidy number, we just put 6 0s. opw-5926624 Forward-Port-Of: odoo/enterprise#107125
Resolved issues and error corrections
A previous issue caused a timeout error in the website builder when adding elements like images, specifically when the system waited for user input after a dialog appeared. This update removes the timeout for these actions, preventing the error and ensuring a smoother user experience. It resolves a frustrating bug that prevented users from adding elements to their websites.
Original PR description
In [0] was added a timeout on operations, as an heuristic to detect when an operation is stuck. Unfortunately, when an action opens a dialog, waiting for the user to choose may go over the timeout limit, thus triggering the timeout. The timeout should be deactivated for those type of actions. This commit sets `canTimeout = false` on actions that open a dialog and wait for user choice in the `apply` method. Steps to reproduce: - Open website builder - Drop `s_sidegrid` snippet - Click on "Add Elements" option: Image - Wait 10sec - Bug: It show the error message "A technical issue occurred..." [0]: https://github.com/odoo/odoo/commit/6df83abb35c95ab42e55d9a08cf6c411efa64b3e Forward-Port-Of: odoo/odoo#248258
This update resolves an issue where event tickets with unlimited seats (seats_max=0) incorrectly showed as 'sold out' when the event itself had a limited number of seats. The fix ensures that these tickets accurately reflect the event's availability, providing a more reliable POS experience for customers.
Original PR description
We had a bug when selling event tickets in POS where tickets with seats_max set to 0 (which should mean unlimited) appeared as sold out when the event had seats_limited enabled. Steps to reproduce:…
We had a bug when selling event tickets in POS where tickets with seats_max set to 0 (which should mean unlimited) appeared as sold out when the event had seats_limited enabled. Steps to reproduce: ------------------- * Create an event with seats_limited=True and seats_max > 0 * Create a ticket for that event with seats_max=0 (unlimited) * Open POS and view the event product > Observation: Ticket appears as "Sold out" instead of showing available seats Why the fix: ------------ The frontend logic only treated tickets with seats_max=0 as unlimited when the event itself was not limited (!event.seats_limited). However, according to the backend logic, seats_max=0 means the ticket is unlimited regardless of the event's limitation status. When the event is limited, unlimited tickets should still respect the event's seats_available limit, not show as sold out. We now check for seats_max=0 independently of event limitation. If the event is not limited, tickets with seats_max=0 are fully unlimited. If the event is limited, we use the event's seats_available value (since the ticket doesn't constrain availability but the event does), ensuring correct display of availability status. opw-5475803 Forward-Port-Of: odoo/odoo#246102
This update resolves a technical issue that caused tracebacks when creating invoices for kit products using AVCO or FIFO valuation methods. The fix addresses a problem where the system incorrectly assumed a single product cost method for multi-component kits, leading to calculation errors. This ensures accurate cost of goods valuation for kit sales.
Original PR description
**Issue**: The computation of cogs value, in AVCO (or FIFO) setup with kit of several component leads to traceback **Steps to reproduce**: - Create a kit product with 2 components: - Inventory…
**Issue**:
The computation of cogs value, in AVCO (or FIFO) setup with kit of several component leads to traceback
**Steps to reproduce**:
- Create a kit product with 2 components:
- Inventory tracking enabled
- Use a category configured with AVCO and Perpetual (at invoicing) valuation
- Create a SO for the kit product and confirm it
- Go to the associated delivery and validate it
- Create and post the invoice on the so -> A traceback occurs
**Cause**:
In `_get_cogs_price_unit`, the code accesses `self.product_id.cost_method` assuming a singleton: https://github.com/odoo/odoo/blob/5d2e4b0f3fa8cdf2a977db05c7c2565b06ca2513/addons/stock_account/models/stock_move.py#L245 but `self.product_id` can be a multi-recordset when the sale line corresponds to a kit with multiple components https://github.com/odoo/odoo/blob/5d2e4b0f3fa8cdf2a977db05c7c2565b06ca2513/addons/stock_account/models/account_move_line.py#L67-L68 https://github.com/odoo/odoo/blob/5d2e4b0f3fa8cdf2a977db05c7c2565b06ca2513/addons/sale_stock/models/account_move.py#L155-L156
which causes the traceback.
**solution**
The solution has been inspired by this:
https://github.com/odoo/odoo/blob/008e69e8215fecc1f3fe45a36189592577cdc593/addons/stock_account/models/stock_move.py#L225-L228
opw-5880383
Forward-Port-Of: odoo/odoo#247775This update resolves an issue preventing custom JavaScript code added to the website from functioning properly. A recent change removed a key identifier, causing the system to misinterpret custom scripts. This fix ensures that developers can reliably add and use their own JavaScript to enhance the website's functionality.
Original PR description
[FIX] website: enable custom javascript on website Steps to reproduce the problem: - Go to the "HTML/ CSS Editor". - Go to the JS tab. - Uncomment the example and save. -> Problem: the confirmation…
[FIX] website: enable custom javascript on website Steps to reproduce the problem: - Go to the "HTML/ CSS Editor". - Go to the JS tab. - Uncomment the example and save. -> Problem: the confirmation dialog does not appear. The problem is that since [1], `/* @odoo-module */` has been removed from the file as since [2], js files in `/static/src` and `/static/tests` are considered as odoo module without the need of the annotation `odoo-module`. In order to understand the problem, here is a summary of what happens when a custom js code is saved; - An attachment is created with the custom js code. - An asset is created to replace the user custom rules of `user_custom_javascript.js` by the one of the newly created attachment. Because the url of the newly created attachment looks like `/_custom/web.assets_frontend_lazy/website/static/src/js/user_custom_javascript.js`, the transpiler does not recognize it as an odoo module. task-5925607 [1]: https://github.com/odoo/odoo/commit/6d2fda172ec9cc7642abe9625ca486c7769e8297 [2]: https://github.com/odoo/odoo/commit/5f2c505836002ac7851c29c28d612f721d467bc4 Forward-Port-Of: odoo/odoo#247959
This update fixes an issue where duplicate GS1 serial or lot numbers could be created when using the 'Default GS1 Nomenclature'. The change allows for the creation of multiple serial numbers with the same name, ensuring data integrity and preventing errors in inventory tracking. This improves the reliability of our stock management system.
Original PR description
## Issue When using the *Default GS1 Nomenclature*, it is possible to create multiple lots/serial numbers with a same name if that name matches a barcode rule pattern. ## Steps to reproduce 1.…
## Issue
When using the *Default GS1 Nomenclature*, it is possible to create multiple lots/serial numbers with a same name if that name matches a barcode rule pattern.
## Steps to reproduce
1. Install *Inventory* (`stock`)
2. In Settings, enable *Lots & Serial Numbers* and set *Barcode Nomenclature* to *"Default GS1 Nomenclature"*
3. Create a product tracked *By Unique Serial Number* or *By Lots*
4. In Inventory > Products > Lots / Serial Numbers, create a lot/serial number named *"101"* and set the product to the one created in the previous step
- The name *"101"* matches the pattern of the rule *"Batch or lot number"* (`(10)([!"%-/0-9:-?A-Z_a-z]{0,20})`)
5. Create a second lot/serial number with the same name and the same product
6. **The second lot/serial number is succesfully created**
## Cause
When comparing a (new) `stock_lot.name` to existing `stock_lot`s, the potential rules at the start of the name are removed by the `gs1_decompose_extended` method [here](https://github.com/odoo-dev/odoo/blob/e06282df3a7482cc327d3124e6c2b1c8bc55c2f0/addons/barcodes_gs1_nomenclature/models/barcode_nomenclature.py#L116-L125). This results in comparing **the end** of the new lot/serial number with **the entire** name of existings serials.
## Solution
Commit https://github.com/odoo/odoo/commit/3513b189a225ca52fc9fae94693f00f43ded71aa introduced the `skip_preprocess_gs1` context flag. This flag allows to skip the step that removes the start of the new lot/serial number before comparing it to existing serials.
## Test
The test for this commit is added in `stock_barcode` by [this PR](https://github.com/odoo/enterprise/pull/104720)
opw-5477003
Forward-Port-Of: odoo/odoo#244427This update resolves a problem that prevented users from sending invoices via PEPPOL, resulting in an error message. The fix ensures that attachments are correctly processed during the PEPPOL invoice sending process, allowing invoices to be sent without interruption. This improves the reliability of the accounting module for businesses using PEPPOL.
Original PR description
**Steps to reproduce:** - Install Accounting - Install a localization using PEPPOL (e.g. l10n_be) - Switch to a Belgian company - In Accounting settings, activate PEPPOL and Audit Trail - Create an…
**Steps to reproduce:** - Install Accounting - Install a localization using PEPPOL (e.g. l10n_be) - Switch to a Belgian company - In Accounting settings, activate PEPPOL and Audit Trail - Create an invoice: * Customer: [a Belgian customer with VAT] * Invoice Lines: [a line with a tax] - Confirm the invoice - Send the invoice via PEPPOL **Issue:** A UserError is raised: "You cannot remove parts of the audit trail.". **Cause:** The audit trail prevent modifying an attachment. When sending an invoice to PEPPOL, a message is logged in the chatter with both the invoice PDF and XML as attachment. During the process, "res_model" and "res_id" fields of the attachments are set to the message record. Before doing it, "res_id" is removed in SQL to prevent raising the audit trail error. However, it fails because the value is still in cache. **Solution:** Invalidate these fields as it is done when sending the invoice without PEPPOL. https://github.com/odoo/odoo/commit/e0229d5c7fa89d32f67151d307161482c300ff20 opw-5916696 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248220 Forward-Port-Of: odoo/odoo#247949
This update resolves an issue where serial numbers assigned to products during repair orders would disappear from the system. The fix ensures that serial numbers are correctly associated with stock movements, even when starting with generic stock, improving accuracy and traceability in repair processes. This prevents data discrepancies and ensures proper tracking of serialized items.
Original PR description
Steps to reproduce: 1. Create a storable product with tracking set to 'By Quantity'. 2. Update the Quantity on Hand (e.g., 100 units). 3. Change the product tracking to 'By Serial Number'. 4. Create…
Steps to reproduce: 1. Create a storable product with tracking set to 'By Quantity'. 2. Update the Quantity on Hand (e.g., 100 units). 3. Change the product tracking to 'By Serial Number'. 4. Create a Repair Order for this product. 5. Add a line, select a specific Serial Number, and click Save. 6. Observe that the serial number disappears. Cause: When reserving stock that was originally created as 'Generic' (no serial), the `_prepare_move_line_vals` method returns `lot_id=False`. The repair view uses `_compute_lot_ids` to display selected lots, which filters out any move lines where `lot_id` is False. This causes the new line to be effectively invisible to the UI immediately after creation. Solution: In the `_set_lot_ids` inverse method, explicitly force the `lot_id` into the create values dictionary (`move_line_vals`). This ensures that even if Odoo reserves generic stock, the resulting move line is born with the correct Serial Number identity, keeping it visible and valid. opw-5156267 Forward-Port-Of: odoo/odoo#248094 Forward-Port-Of: odoo/odoo#247150
A recent test failure was caused by a timing issue in the point-of-sale system. This update adds a brief pause to ensure that all necessary steps are completed before finalizing an order, particularly in scenarios involving local accounting (L10n). This prevents errors related to orders being marked as finalized prematurely.
Original PR description
The `test_point_of_sale_custom_tax_with_extra_product_field` test does a `PaymentScreen.clickInvoiceButton()` and then directly after that a `PaymentScreen.clickValidate()`. In l10n scenarios, the logic behind triggering the `toInvoice` field can take longer. This would cause the validation to execute before the `toggleIsToInvoice` finishes executing and then it would throw an error that the order was already finalized. This PR ads an extra wait on the `Invoice` button to make sure that the toggle is executed properly before finalizing the order. Runbot Error: [233024](https://runbot.odoo.com/odoo/runbot.build.error/233024) Task: [5897371](https://www.odoo.com/odoo/project/1737/tasks/5897371) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248191
This update fixes a display issue where the kitchen printer incorrectly printed "Order" alongside self-order items and resolves a bug where the 'Send To Kitchen' button remained visible after orders were already processed. The changes ensure accurate order transmission and a smoother user experience for self-order operations.
Original PR description
Configuration: ------------------------- - Restaurant Mode - Self-Order Mode: “QR + Ordering” - Service At: Table (Online Payment)…
Configuration:
-------------------------
- Restaurant Mode
- Self-Order Mode: “QR + Ordering”
- Service At: Table (Online Payment)
--------------------------------------------------------------------------------
Issue 1: Extra Order word print in KOT
---------------------
Steps to Reproduce:
1. Make an order using Self Order (QR).
2. Configure and enable the Kitchen Printer.
3. Check the KOT print it shows “Order Self-Order T2”.
Cause:
- The QWeb template always prefixed “Order” regardless of order type.
Fix:
- Added a condition to skip the “Order” label for self-order references:
--------------------------------------------------------------------------------
Issue 2: “Send To Kitchen” Button Visible even order in kitchen
---------------
Steps to Reproduce:
1. Open the Restaurant
2. Place a order from mobile menu and select a table.
3. In the Restaurant UI:
- Open that table. The "Send To Kitchen" button is still visible even
though the order was already sent to the kitchen and printed.
Cause:
- In self-order mode the order is not automatically synced after being sent to
the kitchen and print.
- As a result, the system still treats it as unsent, leaving the Order button
visible.
Fix:
- Synced the order state after sending it to the kitchen.
----------------------------------------------------
Task-5106704
Forward-Port-Of: odoo/odoo#246867
Forward-Port-Of: odoo/odoo#231005This update fixes an issue where combo product refunds weren't correctly handling orderlines with quantities exceeding the combo's total. Now, the POS accurately refunds the full quantity of each item within a combo, regardless of the individual orderline quantities. This ensures accurate refunds for complex combo orders.
Original PR description
When refunding a combo item, the 'To Refund' text would always show the same quantity for all the orerlines as for the combo. But combos could have orderlines with a higher quantity than the combo itself (i.e. 3 menus with 2 burgers each - 6 burgers in total. Now the POS would only let us refund up to the limit qty of the combo, so 3 instead of all 6 burgers) After the fix, we check the quantity of each line in the combo and we refund the full quantity (i.e. if you have a 3 menus with 2 burgers each - 6 burgers in total. The burgers will be divided per combo, so each menu refund will automatically refund 2 burgers.) Task-[5503962](https://www.odoo.com/odoo/project/1737/tasks/5503962) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244702
This update resolves an issue where the rental scheduling feature incorrectly limited the number of products grouped together. Previously, it only considered groups if the number of expanded products was strictly less than a set limit. Now, the system correctly includes all products in the grouping, ensuring accurate rental scheduling for all product quantities. This improves the usability of the rental module.
Original PR description
Versions -------- - 19.0+ Steps ----- 1. Create exactly 19 rental products. 2. Go to the rental schedule, and group by products. 3. Observe that all 19 product are used as groups. 4. Create one more product. Total: 20. 5. Go to the rental schedule, and group by products. Issue ----- Only the products with actual order line linked to them are used as groups, even if there isn't more products than the hard limit set on the gantt view (`sale_renting.sale_order_line_gantt_schedule`). Cause ----- In d5a6e97abab04282c7a69093cd790b539a958241, the expanded groups are taken into account only if `len(expand_groups) < limit`. However, this should be a less than _or equal_ condition. https://github.com/odoo/odoo/blob/d5a6e97abab04282c7a69093cd790b539a958241/addons/web/models/models.py#L345-L349 Solution -------- Use `<=` as the condition. opw-5887837 Forward-Port-Of: odoo/odoo#248001
This update fixes an issue where the barcode scanning process wasn't correctly creating quality checks for products tracked by lot. The change ensures that each unique lot within a receipt generates a separate quality check point, improving inventory accuracy and quality control. This ensures that all products are properly assessed when using the barcode scanning feature.
Original PR description
**Steps to reproduce:** * Install the `stock_barcode`, `quality_control` modules. * Go to *Inventory > Configuration > Settings* and enable **Packages**. * Create a product with **By Lot** tracking…
**Steps to reproduce:** * Install the `stock_barcode`, `quality_control` modules. * Go to *Inventory > Configuration > Settings* and enable **Packages**. * Create a product with **By Lot** tracking enabled and set a barcode reference. * Create a quality control point for this product with following configuration: * Operation: *Receipts* * Control per: *Quantity* * Control Frequency: *All* * Product: the previously created lot-tracked product. * Create a receipt for this product with a quantity of 6 and `mark as todo`. * Open the *Barcode* app and process the receipt. * Scan the product barcode. * Scan some quantity of the product with lot *LOT01* and put those units into a package(Put-In-Pack). * Scan the remaining quantity with lot *LOT02* and put those units into a different package(Put-In-Pack). * Click on **Quality Checks**. **Observed behavior:** * Only one quality check is created, even though the receipt contains two different lots that should each generate a quality check. **Cause:** * In `_inverse_qty_done`, move lines are marked as *picked* when `qty_done` is equal to quantity(Demand). * During the `write` operation, quality checks are created only for move lines that are not picked, which prevents creating a quality check for each lot. * Relevant code: https://github.com/odoo/enterprise/blob/464dc0c65548f3f440b293b534616743ddd5e130/quality_control/models/stock_move_line.py#L39 https://github.com/odoo/enterprise/blob/464dc0c65548f3f440b293b534616743ddd5e130/stock_barcode/models/stock_move_line.py#L67-L71 **Fix:** * Ensure that quality check points are generated correctly when validating products through the Barcode app using the Put in Pack option. --- opw-5405221 Forward-Port-Of: odoo/enterprise#105930 Forward-Port-Of: odoo/enterprise#102714
This update corrects a bug in the task scheduling feature. Previously, tasks started on specific dates would incorrectly limit their duration, resulting in shorter allocated times. The fix ensures tasks automatically extend to cover the full required hours, even when spanning multiple days, improving scheduling accuracy.
Original PR description
Steps to Reproduce: 1- Auto-plan a task starting on 25 November 2025 with 40 allocated hours. 2- The computed end date becomes 26 November, instead of extending into early December. => As a result,…
Steps to Reproduce: 1- Auto-plan a task starting on 25 November 2025 with 40 allocated hours. 2- The computed end date becomes 26 November, instead of extending into early December. => As a result, the allocated period is shorter than the required hours. Source: When selecting 25/11/2025 as the start date, the system tries to schedule the task within the remaining days of November (25–28). However, these four days are not enough to cover 40 hours. The system then searches for available intervals in the next month. But the intervals from November are still kept in the list, so when the algorithm iterates again, it reuses the previously consumed intervals (25 and 26). This causes the scheduler to allocate the remaining hours to those same days, leading to an incorrect result where the task spans only 25–26 November, instead of continuing from 1 December. Solution: Remove already-used intervals before recomputing the schedule. opw-5364327 Forward-Port-Of: odoo/enterprise#107043 Forward-Port-Of: odoo/enterprise#101262
This update resolves an issue where duplicate GS1 serial/lot numbers could cause incorrect stock lot queries. The fix ensures that lot names are correctly processed, regardless of whether the 'stock_barcode' app is installed, preventing inaccurate data retrieval.
Original PR description
## Issue When using the *Default GS1 Nomenclature*, it is possible to create multiple lot/serial numbers with a same name if the name matches a barcode rule pattern. ## Fix The fix related to this…
## Issue When using the *Default GS1 Nomenclature*, it is possible to create multiple lot/serial numbers with a same name if the name matches a barcode rule pattern. ## Fix The fix related to this commit is introduced by [this PR](https://github.com/odoo/odoo/pull/244427). ## Problematic flow The problematic flow starts in the `StockLot._check_unique_lot` method when calling `self._read_group`. At that point, the domain is still correct: it contains the product_id and the (correct) name for the lot we try to create. https://github.com/odoo/odoo/blob/b51c80a4368b99e55073856061113244b16b23f9/addons/stock/models/stock_lot.py#L104-L111 In the `BaseModel._read_group` method, the query is defined by the `self._search` method. At that point, the domain is the same as in the previous step, so it is still correct. https://github.com/odoo/odoo/blob/b51c80a4368b99e55073856061113244b16b23f9/odoo/orm/models.py#L1902-L1904 Now the flow differs depending on whether the `stock_barcode` app is installed or not. If it is, the `stock_barcode/StockLot._search` method is called: https://github.com/odoo/enterprise/blob/24fea3814b95144953fb809d10bf6a62906c06fd/stock_barcode/models/stock_lot.py#L11-L15 This is the method that calls the `BarcodeNomenclature._preprocess_gs1_search_args` which uses the `skip_preprocess_gs1` context flag: https://github.com/odoo/odoo/blob/b51c80a4368b99e55073856061113244b16b23f9/addons/barcodes_gs1_nomenclature/models/barcode_nomenclature.py#L149-L151 **This flow makes the query returned by `self._search(domain)` erroneous, as the start of the name of the lot is removed further down the execution of the `preprocess_gs1_search_args` method.** ### If stock_barcode is not installed The `self._search` method called in the BaseModel will not call `stock_barcode/StockLot._search`, but instead it calls `BaseModel._search`. This totally skips the problematic gs1 flow. opw-5477003 Forward-Port-Of: odoo/enterprise#104720
This update resolves a bug where incorrect product quantities were sometimes sent to the kitchen display when using the numpad in the POS. The fix ensures the system waits for quantity updates before submitting orders, preventing errors in order transmission and improving order accuracy. This resolves a failing test and ensures reliable POS operations.
Original PR description
TASK: [#5897381](https://www.odoo.com/odoo/project/1737/tasks/5897381) --- Inside tour tests environment for POS Restaurant Preparation Display module, when using the numpad to change the quantity of a product in the POS and sending the order to the kitchen immediately after, there is a chance that the quantity is not updated in time. This could lead to sending an order with an incorrect quantity to the kitchen display. As a result, the test `test_payment_does_not_cancel_display_orders` was failing. We are waiting for the orderline to be updated with the correct quantity before submitting the order. X-original-commit: 5ebd1ca99dddbbc62aff90202491562114c0c0dc Forward-Port-Of: odoo/enterprise#106600
This update resolves an issue where guest users purchasing subscriptions would experience payment failures due to Odoo attempting to archive their customer records. The fix ensures guest customers are no longer archived when linked to a subscription, allowing successful payment processing. This improves the eCommerce subscription experience for all users.
Original PR description
When purchasing a subscription from the eCommerce as a guest user, the payment fails because Odoo attempts to archive the subscription customer, which causes issues. To fix this, guest customers are no longer archived when they are linked to a subscription. opw-5475479
This update resolves an issue where users designated as 'invoice' within the subscription system were inadvertently able to view invoices. The fix ensures that only authorized users can access invoice information related to subscription orders, improving data security and accuracy. This change impacts the way subscription invoices are handled.
Original PR description
Forward-Port-Of: odoo/enterprise#99410
This update corrects a problem where certain characters (like accented letters) were not properly encoded in the XML files generated for DIAN invoices. This prevented invoices from being correctly processed by the DIAN tax authority, leading to potential errors and delays. The fix ensures invoices are transmitted accurately.
Original PR description
Some characters are not well encoded in dian xml Steps: - Activate the DIAN Demo Mode - Create a partner that has a "stress" or a "ñ" in their address - Create and confirm an invoice for partner - Open send and print wizard and select 'email' and 'dian' - Unzip the generated zip file and open the xml file -> Characters are wrongly encoded in the embedded xml opw-5883880 Forward-Port-Of: odoo/enterprise#107009
This update resolves an issue where the German tax report export was missing required data due to a recent layout change. The team has restored the necessary values to ensure accurate and compliant tax reporting. This fix is crucial for businesses using Odoo Enterprise to meet German tax regulations.
Original PR description
After the change in the german tax report layout, we incorrectly removed some values from the report export. Add missing values back into the report. original commit: https://github.com/odoo/enterprise/pull/97486/changes/0c579c824b1bf2eb643d2314b38d108cf72139c6 opw-5481368 Forward-Port-Of: odoo/enterprise#106878
Code cleanup and technical improvements
This update optimizes how Odoo calculates employee dates, significantly speeding up processing for large teams. The change avoids multiple database queries, reducing processing time and improving overall HR system performance. This addresses a previous performance bottleneck related to version calculations.
Original PR description
Use batch computation for `_compute_dates`. Getting all values of `hr_presence_state` need that field. Implement `hr_presence_state` using *compute_sql* to have one implementation and add a limit for big databases because "Ugly hack". Related task that should be batched: #248045 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
7 changes
Enhancements to existing features
This update ensures Odoo's Spanish tax reporting (l10n_es_report) complies with the latest requirements from the BOE (Boletín Oficial de la Elección). Specifically, it incorporates changes related to Modelo 347, a key Spanish tax form, and includes a placeholder for subsidy numbers. This update is crucial for accurate tax reporting in Spain.
Original PR description
reference: https://www.boe.es/buscar/doc.php?id=BOE-A-2025-25390 considering the modelo 347 As we do not have anything for the subsidy number, we just put 6 0s. opw-5926624 Forward-Port-Of: odoo/enterprise#107125
Resolved issues and error corrections
This update fixes an issue where multi-employee payslips were defaulting to the language of the first employee. The change ensures that each employee's payslip is printed in their correct, selected language, improving accuracy and user experience. This resolves a previous bug related to date formatting and caching.
Original PR description
Steps to detect the bug: - Install payroll - Create more than one employee with different payslip languages - Add a contract for the employees - Payroll -> Payslip -> Pay run - Create a new payroll for more than one employee - Select all the employees in the pay run - Click 'print' button - Dates for the employees that are not the first one are in the language of the first employee This commit will allow the user to create multiemployee payslips maintaining the correct selected payslip language for each one of them. The issue was caused by a cache dictionary that used only the date and date format as a key, failing to include the user language. This led the system to reuse the first translated date for all subsequent employees. opw-5865260
This update resolves two critical issues impacting payroll calculations and reporting for Hong Kong. Specifically, it corrects a mistake in how taxable salary deductions are handled and ensures that rental allowances are not incorrectly included in IRD reports, aligning with Hong Kong's tax regulations.
Original PR description
Fixes two issues related to computations; The taxable salary wrongly deduce the ERMPF which it should not. in the IRD reports, the total income includes the rental allowances, which is wrong according to their specs. task-5353781 Forward-Port-Of: odoo/enterprise#107136 Forward-Port-Of: odoo/enterprise#100842
This update resolves a bug in the POS Restaurant Preparation Display module where incorrect order quantities were sometimes sent to the kitchen. The fix ensures the system waits for quantity updates before submitting orders, preventing errors that caused test failures and potential inaccuracies in kitchen orders. This improves order accuracy and reliability.
Original PR description
TASK: [#5897381](https://www.odoo.com/odoo/project/1737/tasks/5897381) --- Inside tour tests environment for POS Restaurant Preparation Display module, when using the numpad to change the quantity of a product in the POS and sending the order to the kitchen immediately after, there is a chance that the quantity is not updated in time. This could lead to sending an order with an incorrect quantity to the kitchen display. As a result, the test `test_payment_does_not_cancel_display_orders` was failing. We are waiting for the orderline to be updated with the correct quantity before submitting the order. X-original-commit: 5ebd1ca99dddbbc62aff90202491562114c0c0dc Forward-Port-Of: odoo/enterprise#106600
This update adjusts the calculation for sickness relapse periods in the Belgian payroll module. Starting January 1, 2026, the allowed period between sick leave occurrences to be considered a relapse has increased from 14 to 56 days. This change aligns with updated Belgian tax regulations and ensures accurate payroll reporting.
Original PR description
Spec :- Since 01/01/2026, the period between two sick time off to consider it as a relapse has been increased from 14 days to 56 days. Implementation :- . Update sickness relapse period from 14 to 56 days if the leave starts from 2026 . Add leave work_entry type where work_entry use date_start . Add corresponding tests task-5476174
This update resolves a bug that prevented invoices with lines having a product price of zero in the Mexican (MX) edi format from being saved. The fix ensures that required tax object fields are correctly populated, allowing invoices to be properly generated and processed. This improves the reliability of invoice creation for MX clients.
Original PR description
**PROBLEM** If you create an invoice, and add a line with a product with a price of 0, you cannot save the invoice. **STEP TO REPRODUCE** 1. On a mx company, create an invoice for a mx client. 2. Add a line with a product with a price of 0. 3. Try saving the invoice, it will fails. **CAUSE** Field `l10n_mx_edi_tax_object` is required on invoice line with mx company. However, for lines with a price of 0, it is not set by `_compute_l10n_mx_edi_tax_object` because `_l10n_mx_edi_cfdi_invoice_line_ids()` filters them. opw-5402045
This update fixes an issue where assets incorrectly appeared in depreciation reports after being disposed of. The system was taking the latest date from all depreciation moves, including cancelled ones, resulting in an inaccurate disposal date. This ensures disposal dates align with the intended disposal date.
Original PR description
**Steps to reproduce:** - Install Accounting - In Accounting settings, activate "Audit Trail" - Go to "Accounting / Accounting / Management / Assets" - Create an asset: * Original Value: [any] *…
**Steps to reproduce:** - Install Accounting - In Accounting settings, activate "Audit Trail" - Go to "Accounting / Accounting / Management / Assets" - Create an asset: * Original Value: [any] * Acquisition Date: [in the past] (e.g. 01/01/2025) * Duration: [at least until today] (e.g. 36 Months) * Depreciation Account: [any] * Expense Account: [any] - Confirm the asset - Modify Depreciation: * Action: Dispose * Date: [in the past] (e.g. 30/10/2025) * Loss Account: [any] - Dispose - Go to "Accounting / Reporting / Management / Depreciation Schedule" - Filter on a period after the disposal date **Issue:** The asset appears in the selected period even if it has already been disposed. **Cause:** There are posted depreciation moves that have a date after the disposal date. These moves should be deleted but the Audit Trail feature prevents it. These moves are cancelled instead. However, the disposal date computed on the asset is taking the max date from all the depreciation moves. Even the cancelled ones ; leading to a disposal date different than the one entered. opw-5225749 Forward-Port-Of: odoo/enterprise#107028
11 changes
Enhancements to existing features
This update enhances the handling of Romanian tax invoices (e-invoices) by automatically downloading the official PDF version from the ANAF. Previously, only XML data was imported, lacking a visual invoice for accountants to review. Now, the PDF is the primary attachment, improving accuracy and compliance.
Original PR description
### Before For bills from the Romanian ANAF we only downloaded an XML and imported the data. There is no visual aid for the accountant to see and compare the received document. ### Now We use the ANAF service to get the official "PDF" version of the invoice. This is requested for any new bill we get through ANAF that doesn't already contain a pdf from the vendor and it is set as the main attachment. task-5877171 Forward-Port-Of: odoo/odoo#247382
This update ensures Odoo's Spanish tax reporting (l10n_es_report) complies with the latest requirements from the BOE (Agencia Tributaria) regarding the Modelo 347. A change was made to the export format to align with a recent regulatory update (BOE-A-2025-25390), and a placeholder is used for subsidy numbers. This update is crucial for accurate tax reporting in Spain.
Original PR description
reference: https://www.boe.es/buscar/doc.php?id=BOE-A-2025-25390 considering the modelo 347 As we do not have anything for the subsidy number, we just put 6 0s. opw-5926624 Forward-Port-Of: odoo/enterprise#107125
Resolved issues and error corrections
This update resolves a bug that prevented users from sending invoices via PEPPOL, resulting in a 'You cannot remove parts of the audit trail' error. The fix ensures attachments are correctly handled during the PEPPOL invoice sending process, allowing invoices to be sent without interruption. This improves the reliability of the PEPPOL integration for our business customers.
Original PR description
**Steps to reproduce:** - Install Accounting - Install a localization using PEPPOL (e.g. l10n_be) - Switch to a Belgian company - In Accounting settings, activate PEPPOL and Audit Trail - Create an…
**Steps to reproduce:** - Install Accounting - Install a localization using PEPPOL (e.g. l10n_be) - Switch to a Belgian company - In Accounting settings, activate PEPPOL and Audit Trail - Create an invoice: * Customer: [a Belgian customer with VAT] * Invoice Lines: [a line with a tax] - Confirm the invoice - Send the invoice via PEPPOL **Issue:** A UserError is raised: "You cannot remove parts of the audit trail.". **Cause:** The audit trail prevent modifying an attachment. When sending an invoice to PEPPOL, a message is logged in the chatter with both the invoice PDF and XML as attachment. During the process, "res_model" and "res_id" fields of the attachments are set to the message record. Before doing it, "res_id" is removed in SQL to prevent raising the audit trail error. However, it fails because the value is still in cache. **Solution:** Invalidate these fields as it is done when sending the invoice without PEPPOL. https://github.com/odoo/odoo/commit/e0229d5c7fa89d32f67151d307161482c300ff20 opw-5916696 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248220 Forward-Port-Of: odoo/odoo#247949
This update corrects a bug in the self-order mobile experience where the 'Send To Kitchen' button remained visible after an order had already been processed. The fix ensures the system accurately reflects the order's status, preventing unnecessary button displays and improving the user flow. This enhances the efficiency of kitchen staff.
Original PR description
Configuration: ------------------------- - Restaurant Mode - Self-Order Mode: “QR + Ordering” - Service At: Table Issue : “Send To Kitchen” Button Visible even order in kitchen --------------- Steps to Reproduce: 1. Open the Restaurant 2. Place a order from mobile menu and select a table. 3. In the Restaurant UI: - Open that table. The "Send To Kitchen" button is still visible even though the order was already sent to the kitchen and printed. Cause: - In self-order mode the order is not automatically synced after being sent to the kitchen and print. - As a result, the system still treats it as unsent, leaving the Order button visible. Fix: - Added getLastOrderPreparationChange() method to extract current order state and send it with the RPC request after order is saved, ensuring last_order_preparation_change updated Task-5106704 Related PR-https://github.com/odoo/enterprise/pull/106979
This update resolves a test error that was causing orders to be incorrectly marked as finalized in certain accounting scenarios. The fix adds a brief delay to ensure all order processing steps are completed before validation, preventing the 'already finalized' error. This ensures consistent order handling.
Original PR description
The `test_point_of_sale_custom_tax_with_extra_product_field` test does a `PaymentScreen.clickInvoiceButton()` and then directly after that a `PaymentScreen.clickValidate()`. In l10n scenarios, the logic behind triggering the `toInvoice` field can take longer. This would cause the validation to execute before the `toggleIsToInvoice` finishes executing and then it would throw an error that the order was already finalized. This PR ads an extra wait on the `Invoice` button to make sure that the toggle is executed properly before finalizing the order. Runbot Error: [233024](https://runbot.odoo.com/odoo/runbot.build.error/233024) Task: [5897371](https://www.odoo.com/odoo/project/1737/tasks/5897371) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248191
This update ensures that pricelists correctly apply to event products within the Point of Sale (PoS) system. Previously, event products weren't recognizing pricelists, leading to incorrect pricing. This fix resolves this issue, guaranteeing accurate pricing for event tickets during PoS transactions.
Original PR description
Before this fix, pricelist didn't take effect on event products. How to reproduce : 1. Create a pricelist with fixed price and make it available for a pos. 2. Open a pos with event products. 3. Make an orderline with an event product 4. Apply a pricelist on it. The solution is to override setPricelist() in pos_event. Which is called when we apply a pricelist to an order. task: 5092613 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a problem where the self-order page would freeze if local data was corrupted. Now, users receive an error message and can easily clear their data and refresh, particularly helpful on mobile devices. This enhances usability and prevents frustrating downtime.
Original PR description
Inconsistent data in the localDB or local storage can cause the pos_self_rder to fail before it can get initialized. When this happens the page just stays white. Now when an error happens while initializing an error message will show up and give the user the option to clear all local data and refresh the page. This should be especially useful for users on mobile where it's a pain to refresh the local data manually. Task-[5420544](https://www.odoo.com/odoo/project/1737/tasks/5420544) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246925
This update corrects a bug where loyalty points were incorrectly calculated and duplicated after saving a POS order, particularly when adding products. The fix ensures that loyalty points are accurately reflected, preventing over-rewarding of customers. This improves the reliability of the loyalty program within the Point of Sale system.
Original PR description
Step to reproduce: - have a trusted pos and a loyalty program which gives points per $ spent - start pos and select order and a partner (he should already have some LPs) - notice the loyalty points…
Step to reproduce:
- have a trusted pos and a loyalty program which gives points per $ spent
- start pos and select order and a partner (he should already have some LPs)
- notice the loyalty points assgined
- save the order, you are redirected to new order
- switch back to original order
Observation:
- Notice, the loyalty points are reassigned for example :
- if initially partner's LP = 50, product added is 100$ , LP = 50+100 = 150
- After saving, LP becomes 150 + 100 = 250
Cause:
- LP's are processed after every `sync_from_ui` call from `_postProcessLoyalty` which updates the customer's lp, even before the order is fullfilled or when order is still in `draft` state
Fix:
- Issue is fixed in https://github.com/odoo/odoo/commit/a4b37ec474656c7af23d0134251d589e9a6a61ca
- This commit adds related test for the fix
opw-5609964
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#248077
Forward-Port-Of: odoo/odoo#245400This update corrects a bug in the self-order mode where the 'Send to Kitchen' button remained visible even after an order had been processed and printed. The fix ensures the system accurately reflects the order's status, preventing confusion and improving the user experience for kitchen staff. This update ensures orders are correctly marked as complete.
Original PR description
Configuration: ------------------------- - Restaurant Mode - Self-Order Mode: “QR + Ordering” - Service At: Table Issue : “Send To Kitchen” Button Visible even order in kitchen --------------- Steps to Reproduce: 1. Open the Restaurant 2. Place a order from mobile menu and select a table. 3. In the Restaurant UI: - Open that table. The "Send To Kitchen" button is still visible even though the order was already sent to the kitchen and printed. Cause: - In self-order mode the order is not automatically synced after being sent to the kitchen and print. - As a result, the system still treats it as unsent, leaving the Order button visible. Fix: - Added getLastOrderPreparationChange() method to extract current order state and send it with the RPC request after order is saved, ensuring last_order_preparation_change updated Task-5106704 Related PR-https://github.com/odoo/odoo/pull/247969
This update fixes errors in how Hong Kong payroll taxes are calculated, specifically preventing incorrect deductions for ERMPF and ensuring IRD reports accurately exclude rental allowances. These changes ensure compliance with Hong Kong tax regulations and improve the accuracy of financial reporting.
Original PR description
Fixes two issues related to computations; The taxable salary wrongly deduce the ERMPF which it should not. in the IRD reports, the total income includes the rental allowances, which is wrong according to their specs. task-5353781 Forward-Port-Of: odoo/enterprise#107136 Forward-Port-Of: odoo/enterprise#100842
This update corrects an issue where asset depreciation reports incorrectly showed assets after they had been disposed of. The fix ensures that disposal dates are accurately reflected, preventing misleading reporting and improving financial data accuracy. The change was triggered by a bug in how the system calculated disposal dates.
Original PR description
**Steps to reproduce:** - Install Accounting - In Accounting settings, activate "Audit Trail" - Go to "Accounting / Accounting / Management / Assets" - Create an asset: * Original Value: [any] *…
**Steps to reproduce:** - Install Accounting - In Accounting settings, activate "Audit Trail" - Go to "Accounting / Accounting / Management / Assets" - Create an asset: * Original Value: [any] * Acquisition Date: [in the past] (e.g. 01/01/2025) * Duration: [at least until today] (e.g. 36 Months) * Depreciation Account: [any] * Expense Account: [any] - Confirm the asset - Modify Depreciation: * Action: Dispose * Date: [in the past] (e.g. 30/10/2025) * Loss Account: [any] - Dispose - Go to "Accounting / Reporting / Management / Depreciation Schedule" - Filter on a period after the disposal date **Issue:** The asset appears in the selected period even if it has already been disposed. **Cause:** There are posted depreciation moves that have a date after the disposal date. These moves should be deleted but the Audit Trail feature prevents it. These moves are cancelled instead. However, the disposal date computed on the asset is taking the max date from all the depreciation moves. Even the cancelled ones ; leading to a disposal date different than the one entered. opw-5225749 Forward-Port-Of: odoo/enterprise#107028
4 changes
Enhancements to existing features
This update enhances the security and logging around exporting large spreadsheet datasets from Odoo. Specifically, it adds detailed logging for common export scenarios like downloading and printing, while also restricting access to frozen or XLSX spreadsheets to authorized users. This improves data tracking and protects sensitive information.
Original PR description
Forward-Port-Of: odoo/enterprise#104951 Forward-Port-Of: odoo/enterprise#85888
Resolved issues and error corrections
This update resolves two errors impacting Hong Kong payroll reporting. Specifically, it corrects a calculation mistake that incorrectly deducted ERMPF from taxable salaries and ensures that rental allowances are not included in IRD reports, aligning with Hong Kong's specifications. This ensures accurate tax reporting and compliance.
Original PR description
Fixes two issues related to computations; The taxable salary wrongly deduce the ERMPF which it should not. in the IRD reports, the total income includes the rental allowances, which is wrong according to their specs. task-5353781 Forward-Port-Of: odoo/enterprise#100842
This update fixes an issue where assets incorrectly appeared in depreciation reports after being disposed of. The system was taking the latest date from all depreciation moves, including cancelled ones, leading to an inaccurate disposal date. This ensures asset depreciation reports accurately reflect disposal events.
Original PR description
**Steps to reproduce:** - Install Accounting - In Accounting settings, activate "Audit Trail" - Go to "Accounting / Accounting / Management / Assets" - Create an asset: * Original Value: [any] *…
**Steps to reproduce:** - Install Accounting - In Accounting settings, activate "Audit Trail" - Go to "Accounting / Accounting / Management / Assets" - Create an asset: * Original Value: [any] * Acquisition Date: [in the past] (e.g. 01/01/2025) * Duration: [at least until today] (e.g. 36 Months) * Depreciation Account: [any] * Expense Account: [any] - Confirm the asset - Modify Depreciation: * Action: Dispose * Date: [in the past] (e.g. 30/10/2025) * Loss Account: [any] - Dispose - Go to "Accounting / Reporting / Management / Depreciation Schedule" - Filter on a period after the disposal date **Issue:** The asset appears in the selected period even if it has already been disposed. **Cause:** There are posted depreciation moves that have a date after the disposal date. These moves should be deleted but the Audit Trail feature prevents it. These moves are cancelled instead. However, the disposal date computed on the asset is taking the max date from all the depreciation moves. Even the cancelled ones ; leading to a disposal date different than the one entered. opw-5225749 Forward-Port-Of: odoo/enterprise#107028
This update fixes an issue where invoices sent to DIAN or Carvajal were incorrectly flagged with a warning if the invoice date was within a specific range. The validation logic has been adjusted to align with Colombian regulations, allowing invoice dates up to 6 days before and after the current date, ensuring accurate electronic invoicing.
Original PR description
Currently, an `incorrect warning` message is shown when sending an invoice to `DIAN` or `Carvajal`, if the invoice date is 6 days before today, even though this date should be considered valid.…
Currently, an `incorrect warning` message is shown when sending an invoice to `DIAN` or `Carvajal`, if the invoice date is 6 days before today, even though this date should be considered valid. **Steps to reproduce:** - Install the `l10n_co_dian` module and switch to the `CO company`. - Go to `Invoicing` and create a new invoice with `taxes`. - Set the `Invoice Date` to 6 days before today. - Click `Confirm` > `Send`, ensure `DIAN` is selected, and `send` the invoice. - Observe the warning message. **Observation:** `The issue date can not be older than 5 days or more than 5 days in the future.` **Root cause:** At [1] and [2], the allowed invoice date range is incorrectly computed, using `5 days in the past` and `10 days in the future`. This does not match the Colombian regulations and triggers incorrect validation errors for valid invoice dates. These checks are intentionally implemented in both modules because they apply at different stages and for different providers: 1) `l10n_co_dian` When `DIAN: Free service` is selected as the `Electronic Invoicing Provider` from the `Invoicing Settings`, the date constraint is evaluated at `send time`. After the invoice is created, the validation is performed when the user sends the invoice to `DIAN`, and a blocking error is raised as a `UserError` if the invoice date is outside the allowed range. 2) `l10n_co_edi` When `Carvajal` is selected as the `Electronic Invoicing Provider`, the same rule is checked `at the confirmation time` of the draft invoice. In this case, the validation results in a `chatter message`, not a blocking send-time error. **Fix:** This commit updates the date constraint logic to allow invoices dated up to `6 days before and 6 days after` the current date, in accordance with the DIAN specification described in Anexo Técnico – Documento Soporte No Obligados, page 59, at [2]. <img width="1089" height="120" alt="DIAN" src="https://github.com/user-attachments/assets/408c5ccc-5fed-4585-a81e-dce4ccb98b40" /> [1]: https://github.com/odoo/enterprise/blob/2217827c0989fc5fc8d52a6a9b6f6c6d00b9773f/l10n_co_dian/models/account_edi_xml_ubl_dian.py#L672-L679 [2]: https://github.com/odoo/enterprise/blob/913e55abc4a9aa58509aa2a60d378fb552de554d/l10n_co_edi/models/account_edi_format.py#L574-L603 [3]: https://www.dian.gov.co/impuestos/factura-electronica/Documents/Anexo-Tecnico-Documento-Soporte-No-Obligados.pdf opw-5482555 Forward-Port-Of: odoo/enterprise#105763
14 changes
New functionality added to Odoo
This update introduces specific contract types required for Hong Kong's IRD reporting and salary calculations. These new contract codes will allow users to accurately filter employees and ensure compliance with local regulations. The changes also include a user-friendly view for selecting these contract types within the system.
Original PR description
Add contract types specific to HK local needs, with specific codes attached to them. The codes will be used to filter employees based on their contract type in IRD reports and salary rules. As the code will be used in some flows, we also display them in the view so that users can reuse the code if they want more detailed account types while keeping the functionalities intact. task-5468498
This pull request adds Slovakian Profit & Loss and Balance Sheet reports to Odoo Enterprise. These reports are formatted to comply with Slovakian tax form UZPODv14 and are integrated into the Annual Statements reporting process, providing businesses operating in Slovakia with the necessary financial statements.
Original PR description
Adding the Slovakian P&L and Balance Sheet reports, as well as the combined version under Annual Statements with the xml for form UZPODv14. odoo/odoo/pull/233307 task-5105102
Enhancements to existing features
This update enhances the performance of Odoo's email and messaging features by optimizing database queries. Specifically, the system now checks for the existence of related records before performing certain operations, preventing slowdowns caused by how Odoo handles deleted records. This improves the overall responsiveness of email and messaging workflows.
Original PR description
In order to be defensive we have to check records linked to messages, notifications or activities exist before checking related information like display_name, or even to skip them in various flows. This happens notably due to DB-level cascade deletion that does not remove side records linked through (model, res_id) pairs. It implies some additional exist queries. Task-5138556 Forward-Port-Of: odoo/enterprise#105721 Forward-Port-Of: odoo/enterprise#101185
This update strengthens payroll security by restricting who can approve payslips. Assistants can still create and calculate payslips, but validation is now exclusively handled by Payroll Officers and Managers, ensuring greater accuracy and control over payroll processing. This change aligns with best practices for data protection and reduces potential errors.
Original PR description
Updated the access rights regarding payslip processing: 1. Assistants are no longer authorized to validate payslips. 2. Assistants retain the ability to create and compute payslips. 3. The validation step is now only a responsibility of Payroll Officers and Managers. Task-5376223
This update enhances the account reporting module by adding key features for auditing and reporting on financial data. Specifically, users can now filter audit reports by date, view cumulative balances during account audits, and access detailed information related to checks and move lines, improving financial transparency and compliance.
This update streamlines the reinvoicing process for subscription timesheets by centralizing the logic and optimizing how analytic lines are retrieved. Previously, the system checked each invoice line individually, which was slow. Now, it uses a more efficient approach, only performing detailed checks when necessary – specifically for subscription orders linked to timesheet products. This speeds up the reinvoicing process and improves overall system performance.
Original PR description
_* = helpdesk_sale_timesheet, sale_timesheet_enterprise This commit adapts the community changes that centralized the reinvoicing flow of analytic lines and renamed the field `timesheet_invoice_id`…
_* = helpdesk_sale_timesheet, sale_timesheet_enterprise This commit adapts the community changes that centralized the reinvoicing flow of analytic lines and renamed the field `timesheet_invoice_id` to `reinvoice_move_id` The main technical change concerns how analytic lines to reinvoice are retrieved Previously, analytic lines were always searched per invoice line. This was needed in some situations, because for subscription timesheets the valid date range can depend on the related sale order of each invoice line. With this change, the specific per-invoice-line logic is now only used when all of the following are true: * No explicit `timesheet_start_date` or `timesheet_end_date` is provided in the context * The invoice is linked to at least one sale order that: * is a subscription order * contains products delivered through timesheets. Only in this case do we compute date ranges from the related sale orders and search analytic lines separately per invoice line. In all other cases, the standard aggregated search from the parent implementation is used, which avoids unnecessary processing and speeds up reinvoicing flow. task-5490517 See Also: - https://github.com/odoo/odoo/pull/245216 - https://github.com/odoo/upgrade/pull/9366
Resolved issues and error corrections
This update resolves an error that prevented users from correctly selecting rental product dates. Specifically, when the start and end dates were the same, a technical error occurred. The fix ensures a user-friendly error message is displayed, preventing the issue and allowing rentals to be processed correctly.
Original PR description
Currently, an error occurs when selecting a date on a rental product. **Steps to Reproduce:** - Install the `website_sale_stock_renting` module. - Go to `Products` and create a product with the…
Currently, an error occurs when selecting a date on a rental product. **Steps to Reproduce:** - Install the `website_sale_stock_renting` module. - Go to `Products` and create a product with the following `configuration`: - Enable `Track Inventory` and set `Quantity On Hand` greater than zero. - Disable `Sell when Out-of-Stock` under the `eCommerce tab`. - Under the `Sales tab`, set `Periodicity to Days`, and set the same time for `Pickup and Return`. - Go to `Website > Shop`. - Open the product, select the same date for both `Start Date and End Date`, and `click anywhere`. `ValueError: min() iterable argument is empty` **Cause:** - This error occurs because when the start and end dates are the same, the method returns a set of dates from here [1]. Since there is only a single date, the loop is not executed and it returns an empty list of availabilities [2], which then raises the error [3]. - The error happens due to the removal of this condition [4] in this [recent commit]. - The warning message is now handled here [5]. **Fix:** - This commit ensures that when a user selects a start date that is greater than or equal to the end date, a UserError is raised and the proper warning message is displayed. [1]: https://github.com/odoo/enterprise/blob/f26da0d5285ff47bf7a4297141830db67f7103d1/sale_stock_renting/models/sale_order_line.py#L616 [2]: https://github.com/odoo/enterprise/blob/f26da0d5285ff47bf7a4297141830db67f7103d1/website_sale_stock_renting/models/product_product.py#L77 [3]: https://github.com/odoo/enterprise/blob/f26da0d5285ff47bf7a4297141830db67f7103d1/website_sale_stock_renting/models/website.py#L18-L22 [4]: https://github.com/odoo/enterprise/blob/66f144df6f2056212797547dfef5ed58232698cd/website_sale_renting/models/product_template.py#L175-L176 [5]: https://github.com/odoo/enterprise/blob/f26da0d5285ff47bf7a4297141830db67f7103d1/website_sale_renting/static/src/interactions/daterange_picker.js#L213 [recent commit]: https://github.com/odoo/enterprise/commit/4afdc272e5a7fc4284bbd9f97283b8ec0aa28c34 sentry-7243018656 Forward-Port-Of: odoo/enterprise#106602
This update fixes an issue where the new folder creation process incorrectly opened a file upload view instead of the intended folder form. The change ensures that users are always presented with the correct form to create a new folder, improving usability and workflow efficiency. This resolves a previous bug related to priority and context settings.
Original PR description
**Before this PR:** When creating a new folder from the field, it opens `documents_upload_url_view` instead of new folder form view `document_view_form_new_folder` **Technical reason:** This happens because `documents_upload_url_view` is given a higher priority. Also, adding context to the field to keep the default type set to folder. **After this PR:** `document_view_form_new_folder` will open to create a new folder. Task-5384414
This update ensures that signed PDF documents retain their original bookmarks and metadata after signing. This improves document navigation and consistency, guaranteeing signed documents are informative and reliable.
Original PR description
Before - When a user downloaded a signed document, the original PDF bookmarks and metadata (e.g., title, author, subject) were lost. - This affected structured navigation and document integrity. After - The PDF signing process now retains the original bookmarks and metadata, preserving document structure. Impact - Ensures signed documents are now navigable, informative and consistent with the original version. - Improves overall document integrity. Task-4915124
This update fixes an issue where only one quality check was created when using the barcode scanning feature with lot tracking. The change ensures that quality checks are generated for each distinct lot received during a 'Put-In-Pack' operation, improving inventory accuracy and quality control processes. This resolves a discrepancy in how the system tracked lot-based quality checks.
Original PR description
**Steps to reproduce:** * Install the `stock_barcode`, `quality_control` modules. * Go to *Inventory > Configuration > Settings* and enable **Packages**. * Create a product with **By Lot** tracking…
**Steps to reproduce:** * Install the `stock_barcode`, `quality_control` modules. * Go to *Inventory > Configuration > Settings* and enable **Packages**. * Create a product with **By Lot** tracking enabled and set a barcode reference. * Create a quality control point for this product with following configuration: * Operation: *Receipts* * Control per: *Quantity* * Control Frequency: *All* * Product: the previously created lot-tracked product. * Create a receipt for this product with a quantity of 6 and `mark as todo`. * Open the *Barcode* app and process the receipt. * Scan the product barcode. * Scan some quantity of the product with lot *LOT01* and put those units into a package(Put-In-Pack). * Scan the remaining quantity with lot *LOT02* and put those units into a different package(Put-In-Pack). * Click on **Quality Checks**. **Observed behavior:** * Only one quality check is created, even though the receipt contains two different lots that should each generate a quality check. **Cause:** * In `_inverse_qty_done`, move lines are marked as *picked* when `qty_done` is equal to quantity(Demand). * During the `write` operation, quality checks are created only for move lines that are not picked, which prevents creating a quality check for each lot. * Relevant code: https://github.com/odoo/enterprise/blob/464dc0c65548f3f440b293b534616743ddd5e130/quality_control/models/stock_move_line.py#L39 https://github.com/odoo/enterprise/blob/464dc0c65548f3f440b293b534616743ddd5e130/stock_barcode/models/stock_move_line.py#L67-L71 **Fix:** * Ensure that quality check points are generated correctly when validating products through the Barcode app using the Put in Pack option. --- opw-5405221 Forward-Port-Of: odoo/enterprise#105930 Forward-Port-Of: odoo/enterprise#102714
This update corrects a problem where the ICP report generation failed due to a missing link between return types. The fix now searches for VAT reports instead, ensuring accurate tax return checks and successful report generation. This resolves a previous error impacting compliance reporting.
Original PR description
Since no return type has a link to ICP report, the tax return check will fail each time. This commit changes this by looking for VAT report returns. opw-5491728 Forward-Port-Of: odoo/enterprise#106955
This update resolves an issue where duplicate GS1 serial/lot numbers could cause incorrect stock lot queries. The fix ensures that lot names are correctly processed, preventing errors when creating multiple lots with the same barcode pattern. This improvement ensures data integrity within the stock management system.
Original PR description
## Issue When using the *Default GS1 Nomenclature*, it is possible to create multiple lot/serial numbers with a same name if the name matches a barcode rule pattern. ## Fix The fix related to this…
## Issue When using the *Default GS1 Nomenclature*, it is possible to create multiple lot/serial numbers with a same name if the name matches a barcode rule pattern. ## Fix The fix related to this commit is introduced by [this PR](https://github.com/odoo/odoo/pull/244427). ## Problematic flow The problematic flow starts in the `StockLot._check_unique_lot` method when calling `self._read_group`. At that point, the domain is still correct: it contains the product_id and the (correct) name for the lot we try to create. https://github.com/odoo/odoo/blob/b51c80a4368b99e55073856061113244b16b23f9/addons/stock/models/stock_lot.py#L104-L111 In the `BaseModel._read_group` method, the query is defined by the `self._search` method. At that point, the domain is the same as in the previous step, so it is still correct. https://github.com/odoo/odoo/blob/b51c80a4368b99e55073856061113244b16b23f9/odoo/orm/models.py#L1902-L1904 Now the flow differs depending on whether the `stock_barcode` app is installed or not. If it is, the `stock_barcode/StockLot._search` method is called: https://github.com/odoo/enterprise/blob/24fea3814b95144953fb809d10bf6a62906c06fd/stock_barcode/models/stock_lot.py#L11-L15 This is the method that calls the `BarcodeNomenclature._preprocess_gs1_search_args` which uses the `skip_preprocess_gs1` context flag: https://github.com/odoo/odoo/blob/b51c80a4368b99e55073856061113244b16b23f9/addons/barcodes_gs1_nomenclature/models/barcode_nomenclature.py#L149-L151 **This flow makes the query returned by `self._search(domain)` erroneous, as the start of the name of the lot is removed further down the execution of the `preprocess_gs1_search_args` method.** ### If stock_barcode is not installed The `self._search` method called in the BaseModel will not call `stock_barcode/StockLot._search`, but instead it calls `BaseModel._search`. This totally skips the problematic gs1 flow. opw-5477003 Forward-Port-Of: odoo/enterprise#104720
This update resolves a bug where incorrect order quantities were sometimes sent to the kitchen display when using the numpad in the POS. The fix ensures the system waits for quantity updates before submitting orders, preventing errors and improving order accuracy. This resolves a failing test and ensures reliable kitchen order transmission.
Original PR description
TASK: [#5897381](https://www.odoo.com/odoo/project/1737/tasks/5897381) --- Inside tour tests environment for POS Restaurant Preparation Display module, when using the numpad to change the quantity of a product in the POS and sending the order to the kitchen immediately after, there is a chance that the quantity is not updated in time. This could lead to sending an order with an incorrect quantity to the kitchen display. As a result, the test `test_payment_does_not_cancel_display_orders` was failing. We are waiting for the orderline to be updated with the correct quantity before submitting the order. X-original-commit: 5ebd1ca99dddbbc62aff90202491562114c0c0dc Forward-Port-Of: odoo/enterprise#106600
This update corrects a bug where the 'Asset Plus' column in depreciation reports wasn't displaying acquisition values for certain assets. The fix removes a confusing filter and adjusts the report query to correctly identify assets based on their acquisition or move dates, ensuring accurate reporting of asset values.
Original PR description
This commit removes the hierarchy filter from the depreciation schedule and fixes the asset plus column not showing acquisition value for a given period. Forward-Port-Of: odoo/enterprise#106409
9 changes
Resolved issues and error corrections
This update fixes an issue where refunds with global discounts were incorrectly flagged as exceeding the original order total. The change ensures that refunds accurately account for reversed discounts, preventing inaccurate reporting and improving the reliability of refund processing. This impacts the accuracy of financial reporting related to refunds.
Original PR description
Before this commit, when refunding an order with global discounts, the refund total was compared against the original order total without considering the discounts. While the reversed discount line would be added to the refund, the system could incorrectly flag the refund as exceeding the original order total. opw-5492686
This update fixes a bug in the Saudi HR payroll system where employees resigning after less than two years received a negative end-of-service benefit calculation. The code has been updated to correctly set this value to zero, aligning with Saudi accounting rules. The change also improves clarity by moving the relevant salary logic directly into the rule definition.
Original PR description
purpose: In the saudi eos rule, if the employee resigned after working in the company less than 2 years, their end of service is being computed as a negative value when it should be 0 instead. - added the correct check for the case of employee resignation - moved the logic of the salary rules for EOS benefit and provision from python methods to the rule itself to be more clear for the user task-id: 5499646
This update ensures Odoo's Spanish tax reporting (l10n_es_report) complies with the latest requirements from BOE (the Spanish Official Gazette). Specifically, it incorporates changes related to Modelo 347, adding a placeholder for subsidy numbers and ensuring accurate export data for tax reporting purposes.
Original PR description
reference: https://www.boe.es/buscar/doc.php?id=BOE-A-2025-25390 considering the modelo 347 As we do not have anything for the subsidy number, we just put 6 0s. opw-5926624 Forward-Port-Of: odoo/enterprise#107125
This update resolves a bug in the POS Restaurant Preparation Display module where incorrect order quantities were sometimes sent to the kitchen. The fix ensures the system waits for quantity updates before submitting orders, preventing errors that caused test failures and potential inaccuracies in kitchen orders. This improves order accuracy and reliability.
Original PR description
TASK: [#5897381](https://www.odoo.com/odoo/project/1737/tasks/5897381) --- Inside tour tests environment for POS Restaurant Preparation Display module, when using the numpad to change the quantity of a product in the POS and sending the order to the kitchen immediately after, there is a chance that the quantity is not updated in time. This could lead to sending an order with an incorrect quantity to the kitchen display. As a result, the test `test_payment_does_not_cancel_display_orders` was failing. We are waiting for the orderline to be updated with the correct quantity before submitting the order. X-original-commit: 5ebd1ca99dddbbc62aff90202491562114c0c0dc Forward-Port-Of: odoo/enterprise#106600
This update resolves an issue where feedback wasn't being properly recorded when approving activities within web studio. A recent refactoring caused a bug that prevented feedback messages from posting. Now, feedback is correctly attached to approvals via activity feedback, ensuring a smoother workflow.
Original PR description
Approving an approval via an activity with feedback did not work properly as the feedback was never posted. This was due to the consecutive refactoring that broke the feature. After this commit, the feedback is posted as a message opw-5782803
This update resolves a problem where certain characters (like 'ñ' or 'stress' in addresses) were not correctly encoded in the XML files generated for DIAN invoices. This prevented proper transmission of invoices to the DIAN tax authority, ensuring accurate reporting and compliance. The fix ensures all invoice data is correctly formatted.
Original PR description
Some characters are not well encoded in dian xml Steps: - Activate the DIAN Demo Mode - Create a partner that has a "stress" or a "ñ" in their address - Create and confirm an invoice for partner - Open send and print wizard and select 'email' and 'dian' - Unzip the generated zip file and open the xml file -> Characters are wrongly encoded in the embedded xml opw-5883880
This update fixes errors in how Hong Kong payroll taxes are calculated, specifically preventing incorrect deductions for ERMPF and correcting the inclusion of rental allowances in IRD reports. These changes ensure accurate tax reporting and compliance with Hong Kong regulations.
Original PR description
Fixes two issues related to computations; The taxable salary wrongly deduce the ERMPF which it should not. in the IRD reports, the total income includes the rental allowances, which is wrong according to their specs. task-5353781 Forward-Port-Of: odoo/enterprise#107136 Forward-Port-Of: odoo/enterprise#100842
This update fixes an issue where rental accessories added from the cart's suggested products wouldn't consistently apply the correct rental period. Now, when adding an accessory to a cart, it uses the same rental period as the existing cart, preventing errors and ensuring accessories are correctly added to the order. This improves the rental experience for customers.
Original PR description
Why this commit --- When adding a rental accessory product from the cart page suggested products, the…
Why this commit --- When adding a rental accessory product from the cart page suggested products, the [add_to_cart](https://github.com/odoo/enterprise/blob/19.0/website_sale_renting/controllers/cart.py#L52-L58) was triggered without the rental start and end dates(None was taken by default). As a result, the system uses [default rental duration](https://github.com/odoo/enterprise/blob/19.0/website_sale_renting/models/sale_order.py#L95-L99) for comparison and considers the accessory as having a different rental period then on the sale order and raised an error preventing it from being added to the cart. This issue did not occur when adding the same product from its product page, as the rental context was correctly provided there. After this Commit --- The rental start and end dates from the current sale order are passed when adding accessory products from the cart page suggested products. This ensures that rental period consistency checks succeed and the accessory can be added without raising an invalid operation error. Steps to Reproduce --- 1. Create two rental products A and B. 2. Configure product B as an accessory of product A. 3. Add product A to the cart with any rental period(except default). 4. From the cart page, attempt to add product B from suggested products. 5.Observe the error about mixing different rental periods. Here is the video demonstrating on how the error is reproduced : https://github.com/user-attachments/assets/3d5e6f96-cebd-4221-8592-1bdb6ae40ec7 Expected Result The accessory product is added to the cart using the same rental period as the existing cart's rental period. OPW: 5823691
This update corrects an issue where disposed assets continued to appear in depreciation reports. The fix ensures that disposal dates are correctly calculated, preventing inaccurate reporting after assets have been removed from the books. This improves the reliability of financial reporting.
Original PR description
**Steps to reproduce:** - Install Accounting - In Accounting settings, activate "Audit Trail" - Go to "Accounting / Accounting / Management / Assets" - Create an asset: * Original Value: [any] *…
**Steps to reproduce:** - Install Accounting - In Accounting settings, activate "Audit Trail" - Go to "Accounting / Accounting / Management / Assets" - Create an asset: * Original Value: [any] * Acquisition Date: [in the past] (e.g. 01/01/2025) * Duration: [at least until today] (e.g. 36 Months) * Depreciation Account: [any] * Expense Account: [any] - Confirm the asset - Modify Depreciation: * Action: Dispose * Date: [in the past] (e.g. 30/10/2025) * Loss Account: [any] - Dispose - Go to "Accounting / Reporting / Management / Depreciation Schedule" - Filter on a period after the disposal date **Issue:** The asset appears in the selected period even if it has already been disposed. **Cause:** There are posted depreciation moves that have a date after the disposal date. These moves should be deleted but the Audit Trail feature prevents it. These moves are cancelled instead. However, the disposal date computed on the asset is taking the max date from all the depreciation moves. Even the cancelled ones ; leading to a disposal date different than the one entered. opw-5225749 Forward-Port-Of: odoo/enterprise#107028
14 changes
Enhancements to existing features
This update introduces a new method for calculating taxes on prices, using simultaneous equations. This aims to provide more accurate tax calculations, particularly in complex pricing scenarios. Currently, it focuses on fixed and percent taxes and has future potential for manual tax input.
Original PR description
For fixed and percent taxes, their amounts can be obtained from the unit price using simultaneous equations. In some complicated cases with lots of price-included taxes, this may be a simpler solver than the iterative approach which tries to batch taxes and then iteratively compute them. At the moment, this doesn't handle Python taxes (and will likely not be extensible to them). In addition, we don't handle manual tax / base amounts yet, but that should be fairly simple to implement - instead of solving for the unit price, we should solve for whatever manual tax and base amounts are supplied. task-none
This update ensures Odoo's Spanish tax reporting (l10n_es_report) complies with the latest regulations from BOE (the Spanish Official Gazette). Specifically, it incorporates changes related to Modelo 347, adding a placeholder for subsidy numbers with default zeros to meet reporting requirements. This update is crucial for accurate tax reporting in Spain.
Original PR description
reference: https://www.boe.es/buscar/doc.php?id=BOE-A-2025-25390 considering the modelo 347 As we do not have anything for the subsidy number, we just put 6 0s. opw-5926624 Forward-Port-Of: odoo/enterprise#107125
Resolved issues and error corrections
This update ensures that pickings are automatically created when validating POS orders linked to sale orders, especially when inventory management creates pickings at the end of a session. Previously, stock levels weren't updated correctly. This change improves the accuracy of stock tracking for POS sales.
Original PR description
Before this commit, when validating a POS order linked to a sale order, if the Inventory Management was configured to create pickings at the end of the session, no picking was created for the order, and the sale order stock was not updated. This commit fixes this issue by ensuring that the picking is created for the imported sale orders in real time. opw-5423113 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update restricts access to cost and margin information within the Point of Sale (PoS) system. Previously, this sensitive data was visible to all users, regardless of their permissions. Now, the 'Show margins & costs' setting controls visibility, ensuring only employees with 'advanced' cashier rights can see this information.
Original PR description
Before this commit, the "Show margins & costs" setting did not correctly enforce visibility. When enabled, cost and margin information was displayed to all users, regardless of their cashier rights. Furthermore, even when this setting was disabled, this sensitive information was still visible to cashiers with advanced and minimal rights. This commit modifies the behavior: - If "Show margins & costs" is enabled, cost and margin details are visible in the PoS UI only for employees with 'advanced' cashier rights, and hidden from those with 'basic' rights. - If "Show margins & costs" is not checked, this information is hidden from all users in the PoS UI. opw-4899231 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update ensures website controller pages are correctly linked to relevant business models, resolving previous errors caused by incorrectly binding them to transient or abstract models. This improves data accuracy and stability within the website functionality.
Original PR description
Before this commit, a website_controller_page could be bound to any sort of model. For some of them this was irrelevant or plain wrong: - transient models: they are not pointing to anything relevant business wise - abstract: they cannot even have records, and most of them are mixin - _auto = False: Those are models with a table which is a custom one. The heuristics here is to say that records are not "real" ones. Also, most of these tables are sqlViews or something similar Business wise there were errors because of this, so this commit introduces a constraint that forbids the above use cases. sentry-6842596566 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a bug where translated text couldn't be updated or removed when using highlights on editable pages. The fix ensures that all elements within a translated section are correctly processed, allowing for proper translation editing functionality. This improves the user experience when working with highlighted text in the translation editor.
Original PR description
[FIX] base, tools: fix the behaviour of inline translated elements Steps to reproduce: - Go to a website page (in "Edit" mode) > Add a "Title" snippet. - Select the whole "title" > Set a highlight…
[FIX] base, tools: fix the behaviour of inline translated elements
Steps to reproduce:
- Go to a website page (in "Edit" mode) > Add a "Title" snippet.
- Select the whole "title" > Set a highlight effect on it.
- With the same text selected, transform it to a link and save.
- Try to translate the title into another language in the editor > You
cannot update the text or remove it.
The code from [1] introduced a feature that allows forcing some specific
elements to be "translated inline" using the `o_translate_inline` class.
It was used mainly to handle specific cases where elements DOM is
handled in JS in a way that breaks the "Translate" editor (e.g., text
highlights).
By forcing the highlight `<span/>`s to be inline translated, the fix
from [1] only handled situations where a highlight effect has a non-
"inline-translated" element (e.g., a link) amongst its text content.
E.g. This DOM structure:
```
<span class="o_text_highlight o_text_highlight_wavy o_translate_inline">
Go to the <a href="/contactus">Contact Us</a> page
</span>
```
Which caused the translation `<span/>` to be set inside the highlight
structure [A].
Now, as explained in the steps above, there are some cases like with
this DOM:
```
<span class="o_text_highlight o_text_highlight_wavy o_translate_inline">
<a href="/contactus">Contact Us</a>
</span>
```
That will make the translation code check the inner non-"inline
translated" children even within a `o_translate_inline` parent (see:
`translate_xml_node()` > `hastext()` | `process()`), leading to the
same issue as [A].
The goal of this commit is to prevent any similar situation causing the
translation spans to be added inside elements forced to be translated
as a whole, by automatically considering all elements inside a
`o_translate_inline` parent as inline translated too.
This commit also adds a test for the explained behavior.
[1]: https://github.com/odoo/odoo/commit/e9659e55356e5e4de63f2324eb88a7b6f07cd835
opw-4243639
linked to: opw-3980975
linked to: opw-4089482
linked to: opw-4061566This update fixes an issue where Italian tax information (like VAT number) wasn't being properly carried over when creating a company record from an Italian ecommerce order. This ensures accurate reporting and compliance with Italian tax regulations. The change ensures all required Italian tax fields are populated during company creation.
Original PR description
**STEP TO REPRODUCE** 1. Create a ecommerce order on a shop page of a italian company. 2. Goes to the checkout page, enter info (company_name, l10n_it_codice_fiscale, l10n_it_pa_index). 3. On the contact created, click on create company. 4. Notice l10n_it fields are not propagated to the company. opw-5477372 Forward-Port-Of: odoo/odoo#246785
This update corrects a bug in how loyalty rewards are calculated when products are purchased in non-unit UOMs (like dozens). Previously, rewards weren't applied correctly, requiring a large quantity to trigger the discount. This fix ensures that rewards are accurately applied based on the actual quantity purchased, regardless of the unit of measure.
Original PR description
### Issue: Due to this issue, applying a different uom than unit one, will not apply the reward regarding to quantities. #### Steps to reproduce: 1- Create a program: buy 12 get 6 free. 2- Create a SO, add a dozen of product to SOL. 3- Click on reward. Expect: 6 free unit is added. Current outcome: Nothing is added. Unless you add 12 dozens which is going to add 6 units. ### Cause: In checking rules, `product_uom_qty` is directly used without conversion to quantity. Note: `test_different_uom_to_hours_on_sale_order_confirmation` is failing due to this fix, because the uom_id unit/dozens and hours/days are not compatible. As this is not possible in UI, IMO we can delete the breaking SOL in that test. opw-5913638
This update fixes a bug where customers could still redeem expired ewallet points. The change prevents users from claiming points after their expiration date, ensuring accurate point balances and preventing potential revenue loss. This improves the customer experience and maintains data integrity.
Original PR description
### Issue: Due to this issue, ewallet points are claimable after expiry. #### Steps to reproduce: 1- Create a ewallet program, and generate an ewallet for a partner. 2- Set the expiration date in the past. 3- Create a SO with the same partner. 4- Click on reward. Expected: The ewallet shouldn't be claimable. Current outcome: The ewallet is claimable. opw-5476686
This update fixes a crash that occurred when creating vendor bills with multiple purchase orders linked through the autocomplete field. The issue stemmed from an error in how Odoo handled record insertion, leading to duplicate key errors. By limiting the number of linked purchase orders, this fix ensures stable bill creation.
Original PR description
Steps to reproduce ================== - Edit the Vendor Bill form view to set a limit of 2 on the invoice_line_ids field. - Create 2 purchase orders with the same vendor and 4 products - Create a vendor bill - Set the same vendor - Using the autocomplete field, select the first purchase order - Save the form - Select the other purchase order in the autocomplete field - Delete the record before the last one => Got duplicate key in t-foreach: datapoint_12 Cause of the issue ================== Before inserting the last 4 lines: `this._currentIds = [1, 2, 3, 4]` After the second insert, we have `this._currentIds = [1, 2, virtual_1, 3, virtual 2, virtual_3, virtual_4, 4]` Only the first record is inserted at the correct place, following ones are off by one. opw-5264594
This update fixes an issue where invoices sent to DIAN or Carvajal would incorrectly display a warning if the invoice date was within a specific range. The change adjusts the allowed date range to align with Colombian regulations, ensuring invoices are processed correctly and avoiding unnecessary errors.
Original PR description
Currently, an `incorrect warning` message is shown when sending an invoice to `DIAN` or `Carvajal`, if the invoice date is 6 days before today, even though this date should be considered valid.…
Currently, an `incorrect warning` message is shown when sending an invoice to `DIAN` or `Carvajal`, if the invoice date is 6 days before today, even though this date should be considered valid. **Steps to reproduce:** - Install the `l10n_co_dian` module and switch to the `CO company`. - Go to `Invoicing` and create a new invoice with `taxes`. - Set the `Invoice Date` to 6 days before today. - Click `Confirm` > `Send`, ensure `DIAN` is selected, and `send` the invoice. - Observe the warning message. **Observation:** `The issue date can not be older than 5 days or more than 5 days in the future.` **Root cause:** At [1] and [2], the allowed invoice date range is incorrectly computed, using `5 days in the past` and `10 days in the future`. This does not match the Colombian regulations and triggers incorrect validation errors for valid invoice dates. These checks are intentionally implemented in both modules because they apply at different stages and for different providers: 1) `l10n_co_dian` When `DIAN: Free service` is selected as the `Electronic Invoicing Provider` from the `Invoicing Settings`, the date constraint is evaluated at `send time`. After the invoice is created, the validation is performed when the user sends the invoice to `DIAN`, and a blocking error is raised as a `UserError` if the invoice date is outside the allowed range. 2) `l10n_co_edi` When `Carvajal` is selected as the `Electronic Invoicing Provider`, the same rule is checked `at the confirmation time` of the draft invoice. In this case, the validation results in a `chatter message`, not a blocking send-time error. **Fix:** This commit updates the date constraint logic to allow invoices dated up to `6 days before and 6 days after` the current date, in accordance with the DIAN specification described in Anexo Técnico – Documento Soporte No Obligados, page 59, at [3]. <img width="1089" height="120" alt="DIAN" src="https://github.com/user-attachments/assets/408c5ccc-5fed-4585-a81e-dce4ccb98b40" /> [1]: https://github.com/odoo/enterprise/blob/2217827c0989fc5fc8d52a6a9b6f6c6d00b9773f/l10n_co_dian/models/account_edi_xml_ubl_dian.py#L672-L679 [2]: https://github.com/odoo/enterprise/blob/913e55abc4a9aa58509aa2a60d378fb552de554d/l10n_co_edi/models/account_edi_format.py#L574-L603 [3]: https://www.dian.gov.co/impuestos/factura-electronica/Documents/Anexo-Tecnico-Documento-Soporte-No-Obligados.pdf opw-5482555
This update fixes a discrepancy in the calculation of car tax (ATN) for employees in Belgium. The changes incorporate the latest tax regulations up to 2026, ensuring accurate payroll processing and compliance with Belgian tax laws. This impacts employees and their associated payroll data.
Original PR description
TaskID: 5932573
This update fixes a reporting issue where the inf-a and inf-b reports weren't correctly identifying businesses without VAT numbers. The changes now include these businesses in the reports and standardize warning messages, ensuring more accurate reporting for tax compliance. This improves the reliability of key financial data.
Original PR description
Both inf-a and inf-b reports should include partners with no vat number. Also updated partner warning on reports to harmonize with main query itself. Now warning is shown if: - no country and no VAT - no country and VAT not starting with EE - no country and VAT is "/"
This update resolves an issue where asset depreciation schedules incorrectly showed assets after they had been disposed of. The fix ensures that disposed assets are no longer included in reporting periods, aligning depreciation schedules with actual asset status. This improves the accuracy of financial reporting.
Original PR description
**Steps to reproduce:** - Install Accounting - In Accounting settings, activate "Audit Trail" - Go to "Accounting / Accounting / Management / Assets" - Create an asset: * Original Value: [any] *…
**Steps to reproduce:** - Install Accounting - In Accounting settings, activate "Audit Trail" - Go to "Accounting / Accounting / Management / Assets" - Create an asset: * Original Value: [any] * Acquisition Date: [in the past] (e.g. 01/01/2025) * Duration: [at least until today] (e.g. 36 Months) * Depreciation Account: [any] * Expense Account: [any] - Confirm the asset - Modify Depreciation: * Action: Dispose * Date: [in the past] (e.g. 30/10/2025) * Loss Account: [any] - Dispose - Go to "Accounting / Reporting / Management / Depreciation Schedule" - Filter on a period after the disposal date **Issue:** The asset appears in the selected period even if it has already been disposed. **Cause:** There are posted depreciation moves that have a date after the disposal date. These moves should be deleted but the Audit Trail feature prevents it. These moves are cancelled instead. However, the disposal date computed on the asset is taking the max date from all the depreciation moves. Even the cancelled ones ; leading to a disposal date different than the one entered. opw-5225749 Forward-Port-Of: odoo/enterprise#107028
2 changes
Resolved issues and error corrections
This update resolves an issue where importing EDI invoices could fail when products were restricted to a different company. The fix ensures products are correctly identified during import, preventing 'Incompatible company' errors. This improves the reliability of EDI invoice processing within multi-company Odoo environments.
Original PR description
In a multi-company environment, importing an EDI invoice could fail if a line contains a product restricted to another company. The error "Incompatible company on records" was raised because company consistency rules were applied.
Example steps to reproduce:
- Create two Italian companies, A and B
- In company A, create a product with default code or barcode "TEST"
- This can also occur using the barcode and the “Vendor Product code” from the Purchase supplier.
- Restrict this product to company A
- Create an EDI invoice in company A with this product for company B as customer
- Import the invoice in company B, which would fail
This fix adds a search domain to correctly find products during import
opw-5496912This update fixes an issue where invoices created in foreign currencies didn't accurately display the amount in the company's local currency when generating reports. The fix ensures that amounts are correctly rate-adjusted, providing accurate financial reporting for Saudi Arabia companies. This improves the reliability of financial data.
Original PR description
After 267a876451da8b39ab8c5885e7198ebfeb841573 invoice report will not show the correct amount in company currency Steps to reproduce: - With SA Company setup - Create invoice in foreign currency - Print Issue: Amount in company currency have not been rate adjusted. This occurs because amount_untaxed and amount_total are expressed in foreign currency. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr