Daily updates from Odoo
Wednesday, March 4, 2026
306 changes
22 changes
Resolved issues and error corrections
This update resolves an issue where product variant pricelists were incorrectly storing data after a rule was removed. Specifically, the ‘product_tmpl_id’ field wasn't being reset, leading to data inconsistencies. The fix ensures that the data is properly updated when a pricelist rule is deleted, maintaining accurate product pricing information.
Original PR description
Steps: - Create a price list (or existing one) - Create (or find) a product with only one variant - Add price list rule for that variant (Should show as Variant:... in Pricelist listing) - Go to…
Steps: - Create a price list (or existing one) - Create (or find) a product with only one variant - Add price list rule for that variant (Should show as Variant:... in Pricelist listing) - Go to pricelist listing, select the pricelist - Edit price list rule - Remove the product - Save and check the data (applied_on, product_id, product_tmpl_id) (applied_on still 0_product_variant, product_id, and NO product_tmpl_id) Related ticket: opw-5411034 (Video: https://drive.google.com/file/d/1xmg9A9NgavFQkIFkUZrzuAxVF-PNqdnL/view) Description of the issue/feature this PR addresses: Fix corrupted data <img width="583" height="108" alt="image" src="https://github.com/user-attachments/assets/961e75f8-b2a6-4812-a0b4-d73e02d52b08" /> Current behavior before PR: product_tmpl_id set to None product_id / applied_on data stays the same Desired behavior after PR is merged: When product_tmpl_id is removed, reset the applied_on type back to 3_global --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#250531 Forward-Port-Of: odoo/odoo#249417
A slow process for adding attribute values to products was identified and resolved. The update utilizes more efficient database searching techniques, reducing the loading time from 8 minutes to 2-3 minutes. This improves the overall user experience for customers managing complex product configurations.
Original PR description
opw-4876370 Issue: A customer who uses many attribute values complained that the "add to products" button on product attribute values in their database was really slow (8 minutes or so). Upon investigation I found parts of the involved functions used iteration over a set of records, which proved notably slower to psql searches. Fix: Replacing the code with what I believe is equivalent operations making use of the `search` method to filter through the sets much quicker. Behaviour after fix: The process takes 2-3 minutes when running this commit on the aforementioned database, but it's still a major improvement compared to the previous time. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251571 Forward-Port-Of: odoo/odoo#232149
This update fixes an issue where landed costs weren't correctly applied to subcontracted products, resulting in inaccurate product valuations and missing journal entries. The fix ensures landed costs are properly linked to the subcontracted manufacturing order, leading to accurate valuation updates and the creation of necessary account move lines.
Original PR description
…bcontracted **Problem:** Landed cost added on the receipt of a subcontracted product do not increase the valuation of the product and do not create account move lines. **Steps to reproduce:** -…
…bcontracted **Problem:** Landed cost added on the receipt of a subcontracted product do not increase the valuation of the product and do not create account move lines. **Steps to reproduce:** - create a tracked product with avco perpetual category - create a subcontracted bom for this product with no comp - create and confirm a PO for 10 unit of this product at a unit price of 1$ with the same partner as the subcontractor of the bom - validate the receipt - navigate to inventory/operations/adjustments/landed costs - create a new landed cost - select the receipt from the PO - add a landed cost of 10$ and validate - navigate to inventory/reporting/stock - search for your product and click on the unit cost **Current behavior:** 1) the valuation of the product was not increased by the value of the landed cost 2) open journal items : no account move lines were created for the landed cost **Expected behavior:** 1) the valuation of the product should have been increased: in the unit cost view, the SBC move should have gone from a value of 10 to 20 2) account move lines should have been created with a value of 10 **Cause of the issue:** both issues come from the fact that when creating the stock valuation adjustment line, the move linked is the receipt move when it should be the move of the subcontracted MO linked to the receipt. **fix:** if we create the adjustement line with move_id as the move of the MO (instead of the move of the receipt as it is the case currently) : when button_validate is called on the landed cost : - when using the remaining quantity, it will be the correct one (in our case 10, instead of 0 for the move of the receipt because it's actually an internal move) so the account move line are going to be created https://github.com/odoo/odoo/blob/9c85d7265d7b1ca0b212f46c20aa1e8119c33a22/addons/stock_landed_costs/models/stock_landed_cost.py#L129-L130 https://github.com/odoo/odoo/blob/9c85d7265d7b1ca0b212f46c20aa1e8119c33a22/addons/stock_landed_costs/models/stock_landed_cost.py#L372-L373 which solves problem 2) - when calling _set_value on the move (which will be the move of the MO thanks to this fix), https://github.com/odoo/odoo/blob/064407d32f998ceb08601f9e0a6356c94ad10347/addons/stock_landed_costs/models/stock_landed_cost.py#L152 get_value_data will call _get_value_from_extra, https://github.com/odoo/odoo/blob/9c85d7265d7b1ca0b212f46c20aa1e8119c33a22/addons/stock_account/models/stock_move.py#L392 which uses _get_landed_cost to fetch the landed cost https://github.com/odoo/odoo/blob/9c85d7265d7b1ca0b212f46c20aa1e8119c33a22/addons/stock_landed_costs/models/stock_move.py#L18 before this fix the landed cost created from the receipt were linked to the receipt move so they were not fetched inside _get_landed_cost which caused problem 1) but now the move_id of the adjustment lines is the move of the MO so they are fetched inside _get_landed_cost https://github.com/odoo/odoo/blob/9c85d7265d7b1ca0b212f46c20aa1e8119c33a22/addons/stock_landed_costs/models/stock_move.py#L7-L12 So now the adjustment lines do impact the valuation of the move of the MO which solves problem 1) opw-5723126 Forward-Port-Of: odoo/odoo#248469
This update fixes an issue where modifying production quantities in a Manufacturing Order would incorrectly create duplicate work orders. The change ensures that work orders are correctly updated instead of duplicated, maintaining accurate production tracking. This improves the reliability of the MRP process.
Original PR description
Steps to reproduce: 1. Create a product and two BoMs: BoM A (with operations) and BoM B (empty). 2. Create a Manufacturing Order (MO) for the product selecting BoM A. 3. Switch BoM A to BoM B, then…
Steps to reproduce:
1. Create a product and two BoMs: BoM A (with operations) and BoM B (empty).
2. Create a Manufacturing Order (MO) for the product selecting BoM A.
3. Switch BoM A to BoM B, then switch back to BoM A.
4. Modify the production quantity field. -> New operation lines are appended every time the quantity is changed.
The issue occurred because _compute_workorder_ids used 'wo.ids' to filter existing workorders. In the "Draft" state (UI/onchange), records exist as "virtual records" (NewIds). For these records, .ids returns an empty list [], which evaluates to False in Python.
Consequently, the existing virtual workorders were filtered out of the dictionary used to map operations to existing lines. The logic assumed the lines didn't exist and used Command.create() instead of Command.update(), causing duplication. Similar issues existed where 'NewIds' were ignored during BoM swaps, leaving "phantom" records in the cache.
Solution:
Removing the '.ids' check and using '.mapped('id')' ensures the computation remains "virtual-aware" and stable across sequential onchanges.
TECHNICAL JUSTIFICATION:
In Odoo 18.0, the ORM explicitly supports using Command.update and Command.delete with virtual records (NewIds) without an origin. This is handled by the 'write_new' method in relational fields:
- Virtual browse wraps IDs in NewId: https://github.com/odoo/odoo/blob/f688c6b66310438fa3e36a207770a63d0d8fffa5/odoo/fields.py#L4826-L4855
opw-5489862
Forward-Port-Of: odoo/odoo#246995This update corrects a bug where the standard price of dropshipped products wasn't updated when the bill price differed from the original purchase order price. The fix ensures that the product's standard price accurately reflects the actual billing amount, improving inventory accuracy for dropshipping scenarios. This was triggered by a validation step in the dropship move process.
Original PR description
**Problem:** When Billing a dropshipped PO, if the price of the bill is changed from the price of the Purchase Order, the standard price of the product is not updated **Steps to reproduce:** - enable…
**Problem:** When Billing a dropshipped PO, if the price of the bill is changed from the price of the Purchase Order, the standard price of the product is not updated **Steps to reproduce:** - enable the dropshipping settings - create a storable product with avco perpetual category - in the inventory tab, select the dropship route - in the purchase tab, set a vendor - create and a confirm a quotation for this product - on the linked purchase order, set a unit price of 100$ and confirm - validate the dropship move (- you can check on the product form that the standard price is now 100$) - create a bill for the purchase order - set the price to 90$ and confirm - navigate to the product form **Current behavior:** The standard price is still 100$ **Expected behavior:** It should be 90$ **Cause of the issue:** When we validate the picking, action_done() is called on the moves . Inside the action_done() override of stock_account, after the call to super, set_value is called on is_in and is_dropship moves https://github.com/odoo/odoo/blob/3670c83f1e59d79df439be7c23a679d4d988ec20/addons/stock_account/models/stock_move.py#L168-L169 Inside _set_value(), because the move is dropship, it's going to be added to products_to_recompute https://github.com/odoo/odoo/blob/3670c83f1e59d79df439be7c23a679d4d988ec20/addons/stock_account/models/stock_move.py#L277-L278 and then we're going to exit this iteration of the for loop. https://github.com/odoo/odoo/blob/3670c83f1e59d79df439be7c23a679d4d988ec20/addons/stock_account/models/stock_move.py#L285-L286 so basically we simply call the _update_standard_price() on the product. https://github.com/odoo/odoo/blob/b3559145febc16271c78ca516af9d7e99bf3452f/addons/stock_account/models/stock_move.py#L310 Because the product is avco, _update_standard_price is going to call _run_average_batch https://github.com/odoo/odoo/blob/3670c83f1e59d79df439be7c23a679d4d988ec20/addons/stock_account/models/product.py#L541 The value is not set on the dropship move but it's still used in the computation because for dropship move, we use _get_value() https://github.com/odoo/odoo/blob/b3559145febc16271c78ca516af9d7e99bf3452f/addons/stock_account/models/product.py#L382-L383 which will take into account the bills and POs if there are some. But the problem is that, when we post the invoice we only call set_value on is_in moves https://github.com/odoo/odoo/blob/3670c83f1e59d79df439be7c23a679d4d988ec20/addons/stock_account/models/account_move.py#L42 So the standard price of our dropshipped product is not updated. opw-5498878 Forward-Port-Of: odoo/odoo#250067
This update corrects a bug in the self-order module where the selected time slot was unreliable due to timing issues. The fix now explicitly defines the desired time slot and verifies its availability after selection, ensuring accurate scheduling and preventing incorrect bookings. This improves the reliability of the self-order functionality.
Original PR description
The selected time slot was not the right one as the time of the execution influed on the first choice available. We now specify which time slot to take, and check that this specific timeslot is not available anymore afterwards. runbot-233381 Forward-Port-Of: odoo/odoo#233469
This update resolves a server error that occurred when deleting mailings associated with marketing activities. The fix ensures a user-friendly error message is displayed instead of a crash, guiding users to correct the activity's links to mailings. This improves the overall stability and usability of the Marketing Automation feature.
Original PR description
How to reproduce ------ 1. Open the Marketing Automation app 2. Create a new campaign 3. Click on Add new activity to create a new activity (in the previously created campagin) 4. Set the Activity…
How to reproduce ------ 1. Open the Marketing Automation app 2. Create a new campaign 3. Click on Add new activity to create a new activity (in the previously created campagin) 4. Set the Activity Type to email 5. In the Mail Template option, select or create a mailing 6. Open the selected/created mailing (using the Templates smart button) 7. Click on the gear icon and then click Delete (either one or multiple together) DEMO: https://www.awesomescreenshot.com/video/50021531?key=18a341a6939e6ff8deb847fc251db570 Current behavior ----- Odoo Server Error is displayed. Expected behavior ------ Normal user error indicating that the mailing(s) being deleted is still linked to an activity (or marketing campaign). Cause ------ When formatting the user error, we used the attribute `name`, to get the mailing's display name, which does not exist in `mailing.mailing` model. Therefore, a KeyError is raised. The `name` attribute was an attribute in a class named `UtmSourceMixin` in the utm module, of which `mailing.mailing` was inheriting. In saas-19.2, that class was removed and hence the `name` is no longer available for `mailing.mailing`. The commit in which the metioned class was removed is: https://github.com/odoo/odoo/commit/93f8bb821ab86612d95d93ae0fdca5a08a12e2d5 (See utm_source.py) Solution ------ Change the `name` to `mailing.display_name`. DEMO: https://www.awesomescreenshot.com/video/50049334?key=a34a525ef38bdf2dc8037f2dcfa68761 task-5999999
This update corrects a visual inconsistency in Odoo forms. Previously, the favorite star icon didn't match the heading font size, appearing at a smaller size. This change ensures all icons, including the favorite star, consistently align with the heading styles for a more polished and professional user experience.
Original PR description
Steps to reproduce:
Open a form with a favorite star in .oe_title (e.g. Product form). The star icon appears at body size (1rem) instead of matching the heading font size.
The <a> -> <button class="btn btn-link btn-link-inline"> refactor broke the size: .btn-link-inline sets --bs-btn-font-size to body size, so the existing .o_favorite i.fa { font-size: inherit } rule inherited 1rem from the button instead of the heading size.
Solution:
Add .o_favorite .btn to the font-size: inherit rule so the heading size cascades through the button to the icon.
opw-5998155This update corrects a bug that prevented users with RTL languages (like Arabic) from dragging and dropping content outside of designated dropzones. The fix adjusts the detection logic to account for the left-aligned sidebar in RTL layouts, ensuring proper functionality. This improves usability for a wider range of users.
Original PR description
When dropping outside a dropzone but still on the page, the code checks if the drop happened well outside of the sidebar (so on its left). However, in RTL languages, the sidebar is positioned on the left, so we need to check if the drop is on the right side of it instead. The fix checks if the sidebar is at the left edge (the body of the document should have the `o_rtl` class) and verifies the drop position is on the right of the sidebar. Steps to reproduce: - Set your profile to Arabic - Drag and drop a snippet outside of a dropzone => It's not dropped, but it should, as it would with an LTR language. task-5484936 Forward-Port-Of: odoo/odoo#251041 Forward-Port-Of: odoo/odoo#247759
This update resolves a technical issue that was causing errors in the mail composer and report generation when exporting invoices in certain UBL transactions. The fix ensures that the system doesn't attempt to access invoice date information when an invoice isn't present, preventing crashes and maintaining normal functionality.
Original PR description
### Description of the issue/feature this PR addresses: A regression in account_edi_xml_ubl_bis (_ubl_get_delivery_node_from_delivery_address) references invoice.invoice_date in the intracom delivery…
### Description of the issue/feature this PR addresses:
A regression in account_edi_xml_ubl_bis (_ubl_get_delivery_node_from_delivery_address) references invoice.invoice_date in the intracom delivery branch even when invoice is not set.
This method is also used in sale-order UBL export flows (for example during quotation PDF generation from mail.compose.message), where vals.get('invoice') can be None.
Blame points to regression introduction in commit 0bf8df7d0a096cf8fe984c42d331404d473eeb71 (FP from f6c5aed52e00e807c4879e4139b116f1bea8282e).
### Current behavior before PR:
When the flow reaches sale-order BIS3 export without an invoice in vals, Odoo crashes with:
AttributeError: 'NoneType' object has no attribute 'invoice_date'
This raises an RPC_ERROR and breaks the mail composer / send flow
### Desired behavior after PR is merged:
The intracom delivery-date override is only applied when invoice exists and has invoice_date.
If invoice is missing (sale-order export context), no crash occurs, the delivery node is still generated safely, and mail composer/report generation completes normally.
Invoice export behavior remains unchanged for valid invoice contexts.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#250167This update resolves a bug in the BR invoice processing cron job. Previously, the job processed all invoices at once, leading to failures and wasted IAP credits. Now, the cron job processes invoices in smaller batches, committing changes after each, ensuring progress is preserved and preventing disruptions.
Original PR description
The cron searched with limit=batch_size and only retriggered when >batch_size records were found which never happens. It also ran all invoices in a single transaction so one failure rolled back all progress while IAP credits were already consumed. Search batch_size + 1 so remaining invoices are detected, and commit after each invoice to preserve progress. opw-5954211 Forward-Port-Of: odoo/enterprise#109315 Forward-Port-Of: odoo/enterprise#108191
This pull request addresses several issues within Odoo's testing framework, primarily focused on improving test reliability and debugging. Key changes include automatically clearing test caches, enhancing error reporting, and refining keyboard handling to ensure accurate test execution.
Original PR description
Fixes for tests and testing framework. See commit messages for details. Enterprise: https://github.com/odoo/enterprise/pull/107286 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251667 Forward-Port-Of: odoo/odoo#247137
This update resolves a problem where tests were failing due to incorrectly triggered event handlers. The fix ensures that test environments are properly cleaned up, preventing potential issues with resource usage and improving the stability of our core system. This change focuses on internal testing improvements.
Original PR description
Adapt tests failing due to keydown events being applied to the current active element. Community: https://github.com/odoo/odoo/pull/247137 Forward-Port-Of: odoo/enterprise#109316 Forward-Port-Of: odoo/enterprise#107286
This update resolves an issue preventing multiple tax lines on Italian invoices processed through the l10n_it_edi_doi module. Previously, only the DOI tax could be added. Now, other taxes like Enasarco and RIT can be included on the same line, aligning with Italian invoicing practices. This ensures accurate tax reporting for Italian businesses.
Original PR description
We should be able to add more taxes with the 0% on the same line, like the Enasarco and 23% RIT. Indeed in italy it is possible to have invoices with Dichiarazione d'intento togheter with a withholding and Enasarco taxes. See also: odoo/odoo#236251 Ticket [link](https://www.odoo.com/odoo/project.task/5933699) opw-5933699 Forward-Port-Of: odoo/odoo#248586
This update resolves a technical issue within the Odoo Enterprise HR payroll module that prevented users from editing date inputs in a tour. The fix ensures the popover is displayed before the input field is cleared, restoring full functionality. This improves the user experience for payroll configuration.
Original PR description
With this additionnal step in tour, we ensure the popover is opened before clear the input. If we not wait for this, the input can be no longer editable. runbot-error-id~234440 Forward-Port-Of: odoo/enterprise#109346
This update resolves an issue where certain WebSocket routes were unintentionally causing user sessions to expire. By preventing session rotation for these specific routes, we ensure a smoother and more reliable experience for users. This improves stability and reduces potential disruptions.
Original PR description
Before this commit, calling `/websocket/peek_notifications` or `/websocket/update_bus_presence` could rotate the session. Since those routes are not called by the client, the cookie is unchanged on the client side, leading to expire sessions error later on. This commit ensure we won't rotate the sessions for those routes. opw-5445323 Forward-Port-Of: odoo/odoo#251496 Forward-Port-Of: odoo/odoo#250826
This update resolves an issue where the cash drawer wasn't opening when the cash details popup was accessed in the Italian Point of Sale (POS) system. The fix ensures that the cash drawer opens consistently, regardless of the printer type, improving the user experience for Italian POS operations. This was a simple missing function call.
Original PR description
When opening the cash details popup the cash drawer should be opened. It was not the case for the Italian fiscal printer. Steps to reproduce: ------------------- * Setup a Italian fiscal printer with cash drawer support * Open PoS * Open the cash details popup > Observation: The cash drawer does not open * Try to close the PoS session * Open the cash details popup > Observation: The cash drawer opens Why the fix: ------------ The cash drawer opening function was simply not called opw-5391094 Forward-Port-Of: odoo/enterprise#109155 Forward-Port-Of: odoo/enterprise#107987
This update fixes an issue where time formatting in reports and lists was inaccurate, consistently flooring the time value. The changes ensure time is rounded correctly based on its precision and allows for more flexible formatting options, including controlling the display of seconds.
Original PR description
The rounding of time was not correct. I was always flooring, but before the new duration the rounding was depending of the precision of the duration. The rounding has been restored as before and put…
The rounding of time was not correct. I was always flooring, but before the new duration the rounding was depending of the precision of the duration. The rounding has been restored as before and put in formatDuration. formatFloatTime has been modified to use formatDuration and now take the same options (specify the unit of time of the value). The graph view and list view didn't extract the otpions from the fields with widget. Now, they get the options and give them to the formatter. The widget was showing the seconds by default, but it doesn't match with the behavior of the DateTime widget. It has been changed and now the seconds are shown only if the options 'showSeconds' is true and it's false by default. The impacted views has been restored as before the original commit. The options of float_time widget couldn't take falsy values, now it can. an improvment has also been done: the popover on the float_time widget doesn't show up if the input value and the formattedValue are the same. followup of TASK-5347051 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where time formatting was inaccurate, particularly in graph and list views. The changes ensure time is displayed correctly, allowing for precise reporting and scheduling, and provides more flexible options for displaying time values.
Original PR description
The rounding of time was not correct. I was always flooring, but before the new duration the rounding was depending of the precision of the duration. The rounding has been restored as before and put…
The rounding of time was not correct. I was always flooring, but before the new duration the rounding was depending of the precision of the duration. The rounding has been restored as before and put in formatDuration. formatFloatTime has been modified to use formatDuration and now take the same options (specify the unit of time of the value). The graph view and list view didn't extract the otpions from the fields with widget. Now, they get the options and give them to the formatter. The widget was showing the seconds by default, but it doesn't match with the behavior of the DateTime widget. It has been changed and now the seconds are shown only if the options 'showSeconds' is true and it's false by default. The impacted views has been restored as before the original commit. The options of float_time widget couldn't take falsy values, now it can. an improvment has also been done: the popover on the float_time widget doesn't show up if the input value and the formattedValue are the same. followup of TASK-5347051
This update resolves a bug that prevented users from creating new resources within appointment bookings. The issue stemmed from an incorrect default value being set for the resource timezone, triggering a validation error. The fix ensures a proper timezone is assigned, preventing this error and improving the appointment booking process.
Original PR description
Steps to reproduce =============== 1. Open appointment of resource type 2. Create a new resource from resource tags. 3. Give the resource a name and save. ----> ValidationError will be shown. Issue…
Steps to reproduce =============== 1. Open appointment of resource type 2. Create a new resource from resource tags. 3. Give the resource a name and save. ----> ValidationError will be shown. Issue ===== When creating the new resource from the appointment form view, the value for the `tz` of the `appointment.resource` is `False`. Also, `tz` field is inherited from `resource.mixin` and is a related field as `resource_id.tz`. Therefore, when creating the `appointment.resource` with `tz` as `False` writes the related `resource.resource`'s `tz` field. As `tz` field is required field for the `resource.resource` table, the `ValidationError` is raised. Solution ======= After this commit, we give the default value to the timezone with fallback to current user's timezone or UTC which matches to the default value of `resource.resource`'s timezone field but with a side-effect of overwriting resource's timezone if somehow `default_resource_id` is provided. We also fix in parallel by making the timezone field `readonly` when invisible to avoid "saving" the `False` value for the tz. Task-5712786
This update resolves a technical issue preventing users from correctly selecting a cashier when opening the Point of Sale (POS) system. The problem stemmed from a renaming of a variable without corresponding updates, causing an error. This fix restores the original variable name, ensuring proper POS functionality.
Original PR description
Since this commit: https://github.com/odoo/enterprise/commit/52e2f216528bcb0e67844ac2164f647fee4a2a95 The clockState variable was renamed without modifying the other references. This causes a traceback when trying to select a cashier while opening the POS. This has now been fixed by restoring the previous variable name. Forward-Port-Of: odoo/enterprise#108665
This update resolves an issue where foreign vendor VAT invoices were not correctly identifying the country of origin for JPK reports. The fix adds the necessary country code to vendor bills, ensuring accurate reporting and compliance with Polish tax regulations. This improves the reliability of financial data.
Original PR description
PR #81359 fixed the country code for foreign VAT companies by adding the country code to the start. However, this was only fixed for invoices going out, not vendor bills coming in. [opw-5917264](https://www.odoo.com/odoo/project.task/5917264) Forward-Port-Of: odoo/enterprise#109080
16 changes
Enhancements to existing features
This update enhances the poll experience by displaying the poll's end time when you hover over the 'Remaining Time' text. This allows users to set reminders and proactively manage participation, ensuring timely responses and maximizing poll engagement. It's a small improvement that increases the effectiveness of polls.
Original PR description
This commit adds showing of datetime when the poll will end when mouse-hovering on the Remaining time text of the poll. This is useful to put a reminder for later just before the poll ends, let's say to see if involvement is fine or we need to push pressure for people to vote. <img width="555" height="255" alt="Screenshot 2026-03-04 at 12 55 44" src="https://github.com/user-attachments/assets/19ef91a1-ea52-475a-86e1-acc16e18fe98" />
Resolved issues and error corrections
This update corrects a bug where related fields within many2one chains were displaying the wrong model data. Specifically, when creating a chain with duplicate field names, the popover would incorrectly show fields from a different model. This issue was caused by a recent update to support properties in field definitions.
Original PR description
You cannot create a related field with a related field chain that has two or more fields with the same name in a row. When you click the relation icon for a field the wrong model will be displayed if…
You cannot create a related field with a related field chain that has two or more fields with the same name in a row. When you click the relation icon for a field the wrong model will be displayed if the related model you are trying to show has a many2one with the same name as the field that was selected. Steps to reproduce 1. Create two many2one fields with studio that have the same name, one of the fields must link to the model the other field is on. i.e. `model_a.x_studio_test(relation=model_b), model_b.x_studio_test(relation=other_model)`. 2. Create a related field on model_a and click the related icon for the test field. 3. The popover will now be displaying the fields for other_model instead of model_b. Cause: This behavior was introduced by adding support for properties in this [pr](https://github.com/odoo/odoo/pull/189841). Solution: Check if `fieldDef` is a property or not in order to decide what to pass to `loadPath`. opw-ticket 5459944 Forward-Port-Of: odoo/odoo#249185
This update resolves a minor visual issue with the select menu in Odoo, specifically addressing styling inconsistencies when scrolling. The fix ensures a consistent and polished appearance for the select menu across the base and base_import modules. This improves the overall user experience.
Original PR description
Before this commit, the select menu with its dropdown opened had a little style issue when scrolling base_import's select menu had also a style which was a bit off. After this commit, those are fixed part-of-task-5935511 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 an issue where certain custom reports, built using specialized models, were causing errors within Odoo Studio. By preventing Studio from directly accessing these reports, the system is now more stable and reliable for users creating reports.
Original PR description
…eport Some report build their data via a report model. Those are often tailor made to their business use cases and may crash when entering studio. This commit prevents this
This update resolves a minor display issue in the accounting dashboard where the 'Reconnect Bank' button incorrectly appeared for accounts without an expiration date. The fix ensures the button only shows when a valid numerical expiration date is present, improving the user experience.
Original PR description
The aim of this commit is fixing the behavior of Reconnect bank button in accounting dashboard. Before this commit, a synchronization without any expiring date will always show the Reconnect bank button in the accounting dashboard because the expiring due days (in the JS widget) is null and not undefined. This condition led to check the second part of the condition where null <= 0. Which is true in javascript. Now, we are checking the type of expiring due days as first condition, if it's not a number, we don't check the second part of the condition, and then we don't display the Reconnect Bank button. no task id
This update resolves an issue where product variant pricelist rules were not correctly updating when a product was removed from the pricelist. Specifically, the data associated with the variant was incorrectly retaining a product template ID. The fix ensures that when a product is removed, the data resets to the correct state, preventing data inconsistencies and ensuring accurate pricing calculations for product variants.
Original PR description
Steps: - Create a price list (or existing one) - Create (or find) a product with only one variant - Add price list rule for that variant (Should show as Variant:... in Pricelist listing) - Go to…
Steps: - Create a price list (or existing one) - Create (or find) a product with only one variant - Add price list rule for that variant (Should show as Variant:... in Pricelist listing) - Go to pricelist listing, select the pricelist - Edit price list rule - Remove the product - Save and check the data (applied_on, product_id, product_tmpl_id) (applied_on still 0_product_variant, product_id, and NO product_tmpl_id) Related ticket: opw-5411034 (Video: https://drive.google.com/file/d/1xmg9A9NgavFQkIFkUZrzuAxVF-PNqdnL/view) Description of the issue/feature this PR addresses: Fix corrupted data <img width="583" height="108" alt="image" src="https://github.com/user-attachments/assets/961e75f8-b2a6-4812-a0b4-d73e02d52b08" /> Current behavior before PR: product_tmpl_id set to None product_id / applied_on data stays the same Desired behavior after PR is merged: When product_tmpl_id is removed, reset the applied_on type back to 3_global --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#250531 Forward-Port-Of: odoo/odoo#249417
This update resolves an issue where salespersons couldn't change or reset their payment tokens due to an access error. The fix ensures system administrators have the necessary permissions to retrieve payment token information, preventing disruptions to subscription management.
Original PR description
Use case: A salesman go to a subscription and want to change/reset the payment token a subscription, when trying to get the values of the `payment_token_id` fields [`name_search()` call] an `AccessError` is raised. Since odoo/odoo#239177, fetch() do compute fields, so for payment token this means that `display_name` will be computed without su=True flag, thus raising an `AccessError`. This commit force getting the provider `custom_mode` as sudo, as only system administrator have access to that model. Note: from feedback-pad
This update fixes an issue where modifying production quantities after switching BoMs would create duplicate work orders. The fix ensures that work orders are correctly updated instead of duplicated, improving the accuracy of manufacturing orders. It addresses a technical detail related to how Odoo handles virtual records during data changes.
Original PR description
Steps to reproduce: 1. Create a product and two BoMs: BoM A (with operations) and BoM B (empty). 2. Create a Manufacturing Order (MO) for the product selecting BoM A. 3. Switch BoM A to BoM B, then…
Steps to reproduce:
1. Create a product and two BoMs: BoM A (with operations) and BoM B (empty).
2. Create a Manufacturing Order (MO) for the product selecting BoM A.
3. Switch BoM A to BoM B, then switch back to BoM A.
4. Modify the production quantity field. -> New operation lines are appended every time the quantity is changed.
The issue occurred because _compute_workorder_ids used 'wo.ids' to filter existing workorders. In the "Draft" state (UI/onchange), records exist as "virtual records" (NewIds). For these records, .ids returns an empty list [], which evaluates to False in Python.
Consequently, the existing virtual workorders were filtered out of the dictionary used to map operations to existing lines. The logic assumed the lines didn't exist and used Command.create() instead of Command.update(), causing duplication. Similar issues existed where 'NewIds' were ignored during BoM swaps, leaving "phantom" records in the cache.
Solution:
Removing the '.ids' check and using '.mapped('id')' ensures the computation remains "virtual-aware" and stable across sequential onchanges.
TECHNICAL JUSTIFICATION:
In Odoo 18.0, the ORM explicitly supports using Command.update and Command.delete with virtual records (NewIds) without an origin. This is handled by the 'write_new' method in relational fields:
- Virtual browse wraps IDs in NewId: https://github.com/odoo/odoo/blob/f688c6b66310438fa3e36a207770a63d0d8fffa5/odoo/fields.py#L4826-L4855
opw-5489862
Forward-Port-Of: odoo/odoo#246995This update corrects a bug where manually created stock transfers without references were incorrectly merged into existing transfers. The change ensures each manual transfer creates its own distinct operation, preventing confusion and errors in multi-step warehouse workflows. This improves data accuracy and simplifies inventory management.
Original PR description
*: purchase_stock Issue Before This Commit: ====================== In a `multi-step` configuration, while validating a transfer that has no `stock reference`, its next operation (Input → QC → Stock)…
*: purchase_stock
Issue Before This Commit:
======================
In a `multi-step` configuration, while validating a transfer that has no `stock reference`, its next operation (Input → QC → Stock) is merged into an existing transfer that also lacks a stock reference, even when the transfers are manually
created and not generated from a Sales or Purchase Order. This results in unrelated transfers being grouped together.
Steps to Reproduce:
======================
- Install the `stock` module.
- Configure the warehouse to use `three-step reception`.
- Create and validate two receipts for Product A (qty 10) with Vendor A.
- `Observation`: the next transfers for both receipts are merged into a single transfer, even though both receipts were
created manually and not generated from any same source document like PO/SO.
Cause of the Issue:
======================
In the `_search_picking_for_assignation()` method, when no `stock.reference`is defined on a move, the system still attempts to find an existing picking using the `partner_id`. Additionally, in the `_key_assign_picking()` method, moves
without a `reference_ids` are grouped based on their `partner_id`. As a result, validating multiple manually created receipts sharing the `same vendor` causes them to be incorrectly merged into the `same next transfer`, since they do not share a common stock reference.
After this Commit:
======================
The `_search_picking_for_assignation()` method now skips searching for existing pickings when moves lack a `stock.reference`. The `_key_assign_picking()` method groups moves by their `originating picking` instead of the partner, preventing merges between unrelated transfers without a stock reference. This ensures each manual transfer creates its `own next operation` in multi-step routes.
Task-ID: 5242340
Forward-Port-Of: odoo/odoo#250385
Forward-Port-Of: odoo/odoo#235423This update corrects a test case in the quality control module to reflect a recent change in how Odoo handles merging stock transfers. Specifically, transfers now only merge into existing ones when a 'stock reference' is defined. This ensures the test case accurately reflects the current system behavior and avoids potential issues.
Original PR description
Fix the test case to align with the updated picking move merge behavior, where the next transfer merges into an existing one only when a stock reference is set TaskID-5242340 Forward-Port-Of: odoo/enterprise#108520 Forward-Port-Of: odoo/enterprise#99342
This update corrects a bug that prevented drag-and-drop functionality when using Arabic or other RTL languages. The fix adjusts the detection logic to properly identify drops outside of the sidebar, ensuring a consistent user experience regardless of language settings. This improves usability for a wider range of users.
Original PR description
When dropping outside a dropzone but still on the page, the code checks if the drop happened well outside of the sidebar (so on its left). However, in RTL languages, the sidebar is positioned on the left, so we need to check if the drop is on the right side of it instead. The fix checks if the sidebar is at the left edge (the body of the document should have the `o_rtl` class) and verifies the drop position is on the right of the sidebar. Steps to reproduce: - Set your profile to Arabic - Drag and drop a snippet outside of a dropzone => It's not dropped, but it should, as it would with an LTR language. task-5484936 Forward-Port-Of: odoo/odoo#251041 Forward-Port-Of: odoo/odoo#247759
This update resolves an issue where US-specific reports were incorrectly appearing in Odoo databases configured for India. The fix ensures that the necessary US Payroll module is automatically installed when the l10n_in_hr_payroll module is installed, preventing this unintended report visibility.
Original PR description
**Version:** saas-19.1 **Steps to reproduce:** - Create a new database with India as country. - Install l10n_in_hr_payroll. - US company based reports are visible. **Issue:** Reports specific to us payroll localisation are visible for base hr_payroll module **Cause:** The l10n_us module was missing as the auto_install dependency. **Solution:** Added l10n_us as the auto_install dependency in the manifest file. **task-5948747**
This update resolves a technical error that prevented users from hearing incoming ringtones during VoIP calls. The fix ensures the necessary service is correctly initialized, allowing ringtones to play as expected. This improves the user experience for VoIP calls.
Original PR description
requestIncomingRingtone() was calling this.ringtoneService.incoming.play(), but ringtoneService is not defined on UserAgent, leading to: ``` TypeError: Cannot read properties of undefined (reading 'incoming') when handling VOIP:PLAY_INCOMING. ```
This update resolves a bug that caused the mail composer to crash when generating invoices for sale orders without an associated invoice. The fix ensures that the intracom delivery date logic only applies when an invoice exists, preventing errors and maintaining normal report generation. This improves the reliability of our invoicing and shipping processes.
Original PR description
### Description of the issue/feature this PR addresses: A regression in account_edi_xml_ubl_bis (_ubl_get_delivery_node_from_delivery_address) references invoice.invoice_date in the intracom delivery…
### Description of the issue/feature this PR addresses:
A regression in account_edi_xml_ubl_bis (_ubl_get_delivery_node_from_delivery_address) references invoice.invoice_date in the intracom delivery branch even when invoice is not set.
This method is also used in sale-order UBL export flows (for example during quotation PDF generation from mail.compose.message), where vals.get('invoice') can be None.
Blame points to regression introduction in commit 0bf8df7d0a096cf8fe984c42d331404d473eeb71 (FP from f6c5aed52e00e807c4879e4139b116f1bea8282e).
### Current behavior before PR:
When the flow reaches sale-order BIS3 export without an invoice in vals, Odoo crashes with:
AttributeError: 'NoneType' object has no attribute 'invoice_date'
This raises an RPC_ERROR and breaks the mail composer / send flow
### Desired behavior after PR is merged:
The intracom delivery-date override is only applied when invoice exists and has invoice_date.
If invoice is missing (sale-order export context), no crash occurs, the delivery node is still generated safely, and mail composer/report generation completes normally.
Invoice export behavior remains unchanged for valid invoice contexts.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#250167This update resolves an issue preventing multiple tax lines on Italian invoices processed through the l10n_it_edi_doi module. Previously, only the DOI tax could be applied. Now, other taxes like Enasarco and RIT can be added to the same line, aligning with Italian tax regulations. This ensures accurate invoice processing for Italian businesses.
Original PR description
We should be able to add more taxes with the 0% on the same line, like the Enasarco and 23% RIT. Indeed in italy it is possible to have invoices with Dichiarazione d'intento togheter with a withholding and Enasarco taxes. See also: odoo/odoo#236251 Ticket [link](https://www.odoo.com/odoo/project.task/5933699) opw-5933699 Forward-Port-Of: odoo/odoo#248586
This update resolves a technical issue within the Odoo Enterprise HR payroll module that prevented users from editing date inputs in a specific form view. The fix ensures the popover is displayed before the input is cleared, restoring full editability. This improves the user experience for payroll processing.
Original PR description
With this additionnal step in tour, we ensure the popover is opened before clear the input. If we not wait for this, the input can be no longer editable. runbot-error-id~234440 Forward-Port-Of: odoo/enterprise#109346
2 changes
Enhancements to existing features
This update adjusts the Romanian tax reporting (l10n_ro_saft) to align with recent changes in the core Enterprise version (CE). The update removes outdated tax codes and adds new ones, ensuring accurate reporting for Romanian businesses. This improves compliance and data accuracy.
Original PR description
Some taxes were no longer needed in CE, so they needed to be removed task-5411745 Forward-Port-Of: odoo/enterprise#108884 Forward-Port-Of: odoo/enterprise#106127
Resolved issues and error corrections
This update resolves an issue preventing power buttons from appearing in Odoo Studio reports. The fix defines a key configuration element within Studio's interface, ensuring proper functionality and report customization. It also addresses a previous issue with table menu positioning within Studio.
Original PR description
Description of the issue: Commit [1](https://github.com/odoo/odoo/commit/7d523d6402c9bff3c2e4bcd0329f486a2d0f45ec) replaces overlay with localOverlay for the table menu. However, studio uses its own wysiwyg instance and config, which does not define localOverlayContainers, causing a traceback when table_menu accesses this.config.localOverlayContainers.key. Solution: Define localOverlayContainers and its corresponding key in studio’s wysiwyg config. Additionally, adjust the table menu position calculation when the table cell is inside an iframe. Also Before localOverlayContainers was not defined in studio, so power buttons did not appear in studio reports. Now that localOverlayContainers is defined, power buttons must be excluded from the main plugin to prevent them from appearing inside studio. Community PR: https://github.com/odoo/odoo/pull/250503 Forward-Port-Of: https://github.com/odoo/enterprise/pull/108724
10 changes
Enhancements to existing features
This update ensures invoices sent to French, German, or Belgian customers comply with the latest regulations for Factur-X and ZUGFeRD formats. Specifically, B2B invoices now use ZUGFeRD for German businesses and XRechnung for B2G invoices, improving clarity and accuracy for customers.
Original PR description
Updating the FacturX format (France)/ ZUGFeRD format (Germany) to respect the new norms: Factur-X 1.07.3 EXTENDED and ZUGFeRD 2.3.3 EXTENDED. Add the differentiation between these two formats in the customer interface, even if they point to the same value in the code. It clarifies things for the customer, things are called by their name. Also, in Germany, for B2B invoices (peppol EAS = 9930), use ZUGFeRD, but for B2G invoices (peppol EAS = 0204), use XRechnung. Adaptation of the default values in the partner form according to this statement. For French and German companies that are sending invoices to French, German or Belgian customers, changed the default format of invoice sent to be compliant to PDF/A-3 norms. task-5266286 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#250230 Forward-Port-Of: odoo/odoo#237091
This update adds optional fields to Peppol invoices, resolving a previous issue where users couldn't send fully compliant invoices. Now, users can utilize a studio feature to include necessary optional fields and attributes, ensuring adherence to Peppol standards and enabling successful invoice processing. This improves integration with Peppol partners.
Original PR description
Currently, several specific UBL fields are lacking from our Peppol integration, resulting in users not being able to send compliant invoices Using studio, they can now add the optional fields that are allowed by us and their optional attributes task-4963157 Forward-Port-Of: odoo/odoo#251359
This update improves logging for transactions related to Codabox integration (_l10n_be_codabox_fetch_coda_transactions). These enhanced logs will provide the support team with more detailed information to quickly diagnose and resolve any issues with the Codabox connection. This improves troubleshooting and reduces potential downtime.
Original PR description
This commit will improve the logs of _l10n_be_codabox_fetch_coda_transactions to help the support team to debug possible problem. task-5436868 Forward-Port-Of: odoo/enterprise#107779
Resolved issues and error corrections
This update expands the color field options within the Odoo Gantt editor, allowing users to select all integer fields for color customization. Previously, the color field was limited to fields already present in the view. This change provides greater flexibility for visualizing project timelines and tasks.
Original PR description
Before this commit, only fields already present in the view were selectable for the color field in the gantt editor. After this commit, all int fields of the model are available task-5981029
This update resolves a problem with the CSV reports generated for Peru (l10n_pe_reports) that was triggered by a recent Python update. The fix ensures the reports are correctly formatted, preventing errors during export. This improves the reliability of financial reporting for our Peruvian customers.
Original PR description
Revealed when l10n modules got enabled on the "distro builds" nightly: on Trixie, `delimiter="|", lineterminator='|\n'` raises ValueError: bad delimiter or lineterminator value This is due to…
Revealed when l10n modules got enabled on the "distro builds" nightly: on Trixie, `delimiter="|", lineterminator='|\n'` raises
ValueError: bad delimiter or lineterminator value
This is due to python/cpython#113797 which added new validations to dialect definitions. For this issue, that the delimiter can not be in the line terminator. This can be fixed via a different trick, which is documented:
> The optional `restval` parameter specifies the value to be written
> if the dictionary is missing a key in `fieldnames`.
so if we add a trailing fieldname which *can not* be found in the row dicts, then `DictWriter` will always write out an empty trailing cell (the default `restval` is an empty string), which should result in the same output.
Also remove the `csv.register_dialect` calls, that's so subsequent CSV calls can easily refer to a common configuration but here two different dialects are being registered under the same name, and each one is only used for the following `DictWriter` call, so at best this is a complete waste of time and at worst this is a race condition in threaded configurations. Just pass the formatting parameters directly to the `DictWriter`.
https://runbot.odoo.com/odoo/error/240950
Forward-Port-Of: odoo/enterprise#109081This update adds the street number to the demo company data for Denmark (l10n_dk). This is necessary to ensure accurate reporting and integration with nemhandel, a key payment processing system, improving the demo data's realism and usefulness for testing and demonstration.
Original PR description
This commit adds the street number to the DK demo company, because we need it for nemhandel. no-task Forward-Port-Of: odoo/odoo#250970
This update fixes an issue where credit notes incorrectly rounded prices, leading to discrepancies in accounting. The change ensures that credit notes accurately reflect the original purchase price, regardless of rounding settings. This improves financial accuracy and reduces potential errors.
Original PR description
**Steps to reproduce:** - Setup a rounding of 0.05 - Add it to the PoS settings, turn on the only for cash setting - Make a purchase for 13.01, pay by card - Go to the backend, we have the correct price of 13.01 - Revert the invoice by making a credit note - The price is only 13.00 and we have a rounding of -0.01 **Why the fix:** When making a credit note, we round the price if we find a rounding method, not taking the **only_round_cash_method** setting into account. After this commit, we now check if the reversed entry (the invoice) has a rounding line. If it does not, we skip the rounding. If a rounding is found on the reversed entry, we still round the current account move. opw-5871514 Forward-Port-Of: odoo/odoo#249894 Forward-Port-Of: odoo/odoo#247617
This update fixes an issue where modifying production quantities in a Manufacturing Order would incorrectly create duplicate work orders. The fix ensures that work orders are correctly updated instead of duplicated, maintaining accurate production tracking. This improves the reliability of the MRP process.
Original PR description
Steps to reproduce: 1. Create a product and two BoMs: BoM A (with operations) and BoM B (empty). 2. Create a Manufacturing Order (MO) for the product selecting BoM A. 3. Switch BoM A to BoM B, then…
Steps to reproduce:
1. Create a product and two BoMs: BoM A (with operations) and BoM B (empty).
2. Create a Manufacturing Order (MO) for the product selecting BoM A.
3. Switch BoM A to BoM B, then switch back to BoM A.
4. Modify the production quantity field. -> New operation lines are appended every time the quantity is changed.
The issue occurred because _compute_workorder_ids used 'wo.ids' to filter existing workorders. In the "Draft" state (UI/onchange), records exist as "virtual records" (NewIds). For these records, .ids returns an empty list [], which evaluates to False in Python.
Consequently, the existing virtual workorders were filtered out of the dictionary used to map operations to existing lines. The logic assumed the lines didn't exist and used Command.create() instead of Command.update(), causing duplication. Similar issues existed where 'NewIds' were ignored during BoM swaps, leaving "phantom" records in the cache.
Solution:
Removing the '.ids' check and using '.mapped('id')' ensures the computation remains "virtual-aware" and stable across sequential onchanges.
TECHNICAL JUSTIFICATION:
In Odoo 18.0, the ORM explicitly supports using Command.update and Command.delete with virtual records (NewIds) without an origin. This is handled by the 'write_new' method in relational fields:
- Virtual browse wraps IDs in NewId: https://github.com/odoo/odoo/blob/f688c6b66310438fa3e36a207770a63d0d8fffa5/odoo/fields.py#L4826-L4855
opw-5489862
Forward-Port-Of: odoo/odoo#246995This update resolves an issue preventing multiple tax lines (like Enasarco and RIT) from being added to Italian invoices within the Odoo system. Previously, only the DOI tax could be listed on a single line. This change aligns with Italian tax regulations, allowing for more accurate invoice processing and reporting.
Original PR description
We should be able to add more taxes with the 0% on the same line, like the Enasarco and 23% RIT. Indeed in italy it is possible to have invoices with Dichiarazione d'intento togheter with a withholding and Enasarco taxes. See also: odoo/odoo#236251 Ticket [link](https://www.odoo.com/odoo/project.task/5933699) opw-5933699 Forward-Port-Of: odoo/odoo#248586
A test failure related to invoice data formatting was resolved. The update ensures the correct data structure is used when generating electronic invoices, preventing potential errors and improving the reliability of the export process. This fix addresses a technical issue that could have impacted invoice generation.
Original PR description
In the `test_which_service_to_call` test, we are calling `_call_web_service_before_invoice_pdf_render` with invoice_data. But invoice_data is just a dict with `invoice.read()` and the extra key extra_edis. Instead of manually building invoice_data, we should call `_get_default_sending_settings`, which is meant to be used in the base `account.move.send` flow. Why this fix? Because by not calling `_get_default_sending_settings`, we risk changing the expected invoice_data format used in `_call_web_service_before_invoice_pdf_render`, which could lead to KeyErrors. Spotted while developing https://github.com/odoo/enterprise/pull/80590, the test failed, raising the ['invoice_edi_format'] key error. no-task Forward-Port-Of: odoo/odoo#232105
2 changes
Resolved issues and error corrections
This update resolves an issue where the Documents app would crash after deleting a payslip run. The fix ensures that related documents are also removed when a payslip run is deleted, preventing data inconsistencies and improving application stability. This change addresses a technical bug impacting user experience.
Original PR description
### Issue: When deleting a payslip run, the documents from the payslips of the run are not deleted. This results in a traceboack when opening the document app. ### Steps to reproduce: - Have a…
### Issue: When deleting a payslip run, the documents from the payslips of the run are not deleted. This results in a traceboack when opening the document app. ### Steps to reproduce: - Have a payslip run with payslips - Go to a payslip, validate and generate the document - Then cancel and reset to draft - Reset the Payslip Run to draft - Delete it - Open the Documents app ### Cause: The payslips are linked to the run with a `ondelete='cascade'` relation. https://github.com/odoo/enterprise/blob/03b2a7dae0e5c5ad3142ec2da8f3de5c9b1957f4/hr_payroll/models/hr_payslip.py#L110-L113 This means that deleting the run also deletes its payslips on a database level, bypassing the ORM. As the document is not directly linked by a relational field but instead by `res_model` and `res_id`, these fields are not updated and therefore are still pointing to a record that is no longer in DB. ### Solution: Extend the `unlink()` method in `hr.payslip.run` and unlink the documents there. opw-5501061 Forward-Port-Of: odoo/enterprise#105969
This update fixes an issue where tax reports were generating negative values for carried over tax lines (-81, -82, etc.). This ensures accurate tax reporting and avoids potential discrepancies in financial data. The change was triggered by a bug report and related internal tracking.
Original PR description
When generating the xml for tax report, negative values should not be present in the xml for carried over lines (81, 82, 83, 86, 87, and 88) Steps: - Create a RBILL for today - 1 month, add an invoice line with tax using one of the following tags: -81, -82, -83, -86, -87 or -88 in its base refund repartition line - Open the tax report on the month of the RBILL - Generate the xml, either by the dedicated button, or by creating and posting the closing entry -> there is line(s) for negative amounts opw-5955323 opw-5428395 Forward-Port-Of: odoo/enterprise#109229 Forward-Port-Of: odoo/enterprise#108916
21 changes
New functionality added to Odoo
This update introduces support for Hungarian Intrastat reporting, aligning with specific deadlines and periods required by Hungarian regulations. It allows businesses to accurately file Intrastat data, ensuring compliance with local tax requirements. This functionality builds upon the tax returns feature introduced in Odoo 18.3.
Original PR description
[ADD] l10n_hu_intrastat: Hungarian Intrastat Tax returns feature was introduced in 18.3, this module implement the specific Hungarian periodicities and deadlines for Intrastat. task-4987895
This update allows administrators to add custom fields directly within the Sign Template edition flow via a new sidebar button. These fields can be immediately used and further customized through a wizard form, providing greater flexibility in creating sign requests. This improves the user experience and allows for more tailored sign workflows.
Original PR description
This commits adds the button "Add field", for administrators, in the sidebar of the Sign Template edition flow in order to add custom fields during the edition. The fields can be immediately used after creation and can be customized through a wizard form when clicked. task-5173040
Enhancements to existing features
This update enhances the speed and efficiency of the product configurator within the Enterprise edition of Odoo. The changes, stemming from a community contribution, optimize the underlying processes to provide a smoother and faster experience for users building custom product configurations. This improves overall user productivity.
Original PR description
Adjustments complementing community PR - https://github.com/odoo/odoo/pull/247381 task-3891049
This update enhances the user experience on touchscreens by redesigning input fields and buttons for better usability. The changes include increased spacing, improved icon placement, and a unified look and feel, making it easier to interact with Odoo Enterprise applications on devices like tablets and smartphones.
Original PR description
The PR is the enterprise counterpart of https://github.com/odoo/odoo/pull/250051 Here is the original message: The commit aims to improve the UX on touch screens, by improving inputs and buttons…
The PR is the enterprise counterpart of https://github.com/odoo/odoo/pull/250051
Here is the original message:
The commit aims to improve the UX on touch screens, by improving
inputs and buttons design to make them more usable on those touch
oriented devices first by giving more space around certain elements
and making other UI elements more compact to give the user more
information. As a side effect, this task also allowed to improve the
desktop experience regarding suffixes and to unify the look and
feel of text inputs.
A dedicated o_input_box class has been added. Being used at the highest
level on an input/button element or its parent in the UI, it can be used
to add overlay prefix and/or suffix inside of them, using on those UI
elements the 'o_input_box_overlay + prefix/suffix' classnames.
For example:
```
<div class='o_input_box'>
<i class='fa fa-gear o_input_box_overlay prefix'/>
<input class='o_input'/>
<button class='btn btn-link o_input_box_overlay suffix'>Click Me</button>
<i class='fa fa-arrow o_input_box_overlay suffix'/>
</div>
```
In this example, an input box would be display around the input, with
enough padding before and after the input value, displaying 2 icons
and a button.
Currently, positioning the overlay elements require to call the dedicated
utility function, exported from '/web/static/src/core/input_box.js'.
Padding is then calculated and adapted accordingly to maintain affordance
of the input or button text, and place the dropdown arrow.
An InputBox component has been added as well, implementing easily the right
elements around an input, but it is possible to use the classnames without
the need for this specific component.
If an element with o_input_box is contained inside another o_input_box
parent, the highest element is considered as the input box, and displayed
correctly. This allows a component that already have the class to have a
sibling element serving as an overlay, by adding a parent to both elements
having the o_input_class. It is also useful when some UI is declared from
the arch XML while other overlays are defined from the component side.
This commit also removes the need of a dedicated component for the boolean
toggle field in list views. The edition of any boolean field in
readonly/non selected rows in list views is already well handled in a
scss rule, and it is not necessary to have this dedicated wrapper around
the standard BooleanToggleField component.
task-5355007This update enhances the rental dashboard within the Odoo Enterprise system, providing a consolidated view of rental orders with key status counts. This change simplifies order management and offers a more intuitive overview of rental operations, improving decision-making.
Original PR description
Task: 5358651
Resolved issues and error corrections
This update corrects a minor issue preventing users from editing date input fields within the HR payroll module. The change ensures the relevant popover is displayed before the input field is cleared, restoring full functionality. This resolves a temporary disruption to payroll processing.
Original PR description
With this additionnal step in tour, we ensure the popover is opened before clear the input. If we not wait for this, the input can be no longer editable. runbot-error-id~234440 Forward-Port-Of: odoo/enterprise#109346
This update corrects a technical issue within the Odoo Enterprise payroll module that could cause inconsistencies between payslip data. The fix ensures that all payroll line codes are synchronized, preventing potential errors in payroll calculations and reporting. This improves the accuracy and reliability of payroll processing.
Original PR description
Forward-Port-Of: odoo/enterprise#109280 Forward-Port-Of: odoo/enterprise#108729
This update corrects a bug where salary inputs weren't properly copied when creating duplicate selections. Previously, this prevented certain salary calculations from working correctly. The fix ensures that all necessary selection options are now accurately reflected, improving payroll accuracy and functionality.
Original PR description
When having a salary input avaiblable for employee and payslip, and using it in an employee made it unavailable in payslips. This is unwanted behaviour and is due to the domain restricting existing_ids in employees. This was extracted from the action and is set in each separate model according to the needs. task-5909636 Forward-Port-Of: odoo/enterprise#109277 Forward-Port-Of: odoo/enterprise#106488
This update fixes a minor issue in the Gantt chart's date selection tool. Previously, date labels didn't update immediately when a new range was chosen. Now, the UI provides instant visual feedback as you select dates, leading to a smoother and more responsive user experience. This ensures accurate date selection and reduces potential confusion.
Original PR description
This PR improves the user experience of the Gantt Scale Selector when using a **Custom** range. Previously, the "Start" and "Stop" date labels in the UI remained static until the "Apply" button was clicked, as they were bound directly to `props.scales`. This commit switches those labels to use the component's internal reactive state (`this.pickerValues`). **Changes:** * Bind `t-out` directives to `this.pickerValues` instead of `props.scales`. * Pass reactive Luxon objects through `getFormattedDate` for immediate localized rendering. **Task-5926713**
This update enhances the user experience within Odoo's web_studio by changing the names of report customizations from technical keys to more descriptive, human-readable labels. This makes it easier for users to understand and manage their report customizations, improving overall usability. The change was a simple refinement to improve clarity.
Original PR description
Before this commit the name of a view customization for a report was basically its key. After this commit, the name is more human readable task-5945040
This update corrects a display issue on payslips. The "Error" status, previously shown, has been changed to "Blocked" to provide a clearer indication of payroll processing problems. This ensures accurate reporting and easier troubleshooting for HR and finance teams.
Original PR description
[IMP] hr_payroll: renaming status name
Shown status in payslip ("Error") is needed to be changed to Blocked.
task - 5969322This update fixes an issue where payroll reports and payment exports incorrectly displayed employee names instead of the actual account holder's information. The change ensures payment records accurately reflect the bank account partner, improving data accuracy and compliance across various localized payroll modules (AU, BE, CH, IN, SA, US).
Original PR description
Steps to reproduce: 1. Setup an employee with a bank account where the account holder is different from the employee (e.g., a spouse). 2. Generate a payslip for this employee. 3. Print the payslip…
Steps to reproduce: 1. Setup an employee with a bank account where the account holder is different from the employee (e.g., a spouse). 2. Generate a payslip for this employee. 3. Print the payslip (PDF) or generate a payment export (SEPA, NACHA, ABA, CSV). 4. Observe that the employee's name is displayed instead of the account holder's information. Issue: Payroll reports and payment exports were frequently hardcoded to use the employee's legal name or work contact ID. This is incorrect when a bank account belongs to a different partner, as payment records should reflect the actual account holder. Solution: Unified logic across standard and localized payroll modules (AU, BE, CH, IN, SA, US) to prioritize the bank account's linked partner: - Updated QWeb templates to display bank.partner_id.name for account allocations. - Modified payment wizards (CSV, NACHA, ABA, SEPA) to use the bank account's partner ID. - Ensured a fallback to the employee's legal name remains in place. opw-5357652 Forward-Port-Of: odoo/enterprise#108785 Forward-Port-Of: odoo/enterprise#106718
This update resolves a stability issue in the invoice processing cron job for Brazilian tax documents. Previously, a single error would halt the entire process, wasting credits. The fix now processes invoices in smaller batches, committing changes after each, ensuring progress is preserved and preventing disruptions.
Original PR description
The cron searched with limit=batch_size and only retriggered when >batch_size records were found which never happens. It also ran all invoices in a single transaction so one failure rolled back all progress while IAP credits were already consumed. Search batch_size + 1 so remaining invoices are detected, and commit after each invoice to preserve progress. opw-5954211 Forward-Port-Of: odoo/enterprise#109315 Forward-Port-Of: odoo/enterprise#108191
This update simplifies the process of adding employees to workorders in Odoo Enterprise. Previously, the automatic employee creation for admins was removed, causing issues. Now, a popup allows quick employee creation with the current user's ID pre-filled, and automatically creates an employee if needed during shopfloor operator editing.
Original PR description
In 19.1, the automatic creation of an employee profile for the admin user has been removed. This causes issues when the admin wants to start a workorder or mark it as done, so we added a popup to create a new employee profile with the user_id already filled with the id of the current user. Also, if no employee exist when editing operators in the shopfloor, the popup proposes to directly create a new employee linked to the current user if they have HR access. This new employee will be directly logged in the shopfloor operators. see https://github.com/odoo/odoo/pull/250607 to make `action_create_employee` return an employee record. task 5932500 Forward-Port-Of: odoo/enterprise#107439
This update fixes an issue where worked days were incorrectly calculated for employees with no contract or contracts that didn't fully align with pay periods. The changes ensure accurate attendance and out-of-contract day calculations, particularly for new hires and those with contracts starting or ending mid-month. New tests have been added to verify this fix.
Original PR description
Problem: ------- In several scenarios, Worked Days are incorrectly computed when the employee has no contract or when the contract does not fully overlap with the payslip period. Case 1: - Create an…
Problem: ------- In several scenarios, Worked Days are incorrectly computed when the employee has no contract or when the contract does not fully overlap with the payslip period. Case 1: - Create an employee without a contract - Create a payslip for this employee for the current month: You'll see X days of attendance (= today until the end of the payslip period) and Y days of out of contract (= number of days from the start of the payslip period until today) - Create a payslip for this employee for the previous month: you'll see ( Z_prev + Y ) days out of contract ( Z_prev = number of working days in the previous month) - Create a payslip for this employee for the next month: you'll see Z_next days of attendance (Z_next = number of working days in the next month) Case 2: - Create a new employee with a contract starting during the current month - Create a payslip for this employee for the previous month - Out-of-Contract days are incorrectly computed as: contract_start_date - previous_month_start. Case 3: - Create an employee with a contract ending during this month - Create a payslip for this employee for the next month - Out-of-Contract days are incorrectly computed as: next_month_end - contract_end_date. Solution: -------- When generating work days lines: - Explicitly handle employees without a contract. - Use adjusted date bounds when the contract does not overlap the payslip period. Several tests were added to cover these scenarios, as well as the tests the corresponding commit in odoo/odoo (PR odoo: 241978) task-5430759 Forward-Port-Of: odoo/enterprise#109237 Forward-Port-Of: odoo/enterprise#103207
This update resolves an issue where foreign vendor VAT invoices were not correctly identifying the country of origin. The team has implemented a fix to ensure the correct country code is applied to vendor bills, improving accuracy in JPK reports. This ensures proper tax reporting for international suppliers.
Original PR description
PR #81359 fixed the country code for foreign VAT companies by adding the country code to the start. However, this was only fixed for invoices going out, not vendor bills coming in. [opw-5917264](https://www.odoo.com/odoo/project.task/5917264) Forward-Port-Of: odoo/enterprise#109080
This update resolves a problem that prevented Italian fiscal printers from working correctly. The fix ensures the order is fully synced before printing the ticket, preventing errors related to missing currency information. This improves the reliability of the Italian POS system for businesses.
Original PR description
Issue: When printing with the italian fiscal printer since the sync_from_ui was not awaited before printing, the generation of the ticket was trying to access the currency from the order that wasn't set. Fix: Print the ticket after the order is synced. Forward-Port-Of: odoo/enterprise#108144 Forward-Port-Of: odoo/enterprise#106455
A server error occurred when deleting mailings linked to marketing activities. This update corrects a technical issue caused by a change in Odoo's codebase, ensuring users receive a standard error message when attempting to delete mailings that are still in use. This prevents unexpected application crashes and improves the user experience.
Original PR description
How to reproduce ------ 1. Open the Marketing Automation app 2. Create a new campaign 3. Click on Add new activity to create a new activity (in the previously created campagin) 4. Set the Activity…
How to reproduce ------ 1. Open the Marketing Automation app 2. Create a new campaign 3. Click on Add new activity to create a new activity (in the previously created campagin) 4. Set the Activity Type to email 5. In the Mail Template option, select or create a mailing 6. Open the selected/created mailing (using the Templates smart button) 7. Click on the gear icon and then click Delete (either one or multiple together) DEMO: https://www.awesomescreenshot.com/video/50021531?key=18a341a6939e6ff8deb847fc251db570 Current behavior ----- Odoo Server Error is displayed. Expected behavior ------ Normal user error indicating that the mailing(s) being deleted is still linked to an activity (or marketing campaign). Cause ------ When formatting the user error, we used the attribute `name`, to get the mailing's display name, which does not exist in `mailing.mailing` model. Therefore, a KeyError is raised. The `name` attribute was an attribute in a class named `UtmSourceMixin` in the utm module, of which `mailing.mailing` was inheriting. In saas-19.2, that class was removed and hence the `name` is no longer available for `mailing.mailing`. The commit in which the metioned class was removed is: https://github.com/odoo/odoo/commit/93f8bb821ab86612d95d93ae0fdca5a08a12e2d5 (See utm_source.py) Solution ------ Change the `name` to `mailing.display_name`. DEMO: https://www.awesomescreenshot.com/video/50049334?key=a34a525ef38bdf2dc8037f2dcfa68761 task-5999999 Forward-Port-Of: odoo/enterprise#109400
This update resolves an issue where refreshing pivot tables caused unexpected delays. The fix ensures that related dynamic tables are also updated, improving the overall performance and stability of the pivot functionality. This change addresses a technical problem that impacts how users interact with data visualizations.
Original PR description
Refreshing the pivot will invalidate the datasource,which means that t dynamic table related to a pivot also needs to be invalidated. This usually occurs when we insert a new table but since [1], we create dynamic tables out of thin air. Pretty much every command that will invalidate the pivots will now need to invalidate the tables as well. [1]: https://www.odoo.com/odoo/2328/tasks/4552232 Counter-part of https://github.com/odoo/odoo/pull/250909 Task-5976773 Forward-Port-Of: odoo/enterprise#109325
This update corrects a display issue where upsell sale orders created from subscriptions incorrectly showed as "Quotation". The fix ensures that upsell orders now display as standard sales orders, aligning with the naming convention for initial subscriptions. This improves clarity and consistency for users.
Original PR description
## Issue When creating and confirming an Upsell SO from a Subscription, the preview still shows the Sale Order as a "Quotation", which is inaccurate. <img width="1330" height="296" alt="5489970"…
## Issue
When creating and confirming an Upsell SO from a Subscription, the preview still shows the Sale Order as a "Quotation", which is inaccurate.
<img width="1330" height="296" alt="5489970" src="https://github.com/user-attachments/assets/cfff4c7a-fff7-4859-861b-c190dab9097d" />
## Steps to reproduce
1. Install *Subscription* (`sale_subscription`)
2. Create a Subscription S00001
- Any Customer
- Any Recurring Plan
- Any Product
3. Create and confirm the invoice for the subscription S00001
4. On the subscription S, click Upsell and confirm the resulting Sale Order S00002
5. On the Sale Order S00002, click Preview
6. **The title of the Sale Order is "Quotation - S000002". In the sale.order list view, the Sale Order is shown as a Sales order, just like the initial Subscription.**
## Cause
The title shown in the preview is defined here:
https://github.com/odoo/enterprise/blob/a4e2c7c7d3aa50c8b57668c9ca73f523a31a5c41/sale_subscription/views/sale_subscription_portal_templates.xml#L187-L195
The initial subscription falls into the `if` condition, which only shows the name of the SO. The upsell sale order is not considered as a subscription, as explained and showed here:
https://github.com/odoo/enterprise/blob/6bfd057b3d17ce8b266aa6dbd88ffef70ca634aa/sale_subscription/models/sale_order.py#L193-L201
The word *"Quotation"* shown in the preview is the `sale_order.type_name`", computed here:
https://github.com/odoo/enterprise/blob/6bfd057b3d17ce8b266aa6dbd88ffef70ca634aa/sale_subscription/models/sale_order.py#L227-L237
The term "Quotation" was chosen in https://github.com/odoo/enterprise/commit/14e5cff65affa888f33d4008d10a32e6992d3a39.
## Fix
Before this commit, an upsell would always be named *"Quotation"*. With this commit, upsells are now added to the `other_orders` variable in `_compute_type_name` and follow the same logic as other SO:
https://github.com/odoo/odoo/blob/a3bf9264ca25ec11b0c9742e142d2404cac6d261/addons/sale/models/sale_order.py#L797-L803
<img width="1316" height="308" alt="5479900_2" src="https://github.com/user-attachments/assets/7cfeb578-2870-43a6-a48b-ba0898718641" />
## Alternative
An alternative to this fix would be to update the condition used to display the name of the subscription in the preview (cf. first code snippet). This would probably result in removing the `sale_order.is_subscription` from the condition, as it is the part of the condition that upsell SOs do not meet.
opw-5489970
Forward-Port-Of: odoo/enterprise#109268
Forward-Port-Of: odoo/enterprise#106767Code cleanup and technical improvements
This update reorganizes how Odoo handles incoming requests, moving serving logic to a dedicated module. This change simplifies the system and makes it more efficient, ensuring requests are processed effectively. It’s an internal technical update that improves the underlying infrastructure.
Original PR description
Now that the http module has been split, it makes sense to move the serving logic to the `router.py` module. These functions do not need to be exposed from a `Request` instance. Task-5926433 Forward-Port-Of: odoo/enterprise#107416
10 changes
Enhancements to existing features
This update ensures Odoo's Uruguay-specific electronic invoicing (CFE) reports comply with recent changes mandated by the Uruguayan tax authority (DGI). Specifically, a new reporting option for 'Export under Mandate' has been added, and adjustments have been made to how reference invoices are transmitted to accurately reflect export transactions.
Original PR description
Purpose: The DGI introduced changes in CFE version 25. The following changes below needs to be implemented for legal compliance.
Required Changes:
- Introduce a new selection value,("91", "Export under Mandate")for field, l10n_uy_edi_cfe_sale_mode. This option is required when documenting export operation performed as a mandating entity, where the definitive export will be carried out by a third party.
- The reference document(credit note or debit note) of an existing account move will need to send:
- Amount (MntCFEref)
- Currency (TpoMonedaRef)
- Exchange Rate (TpoCambioRef) if the currency is not Uruguayan Pesos
task-5419331
task-5419331
Forward-Port-Of: odoo/enterprise#108430
Forward-Port-Of: odoo/enterprise#103881This update simplifies the process for Italian businesses filing withholding tax returns. The default periodicity has been changed to monthly, aligning with Italian regulations and improving ease of use. This change ensures accurate reporting and reduces the complexity for users.
Original PR description
In Italy, withholding tax return periodicity is monthly. but it's hard to discover/configure. Default periodicity should be monthly. task-5985704 Forward-Port-Of: odoo/enterprise#109185
Resolved issues and error corrections
This update resolves a test failure related to holiday attestations in the Belgian payroll module. Adding a 'freeze_time' setting to the test ensures accurate calculations and prevents errors during automated testing. This ensures the correct processing of holiday pay calculations.
Original PR description
Addind freeze_time to Fix holiday attest test that failed on the runbot
This update resolves an issue where approval rules for account moves incorrectly linked actions to the list view. The change ensures that when an approval rule is applied, the associated list view action is automatically deactivated, streamlining the approval process and preventing unintended actions. This improves the reliability and usability of the approval workflow.
Original PR description
Following commit odoo/odoo@c442f72479b50855f40ba079800ee9e5a5690753 When putting an approval rule action_post (account.move) the action bound to the list view must be deactivated. opw-5921128
This update fixes an issue where payslips weren't being generated correctly for employees with flexible working hours. The system now automatically creates work entries for these employees when a payslip is created, ensuring accurate payroll calculations. This improves the reliability of payroll processing for a wider range of employee types.
Original PR description
**Version:** - 19.0 **Steps to reproduce:** - Create an employee. - Leave the Working Hours field empty. - Set the contract dates and a wage. - Create a payslip using the smart button. **Issue:** - Worked day lines are empty for flexible employees when the payslip is created from the smart button. **Cause:** - Flexible employees were being skipped because their working hours were empty, which results in work entries not being generated. **Solution:** - Updated the condition to also generate work entries for flexible employees. Task-5431870
This update fixes inconsistencies in how rental dates and planning slots are synchronized, ensuring accurate scheduling and order management. It automatically updates all related dates and quantities when changes are made to rental orders or planning slots, resolving previous issues with quantity discrepancies and resource conflicts. This improves data accuracy and reduces potential scheduling errors.
Original PR description
## [FIX] sale_renting_planning: fix sync between rental dates and planning slots dates Before this commit, it was possible to have `Planning Slots` with `Sync Shifts and Rental Orders` whose dates…
## [FIX] sale_renting_planning: fix sync between rental dates and planning slots dates Before this commit, it was possible to have `Planning Slots` with `Sync Shifts and Rental Orders` whose dates were different from the `Rental order`. This commit makes sure that all dates are always synced: - If the `Rental Order` dates are changed then all `Planning Slots`' dates changed to the new dates. - If a `Planning Slot` dates have changed then all other `Planning Slots` and the `Rental Order` Dates are changed to the new dates. ## [FIX] sale_renting_planning: fix sync between order line quantity and planning slots Before this commit, adding/removing a `Planning Slot` would not change the `SOL quantity` and changing the `SOL quantity` would not add/remove `Planning Slots` unless all slots are being deleted. This commit makes sure that when the `SOL quantity` is changed, the number of `Planning Slots` is changed accordingly, and if a Planning Slot` was added/removed, the `SOL quantity` would update accordingly. Note: The new sync behaviour from `SOL quantity` is ignored for `Products` with `hour UOM` because it is not clear yet how to update the `Planning Slots` if the new quantity of hours doesn't span a full rental interval. ## [FIX] sale_renting_planning: fix set multiple slots to resources Before this commit, adding multiple `Planning Slots` at the same time with the same `Role` can assign them to the same `Resource` even if they conflict with each other. This commit makes sure that when adding multiple `Planning Slots` none of them would conflict with each other after being added. task-5187356 Forward-Port-Of: odoo/enterprise#104771
This update resolves an issue preventing the export of Eco-Voucher data to Excel after a recent system update. The change addresses a discrepancy in data tracking between the old 'contracts' system and the new 'versions' system, ensuring accurate export functionality for Belgian companies using the payroll module.
Original PR description
Since the switch from contracts to versions, exporting Eco-Vouchers to excel has not been functional, this commit fixes this. **Steps to reproduce:** - Open Payroll App as a Belgian company - Under Reporting Menu, select Eco-Vouchers - Try exporting with XLSX **Issue:** Since introduction of versions, version module does not contain state field anymore which was present in contracts **Fix:** Removed the state field and replaced it with the corresponding field in version. task:5163668 Forward-Port-Of: odoo/enterprise#97375
This update resolves a crash issue that occurred when viewing pay runs on mobile devices with a smaller screen size. The fix ensures the system correctly identifies and interacts with the pay run Kanban view, preventing unexpected errors and improving stability for users. It addresses a technical problem related to how the system locates and manages scrollable content.
Original PR description
**Steps to Reproduce:** 1. Open Payroll->Payslips->Pay Runs 2. Click on a Pay Run in Mobile View (Width < 600px). 3. Return to the previous view using the breadcrumb. 4. The system crashes with…
**Steps to Reproduce:** 1. Open Payroll->Payslips->Pay Runs 2. Click on a Pay Run in Mobile View (Width < 600px). 3. Return to the previous view using the breadcrumb. 4. The system crashes with Traceback: TypeError: Cannot set properties of null (setting 'scrollLeft') **Bug Cause:** The custom 'hr_payroll.PayrunKanbanRenderer' template overrode the 'class' attribute of the root div. By setting it only to 'o_payrun_kanban', the standard 'o_renderer' class was removed. The Kanban controller's scroll restoration logic (introduced in recent lazy-loading updates) relies on the '.o_renderer' selector to find the scrollable container. When missing, querySelector returns null, leading to a traceback. **Solution:** Updated the XML template to explicitly include 'o_renderer' in the class list. This restores the functional hook required by the JavaScript controller for scroll restoration while maintaining the custom 'o_payrun_kanban' layout. Task: 5971861 Forward-Port-Of: odoo/enterprise#108847
This update corrects an issue where shift durations weren't accurately displayed in the Planning app when shifts spanned across multiple days. The fix removes outdated logic that previously truncated pill names based on hour spans, ensuring correct duration information is shown regardless of the shift's length. This improves the accuracy of shift scheduling and reporting.
Original PR description
### Issue: The pill name contains the hours when it spans over the next day for less than 3 hours but not if more than 3 hours. ### Steps to reproduce: - Go to Planning app - Create a shift for an…
### Issue: The pill name contains the hours when it spans over the next day for less than 3 hours but not if more than 3 hours. ### Steps to reproduce: - Go to Planning app - Create a shift for an employee from 3pm to 2am (over two days) - The hours of the shift are displayed - Modify the shift end to 3am - The hours of the shift aren't displayed ### Cause: Before the refactor adapting the gantt view to OWL, when a shift spanned over two days less than three hours, then the gantt view truncated the pill to display it in only one day. (see [`_snapToGrid()`](https://github.com/odoo/enterprise/blame/a16b2ef569903c0ae5803c169dbd68acd0141fe1/web_gantt/static/src/js/gantt_row.js#L1044-L1072)) The same logic was done for the computation of the pill's name in [this commit](https://github.com/odoo/enterprise/commit/98a86cbacf484646f486e4648788cfa53cc9648c). But as the pills are no longer truncated since 17.0, the computation of pill names is faulty. ### Solution: We remove the checks of the 3-hour margin. This also makes the variable `spanMoreThanOneDay` useless, so we delete it. opw-5881532 Forward-Port-Of: odoo/enterprise#109314 Forward-Port-Of: odoo/enterprise#107233
This update resolves a problem preventing the correct generation of CSV reports for Peru-specific financial reports. The issue stemmed from incompatible CSV formatting settings within the Odoo system, specifically related to Python 3.13. The fix ensures reports are generated correctly, maintaining data accuracy for Peruvian accounting.
Original PR description
Revealed when l10n modules got enabled on the "distro builds" nightly: on Trixie, `delimiter="|", lineterminator='|\n'` raises ValueError: bad delimiter or lineterminator value This is due to…
Revealed when l10n modules got enabled on the "distro builds" nightly: on Trixie, `delimiter="|", lineterminator='|\n'` raises
ValueError: bad delimiter or lineterminator value
This is due to python/cpython#113797 which added new validations to dialect definitions. For this issue, that the delimiter can not be in the line terminator. This can be fixed via a different trick, which is documented:
> The optional `restval` parameter specifies the value to be written
> if the dictionary is missing a key in `fieldnames`.
so if we add a trailing fieldname which *can not* be found in the row dicts, then `DictWriter` will always write out an empty trailing cell (the default `restval` is an empty string), which should result in the same output.
Also remove the `csv.register_dialect` calls, that's so subsequent CSV calls can easily refer to a common configuration but here two different dialects are being registered under the same name, and each one is only used for the following `DictWriter` call, so at best this is a complete waste of time and at worst this is a race condition in threaded configurations. Just pass the formatting parameters directly to the `DictWriter`.
https://runbot.odoo.com/odoo/error/240950
Forward-Port-Of: odoo/enterprise#10908114 changes
Enhancements to existing features
This update enhances the accuracy of loan interest rates within the Enterprise module. Previously, interest rates were displayed with only two decimal places. Now, users can specify up to ten decimal places for greater precision, improving financial reporting and calculations.
Original PR description
Allowing more precision on the interest rate for loans. By default the display uses 2 decimals, but if a user decides to add more precision they can up to 10 decimals. task-5913175
This update adjusts the salary scale parameters used in the Odoo Enterprise's Belgian payroll module. Specifically, the values for the first year of the CP200 salary scale and the overall scale have been updated to reflect changes in Belgian regulations as of January 1, 2026. This ensures accurate payroll calculations for Belgian employees.
Original PR description
. Update cp200_salary_scale_first_year values for 01/01/2026 . Update cp200_salary_scale values for 01/01/2026 task-5485636 Forward-Port-Of: odoo/enterprise#107473
Resolved issues and error corrections
A bug was causing a validation error when simultaneously updating the fiscal year's last month and last day for a company and its branches. This fix ensures that all changes are applied before the system checks for constraints, preventing the error and allowing users to correctly configure fiscal year settings. This improves the reliability of accounting configurations.
Original PR description
Having a parent company and a chid company selected, and changing both the last day and the last month of the fiscal year as the same time raises a ValidationError. This is because in this case, in the write we successively modify each changed delegated fields from root company to the branches. Then, when checking the constrains we loop through all delegated fields and check if the value of the branches are the same as the root company. This check triggers the error as all values are not set yet. By using a write on branches for all changed delegated fields instead of a simple assignation, the constrains check occurs once all the value have been updated. Steps: - Have a root company and a branch - Select both in company selector - Go to Accounting configuration - Change fiscalyear last month AND ast day at the same time - Save -> ValidationError in `_check_root_delegated_fields` opw-5431145
This update resolves a runtime error that occurred when generating the stock forecast report. Specifically, the report was failing due to an issue with how stock movements were being processed during delivery transfers. This change ensures the report generates correctly, preventing data inaccuracies.
Original PR description
This reverts commit 2b2d73df420baee4fec1c51c28250666d80b48b8. ## How to reproduce (in runbot): - Create Product P - Create Delivery transfer from 'WH/Stock/Shelf 1' - Open Forecast report: =>…
This reverts commit 2b2d73df420baee4fec1c51c28250666d80b48b8.
## How to reproduce (in runbot):
- Create Product P
- Create Delivery transfer from 'WH/Stock/Shelf 1'
- Open Forecast report:
=> RuntimeError: dictionary changed size during iteration
The original fix will be redone in another commit.
---
## Traceback:
```
File "/data/build/odoo/addons/stock/report/stock_forecasted.py", line 21, in get_report_values
'docs': self._get_report_data(product_ids=docids),
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/addons/stock/report/stock_forecasted.py", line 128, in _get_report_data
res['lines'] = self._get_report_lines(product_template_ids, product_ids, wh_location_ids, wh_stock_location)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/addons/stock/report/stock_forecasted.py", line 359, in _get_report_lines
for product_id, location_id in currents:
RuntimeError: dictionary changed size during iteration
```
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#251768This update fixes an issue where landed cost accounting for subcontracted receipts didn't accurately reflect the quantity of stock still in inventory. The fix ensures that the correct number of account move lines are created to properly account for stock movements, aligning with standard accounting practices for non-subcontracted products.
Original PR description
…lues landed cost sbc **Problem:** account move line created from a landed cost on a subcontracted receipt do not take into account already out quantity. **Steps to reproduce:** - create a tracked…
…lues landed cost sbc **Problem:** account move line created from a landed cost on a subcontracted receipt do not take into account already out quantity. **Steps to reproduce:** - create a tracked product with avco auto category - create a subcontracted bom for this product with no comp - create and confirm a PO for 10 unit of this product with the same partner as the subcontractor of the bom - validate the receipt - create and validate a delivery for 4 unit of your product - navigate to inventory/operations/adjustments/landed costs - create a new landed cost - select the receipt from the PO - add a landed cost of 10$ and validate - select the valuation smart button - a 6$ svl was created (which is correct because 6 out 10 products of the receipt are still in stock) - click on the book widget to open the account move view **Current behavior:** Only two account move lines were created both with a value of 10 One crediting sotck interim received On debiting stock valuation **Expected behavior:** 4 extra account move lines (all with a value of 4) should have been created to compensate the out quantity like it is the case for non subcontracted product. One debiting stock interim delivered One crediting stock valuation One debiting expenses One crediting stock interim delivered **Cause of the issue:** _is_in() will return false for the move of a subcontracted receipt https://github.com/odoo/odoo/blob/7462ec423e8b106a5175a71ac009176d16cdf225/addons/stock_landed_costs/models/stock_landed_cost.py#L185 This is wanted and happens because _should_be_valued() will return true when called on the subcontracted location https://github.com/odoo/odoo/blob/7462ec423e8b106a5175a71ac009176d16cdf225/addons/stock_account/models/stock_move.py#L129 As a consequence, qty_out stays 0 https://github.com/odoo/odoo/blob/7462ec423e8b106a5175a71ac009176d16cdf225/addons/stock_landed_costs/models/stock_landed_cost.py#L185-L186 and we do not append the values for the extra amls inside _create_account_move_line() https://github.com/odoo/odoo/blob/7462ec423e8b106a5175a71ac009176d16cdf225/addons/stock_landed_costs/models/stock_landed_cost.py#L465-L466 **fix:** if we make sure the the adjustment line is linked to the move of the MO instead of the move of the receipt, this problem does not happen because _is_in() returns true for the move of the MO. Also in this case we don't need _get_stock_valuation_layer_ids() which was introduced by this PR https://github.com/odoo/odoo/pull/166107 to solve the same issue. That is because the move used in button_validate is the move linked to the adjustment line, which will, after this fix, be the one of the MO, so we can directly take its stock valuation layers. opw-5723126
This update resolves a problem with the HTML Editor's automated tests. The tests were unreliable due to the toolbar being a popover, making it difficult to wait for the display to fully load. The team has increased timeouts and addressed timing issues to ensure test stability and consistent results.
This update corrects a discrepancy in the Spanish version of the abbreviated balance sheet report. It adds account code 189, required by recent Spanish accounting regulations (PGCE) to ensure accurate reporting and compliance. This ensures the financial reports generated for Spanish businesses align with current legal requirements.
Original PR description
According to last updated of PGCE https://www.boe.es/buscar/act.php?id=BOE-A-2011-18458 <img width="790" height="342" alt="image" src="https://github.com/user-attachments/assets/d5875946-d3b0-480b-bea1-8a7f4202aef7" /> @moduon MT-14017
This update fixes an issue in the batch transfer report where product lines were scattered across the document, causing operators to waste time scanning. The report now sorts move lines by product, grouping similar items together for quicker identification and reduced operational inefficiencies.
Original PR description
Issue Before This Commit: ======================= In the `batch transfer report`, move lines are ordered by the `picking's batch sequence` (picking_id.batch_sequence). When operators use the document…
Issue Before This Commit: ======================= In the `batch transfer report`, move lines are ordered by the `picking's batch sequence` (picking_id.batch_sequence). When operators use the document to pick items, they have to scan through the report to find all lines for the same product. As a result, operators `lose time scanning the document` and `risk of missing lines`. Steps to Reproduce: ======================= - Install the `stock_picking_batch` module. - Create `multiple deliveries` with several `common products`. - Add these deliveries to a batch transfer and print the batch transfer report. - Observe that product lines are ordered by location and then by picking. Cause of the issue: ======================= The batch transfer report currently sorts move lines by picking in the report `(picking_id.batch_sequence)`. When the same product exists in another picking, This causes lines for the same product to be scattered across the report instead of being grouped together, causing the product to appear in multiple places in the document. After This Commit: ======================= In the report, move line sorting by picking (picking_id.batch_sequence) has been replaced with sorting by product `(product_id.id)`. Move lines are now ordered by product, so similar products are displayed together in the document. This helps operators find products more quickly, reduces scanning effort, and makes the process more reliable. TaskID-5379367
This update corrects an issue where phone numbers on Arabic receipts were displayed in reverse (right-to-left) instead of the correct left-to-right format. The fix ensures phone numbers are correctly formatted based on the selected language, improving the user experience for Arabic-speaking customers. Alternative fixes were considered but the XML fix is the most straightforward.
Original PR description
# Steps to reproduce: - Open the company, change the language to Arabic - Go to POS, open the shop - Buy anything and click on receipt # Problem: When clicking on the receipt, you would find the…
# Steps to reproduce:
- Open the company, change the language to Arabic
- Go to POS, open the shop
- Buy anything and click on receipt
# Problem:
When clicking on the receipt, you would find the phone number is written right to left, although it should be printed left to right.
# Cause:
Normally when another language is selected, this line will adapt to it, and translate the whole block "Tel: `props.data.company.phone`" to arabic (right to left)
https://github.com/odoo/odoo/blob/5fc1e34d174f7f61d692d086d0ff65fbfc72b013/addons/point_of_sale/static/src/app/screens/receipt_screen/receipt/receipt_header/receipt_header.xml#L12
# Fix:
We need to specify the direction of the phone number to be Left to right.
```
<div>Tel:<span dir="ltr"><t t-esc="props.data.company.phone" /></span></div>
```
**Result:**
<img width="167" height="86" alt="HATEF" src="https://github.com/user-attachments/assets/4fe0bdd0-fe77-430f-9136-cd7086c4d5d9" />
There is also alternative fixes:
# First alternative fix:
Replace the '+' with '00' (there is no difference when trying to copy), and make a function in js that preserve the whole thing in a string variable.
```
get phoneText() {
return _t("Tel:") + " " + this.props.data.company.phone.replace("+", "00");
}
```
**Result:**
<img width="215" height="148" alt="hatef2" src="https://github.com/user-attachments/assets/e9cb4415-baad-4d66-a04b-ecdb308e3e72" />
**Drawback:**
- The inconsistency between how the number is stored and how we view it.
# Second alternative fix:
**File:** `/home/odoo/codebase/odoo/addons/point_of_sale/static/src/app/screens/receipt_screen/receipt/receipt_header/receipt_header.js`
```diff
import { _t } from "@web/core/l10n/translation";
import { Component } from "@odoo/owl";
+ import { localization } from "@web/core/l10n/localization";
```
```diff
+ get direction() {
+ return localization.direction;
+ }
```
**File:** `/home/odoo/codebase/odoo/addons/point_of_sale/static/src/app/screens/receipt_screen/receipt/receipt_header/receipt_header.xml`
```diff
<t t-if="props.data.company.phone">
- <div>Tel:<t t-esc="props.data.company.phone" /></div>
+ <t t-if="direction == 'ltr'">
+ <div>Tel:<t t-esc="props.data.company.phone" /></div>
+ </t>
+ <t t-elif="direction == 'rtl'">
+ <div><t t-esc="props.data.company.phone" />Tel:</div>
</t>
</t>
```
**Drawback:**
- Too much code for a small issue that probably won't bother the client.
- The need to change in multiple translation files for all RTL languages in odoo.
- Readability
opw-5881503
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update fixes a restriction in the Italian tax processing (l10n_it_edi_doi) module, allowing multiple tax lines to be added to invoices, including those with 0% taxes like Enasarco and RIT. This change aligns with Italian tax regulations that permit combining Dichiarazione d'intento with other tax withholdings on the same invoice.
Original PR description
We should be able to add more taxes with the 0% on the same line, like the Enasarco and 23% RIT. Indeed in italy it is possible to have invoices with Dichiarazione d'intento togheter with a withholding and Enasarco taxes. See also: odoo/odoo#236251 Ticket [link](https://www.odoo.com/odoo/project.task/5933699) opw-5933699 Forward-Port-Of: odoo/odoo#248586
This update resolves a minor technical issue that was preventing the correct processing of account EDI invoices, specifically related to handling country codes. The change ensures the system correctly identifies supported countries, improving the reliability of invoice generation and transmission. This fix was made as part of our ongoing commitment to stability and accuracy.
Original PR description
`('FR, DE')` was a single string instead of a tuple, causing a TypeError when `country_code` is not a string (e.g. falsy value on empty recordset). Changed to `('FR', 'DE')` so membership test is used instead of substring search.
opw-6004910
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update fixes an issue where miscellaneous journal entries weren't appearing in the printed follow-up reports, even when marked for inclusion. Now, all relevant information from these entries, including the entry itself, is accurately reflected in the reports sent to partners. This ensures partners receive a complete overview of overdue receivables.
Original PR description
…port Currently, even if users mark a miscellaneous entry to be included in the follow-up report, only its amount is counted in the total overdue; the entry itself is excluded from the printed report sent to the partner. Steps to reproduce: - Have a journal item with partner, receivable account and due date in the past - Open followup report for the partner, uncheck 'No followup' for the aml - Go back to the partner, in the followup section, hit 'Send' and send the manual followup (or wait/trigger the scheduled action) Issue: Printed followup report is missing any info on the misc entry opw-5405657
This update resolves an issue where self-order prices weren't accurately calculated when taxes and fiscal position mappings were involved. The fix ensures prices are correctly recomputed using accounting methods, leading to more accurate order totals and improved financial reporting. This impacts self-service ordering functionality.
Original PR description
Before this commit, the price of order lines from self was recomputed in the backend but for orders with price included taxes and a fiscal position mapping, the recomputation was not correct. This commit fixes the issue by recomputing the prices using compute_all method from accounting on taxes after fiscal position. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where vendor bills with foreign VAT companies were not correctly identifying the country of origin for VAT reporting. The fix ensures accurate JPK country code reporting for both invoices going out and vendor bills coming in, aligning with Polish tax regulations. This improves the accuracy of financial reporting.
Original PR description
PR #81359 fixed the country code for foreign VAT companies by adding the country code to the start. However, this was only fixed for invoices going out, not vendor bills coming in. [opw-5917264](https://www.odoo.com/odoo/project.task/5917264) Forward-Port-Of: odoo/enterprise#109080
3 changes
Resolved issues and error corrections
This update fixes a bug where settings weren't appearing in the search results when accessed from different app tabs. The change ensures all settings are searchable regardless of the currently selected tab, improving the user experience and search accuracy.
Original PR description
**Problem:** Searching for text that only exists in a setting's sub-field content (e.g., "qr" matching "Add QR-code link on PDF") fails to find the setting when searching from a different app tab in…
**Problem:** Searching for text that only exists in a setting's sub-field content (e.g., "qr" matching "Add QR-code link on PDF") fails to find the setting when searching from a different app tab in General Settings. The same search works when already on the correct app tab. **Steps to reproduce:** 1. Open Settings (General tab is selected) 2. Search for "qr" 3. "Invoice Online Payment" setting is not found 4. Navigate to Accounting settings tab 5. Search for "qr" again 6. Now the setting appears **Current behavior:** Settings from non-selected apps are not found when the search term only matches sub-field content (text inside the setting body). **Expected behavior:** Search should find settings across all apps regardless of which tab is currently selected. **Cause of the issue:** SearchableSetting collects search labels in two phases: the setting's own label and help text during setup(), and sub-field text from span[searchableText] DOM elements during onMounted(). However, visible() is evaluated during render via t-if, which runs before onMounted. When an app first renders due to a search (it was previously unrendered because its tab wasn't selected), visible() only has the incomplete label set and returns false, preventing the setting div from rendering. This creates a chicken-and-egg problem: the DOM needed for label collection never exists because visibility check fails without those labels. **Fix:** A reactive labelsReady flag defers visibility filtering until onMounted has had a chance to collect all DOM-based labels. On the initial render, visible() returns true unconditionally so the DOM exists for label collection. The state change then triggers a proper re-render with the complete label set. opw-5946625
This update automatically groups vendor bills during UBL/CII import based on the vendor's previous billing patterns. The system now checks the last posted bill to determine if lines should be grouped by tax, streamlining the import process and reducing manual effort. Additionally, this fix includes improvements for sale moves and PDF generation.
Original PR description
[FIX] account_edi_ubl_cii: automate bill line grouping
This commit automates vendor bill line grouping during import based on the vendor's most recent posted bill.
- Logic: Added `_has_lines_grouped()` to `account.move` to detect if lines follow the grouping pattern.
- Heuristic: During UBL/CII import, the system now checks the last posted bill from the same vendor; if it was grouped, the new bill is automatically grouped by tax.
task-5979667This update resolves a problem where the system was incorrectly returning multiple bank accounts for companies with shared account numbers, particularly when dealing with child contacts. The fix ensures that only one bank account is created, streamlining bank management and preventing data inconsistencies.
Original PR description
The function `_find_or_create_bank_account` is expected to return one or no record at all. In the case of child contacts, it is possible that the same account number was set on multiple records, leading the function to return multiple banks.