Daily updates from Odoo
Wednesday, February 11, 2026
81 changes
20 changes
Enhancements to existing features
This update enhances the eTransport functionality for Odoo's Romanian localization (l10n_ro_edi_stock) by improving the accuracy of XML files generated for shipping. Specifically, it now uses standard unit prices, includes necessary rounding for product values, and logs the sent XML files for tracking and troubleshooting.
Original PR description
- Adding logging of sent XML into move chatter - Adjusting the XML generator to use standard unit price - Adding rounding for product values as required by the XML structure task-5892338 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247919 Forward-Port-Of: odoo/odoo#247541
This update enhances the chatter interface by adding a company card with details sourced from DNB. Previously, industry tags from DNB were stored separately. This change consolidates relevant partner information within the chatter for better visibility and efficiency.
Original PR description
Before: Industry tags coming from DnB were stored in the Tags section of res.partner. and there was no Company info card in chatter. After: Industry tags coming from DnB are not stored in the Tags section of res.partner. Company card is created in chatter that is having details from Dnb along with tags. task-5373200 Forward-Port-Of: odoo/odoo#239464
Resolved issues and error corrections
This update fixes an issue where the quantity displayed in the shopping cart wasn't updating correctly after a user changed the quantity of a product. The fix ensures that the cart accurately reflects the updated quantity, improving the user experience and preventing order discrepancies. This was a critical bug impacting order accuracy.
Original PR description
**Steps to produce:** - Install `website_sale` with demo data. - Go to the shop page. - Select product `Customizable Desk` > click `Add to cart`. - In the wizard, change the quantity to 100 and…
**Steps to produce:** - Install `website_sale` with demo data. - Go to the shop page. - Select product `Customizable Desk` > click `Add to cart`. - In the wizard, change the quantity to 100 and directly click `Checkout`. **Issue:** - The cart shows the product with quantity = 1 instead of the edited value. Root cause: - When the user clicks Checkout, both `setQuantity` and `onConfirm` are triggered almost simultaneously. - At [1], the `_setQuantity` method is called, but due to the await before the quantity update is completed, the update may not finish in time. As a result, the previous quantity is sometimes used during checkout instead of the newly selected one. Solution: - we can update the quantity immediately before awaiting `_updateCombination`, ensuring that the correct quantity is already set when onConfirm runs. [1]: https://github.com/odoo/odoo/blob/f4eabe47a602301013afa63da6bdf87809903d29/addons/sale/static/src/js/product_configurator_dialog/product_configurator_dialog.js#L225 opw-5435672 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247866 Forward-Port-Of: odoo/odoo#241424
This update resolves an issue preventing single-tenant Odoo apps using Microsoft Calendar from properly renewing their access tokens. The fix ensures Odoo uses the correct, tenant-specific Microsoft endpoint, allowing calendar synchronization with Outlook to function reliably. This improves the experience for businesses utilizing single-tenant Odoo instances.
Original PR description
Single-tenant Azure applications could synchronize calendar with Outlook, but refresh token renewal fail. Odoo was always using the default Microsoft token endpoint instead of the tenant-specific endpoint required for single-tenant apps. Steps to reproduce: - Create a single-tenant app in the Azure portal - Configure Odoo Microsoft Calendar with this app - Set `microsoft_account.auth_endpoint` and `microsoft_account.token_endpoint` system parameters with the specific endpoints using the tenant ID - Open the Calendar app and sync with Outlook - Wait for access token expiration - Refresh token request fails This commit fixes the issue by using the token endpoint stored in the microsoft_account.token_endpoint system parameter when requesting a refresh token. Forward-Port-Of: odoo/odoo#246829 Forward-Port-Of: odoo/odoo#244371
This update resolves an issue where Sale Orders imported through POS and paid with online payments remained in 'Quotation' status. The fix ensures that the Sale Order's state is correctly updated to 'Paid' after online payment processing, streamlining the order management process. This improves data accuracy and prevents manual intervention.
Original PR description
When a Sale Order was imported in PoS and paid using online payment method, the SO's state stayed in Quotation. Steps to reproduce: ------------------- * Create a new Sale Order with a product available in POS * Add Online Payment in the Payment Methods * Import and settle the Order in POS * Pay the order with the Online Payment > Observation: In Sale app, the Sale Order is still in Quotation state. Why the fix: ------------ Online payments call `action_pos_order_paid()` directly, which only sets the POS order state to paid and never confirms the linked sale.order. Other payment methods do it in `sync_from_ui()`. Extended `action_pos_order_paid()` in pos_sale will now confirm linked quotations after POS marks the order as paid. opw-5022526 Forward-Port-Of: odoo/odoo#247998 Forward-Port-Of: odoo/odoo#230112
This update fixes a crash in the Forecast report when it includes archived product variants. The fix ensures that only active variants are considered when calculating stock levels, preventing errors and ensuring accurate reporting. This improves the reliability of the Forecast report.
Original PR description
Currently, accessing the Forecast report on a Product Template causes a crash if the template contains an archived variant that still has active stock moves (e.g., a pending delivery). ## **Steps to…
Currently, accessing the Forecast report on a Product Template causes a crash if the template contains an archived variant that still has active stock moves (e.g., a pending delivery).
## **Steps to Reproduce:**
1) Install `stock` with demo data.
2) Create a Delivery orders(stock picking) for product `conference chair(E-COM12)`
with demand of 40 qty, click on `Mark as todo`.
3) Navigate to `stock>products>products` and open `conference chair` product form
view.
4) From the variant smart button archive `E-COM12` variant.
5) Navigate back to product form view and click on `forecast` smart button.
## **Error:**
`TypeError: Cannot read properties of undefined (reading 'free_qty')`
## **Root Cause:**
`this.props.docs.product[line]` at [1] is undefined because the server did not
include an entry for that product id in the report header.
### **Complete Flow:**
On clicking the Forecast button an ORM call is made to [_get_report_values](https://github.com/odoo/odoo/blob/0dd40ede75f68b18192738f0d20aadaac9f348c7/addons/stock/report/stock_forecasted.py#L512-L519),
which calls [_get_report_data](https://github.com/odoo/odoo/blob/0dd40ede75f68b18192738f0d20aadaac9f348c7/addons/stock/report/stock_forecasted.py#L156-L172) to build the report data.
#### **Header Part:**
- [_get_report_header](https://github.com/odoo/odoo/blob/0dd40ede75f68b18192738f0d20aadaac9f348c7/addons/stock/report/stock_forecasted.py#L112-L144) returns metadata only for active variants because,
[_get_product_quantity](https://github.com/odoo/odoo/blob/0dd40ede75f68b18192738f0d20aadaac9f348c7/addons/stock/report/stock_forecasted.py#L69-L72) is called which calls _get_products(see[2]), and _get_products only
returns active variants for the product template.
#### **Lines Part:**
- [_get_product_lines](https://github.com/odoo/odoo/blob/82fe034509a6b401e86c345a82aa7b8948294e52/addons/stock/report/stock_forecasted.py#L239) iterates over products coming from the move search
and it includes both archived and unarchived variants.
[_move_confirmed_domain](https://github.com/odoo/odoo/blob/82fe034509a6b401e86c345a82aa7b8948294e52/addons/stock/report/stock_forecasted.py#L55-L56) calls _move_domain(see[3]), which searches stock.move using
product_tmpl_id when given a template id and therefore returns moves for
every variant of the template (archived or not).
#### **Why the mismatch happens:**
- `_get_products` fetches variants using `browse()` which by default excludes archived variants.
`_product_domain`(see[3]) uses product_tmpl_id when given product_template_ids,
which matches moves for all variants of the template. As a result, moves can reference
archived variant ids that the header never listed.
[1]- https://github.com/odoo/odoo/blob/0dd40ede75f68b18192738f0d20aadaac9f348c7/addons/stock/static/src/stock_forecasted/forecasted_details.js#L188
[2]- https://github.com/odoo/odoo/blob/82fe034509a6b401e86c345a82aa7b8948294e52/addons/stock/report/stock_forecasted.py#L61-L67
[3]- https://github.com/odoo/odoo/blob/82fe034509a6b401e86c345a82aa7b8948294e52/addons/stock/report/stock_forecasted.py#L25-L31
## **Fix:**
- This commit ensures that archived product variants are excluded directly
at move search level by appending `('product_id.active', '=', True)` to
the product domain used by the forecast report. This ensures that only
active product variants are considered when fetching stock moves.
### **opw-5440872**
Forward-Port-Of: odoo/odoo#245852A bug in the Point of Sale refund process was causing errors related to invoice and credit note handling. This update corrects the system to properly identify refund orders based on the 'is_refund' field, ensuring accurate accounting and preventing errors. This fix improves the reliability of refund transactions.
Original PR description
TASK: [#5897377](https://www.odoo.com/odoo/project/1737/tasks/5897377) --- The test `point_of_sale:TestPointOfSaleFlow.test_pos_order_refund_ship_delay_totalcost` was failing with the following error: > You cannot use a credit_note document type with an invoice. This issue occurred because the refund order was not marked as a refund. As a result, the `account.move` `move_type` was set to `out_invoice` instead of `out_refund`. Since 19.0, following the change introduced in [odoo/229683](https://github.com/odoo/odoo/pull/229683/files#diff-29cbaebb5b63b539ab173d9340b2aec87b9ad63cd322eec2347879c5412bd50bR850), the `move_type` is no longer determined based on the `pos.order` `amount_total`, but on its `is_refund` field. This field was missing in the test, causing the incorrect behavior. Forward-Port-Of: odoo/odoo#247136
This update ensures invoices for Point of Sale orders are correctly marked as paid when the order was previously settled through a 'settle due' process. Previously, the system didn't account for payments from the settle due order, leading to unpaid invoices. This fix resolves a critical issue impacting invoice accuracy.
Original PR description
If you made a PoS order paid with the customer account payment method, and then you created a settle due order to settle the previous one. If you then create the invoice for the original order, the invoice would appear as unpaid, because the payments of the settle due order were not taken into account. Steps to reproduce: ------------------- * Create a PoS order and pay with the customer account payment method * Settle the order that you just created with a settle due order * Close the session * Go on the original order and create the invoice > Observation: The invoice appears as unpaid when it should be paid. Why the fix: ------------ When creating the invoice we gather all the payments of the order to create the corresponding journal entries. But the payment of the settle due order were not included. So the order was considered as unpaid. opw-5268042 Forward-Port-Of: odoo/odoo#245796
This update fixes an error in how the cost of goods is calculated for products tracked by lot. Previously, the standard price wasn't updated correctly after a sale, leading to inaccurate cost reporting. The fix ensures that the cost accurately reflects the value of the lots used, improving financial reporting accuracy.
Original PR description
**Problem:** the cogs do not take into account lot valuation and the standard price of the form is not updated after a move out. **Steps to reproduce:** - create storable avco perpetual product,…
**Problem:** the cogs do not take into account lot valuation and the standard price of the form is not updated after a move out. **Steps to reproduce:** - create storable avco perpetual product, tracked and valued by lot - confirm a purchase order for 2 qty at price 10 - in the receipt add 'lot 1' for the lot - validate - confirm a purchase order for 2 qty at price 16 - in the receipt add 'lot 2' for the lot - validate - confirm a sale order for a qty of 1, validate the move - invoice the sale order, and confirm the invoice **Current behavior:** 1) the cogs line (stock valuation and expenses) have a value of 13 (the avco value) 2) the standard price on the form view is still 13 **Expected behavior:** 1) it should be 10 (the value of lot1) 2) it should have been updated to 14 (weighted average of the lots value) **Cause of the issue:** 1) get_cogs_price_unit() is taking standard price of the product if the product is not fifo. https://github.com/odoo/odoo/blob/93fa6d9fff63534cfa9251e21fc82797d8b83468/addons/stock_account/models/stock_move.py#L245 In case of avco lot valuated product, this is not correct, the value should be the sum of (the value of each lot * the number of product from this lot in the moves) divided by the total quantity. this value can be obtained be dividing the total value of the moves by the total quantity. 2) after the move is validated, the standard price should be updated because for lot valued product, the avco value can change after a move out. Currently it's only updated for fifo products. https://github.com/odoo/odoo/blob/93fa6d9fff63534cfa9251e21fc82797d8b83468/addons/stock_account/models/stock_move.py#L172 **fix** For the diff inside _update_standard_price() for problem 2, I use avg_cost instead of doing the computation directly in _update_standard_price() to not duplicate code logic because the computation logic for lot valued products is already inside _compute_value() https://github.com/odoo/odoo/blob/93fa6d9fff63534cfa9251e21fc82797d8b83468/addons/stock_account/models/product.py#L152-L157 The extra dependency on compute_value on the stock.lot model is needed because otherwise total_value of the lot is not invalidated in the cache after an out mouve is validated (in our steps it will stay in cache with a value of 20 even after the out move is validated). With our steps this does not cause problem because when we use the avg_cost value for the product, \__get__() is called on total_value of the lots, but it was not in cache because we didn't compute it before in this environment , so it will be recomputed with correct current value . But in other cases where the action_done is called on the move and there is already a value in cache for total_value of the lots (like in the test of this commit for instance), this value will become wrong after the move is validated and the cache won't be invalidated which will lead to incorrect computation of avg_cost because it will use the wrong cache value of total_value for the lots. the test needs to be in sale_stock because the moves used for the cogs are being returned via the sale_stock override of _get_stock_moves() https://github.com/odoo/odoo/blob/7ae112acd0c333f09c54e4eabbd22bcef72c32a7/addons/stock_account/models/account_move_line.py#L67 opw-5459082 Forward-Port-Of: odoo/odoo#246821
This update resolves an issue where the BoM report wouldn't correctly switch between product variants due to a discrepancy in how the frontend and backend processed variant order. The fix ensures the frontend uses the explicitly passed variant ID, guaranteeing correct variant selection within the report.
Original PR description
Steps to reproduce on runbot ------------------ Select a product with several variants and a Bill of Materials (e.g. Stool). Change the variants order so that their ids are not ordered, this can be…
Steps to reproduce on runbot ------------------ Select a product with several variants and a Bill of Materials (e.g. Stool). Change the variants order so that their ids are not ordered, this can be done by modifying the default_code for example (e.g. Internal Reference for variant "Color: Green" set to "A"). When accessing the BoM report, you won’t be able to switch to one of the possible variants (in the example the Dark Blue variant). Why it is happening ------------------ The default variant to be displayed when opening the report is selected in the backend using the product_variant_id field. This field is computed as the first element in product_variant_ids as they are ordered in the model. We then send this variant’s information to the frontend and a dictionary containing every variant (key= id and value = display_name). In the serialization process, the object is reordered based on the keys. Thus, if the variants were not ordered based on their ids in python, the order will change. The displayed variant is correct as it has been passed directly but the frontend also computes the currentVariant attribute. This is computed as the first element in the dictionary but in this case, it is not the one that has been selected in the backend, as the order changed. As a result, you see the report for a variant A but the frontend considers you are on the report for variant B so you cannot switch to variant B as you are supposed to be already on it. The fix ------------------ I propose to use the explicitly passed id as the currentVariantId. opw-5409493 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248009 Forward-Port-Of: odoo/odoo#241603
This update resolves a bug that caused a RecursionError when producing large quantities of products tracked by serial numbers. The issue stemmed from excessive recalculations during order splitting, specifically related to manufacturing order processing. This change ensures stable production runs for high-volume serial-tracked items.
Original PR description
**Issue** When producing a large number of serial-tracked products, a RecursionError can occur. **Steps to reproduce** - Create three products tracked by serial number (ensure MTO and Manufacture…
**Issue** When producing a large number of serial-tracked products, a RecursionError can occur. **Steps to reproduce** - Create three products tracked by serial number (ensure MTO and Manufacture routes are enabled). - Create a BoM for product A containing product B. - Create a BoM for product B containing product C. - Create a BoM for product C containing another product. - Create a manufacturing order of 100 units for product A and confirm it. - Go to the MO C and split into 100 mo - Go to the MO B and split into 100 mo -> RecursionError: maximum recursion depth exceeded. **Cause** While splitting, this method is called: https://github.com/odoo/odoo/blob/cda011dc8590773f6c3a26f4ae9d5242a3147024/addons/mrp/models/mrp_production.py#L2031 which ultimately calls: https://github.com/odoo/odoo/blob/cda011dc8590773f6c3a26f4ae9d5242a3147024/addons/stock/models/stock_move.py#L658-L661 This retriggers `_compute_packaging_uom_id` for all moves in `move_orig_ids` or `move_dest_ids`, and accessing the full recordsets causes recursive recomputation leading to a RecursionError. opw-5265424 Forward-Port-Of: odoo/odoo#247839
This update resolves an issue where reducing order quantities in multi-step delivery kits incorrectly triggered additional picking operations. The fix ensures accurate quantity calculations during order fulfillment, preventing unnecessary stock movements and improving order processing efficiency. This impacts users utilizing multi-step delivery kits.
Original PR description
### Steps to reproduce: 1. In the settings enable: Multi-steps route 2. Put your warehouse in 2-step deliveries 3. Create a kit product: - With one component - There is one component in the stock 4.…
### Steps to reproduce: 1. In the settings enable: Multi-steps route 2. Put your warehouse in 2-step deliveries 3. Create a kit product: - With one component - There is one component in the stock 4. Create and confirm a SO with 1 x K 5. Process the pick and ship 6. Return the delivery 7. Set the sol qty to 0 #### > Two unexpected pickings are created to put the kit in output ### Cause of the issue: Decreasing the sol quantity to 0 will call the `_action_launch_stock_rule` in order to create and run procurements related to that quantity change. However, the quantity currently handled by other procurements is determined here by the `_compute_kit_quantities`: https://github.com/odoo/odoo/blob/87e176ad76c9d7b87cd622ae38a8b9a62813b1cb/addons/sale_stock/models/sale_order_line.py#L388 https://github.com/odoo/odoo/blob/87e176ad76c9d7b87cd622ae38a8b9a62813b1cb/addons/sale_mrp/models/sale_order_line.py#L154-L166 https://github.com/odoo/odoo/blob/87e176ad76c9d7b87cd622ae38a8b9a62813b1cb/addons/mrp/models/stock_move.py#L578-L580 Now, the issue is that `_compute_kit_quantities` does not handle move chains properly, as all delivery moves contribute to the `incoming_qty` and all return moves contribute to the `outgoing_qty`. This results in an `incoming_qty` of 1 (for the pick) + 1 (for the ship) and an `outgoing_qty` of 1 (for the 1-step return), that is a `qty_processed` of 1. As a result, the procurement will be generated for a quantity of `0 - 1` (rather than 0): https://github.com/odoo/odoo/blob/87e176ad76c9d7b87cd622ae38a8b9a62813b1cb/addons/sale_stock/models/sale_order_line.py#L388-L402 which leads to the unexpected picking creations. opw-5432558 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246141
This update resolves an issue where updating the amount of a payment with multiple liquidity lines would cause an error. The fix ensures that the payment's journal entry accurately reflects changes to liquidity lines, improving payment processing reliability. This change impacts payments with complex liquidity line configurations.
Original PR description
This PR improves payment move synchronization and fixes an error that is caused while changing amount of a Payment that has multiple liquidity lines. Steps to reproduce: 1. Create payment with x…
This PR improves payment move synchronization and fixes an error that is caused while changing amount of a Payment that has multiple liquidity lines. Steps to reproduce: 1. Create payment with x amount and validate it. 2. Open the payment journal entry. 3. Reset to draft and update the liquidity line amount from x to (x - y) 4. Create another liquidity line with amount y to balance entry and post it. 5. Draft the payment and try to update the amount. A traceback will appear. `ValueError: Expected singleton` Cause: The lines for payment JE are prepared for the case assuming that there will be only 1 liquidity line, but since we have more than 1, we get a Singleton error. Description of changes made: While preparing values for move in `synchronize_to_moves()` check for multiple liquidity lines and append all values to write. Further, the `_prepare_move_line_default_vals()` is also improved in order to manage different type of move lines individually. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246675
This update resolves an issue where Odoo wasn't correctly managing access to email messages related to activities. The changes enhance the system's ability to securely access and manage these messages, ensuring reliable email functionality within the application. This improves the overall performance and stability of Odoo's email features.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248125 Forward-Port-Of: odoo/odoo#245744
This update fixes several issues related to rental scheduling, preventing conflicts when users update shift dates and ensuring resources are correctly allocated. Specifically, it now validates shift dates to avoid overlapping bookings and correctly displays error messages when conflicts arise, improving the reliability of the rental scheduling process.
Original PR description
## [FIX] sale_renting_planning: prevent user to do a conflict with rental shift Before this commit, the user could update the shift linked to a rental order and creating a conflict with another shift…
## [FIX] sale_renting_planning: prevent user to do a conflict with rental shift Before this commit, the user could update the shift linked to a rental order and creating a conflict with another shift for the same resource and so, it would be impossible for the resource to be in 2 spaces at the same time (or it is impossible to rent a room to 2 different customers). This commit returns an Validation Error if the user updates the planned dates of a rental shift and creates a conflict. ## [FIX] sale_renting_planning: add problematic shifts only if rental order Before this commit, the previous fix making sure the error, saying no resource is available during the generation of a shifts when the user confirms a sale order, is only displayed when the `Sync Shifts and Rental Orders` is enabled, could potentially never display the error when it should be expected because we only check if the last SOL of the batch to generate shifts has the feature enable or not. This commit makes sure the error is correctly displayed as expected. ## [FIX] sale_renting_planning: update condition of Rental buttons in shift Before this commit, the user could click on Create order button for an open shift is the role having the rental feature enabled. To problem is a resource is required to make sure the rental order can be delivered. About the other button shown, `Add to Last Order` one, this one could be clicked even if the shift is in conflict with another shift and so, it will display a warning saying no resource is available. This commit makes sure - `Create Order` button in shift form view is not visible when the shift is a open shift. - `Create Order` and `Add to Last Order` buttons in shift form view are not displayed when the shift is in conflict. task-5065930 Forward-Port-Of: odoo/enterprise#97024
This update fixes an error that occurred when users selected the same start and end dates for rental products, preventing a system crash. The fix ensures that the system correctly handles this scenario, allowing users to properly select rental periods. This improves the reliability of the rental product functionality.
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
This update fixes an issue where invoices for Point of Sale orders paid with customer accounts wouldn't correctly reflect payments made through subsequent 'settle due' orders. Now, invoices accurately display the total paid, ensuring proper accounting and preventing unpaid order statuses. This improves the accuracy of financial reporting.
Original PR description
If you made a PoS order paid with the customer account payment method, and then you created a settle due order to settle the previous one. If you then create the invoice for the original order, the invoice would appear as unpaid, because the payments of the settle due order were not taken into account. Steps to reproduce: ------------------- * Create a PoS order and pay with the customer account payment method * Settle the order that you just created with a settle due order * Close the session * Go on the original order and create the invoice > Observation: The invoice appears as unpaid when it should be paid. Why the fix: ------------ When creating the invoice we gather all the payments of the order to create the corresponding journal entries. But the payment of the settle due order were not included. So the order was considered as unpaid. opw-5268042 Forward-Port-Of: odoo/enterprise#105564
This update resolves an issue where creating or editing product variants within recurring or rental pricing configurations resulted in incorrect product linking and misconfiguration. The fix restricts the 'Product Variants' field to only allow selecting existing variants, ensuring accurate pricing and product setup for subscription and rental products.
Original PR description
**version** - 19.0 **Steps to reproduce** 1. Create a recurring or rental product. 2. Add multiple variants to the product. 3. Configure a recurring/rental price. 4. From the *Product Variants* column, try to create or edit a variant. **Issue** Creating or editing a variant from the *Recurring Prices* or *Rental Prices* section creates a new variant that is not properly linked to the parent product, leading to incorrect configuration. same issue occurs in both **sale_subscription** and **sale_renting**. **Fix** Restrict the *Product Variants* field in *Recurring Prices* and *Rental Prices* to allow selection of existing variants only by disabling create and edit options. taskid-5484735 Forward-Port-Of: odoo/enterprise#103958
This update fixes an issue where month names were incorrectly displaying based on the user's locale instead of the Odoo environment's language. The change ensures month names are consistently shown in the correct language for each Odoo instance, improving accuracy and user experience. This impacts all payroll and reporting modules.
Original PR description
Month name is using the locale language instead of the env language Get month name in the env language Community PR: odoo/odoo#246790 Task [link](https://www.odoo.com/odoo/project.task/5902364) task-5902364 Forward-Port-Of: odoo/enterprise#106929 Forward-Port-Of: odoo/enterprise#106175
This update resolves an issue where the asset plus column in reports wasn't displaying acquisition values correctly, particularly for assets without a bill of sale. It also removes a redundant filter from the depreciation schedule, streamlining the reporting process and improving clarity.
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.
1 change
Resolved issues and error corrections
This update resolves an issue where reports for Peruvian VAT returns were occasionally failing due to inconsistent data selection. The fix ensures that the correct stock valuation layer is always chosen, leading to reliable reporting. This improves the accuracy of financial data for our Peruvian clients.
Original PR description
Occasionally the test_kardex_report test fails: ``` Traceback (most recent call last): File "/data/build/enterprise/l10n_pe_reports_stock/tests/test_ple_kardex_report.py", line 126, in…
Occasionally the test_kardex_report test fails:
```
Traceback (most recent call last):
File "/data/build/enterprise/l10n_pe_reports_stock/tests/test_ple_kardex_report.py", line 126, in test_kardex_report
self.assertSequenceEqual(
AssertionError: Sequences differ: ['M1|[18 chars]|1||02/01/2024|01|FBILL202401|0002|02|product_[313 chars], ''] != ['M1|[18 chars]|1||01/01/2024|01|FBILL202401|0001|02|product_[313 chars], '']
First differing element 0:
'M1|0[17 chars]|1||02/01/2024|01|FBILL202401|0002|02|product_[21 chars]0|1|'
'M1|0[17 chars]|1||01/01/2024|01|FBILL202401|0001|02|product_[21 chars]0|1|'
- ['M1|0000|1|99|FURN9999|1||02/01/2024|01|FBILL202401|0002|02|product_order_no|NIU|3.00|0.00|1|',
? ^ ^
+ ['M1|0000|1|99|FURN9999|1||01/01/2024|01|FBILL202401|0001|02|product_order_no|NIU|3.00|0.00|1|',
? ^ ^
```
The issue was reproducible locally by disabling nested loop joins: `self.env.cr.execute("SET LOCAL enable_nestloop = off")` to nudge Postgres to use a different join strategy.
The test creates a PO that is picked and invoiced in two steps (first quantity 3, then the remaining 2). As a result, the `stock.valuation.layer` ends up being linked to two `account.move.line`s because the join goes through the same `purchase_order_line`. So it will appear twice in the `_get_ple_reports_data()` query. A `DISTINCT
ON (stock_valuation_layer.id)` was already there with the goal of picking one of them. Which one depends on the order, but it's not deterministic: the valuation layer's `id`, `product_id`, and `create_date` will all be the same.
This commit makes the behavior deterministic by sorting on PO line and SO line ids.
runbot-error-238888
Forward-Port-Of: odoo/enterprise#10704710 changes
Enhancements to existing features
This update enhances the chatter interface by adding a company card with details sourced from DNB. Industry tags previously stored separately are now integrated into this card, providing a more complete view of partner information. This improves communication and data accessibility.
Original PR description
Before: Industry tags coming from DnB were stored in the Tags section of res.partner. and there was no Company info card in chatter. After: Industry tags coming from DnB are not stored in the Tags section of res.partner. Company card is created in chatter that is having details from Dnb along with tags. task-5373200 Forward-Port-Of: odoo/odoo#239464
Resolved issues and error corrections
This update resolves an issue where Sale Orders imported through POS and paid with online payments remained in 'Quotation' status. The fix ensures that the Sale Order's state is correctly updated to 'Paid' after online payment processing, streamlining the order management process. This improves data accuracy and prevents manual intervention.
Original PR description
When a Sale Order was imported in PoS and paid using online payment method, the SO's state stayed in Quotation. Steps to reproduce: ------------------- * Create a new Sale Order with a product available in POS * Add Online Payment in the Payment Methods * Import and settle the Order in POS * Pay the order with the Online Payment > Observation: In Sale app, the Sale Order is still in Quotation state. Why the fix: ------------ Online payments call `action_pos_order_paid()` directly, which only sets the POS order state to paid and never confirms the linked sale.order. Other payment methods do it in `sync_from_ui()`. Extended `action_pos_order_paid()` in pos_sale will now confirm linked quotations after POS marks the order as paid. opw-5022526 Forward-Port-Of: odoo/odoo#247998 Forward-Port-Of: odoo/odoo#230112
This update resolves an issue where serial numbers assigned to products during repair orders would disappear from the system. The fix ensures that all stock movements, including those using generic stock, correctly display the assigned serial number, improving accuracy and traceability. 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#247885 Forward-Port-Of: odoo/odoo#247150
This update fixes an issue where anonymous users registering for events bypassed the address form, leading to incorrect tax calculations on sale orders. The fix ensures the address form is always displayed during event registration, guaranteeing accurate tax application based on the user's billing address. This improves the reliability of event ticket sales.
Original PR description
**Steps to reproduce:** - Install Website/Event/Sales apps - Create a new event and set a ticket price - Create a fiscal position (with specific tax) for a country with `auto_apply` enabled - Publish…
**Steps to reproduce:** - Install Website/Event/Sales apps - Create a new event and set a ticket price - Create a fiscal position (with specific tax) for a country with `auto_apply` enabled - Publish the event - Register to the event as a anonymous user - The process bypasses the address form and goes directly to payment - The resulting sale order will have no fiscal position - Prices won't be impacted by taxes related to the user billing address **Issue:** Address form is skipped before payment for event registration of a public user as `_needs_customer_address` is not overwritten properly in some module. This is probably due to a refactoring that changed how the required information is evaluated in the payment flow (see related commit). **Fix:** Set `_needs_customer_address` to `True` by default to avoid such issues in dependant modules. Might need to remove this feature in master as the workarounds are not that clean (geo_ip, check on fiscal position enabled, overwrite everywhere, others ?). Similar fix is done for appointments with payment enabled. related: https://github.com/odoo/odoo/commit/d43f0423667835512e16c3fd3474328da63a948d original-task: https://www.odoo.com/odoo/project/49/tasks/4307281 opw-5143124
This update resolves an issue where Ctrl+A followed by Delete wouldn't remove all text when the editable area started with a non-editable element. The fix ensures the selection correctly anchors to the deepest editable position, guaranteeing full content removal. This improves the editor's functionality and user experience.
Original PR description
Description of the issue this PR addresses: - When an element with `contenteditable="false"` is the first node in the editable, pressing Ctrl+A followed by Delete does not remove the entire selection and instead deletes only the last character. Desired behavior after PR is merged: - Ensure that the selection is anchored to the deepest editable position when performing a select-all operation so that the full editable content is correctly selected and removed. Steps to reproduce: - Insert a toggle list using `/togglelist` in a new todo - Add one or more paragraphs below it and enter some text - Select all content using Ctrl+A - Press Backspace to delete the selection - Observe that only the last character is removed Backport of: 67e6a617def3bf4f9eb6b63b0850f5cfc773bccc task-5363926 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where resetting dynamic colors in SVG illustrations within the website editor would cause the images to disappear. Now, resetting the color palette correctly restores the theme colors, ensuring SVG images remain visible and functional. This improves the user experience when customizing website designs.
Original PR description
Steps to reproduce: - Insert a media library SVG illustration. - Change one of its Dynamic Colors. - Click the reset button in the colorpicker. => The SVG disappears. Before this commit, resetting a dynamic SVG color could send an empty color value and the image failed to render. After this commit, resetting restores the theme palette colors so the SVG stays visible. task-5868584 Forward-Port-Of: odoo/odoo#245778
This update resolves an issue that prevented accurate payment move synchronization when a payment had multiple liquidity lines. The fix ensures the system correctly handles payments with varying liquidity line amounts, preventing errors and improving financial reporting accuracy. This change impacts the account module and related payment processing.
Original PR description
This PR improves payment move synchronization and fixes an error that is caused while changing amount of a Payment that has multiple liquidity lines. Steps to reproduce: 1. Create payment with x…
This PR improves payment move synchronization and fixes an error that is caused while changing amount of a Payment that has multiple liquidity lines. Steps to reproduce: 1. Create payment with x amount and validate it. 2. Open the payment journal entry. 3. Reset to draft and update the liquidity line amount from x to (x - y) 4. Create another liquidity line with amount y to balance entry and post it. 5. Draft the payment and try to update the amount. A traceback will appear. `ValueError: Expected singleton` Cause: The lines for payment JE are prepared for the case assuming that there will be only 1 liquidity line, but since we have more than 1, we get a Singleton error. Description of changes made: While preparing values for move in `synchronize_to_moves()` check for multiple liquidity lines and append all values to write. Further, the `_prepare_move_line_default_vals()` is also improved in order to manage different type of move lines individually. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246675
This update fixes an issue where tasks automatically scheduled with a start date within November were incorrectly limited to just 25-26 November. The fix removes previously used time intervals before rescheduling, ensuring tasks extend into the next month as needed. This prevents tasks from being under-allocated for their required hours.
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#106160 Forward-Port-Of: odoo/enterprise#101262
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 and improving order accuracy. This resolves a failing test and ensures reliable order processing.
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 reports for Peruvian VAT returns were sometimes generating duplicate entries. The fix ensures that the system consistently picks the correct stock valuation layer, leading to accurate reporting. This improves data reliability for financial compliance in Peru.
Original PR description
Occasionally the test_kardex_report test fails: ``` Traceback (most recent call last): File "/data/build/enterprise/l10n_pe_reports_stock/tests/test_ple_kardex_report.py", line 126, in…
Occasionally the test_kardex_report test fails:
```
Traceback (most recent call last):
File "/data/build/enterprise/l10n_pe_reports_stock/tests/test_ple_kardex_report.py", line 126, in test_kardex_report
self.assertSequenceEqual(
AssertionError: Sequences differ: ['M1|[18 chars]|1||02/01/2024|01|FBILL202401|0002|02|product_[313 chars], ''] != ['M1|[18 chars]|1||01/01/2024|01|FBILL202401|0001|02|product_[313 chars], '']
First differing element 0:
'M1|0[17 chars]|1||02/01/2024|01|FBILL202401|0002|02|product_[21 chars]0|1|'
'M1|0[17 chars]|1||01/01/2024|01|FBILL202401|0001|02|product_[21 chars]0|1|'
- ['M1|0000|1|99|FURN9999|1||02/01/2024|01|FBILL202401|0002|02|product_order_no|NIU|3.00|0.00|1|',
? ^ ^
+ ['M1|0000|1|99|FURN9999|1||01/01/2024|01|FBILL202401|0001|02|product_order_no|NIU|3.00|0.00|1|',
? ^ ^
```
The issue was reproducible locally by disabling nested loop joins: `self.env.cr.execute("SET LOCAL enable_nestloop = off")` to nudge Postgres to use a different join strategy.
The test creates a PO that is picked and invoiced in two steps (first quantity 3, then the remaining 2). As a result, the `stock.valuation.layer` ends up being linked to two `account.move.line`s because the join goes through the same `purchase_order_line`. So it will appear twice in the `_get_ple_reports_data()` query. A `DISTINCT
ON (stock_valuation_layer.id)` was already there with the goal of picking one of them. Which one depends on the order, but it's not deterministic: the valuation layer's `id`, `product_id`, and `create_date` will all be the same.
This commit makes the behavior deterministic by sorting on PO line and SO line ids.
runbot-error-238888
Forward-Port-Of: odoo/enterprise#1070472 changes
Resolved issues and error corrections
This update resolves a bug where incorrect order quantities were sometimes sent to the kitchen when using the numpad in the POS. The fix ensures the system waits for quantity updates before submitting orders, preventing errors that caused test failures. This improves order accuracy and reliability for restaurant 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
This update resolves an issue where reports for Peruvian VAT returns were occasionally failing due to inconsistent data selection. The fix ensures the reports always pick the correct data by sorting purchase and sales order IDs, making the process predictable and reliable. This improves the accuracy of financial reporting for our Peruvian clients.
Original PR description
Occasionally the test_kardex_report test fails: ``` Traceback (most recent call last): File "/data/build/enterprise/l10n_pe_reports_stock/tests/test_ple_kardex_report.py", line 126, in…
Occasionally the test_kardex_report test fails:
```
Traceback (most recent call last):
File "/data/build/enterprise/l10n_pe_reports_stock/tests/test_ple_kardex_report.py", line 126, in test_kardex_report
self.assertSequenceEqual(
AssertionError: Sequences differ: ['M1|[18 chars]|1||02/01/2024|01|FBILL202401|0002|02|product_[313 chars], ''] != ['M1|[18 chars]|1||01/01/2024|01|FBILL202401|0001|02|product_[313 chars], '']
First differing element 0:
'M1|0[17 chars]|1||02/01/2024|01|FBILL202401|0002|02|product_[21 chars]0|1|'
'M1|0[17 chars]|1||01/01/2024|01|FBILL202401|0001|02|product_[21 chars]0|1|'
- ['M1|0000|1|99|FURN9999|1||02/01/2024|01|FBILL202401|0002|02|product_order_no|NIU|3.00|0.00|1|',
? ^ ^
+ ['M1|0000|1|99|FURN9999|1||01/01/2024|01|FBILL202401|0001|02|product_order_no|NIU|3.00|0.00|1|',
? ^ ^
```
The issue was reproducible locally by disabling nested loop joins: `self.env.cr.execute("SET LOCAL enable_nestloop = off")` to nudge Postgres to use a different join strategy.
The test creates a PO that is picked and invoiced in two steps (first quantity 3, then the remaining 2). As a result, the `stock.valuation.layer` ends up being linked to two `account.move.line`s because the join goes through the same `purchase_order_line`. So it will appear twice in the `_get_ple_reports_data()` query. A `DISTINCT
ON (stock_valuation_layer.id)` was already there with the goal of picking one of them. Which one depends on the order, but it's not deterministic: the valuation layer's `id`, `product_id`, and `create_date` will all be the same.
This commit makes the behavior deterministic by sorting on PO line and SO line ids.
runbot-error-238888
Forward-Port-Of: odoo/enterprise#10704716 changes
New functionality added to Odoo
This update introduces new reports for Colombian tax compliance, generating CSV files for submission to the DIAN. These reports automate the creation of required XML files, simplifying the process for users to meet reporting deadlines and regulations. The changes include new data models and configurations to manage these reports effectively.
Original PR description
Purpose: Exogenous information is the set of data that individuals and legal entities must periodically submit to the DIAN, with different deadlines depending on the taxpayer's characteristics,…
Purpose: Exogenous information is the set of data that individuals and legal entities must periodically submit to the DIAN, with different deadlines depending on the taxpayer's characteristics, regarding transactions with clients or users of their products or services. DIAN requires exogenous information reports to be delivered as an XML file. The goal is to generate the most important formats (1001, 1003, 1005, 1007, 1008 and 1009) as a CSV, so the user can submit it to the DIAN for the XML generation. Key Aspects of the reports: - Each report has a set amount of columns(including categories) that must be displayed and the columns are position dependent. - The rows of the report can be categorized accordingly - Header - AMLs grouped by partner that are not considered minor amounts - AMLs grouped in a minor amount row based on the report's minor amount rule - The minor amount rules are dependent on the exogenous categories Additional Changes: Models: - l10n_co.exogenous.category: - Displayed as columns on the report - Used as a basis for the minor amount rules in the report - sequence: the column position of the category on the report - report_type: the report the category is applicable to - name: name of the category displayed on the report - l10n_co.exogenous.config: -Defines how each report is used per chart of account - report_type: determines which report the config is for - exogenous_category_id: the exogenous category used - value_to_report: the type of amount to aggregate for said category, such as credit, debit, balance - concept: the concept if required by the report - account_ids: a many2many relationship to chart of accounts the config is applicable to Relations: - account_account_exogenous_config: -the Many2many relation table between - account.account - l10n_co.exogenous.config Currency: - l10n_co.reports.uvt: - Used to compare amounts in minor amount rules - A tax value unit used by the Colombian government to standardize tax values Wizard: - l10n_co_reports.exogenous_report.wizard: Allows the user to generate the CSV based on the report Function Workflow: - Generate account moves using the accounts that are mapped to exogenous configs - Navigate to the General Ledger report - Click on the action cog to dropdown the button, `Exogenous Report CSV` - A wizard will pop-up to allow the user to select the type of exogenous report they want to export - A CSV file will be downloaded onto the user's machine so they can import the file into the DIAN pre-validator tool task-5061117
This update introduces a new module to generate a required .csv file (FAF) for the Federal Tax Authority (FTA) audits. This allows businesses to meet FTA reporting requirements and move closer to accreditation, ensuring ongoing compliance with UAE tax regulations. The generated file contains key financial data in a format the FTA can directly use for audits.
Original PR description
The Federal Tax Authority (FTA) requires businesses to generate a FAF (FTA Audit File) for audit and compliance purposes in a .csv format. There are two kinds, VAT and Excise. In this task, we aim to…
The Federal Tax Authority (FTA) requires businesses to generate a FAF (FTA Audit File) for audit and compliance purposes in a .csv format. There are two kinds, VAT and Excise. In this task, we aim to generate a successful VAT Audit File, whereas we we will work to support the Excise Taxes and it's audit file in a separate task. This will bring us a step closer to re-registering us as an Accredited Software Vendor with the FTA (https://tax.gov.ae/en/tax.support/tax.accounting.software.vendors/accredited.tax.accounting.software.vendors.aspx). As per the FTA, "The FAF should be a pure collection of data in the comma-separated values (csv) file format and should be broken down by, but not limited to, invoices, credit notes etc., to give all the required information to FTA to conduct the Audit. The taxpayer should not be able to modify any value in the FAF. The FAF should not be an image file." This PR introduces a new module l10n_ae_saft which allows the users to export the a FAF .csv file from the general ledger. task-5256491 Forward-Port-Of: odoo/enterprise#99228
This update introduces a new reporting process for Belgian employees who become unemployed. It includes the necessary steps to file a DRS (déclaration des risques sociaux) with the ONSS, ensuring compliance with local regulations. This addition supports 11 unemployment scenarios, streamlining HR processes.
Original PR description
Whenever an employee becomes unemployed, there is a need to send a DRS (déclaration des risques sociaux) to the ONSS. This introduces the DRS for unemployment with the 11 scenarios. Task: 5915160
Enhancements to existing features
This update simplifies the employee appraisal process by removing the 'Request Appraisal' button from the employee view. It has been replaced with a smart button, streamlining the user experience and making it easier for employees to initiate appraisals. This change focuses on improving usability and efficiency.
Original PR description
[IMP] hr_appraisal: change appraisals UX in employee view Improvements made in the UI of hr_appraisal by removing Request Appraisal button in the employee form view and replacing it with a smart button task-5443582
This update adds a total progress bar to the Gantt chart views for Project, Field Service, and Planning modules. This provides a clearer visual representation of overall progress, particularly when grouped by role and department, allowing users to quickly assess project status.
Original PR description
[IMP] {project, planning}: Gantt total progress bar
In this commit:
- progress bar displayed for total row in project, field service
and planning (when group by role, department, role > resource and department)
task-3992041This update enhances the customer display in point-of-sale (POS) systems by automatically including crucial scale data like product details, prices, and weights. This ensures accurate and complete information is presented to customers during weighing transactions, improving the overall shopping experience. This change is an important improvement to the POS functionality.
Original PR description
In this commit: --- - Introduce an override to inject scale details (product, unit price, total price, weights, tare) into the customer display adapter. task-5431617 related-https://github.com/odoo/odoo/pull/241509
This update enhances the 'itsme' integration in Odoo Sign by providing clearer visibility into available IAP credits and simplifying the process for users to purchase more. The changes include a direct link to manage credits, a more informative email notification, and visual indicators within the Sign Editor, making the 'itsme' authentication flow more user-friendly.
Original PR description
Prior to this commit, the integration of 'itsme' in Odoo Sign lacked visibility regarding IAP credits. Users could not easily see their balance when configuring roles, and the "insufficient credits"…
Prior to this commit, the integration of 'itsme' in Odoo Sign lacked visibility regarding IAP credits. Users could not easily see their balance when configuring roles, and the "insufficient credits" email was generic without actionable steps. Additionally, the Sign Editor sidebar did not visually distinguish between authentication methods (SMS vs itsme).
This commit improves the UX for the 'itsme' flow through the following changes:
1. Role Configuration (sign.item.role):
- Updates the form view to display the current available credits when 'itsme' is selected as the authentication method.
- Adds a direct link to the IAP service to manage credits.
2. Email Notification (mail.template):
- Refactors the 'sign_template_mail_not_enough_credits' template to use clearer wording ("due to insufficient credits") for all auth methods.
- Adds a specific condition for 'itsme': if verification fails due to lack of credits, the email now includes a direct link to the IAP purchase page.This update enhances the way email templates are rendered in Odoo, specifically by directly incorporating the desired email layout from the template data. This ensures a more consistent and visually accurate email experience across various modules, improving communication with customers and partners.
Original PR description
This commit changes the way email layout is specified for the composer. Currently the email layout is set by email_layout_xmlid in the context. This commit sets the email_layout_xmlid in the mail template records. Task-4229684
This update streamlines production planning by allowing users to plan single workorders and incorporating planning per employee. Now, a production is automatically considered 'planned' when all associated workorders are scheduled, simplifying the tracking of production progress. This change enhances efficiency and visibility within the manufacturing process.
Original PR description
1) Adapt planning related views 2) Allow to plan a single workorder 3) Add Planning per Employee Note that now a production is considered as planned when all of its workorders are planned. task: 5259535
This update adds the ability to include buffer zones around tasks in the Gantt chart. This allows users to represent durations like travel time or setup periods separately from the core task duration, providing a more accurate visual representation of project timelines. It enhances the Gantt chart's ability to display auxiliary durations.
Original PR description
This commit introduces two new attributes to the Gantt view architecture to support visual margins around task pills: - `buffer_start`: Name of the float field defining the pre-task margin (in hours). - `buffer_stop`: Name of the float field defining the post-task margin (in hours). This feature allows users to visualize auxiliary durations such as travel time, setup/cleanup periods, or security margins distinct from the main task duration. task-5259085
This update streamlines the creation of HK IRD reports by automating employee declaration population and adding support for new report types (IR56E/G). It also includes crucial fixes for data validation and company filtering to ensure accurate reporting and compliance.
Original PR description
- Improve the UX of the IRD reports by providing a way to automatically populate the employee's declaration for all IRD reports. - Update the IRD reports XSD files and add the missing ones. - Add XML generation for IR56E/G, which didn't exist back when the original reports were done. - Add proper testing for these reports. and also - Store the version of the employee when an employee declaration is created - Employees on the employee declaration are nowfiltered to only allow employees of the same company as the one set on the employee declaration - Fixes a wrongly formatted HKID number in the demo data task-5050333
Resolved issues and error corrections
This update resolves an issue where payment reports were sometimes generated with inconsistent formats, leading to potential errors. The fix ensures all localized payment reports (across various countries) now use a standardized export format, improving reliability and accuracy. This change has been backported to version 18.0.
Original PR description
\* = l10n_{ae, au, ch, in, sa, us}_hr_payroll + hr_payroll_account_iso20022
Issue:
The current behavior looks deterministic: when clicking on "Create Payment Report" it -sometimes- shows the current company's export format by default, other times it shows the "NACHA" type. Or it could be the last installed module's export format value for the other companies.
Solution:
I fixed it in this PR: https://github.com/odoo/enterprise/pull/93683 and now backporting the changes to version 18.0
task-5189295
Forward-Port-Of: odoo/enterprise#105645
Forward-Port-Of: odoo/enterprise#100126Users were experiencing blocks in the Point of Sale UI due to printers failing to receive print job requests. This change reverts a recent update that introduced this issue, allowing users to successfully print from the POS system. It's a quick fix to restore normal POS functionality.
Original PR description
Since preparation printers are ignoring the print job requests sent a lot of users are being blocked in pos UI. This reverts commit 5e290c264f14108e036344663fc459bf77da265e. This unblocks the user's UI in case of a duplicate print Forward-Port-Of: odoo/enterprise#104421
This update fixes an issue where invoices for Point of Sale orders paid with customer accounts wouldn't correctly reflect payments made through settle due orders. The fix ensures that all payments, including those from settle due orders, are accounted for when generating invoices, preventing unpaid invoice statuses.
Original PR description
If you made a PoS order paid with the customer account payment method, and then you created a settle due order to settle the previous one. If you then create the invoice for the original order, the invoice would appear as unpaid, because the payments of the settle due order were not taken into account. Steps to reproduce: ------------------- * Create a PoS order and pay with the customer account payment method * Settle the order that you just created with a settle due order * Close the session * Go on the original order and create the invoice > Observation: The invoice appears as unpaid when it should be paid. Why the fix: ------------ When creating the invoice we gather all the payments of the order to create the corresponding journal entries. But the payment of the settle due order were not included. So the order was considered as unpaid. opw-5268042 Forward-Port-Of: odoo/enterprise#105564
This update fixes inaccuracies in the Mod349 report for Spanish EC Sales Lists, specifically addressing issues with refund calculations and currency handling. It now correctly accounts for refunds and multi-currency transactions, improving the report's accuracy and reliability for tax reporting.
Original PR description
[IMP] l10n_es_reports: mod349 uses tax_tags Fix modelo 349 computation, allow for mixed operations The mod349 is the Spanish EC Sales List report. In this PR, we: - Fix some of the report computation (see for instance how refunds not in the same period displayed incorrectly the value invoice-refund when the refund should be displayed) - Allowed for the use of taxes with related tax_tags rather than using a field for the whole account.move. This implied modifying the custom engine to fetch move lines rather than moves and to adapt its sorting and computing. See also https://github.com/odoo/odoo/pull/237142
This update addresses an issue where some automated tour processes were failing intermittently. The team temporarily added a delay to these tours to ensure they completed successfully. This commit restores the original behavior by re-enabling the necessary delay, allowing these tours to run as intended. It's a follow-up to previous work aimed at removing this delay.
Original PR description
*account_reports,hr_contract_salary,hr_payroll_attendance, pos_enterprise,test_l10n_be_hr_payroll_account This commit is a followup of [1] which attempted to remove the 50ms delay between each step in tours. This allowed to highlight non deterministic tours that only passed thanks to that delay. A temporary flag was added to indicate to the tour system that a tour must be run with the 50ms delay (otherwise it fails). However, it seems that some tours have been forgotten in the process. This commit flags them, so they run as before. We'll now try to understand why they (sometimes) fail without a delay, and progressively remove the added flags. [1] odoo/odoo#237531 runbot error-238493 runbot error-238498 runbot error-238490 runbot error-238496 runbot error-238491 runbot error-238513 runbot error-238494 runbot error-238517 runbot error-238500 runbot error-238533
10 changes
New functionality added to Odoo
This update establishes the core framework for Kuwait payroll, ensuring compliance with local labor laws. It includes automated Social Security calculations, complex End of Service benefits, and accurate leave management, providing a solid base for future payroll enhancements within the Kuwait operation.
Original PR description
Introduce the foundational setup for the Kuwait payroll localization, serving as the base for subsequent enhancements, and implement core legal requirements including Social Security, End of Service…
Introduce the foundational setup for the Kuwait payroll localization, serving as the base for subsequent enhancements, and implement core legal requirements including Social Security, End of Service (EOS), and leave logic. The goal of this change is to establish a functional payroll framework compliant with Kuwait Labor Law. It provides a consistent baseline by: 1. Setting up demo data and standard working schedules for immediate testing. 2. Automating Social Security calculations for employee deductions and company contributions. 3. Implementing complex End of Service indemnity logic based on service duration and departure reasons (e.g., resignation tiers). 4. Handling specific leave computations, including tiered deductions for sick leave and monthly provisions for accounting accuracy. Technical summary: - Added demo company: "My Kuwaiti Company" and linked employees. - Defined standard working schedule (9:00–17:00, Sunday–Thursday). - Introduced Kuwait salary structure "Kuwait: Monthly Pay". - Added Rule Parameters for Social Security: - Basic Pension: Employee (10%), Company (15%). - Unemployment: Employee (0.5%), Company (0.5%). - Added Salary Rules for: - Social Security deductions and contributions. - End of Service Benefit: Logic for "Resigned" (<3y: 0%, 3-5y: 50%, 5-10y: 66%, >10y: 100%), "Fired" (0%), and standard calculation (15 days/year first 5 years, 1 month thereafter). - End of Service Provision: Monthly accrual calculation. - Annual Leave Provision and Remaining Leaves Compensation. - Added "Kuwait Annual Leaves" Accrual Plan (2.5 days/month, starts after 6 months) and linked it to the Annual Leave type. - Overridden `_get_worked_day_lines` in `hr.payslip` to implement tiered deduction logic for Sick Leaves (15 days full pay, 10 days 75%, etc.). task-5116274
Resolved issues and error corrections
This update ensures invoices for Point of Sale orders are correctly marked as paid when a settle due order is used to complete the payment. Previously, the system didn't account for payments from settle due orders, leading to invoices appearing unpaid. This fix ensures accurate invoice status and payment tracking.
Original PR description
If you made a PoS order paid with the customer account payment method, and then you created a settle due order to settle the previous one. If you then create the invoice for the original order, the invoice would appear as unpaid, because the payments of the settle due order were not taken into account. Steps to reproduce: ------------------- * Create a PoS order and pay with the customer account payment method * Settle the order that you just created with a settle due order * Close the session * Go on the original order and create the invoice > Observation: The invoice appears as unpaid when it should be paid. Why the fix: ------------ When creating the invoice we gather all the payments of the order to create the corresponding journal entries. But the payment of the settle due order were not included. So the order was considered as unpaid. opw-5268042
This update resolves an issue where invoice exports were failing when invoices included a section or note line as the first entry. The fix filters out these lines during currency rate calculations, preventing a division-by-zero error and ensuring invoices can be correctly sent and downloaded. This improves the reliability of invoice export processes.
Original PR description
Before this commit: Steps 1) Create an invoice with a section or note line as the first line 2) Try to send or download the invoice => A traceback error is raised with the message: File "/home/odoo/src/enterprise/17.0/l10n_cl_edi_exports/models/account_move.py", line 68, in _get_inverse_currency_rate return float_round(abs(self.line_ids[0].balance / self.line_ids[0].amount_currency), 2) ZeroDivisionError: float division by zero This occurs because the `_get_inverse_currency_rate()` method is dividing over self.line_ids[0].amount_currency which is always equal to 0 in case of section or note line is added as a first line in the invoice. After this commit: Filtering out section and note lines in _get_inverse_currency_rate() to correctly calculation the inverse currency rate opw-5488417 Forward-Port-Of: odoo/enterprise#105774
This update fixes an issue where reports related to Spanish withholding taxes were incorrectly including a specific tax type (347). The change ensures that these reports accurately reflect withholding tax moves by clearing the `type for 347` field, improving the accuracy of financial reporting. This resolves a potential discrepancy in tax calculations.
Original PR description
- Moves that use withholding taxes should have the `type for 347` unselected and left blank. Related PR : https://github.com/odoo/odoo/pull/245828 task-5732679 Forward-Port-Of: odoo/enterprise#106889 Forward-Port-Of: odoo/enterprise#105597
This update resolves a bug that caused a RecursionError when producing large quantities of serial-tracked products. The fix prevents excessive recomputation during manufacturing order splitting, ensuring stability and preventing errors with high-volume production runs. This improves the reliability of the MRP module.
Original PR description
**Issue** When producing a large number of serial-tracked products, a RecursionError can occur. **Steps to reproduce** - Create three products tracked by serial number (ensure MTO and Manufacture…
**Issue** When producing a large number of serial-tracked products, a RecursionError can occur. **Steps to reproduce** - Create three products tracked by serial number (ensure MTO and Manufacture routes are enabled). - Create a BoM for product A containing product B. - Create a BoM for product B containing product C. - Create a BoM for product C containing another product. - Create a manufacturing order of 100 units for product A and confirm it. - Go to the MO C and split into 100 mo - Go to the MO B and split into 100 mo -> RecursionError: maximum recursion depth exceeded. **Cause** While splitting, this method is called: https://github.com/odoo/odoo/blob/cda011dc8590773f6c3a26f4ae9d5242a3147024/addons/mrp/models/mrp_production.py#L2031 which ultimately calls: https://github.com/odoo/odoo/blob/cda011dc8590773f6c3a26f4ae9d5242a3147024/addons/stock/models/stock_move.py#L658-L661 This retriggers `_compute_packaging_uom_id` for all moves in `move_orig_ids` or `move_dest_ids`, and accessing the full recordsets causes recursive recomputation leading to a RecursionError. opw-5265424
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 similar names, regardless of whether the 'stock_barcode' app is installed.
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
This update fixes several issues related to rental scheduling conflicts, preventing users from overlapping bookings for the same resources. Specifically, it now validates date changes to rental shifts, preventing conflicts and ensuring resources are available for multiple bookings. The changes also ensure error messages are displayed correctly and that buttons are appropriately disabled when conflicts exist.
Original PR description
## [FIX] sale_renting_planning: prevent user to do a conflict with rental shift Before this commit, the user could update the shift linked to a rental order and creating a conflict with another shift…
## [FIX] sale_renting_planning: prevent user to do a conflict with rental shift Before this commit, the user could update the shift linked to a rental order and creating a conflict with another shift for the same resource and so, it would be impossible for the resource to be in 2 spaces at the same time (or it is impossible to rent a room to 2 different customers). This commit returns an Validation Error if the user updates the planned dates of a rental shift and creates a conflict. ## [FIX] sale_renting_planning: add problematic shifts only if rental order Before this commit, the previous fix making sure the error, saying no resource is available during the generation of a shifts when the user confirms a sale order, is only displayed when the `Sync Shifts and Rental Orders` is enabled, could potentially never display the error when it should be expected because we only check if the last SOL of the batch to generate shifts has the feature enable or not. This commit makes sure the error is correctly displayed as expected. ## [FIX] sale_renting_planning: update condition of Rental buttons in shift Before this commit, the user could click on Create order button for an open shift is the role having the rental feature enabled. To problem is a resource is required to make sure the rental order can be delivered. About the other button shown, `Add to Last Order` one, this one could be clicked even if the shift is in conflict with another shift and so, it will display a warning saying no resource is available. This commit makes sure - `Create Order` button in shift form view is not visible when the shift is a open shift. - `Create Order` and `Add to Last Order` buttons in shift form view are not displayed when the shift is in conflict. task-5065930 Forward-Port-Of: odoo/enterprise#97024
This update resolves an issue where reports related to Peruvian sales (l10n_pe) were occasionally producing inconsistent results. The fix ensures that stock movements are consistently identified in reports by sorting purchase and sales order IDs, guaranteeing accurate reporting. This improves the reliability of financial data for Peruvian customers.
Original PR description
Occasionally the test_kardex_report test fails: ``` Traceback (most recent call last): File "/data/build/enterprise/l10n_pe_reports_stock/tests/test_ple_kardex_report.py", line 126, in…
Occasionally the test_kardex_report test fails:
```
Traceback (most recent call last):
File "/data/build/enterprise/l10n_pe_reports_stock/tests/test_ple_kardex_report.py", line 126, in test_kardex_report
self.assertSequenceEqual(
AssertionError: Sequences differ: ['M1|[18 chars]|1||02/01/2024|01|FBILL202401|0002|02|product_[313 chars], ''] != ['M1|[18 chars]|1||01/01/2024|01|FBILL202401|0001|02|product_[313 chars], '']
First differing element 0:
'M1|0[17 chars]|1||02/01/2024|01|FBILL202401|0002|02|product_[21 chars]0|1|'
'M1|0[17 chars]|1||01/01/2024|01|FBILL202401|0001|02|product_[21 chars]0|1|'
- ['M1|0000|1|99|FURN9999|1||02/01/2024|01|FBILL202401|0002|02|product_order_no|NIU|3.00|0.00|1|',
? ^ ^
+ ['M1|0000|1|99|FURN9999|1||01/01/2024|01|FBILL202401|0001|02|product_order_no|NIU|3.00|0.00|1|',
? ^ ^
```
The issue was reproducible locally by disabling nested loop joins: `self.env.cr.execute("SET LOCAL enable_nestloop = off")` to nudge Postgres to use a different join strategy.
The test creates a PO that is picked and invoiced in two steps (first quantity 3, then the remaining 2). As a result, the `stock.valuation.layer` ends up being linked to two `account.move.line`s because the join goes through the same `purchase_order_line`. So it will appear twice in the `_get_ple_reports_data()` query. A `DISTINCT
ON (stock_valuation_layer.id)` was already there with the goal of picking one of them. Which one depends on the order, but it's not deterministic: the valuation layer's `id`, `product_id`, and `create_date` will all be the same.
This commit makes the behavior deterministic by sorting on PO line and SO line ids.
runbot-error-238888
Forward-Port-Of: odoo/enterprise#107047This update resolves an issue where the ICP report generation process failed due to a missing link between return types. The change now correctly identifies VAT reports to ensure accurate XBRL filing for the ICP report. This improves the reliability of tax reporting for Dutch businesses.
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
This update fixes an issue where the system wasn't creating enough quality checks when using the barcode scanning feature with lot tracking. The change ensures that quality checks are generated for each unique lot received, improving inventory accuracy and quality control processes. This impacts users relying on lot-based tracking for quality assurance.
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#105863 Forward-Port-Of: odoo/enterprise#102714
12 changes
Enhancements to existing features
This update enhances the handling of Romanian VAT invoices from the ANAF tax authority. Now, the system automatically downloads and attaches the official PDF version of the invoice, providing accountants with a visual document for comparison and compliance. This eliminates the previous reliance solely on XML data.
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
This update enhances the partner information displayed in Odoo's chatter by integrating data from DnB. Now, a dedicated company card is created in chatter, pulling in relevant details alongside the previously stored industry tags. This provides a more complete view of partner information directly within conversations.
Original PR description
Before: Industry tags coming from DnB were stored in the Tags section of res.partner. and there was no Company info card in chatter. After: Industry tags coming from DnB are not stored in the Tags section of res.partner. Company card is created in chatter that is having details from Dnb along with tags. task-5373200 Forward-Port-Of: odoo/odoo#239464
Resolved issues and error corrections
This update fixes an issue where the Stock Forecasted report incorrectly displayed stock quantities after a repair order was deleted. The fix ensures that related stock moves are properly cancelled when a draft repair order is removed, providing accurate stock reporting. This improves the reliability of inventory tracking within the repair process.
Original PR description
**Steps to reproduce:** * Install the *repair* module. * Create a *storable product* and set some **On Hand** quantity. * Go to *Repairs* and create a new **Repair Order**. Keep the repair order in…
**Steps to reproduce:** * Install the *repair* module. * Create a *storable product* and set some **On Hand** quantity. * Go to *Repairs* and create a new **Repair Order**. Keep the repair order in *draft* state (do not confirm). * In the **Parts** tab, add the storable product with the operation type set to *Add*. * Open the **Stock Forecasted** report for the added product. Note the quantity shown under *Outgoing Draft Transfer*. * Delete the **Repair Order**. * Open the **Stock Forecasted** report for the same product again. **Observed behavior:** * The quantity still appears in the **Stock Forecasted** report under *Outgoing Draft Transfer* even after the repair order is deleted. **Cause:** * Deleting a draft repair order triggers `_unlink_except_confirmed`. * This method prevents related stock moves from changing their state to cancel when the repair order is deleted. * The *Outgoing Draft Transfer* value is calculated as the sum of quantities of stock moves in draft state at draft state. https://github.com/odoo/odoo/blob/75ca0fec9a0d3b1e3a05a8bf3101bbe21846ac7a/addons/stock/report/stock_forecasted.py#L49 https://github.com/odoo/odoo/blob/75ca0fec9a0d3b1e3a05a8bf3101bbe21846ac7a/addons/stock/report/stock_forecasted.py#L90 * As a result, deleting a draft repair order leaves related stock moves in draft state, causing them to appear under *Outgoing Draft Transfer* https://github.com/odoo/odoo/blob/20d96c54b795b8d617776afe9877fb5c6632c666/addons/repair/models/repair.py#L332-L335 **Fix:** * Ensure that related stock moves are properly cancelled when a draft repair order is deleted. --- opw-5449323 Forward-Port-Of: odoo/odoo#241970
This update enhances the reliability of sending Peppol documents by limiting the number of invoices processed in each request. Previously, sending a large batch of invoices could cause system slowdowns. Now, the system batches invoices in groups of 100, preventing timeouts and ensuring smoother operation.
Original PR description
The current implementation of Peppol document sending attempts to process all selected invoices in a single API call. When a user sends a very large number of invoices at once, this can lead to timeouts from the Peppol proxy or Odoo worker, resulting in system instability. This commit introduces batching for the `send_document` API call, limiting each request to a maximum of 100 invoices. This ensures more reliable processing and prevents request payload size issues. Task-5877964 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where website redirects were losing important URL parameters, causing errors when users attempted to access specific features. The fix ensures all parameters are correctly encoded during redirects, preventing errors and maintaining expected functionality. This improves the user experience and prevents disruptions to workflows.
Original PR description
Scenario from 17.0:
- set domain on website
- go to website /website/force/1?path=%2F%3Fa%3Db%26c%3Dd with another
domain
=> you are redirected to {domain}/?a=b instead of {domain}/?a=b&c=d
Scenario from 18.0:
- set domain on website
- go to /appointment/1 on other domain, select person date and time
- click on "Editor"
=> you get error:
> TypeError: AppointmentController.appointment_type_id_form() missing 1
> required positional argument: 'duration'
Cause: the /website/force/ domain redirection doesn't encode the
parameter when redirecting, so we lose parameters after the first one.
Fix: encode parameters when redirecting domain in /website/force/ route.
opw-5441957
Forward-Port-Of: odoo/odoo#242252This update resolves an issue where validating purchase receipts for kits with different unit of measure categories (e.g., 'Units' vs. 'Length') would cause errors. The fix ensures accurate quantity calculations for kit receipts, particularly when the purchase order currency differs from the company currency, by correctly aggregating component move quantities.
Original PR description
Steps to reproduce ------------------ 1. Enable Units of Measure and Automatic Valuation. 2. Create: Product KIT, stockable, UoM category Unit, UoM = Units. BoM for KIT with at least one component…
Steps to reproduce
------------------
1. Enable Units of Measure and Automatic Valuation.
2. Create:
Product KIT, stockable, UoM category Unit, UoM = Units.
BoM for KIT with at least one component whose UoM is in a different
category (e.g. m from Length).
3. Go to the product's category and set the Costing Method to Average
Cost (AVCO) and the Inventory Valuation to Automated.
4. Create a PO for KIT in a currency different from the company currency.
5. Confirm the PO and validate the receipt.
Issue
-----
Validating the receipt raises:
> The unit of measure m defined on the order line doesn't belong to the
> same category as the unit of measure kit defined on the product…
If you keep the PO currency equal to the company currency, the same kit
and BoM work and the receipt posts correctly.
Cause of the issue
------------------
Validating the receipt will call the `_action_done` of stock.move's and generate the related accounting entries. During this call and the currency of the PO is different from the company currency the `_generate_valuation_lines_data` will call the `_get_currency_convert_date` method:
https://github.com/odoo/odoo/blob/751d54207c6214a25a5a1def57137e2f2f9106e3/addons/purchase_stock/models/stock_move.py#L134-L140
This call will in turn call the `_get_qty_received_without_self`:
https://github.com/odoo/odoo/blob/751d54207c6214a25a5a1def57137e2f2f9106e3/addons/purchase_stock/models/stock_move.py#L121-L122
which was not written to handle kit products since it assumes that the product of the PO is the same as the one of the related move:
https://github.com/odoo/odoo/blob/751d54207c6214a25a5a1def57137e2f2f9106e3/addons/purchase_stock/models/stock_move.py#L102-L108
Fix
---
The qty_received is relevant to the _get_currency_convert_date as the method compares the qty_invoiced with the qty_received to determine whether to use the Invoice Date (when qty_invoiced > qty_received) or the Receipt Date.
https://github.com/odoo/odoo/blob/888e086dc6c7823b07993e90f70e2849e988fa7a/addons/purchase_stock/models/stock_move.py#L122-L126
For kits, `qty_received` must be calculated by aggregating component
moves to accurately determine this status. Since the standard logic
crashes due to UoM mismatch, the override in `purchase_mrp` is
necessary to provide the correct quantity for this date selection.
opw-5030761
Forward-Port-Of: odoo/odoo#236276This update resolves an issue preventing users from sending invoices via PEPPOL, which is a key feature for international sales. The problem stemmed from an audit trail restriction preventing attachment modifications during the PEPPOL sending process. The fix ensures attachments are handled correctly, allowing invoices to be successfully transmitted.
Original PR description
**Steps to reproduce:** - Install Accounting and l10n_de - Switch to a German company (e.g. DE Company) - In Accounting settings, activate Peppol - Create an invoice: * Customer: [a German customer…
**Steps to reproduce:** - Install Accounting and l10n_de - Switch to a German company (e.g. DE Company) - In Accounting settings, activate Peppol - Create an invoice: * Customer: [a German 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#247949
This update fixes an issue where the HTML editor toolbar incorrectly appeared on non-editable elements, causing instability. Now, the toolbar only displays for editable elements, ensuring a smoother and more reliable editing experience for users. This improves the overall usability of the HTML editor.
Original PR description
Current behavior before PR: - Removing formatting on a contenteditable false element infinite loop when removing format. - The toolbar could appear even when the target element had contenteditable false Desired behavior after PR is merged: - Now,the toolbar no longer opens when the selected element is contenteditable false - The toolbar is now only shown for elements with contenteditable true, except for QWeb and icon elements, where it remains accessible. task-5265416
This update corrects a bug where a POS order could incorrectly apply a pricelist even if it wasn't a valid option for the customer. The fix ensures that only available pricelists are used when changing a customer on a POS order, improving order accuracy and preventing potential pricing errors. This resolves issue OPW-5461556.
Original PR description
When changing the customer on a POS order, if the customer's pricelist is not in the list of available pricelists for the POS, but the pricelist was loaded due to loading a paid order, the POS would still set that pricelist on the order. opw-5461556 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves two critical errors in the Hong Kong payroll calculations. Specifically, it corrects a mistake where rental allowances were incorrectly included in IRD reports and removes an incorrect deduction of ERMPF from taxable salaries. This ensures 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
This update resolves two issues related to the LNE scale certification process. It now prevents users from manually altering order line weights for products measured on a scale, and it restricts the input of negative tare weights, ensuring accurate net weight calculations. These changes enhance data integrity and compliance for certified products.
Original PR description
This PR fixes 2 issues we currently have with out LNE scale certification 1) You can manually change the value of a order line for a product which was weighed with a scale --> should not be possible 2) User can input negative tare weight resulting in a manual net weight --> should not be possible task-5926814
This update resolves an issue where reports related to Peruvian sales (l10n_pe) were occasionally generating duplicate records. The fix ensures that the system consistently picks the correct stock valuation layer during report generation, leading to accurate financial reporting. This improves data reliability for Peruvian accounting.
Original PR description
Occasionally the test_kardex_report test fails: ``` Traceback (most recent call last): File "/data/build/enterprise/l10n_pe_reports_stock/tests/test_ple_kardex_report.py", line 126, in…
Occasionally the test_kardex_report test fails:
```
Traceback (most recent call last):
File "/data/build/enterprise/l10n_pe_reports_stock/tests/test_ple_kardex_report.py", line 126, in test_kardex_report
self.assertSequenceEqual(
AssertionError: Sequences differ: ['M1|[18 chars]|1||02/01/2024|01|FBILL202401|0002|02|product_[313 chars], ''] != ['M1|[18 chars]|1||01/01/2024|01|FBILL202401|0001|02|product_[313 chars], '']
First differing element 0:
'M1|0[17 chars]|1||02/01/2024|01|FBILL202401|0002|02|product_[21 chars]0|1|'
'M1|0[17 chars]|1||01/01/2024|01|FBILL202401|0001|02|product_[21 chars]0|1|'
- ['M1|0000|1|99|FURN9999|1||02/01/2024|01|FBILL202401|0002|02|product_order_no|NIU|3.00|0.00|1|',
? ^ ^
+ ['M1|0000|1|99|FURN9999|1||01/01/2024|01|FBILL202401|0001|02|product_order_no|NIU|3.00|0.00|1|',
? ^ ^
```
The issue was reproducible locally by disabling nested loop joins: `self.env.cr.execute("SET LOCAL enable_nestloop = off")` to nudge Postgres to use a different join strategy.
The test creates a PO that is picked and invoiced in two steps (first quantity 3, then the remaining 2). As a result, the `stock.valuation.layer` ends up being linked to two `account.move.line`s because the join goes through the same `purchase_order_line`. So it will appear twice in the `_get_ple_reports_data()` query. A `DISTINCT
ON (stock_valuation_layer.id)` was already there with the goal of picking one of them. Which one depends on the order, but it's not deterministic: the valuation layer's `id`, `product_id`, and `create_date` will all be the same.
This commit makes the behavior deterministic by sorting on PO line and SO line ids.
runbot-error-238888
Forward-Port-Of: odoo/enterprise#10704710 changes
Enhancements to existing features
This update enhances the chat interface by adding a company card with details sourced from DNB. Previously, industry tags from DNB were stored separately, but now they're integrated directly into this new company card within the chatter window, providing a more complete view of partner information.
Original PR description
Before: Industry tags coming from DnB were stored in the Tags section of res.partner. and there was no Company info card in chatter. After: Industry tags coming from DnB are not stored in the Tags section of res.partner. Company card is created in chatter that is having details from Dnb along with tags. task-5373200
This update modifies the process for generating BOE (Boletín Oficial Electrónico) tax reports in Spain, aligning with recent regulatory changes (BOE-A-2025-25390). The update addresses a requirement for the Modelo 347 report, adding a placeholder for subsidy numbers with default zeros. This ensures compliance with Spanish tax regulations.
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
Resolved issues and error corrections
This pull request adds a crucial test case to the account_edi_ebl_cii module, ensuring the system correctly processes Electronic Bank Letter (EBL) data in CII format. Previously, this specific functionality lacked adequate testing, potentially leading to errors in financial transactions. Merging this change strengthens the reliability and accuracy of our EBL processing.
Original PR description
Adding test for 5f5181c6b8eed3550432371227b22a36715cc857 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 user error that prevented invoices from being sent via PEPPOL, a key compliance feature. The issue stemmed from the audit trail preventing attachment modifications during the PEPPOL sending process. The fix ensures attachments are handled correctly, allowing invoices to be successfully transmitted.
Original PR description
**Steps to reproduce:** - Install Accounting and l10n_de - Switch to a German company (e.g. DE Company) - In Accounting settings, activate Peppol - Create an invoice: * Customer: [a German customer…
**Steps to reproduce:** - Install Accounting and l10n_de - Switch to a German company (e.g. DE Company) - In Accounting settings, activate Peppol - Create an invoice: * Customer: [a German 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
This update resolves an issue where invoices created in a non-AFIP POS sales journal in Argentina didn't display available document types. The fix ensures that document types are correctly identified for these invoices, allowing for proper record-keeping and reporting. This improves the accuracy of financial data for businesses using this sales channel.
Original PR description
Issue: No documents are available for Invoices of a non AFIP POS sale journal. Steps to reproduce: - in a Company in Argentina. - Create a new journal named "NO-AFIP POS" of type "Sales" with documents, but not AFIP POS. - Create an invoice for "Consumidor Final Anónimo" with the journal "NO-AFIP POS". Current behavior: No document show in the Document Type field. Expected behavior: Some documents should appear. Solution: Find document for those sale journals as if they were journals using the AFIP POS system for pre-printed invoice. opw-5234311 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update enhances the security of invoices by preventing the use of untrusted accounts when processing inbound invoices. The team removed unnecessary calculations and logging logic, simplifying the process and relying on existing methods. This change ensures greater accuracy and reduces potential risks associated with invoice processing.
Original PR description
fixed some tests and remove the computation logic from account_move_reversal wizard, to rely on existing compute method --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247954
This update fixes an issue where Italian tax information (like VAT number) wasn't being correctly applied when creating a company record from an Italian ecommerce order. The change ensures that all required Italian tax fields are automatically populated, improving data accuracy and compliance for Italian businesses using Odoo.
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
This update resolves an issue where stock valuation reports were generating inconsistent results due to how related records were being linked. The fix ensures the reports always produce the same output by sorting purchase and sales order IDs, guaranteeing a reliable and predictable report. This improves data accuracy for financial reporting.
Original PR description
Occasionally the test_kardex_report test fails: ``` Traceback (most recent call last): File "/data/build/enterprise/l10n_pe_reports_stock/tests/test_ple_kardex_report.py", line 126, in…
Occasionally the test_kardex_report test fails:
```
Traceback (most recent call last):
File "/data/build/enterprise/l10n_pe_reports_stock/tests/test_ple_kardex_report.py", line 126, in test_kardex_report
self.assertSequenceEqual(
AssertionError: Sequences differ: ['M1|[18 chars]|1||02/01/2024|01|FBILL202401|0002|02|product_[313 chars], ''] != ['M1|[18 chars]|1||01/01/2024|01|FBILL202401|0001|02|product_[313 chars], '']
First differing element 0:
'M1|0[17 chars]|1||02/01/2024|01|FBILL202401|0002|02|product_[21 chars]0|1|'
'M1|0[17 chars]|1||01/01/2024|01|FBILL202401|0001|02|product_[21 chars]0|1|'
- ['M1|0000|1|99|FURN9999|1||02/01/2024|01|FBILL202401|0002|02|product_order_no|NIU|3.00|0.00|1|',
? ^ ^
+ ['M1|0000|1|99|FURN9999|1||01/01/2024|01|FBILL202401|0001|02|product_order_no|NIU|3.00|0.00|1|',
? ^ ^
```
The issue was reproducible locally by disabling nested loop joins: `self.env.cr.execute("SET LOCAL enable_nestloop = off")` to nudge Postgres to use a different join strategy.
The test creates a PO that is picked and invoiced in two steps (first quantity 3, then the remaining 2). As a result, the `stock.valuation.layer` ends up being linked to two `account.move.line`s because the join goes through the same `purchase_order_line`. So it will appear twice in the `_get_ple_reports_data()` query. A `DISTINCT
ON (stock_valuation_layer.id)` was already there with the goal of picking one of them. Which one depends on the order, but it's not deterministic: the valuation layer's `id`, `product_id`, and `create_date` will all be the same.
This commit makes the behavior deterministic by sorting on PO line and SO line ids.
runbot-error-238888This update fixes an issue preventing users from dragging tasks to the 'Mitchell Admin' row within the Gantt chart view. The previous code incorrectly set rows to 'readonly' during the drag-and-drop process, blocking subsequent actions. This change ensures smooth task movement within the Gantt chart.
Original PR description
**Steps to reproduce** 1. Go to Project > Tasks > All tasks > Gantt view 2. Drag and drop a task from the Mitchell Admin row to the Marc Demo row. 3. Now, it will be impossible to drag and drop a task from any row to the Mitchell Admin row. **Cause** Since commit 3009885188580a7e82c25fc224428fa0f9ba63af, a readonly attribute is removed when the dragging starts to be able to drop in the same row. It is added back at the end of the drag, even if the row is not readonly. This causes any row from which we drag from to become readonly. https://github.com/odoo/enterprise/blob/3009885188580a7e82c25fc224428fa0f9ba63af/web_gantt/static/src/gantt_renderer.js#L291 opw-5462522
This update corrects a reporting issue where assets marked as disposed still appeared in depreciation schedules. The fix ensures that cancelled depreciation moves, which were incorrectly influencing disposal dates, are no longer considered when generating reports. This provides more accurate asset 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