Friday, December 19, 2025
22 changes · saas-18.3
Resolved issues and error corrections
This update simplifies the TDS warning displayed in the vendor payment process. It now automatically alerts users if a vendor’s PAN (tax identification number) is missing, ensuring compliance with Indian tax regulations. This change focuses solely on prompting users to collect vendor PAN information, rather than relying on TDS rate checks.
Original PR description
Simplified the condition to show warning whenever the partner’s PAN is missing in the TDS entry wizard, instead of checking for lower TDS rate. The warning’s purpose is only to alert users to collect PAN from vendors, so rate based check was removed. task-5245353 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#240471 Forward-Port-Of: odoo/odoo#235436
This update fixes an issue where Chilean invoices generated as PDFs incorrectly displayed unit prices with decimal points. The change ensures that unit prices in Chilean invoices match local regulations by removing unnecessary decimal formatting, improving invoice accuracy and compliance.
Original PR description
**Steps to reproduce:** * Install the *l10n_cl* module with demo data. * Switch the environment to the **CL** company. * Create a customer invoice containing at least one invoice line. Enter a…
**Steps to reproduce:** * Install the *l10n_cl* module with demo data. * Switch the environment to the **CL** company. * Create a customer invoice containing at least one invoice line. Enter a **price_unit with decimals** (e.g., *99.56*). * Confirm the invoice. * Download and open the generated PDF from the invoice form. **Observed behavior:** * The **unit price** rendered in the PDF is displayed as a rounded decimal value (e.g., *100.00*), even though *Chilean* localization does **not** use decimal representation for unit prices. **Cause:** * The QWeb template uses `t-options` to format float values with **two-decimal precision**, forcing decimals to appear in the PDF. **Fix:** * Reduce the formatting precision in the PDF template so that **no decimal points** are displayed, matching Chilean localization rules. **Before Fix** <img width="783" height="319" alt="image" src="https://github.com/user-attachments/assets/e5ea5a38-a77a-4d64-9aae-672940734ea4" /> **After Fix** <img width="794" height="316" alt="image" src="https://github.com/user-attachments/assets/c47d2f0a-b4ea-428e-bf57-23584c34bf5c" /> --- opw-5234563 Forward-Port-Of: odoo/odoo#238059
This update resolves a problem during the migration process where tax groups weren't being created correctly. Specifically, the migration script now proactively creates necessary tax groups if they don't already exist, preventing errors and ensuring accurate tax calculations. This was caused by a previous system change that altered how tax groups were managed.
Original PR description
Before this commit: migration script only creates a new tax group. After this commit: migration script will create all tax groups that are required for new taxes if they do not already exist Why:…
Before this commit:
migration script only creates a new tax group.
After this commit:
migration script will create all tax groups that are required for new taxes if they do not already exist
Why:
During the migration if the tax group is not found then the value error is raised
There are 2 reason of why the tax group is not found :
1. User deletes it by themselves
2. In the upgrade script of account in version saas~16.2.1.2 the pre-migrate script where global scope of tax groups was converted to company-specific, [Ref](https://github.com/odoo/upgrade/blob/b4f278aa9f32dc5edab814af0c2a0339cd7400a6/migrations/account/saas~16.2.1.2/pre-migrate.py#L173) If the tax groups are not associated with any tax or any account_move_line then it is deleted.
User Traceback :
` File "/home/odoo/src/odoo/17.0/odoo/addons/base/models/ir_model.py", line 2203, in _xmlid_lookup
raise ValueError('External ID not found in the system: %s' % xmlid)
ValueError: External ID not found in the system: account.1_l10n_id_tax_group_non_luxury_goods`
account_tax_group records in production :
```
kdes_3444743=> select id,name from account_tax_group;
id | name
----+---------------------------------------------------------------
1 | {"en_US": "Taxes", "id_ID": "Pajak"}
2 | {"en_US": "Luxury Good Taxes", "id_ID": "Pajak Barang Mewah"}
3 | {"en_US": "Non-luxury Good Taxes", "id_ID": "Pajak Barang"}
4 | {"en_US": "Zero-rated Taxes", "id_ID": "Pajak Nol"}
5 | {"en_US": "Tax Exempted", "id_ID": "Bebas Pajak"}
(5 rows)
```
Query executed [here](https://github.com/odoo/upgrade/blob/b4f278aa9f32dc5edab814af0c2a0339cd7400a6/migrations/account/saas~16.2.1.2/pre-migrate.py#L152) :
```
WITH company AS (
SELECT "company_id" AS id,
"tax_group_id" AS tg_id
FROM "account_move_line"
WHERE "company_id" IS NOT NULL
AND "tax_group_id" IS NOT NULL
UNION
SELECT "company_id" AS id,
"tax_group_id" AS tg_id
FROM "account_tax"
WHERE "company_id" IS NOT NULL
AND "tax_group_id" IS NOT NULL
)
INSERT INTO account_tax_group ("country_id", "create_date", "create_uid", "name", "preceding_subtotal", "sequence", "write_date", "write_uid", company_id, _tmp_orig_id)
SELECT "tg"."country_id", "tg"."create_date", "tg"."create_uid", "tg"."name", "tg"."preceding_subtotal", "tg"."sequence", "tg"."write_date", "tg"."write_uid", company.id, tg.id
FROM account_tax_group tg,
company
WHERE company.tg_id = tg.id
```
Above selection query on user's DB :
```
kdes_3444743=> SELECT "company_id" AS id,
"tax_group_id" AS tg_id
FROM "account_move_line"
WHERE "company_id" IS NOT NULL
AND "tax_group_id" IS NOT NULL
UNION
SELECT "company_id" AS id,
"tax_group_id" AS tg_id
FROM "account_tax"
WHERE "company_id" IS NOT NULL
AND "tax_group_id" IS NOT NULL;
id | tg_id
----+-------
1 | 1
1 | 2
(2 rows)
```
As only 2 tax groups are associated with the account_move_line and account_tax
They are only being inserted to the able along with the company id prefix and company_id field set
, remaining enteries are deleted in [next query](https://github.com/odoo/upgrade/blob/b4f278aa9f32dc5edab814af0c2a0339cd7400a6/migrations/account/saas~16.2.1.2/pre-migrate.py#L173).
Same is the case with the records in [ir_model_data](https://github.com/odoo/upgrade/blob/b4f278aa9f32dc5edab814af0c2a0339cd7400a6/migrations/account/saas~16.2.1.2/pre-migrate.py#L174-L196).
OPW : 5358546
UPG : 3444743
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#238981This update fixes an issue where the number of reconciliation entries displayed on the dashboard was incorrect. The system was filtering out draft journal entries, which could be reconciled. Now, all entries, including draft ones, are accurately counted, ensuring users see the correct number of reconciliations available.
Original PR description
Steps to reproduce: - go to daschboard > N to reconcile - validate the first entry - back to dashboard you will N-1 to reconcile - Reset to to draft the journal entry associated with the reconciliation - Reset the bank reconciliation Issue Back to the dashboard you will see N-1 to reconcile but when clicking on it you will have 8 entries to reconcile Cause: We filter out non posted entries. In Odoo, draft entrie can be reconciled. opw-5102016 Forward-Port-Of: odoo/odoo#229267
This update resolves an issue where users' presence status wasn't reliably updated after returning from inactivity. The fix ensures that the status service consistently sends updates, regardless of whether the user was previously inactive, improving the accuracy of user presence information within Odoo.
Original PR description
Before this commit, the user's presence might not be updated after returning from inactivity. This occurs because the status service only sends an update if the user was away during the previous update. However, this condition doesn't account for cases where the update was never sent. Forward-Port-Of: odoo/odoo#239458 Forward-Port-Of: odoo/odoo#239202
This update resolves a technical problem that could cause errors when opening invoices with multiple active CAF (Contribution Authority File) documents. The fix ensures the system correctly identifies and uses the CAF with the lowest starting number, allowing for proper document processing and preventing database errors. This improves stability and reliability for invoice handling.
Original PR description
In #92208 the CAF system was improved to find the next starting value in the right sequence if there are multiple in the system. If no CAFs are found, it will reset to the document types starting…
In #92208 the CAF system was improved to find the next starting value in the right sequence if there are multiple in the system. If no CAFs are found, it will reset to the document types starting number. This worked except in the case where there are multiple CAFs that are currently marked active in a document type. As it tries to access `caf.start_nb` it hits an ensure_one() which throws a traceback whenever you open most account.moves on the DB. Steps to reproduce: - Modify the CAF for Doc Type 33 (Electronic Invoices) to have a smaller range than 1 - 999,999 (1 - 5) - Create Two new CAF files also for Doc Type 33 that start after this value (6 - 10 and 11 - 15 for example). - Mark the original to be spent via cancelling it and try to open an invoice. It will find both of the new CAFs and try to get the start_nb of the recordset. In discussion with the PO, when we have multiple CAFs, we should pick by the lowest start number as it will allow for any gaps that might exist be filled. opw-5414350 Forward-Port-Of: odoo/enterprise#102385
YouTube recently changed its security settings, causing some of our website videos to fail to load. This update corrects a configuration issue by directly setting the required referrer policy for YouTube embeds, ensuring videos play correctly for our users. This resolves a blocking error and maintains a smooth user experience.
Original PR description
Issue: YouTube has changed its referrer policy to enforce "strict-origin-when-cross-origin". Without this, it can throw a 153 error and block the video. To replicate in runbot ,add "<meta…
Issue: YouTube has changed its referrer policy to enforce "strict-origin-when-cross-origin". Without this, it can throw a 153 error and block the video. To replicate in runbot ,add "<meta name="referrer" content="no-referrer"/>" to any major page like the main layout or footer. This sets it for the entire page. Therefore, to enforce YouTube's calls to have the proper referrerpolicy, I hardcoded it directly. Fix: added 'referrerpolicy="strict-origin-when-cross-origin"' to the iframe. opw-5239363 Description of the issue/feature this PR addresses: Our website allows for customization, including the ability to modify meta tags. In ticket#523963, the customer added "<meta name="referrer" content="no-referrer" />" which forced all calls to be set with referrerpolicy="no-referrer" when it's required to have 'referrerpolicy="strict-origin-when-cross-origin"' for embeded videos to youtube Current behavior before PR: If a customer sets "<meta name="referrer" content="no-referrer" />" on any page, YouTube blocks it on that page; if it's in the header or footer, the entire website is then blocked. Desired behavior after PR is merged: After it now enforces the call to have 'referrerpolicy="strict-origin-when-cross-origin"' even if the tag <meta name="referrer" content="no-referrer" />". Allowing YouTube to be used. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#237182
This update resolves an issue where custom embedded actions weren't consistently displayed across projects. The fix ensures that actions are correctly loaded and available, regardless of project switching or page refreshes, improving the user experience. It addresses a bug related to how the system tracks and loads embedded actions.
Original PR description
Since this change: https://github.com/odoo/odoo/pull/185674/commits/b663a6e3dbda6eda84e4a6b051acfc8511476cd3#diff-552aefb62246b1f4fe6a2607ec8f0a01773e53de2d68293266b38bc99c5cb56dR503 It introduces…
Since this change: https://github.com/odoo/odoo/pull/185674/commits/b663a6e3dbda6eda84e4a6b051acfc8511476cd3#diff-552aefb62246b1f4fe6a2607ec8f0a01773e53de2d68293266b38bc99c5cb56dR503 It introduces two bugs:
- Create a project A and project B, activate the top bar in both projects
- Create a new custom embedded action in project A
- Switch to project B (by changing the URL), the custom action of project A is present in project B
- In a project, create a new custom embedded action, refresh the page, the action is not visible nor available in the top bar.
It enters the if condition, and get the "lastAction", which may not contain the same "embedded_action_ids" than the current action (targeting another project or the same project if we just refreshed the page). It enters the condition because the path of the action is the same ("tasks") and no "active_id" is specified in the context of the action.
We then force the load of the action if the "lastAction" stored in the browser session had embedded actions, to be sure to get the latest embedded actions linked to the current action in case of any, and not keep the ones linked to "lastAction".
task-5269261
Forward-Port-Of: odoo/odoo#237695This update fixes a potential issue where printing from the Odoo system could fail on Windows. By adding a simple error catch, the system now handles printing errors more gracefully, preventing disruptions for users. This ensures a more stable and reliable printing experience.
Original PR description
This commit adds the try/except block around print_raw method of the virtual iot box to allow catching exceptions when printing on Windows Forward-Port-Of: odoo/odoo#238633
This update ensures that all CFEs (tax documents) are now processed when an Uruguayan XML file is uploaded to a purchase journal. Previously, only the first CFE was handled, leading to potential data discrepancies. This enhancement improves the accuracy of vendor bill synchronization for our Uruguay clients.
Original PR description
When an uruguayan xml file is uploaded on a purchase journal it could contain the information of more than one CFE but before this commit only the first CFE was processed. Now all the CFEs are processed. Take in consideration this comment https://github.com/odoo/enterprise/pull/86829#discussion_r2490754143 Task Adhoc side: 60187 Task latam side: 1371 Forward-Port-Of: odoo/enterprise#99334
This update fixes an issue where downpayment lines weren't correctly categorized in financial reports. The system now consistently assigns a standard classification code ('022') to downpayment lines, ensuring accurate reporting and compliance. This change improves the reliability of financial data for our MyEDi customers.
Original PR description
Ensure downpayment lines are assigned a fixed classification code ("022"), while other lines retain their product-based classification.
Task-5356913
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#240346
Forward-Port-Of: odoo/odoo#239831This update fixes a bug in the HTML editor that prevented it from correctly identifying certain QWeb nodes when they were hidden using the 'display: none' style. The change ensures consistent parsing behavior, regardless of an element's visibility, resolving a potential parsing error.
Original PR description
Problem: When nodes have `display: none` (for example a QWeb `t-else` node with a false condition), `isBlock` incorrectly fails when checking them. Solution: If a node has `display: none`, fall back to checking its `tagName` against `blockTagNames`. This ensures consistent behavior regardless of the node visibility. Steps to reproduce: - Open “Appointment: Attendee Invitation”. - Add a list item to the list in the content. - Save. - A QWeb parsing error occurs. opw-5268806 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#239482
This update adds a new test helper within the Odoo spreadsheet module. This enhancement simplifies the process of adding rows during testing, ensuring more robust and reliable test coverage for spreadsheet functionality. This change improves the overall quality and stability of the spreadsheet feature.
Original PR description
This commit adds a test helper to add a row. See enterprise PR Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#238293
This update resolves a bug where field syncs would disappear after inserting a new row in a Quote calculator spreadsheet. The fix ensures that field syncs are correctly maintained when rows are added, preventing data inconsistencies. This improves the reliability of spreadsheet-based sales calculations.
Original PR description
Steps to reproduce: - create a Quote calculator spreadsheet - add a field sync on A1 - autofill it down on a few cells - select row B - right click and "Insert row above" => some field syncs disapeared Forward-Port-Of: odoo/enterprise#101241 Forward-Port-Of: odoo/enterprise#101066
This update fixes a bug where forum post images set to specific sizes (50% or 25%) weren't being saved correctly. The system was stripping out inline styles, preventing the desired image size from being applied. This change ensures forum images are saved and displayed at the intended size.
Original PR description
Problem: When creating a new forum post with an image set to "50%" or "25%" size, the post is saved with the original image size instead of the selected one. Cause: The `Post.content` field has `strip_style=True`, which removes any inline `style` attributes before saving. Since image size ratios were applied using `style="width: 50%"`, the width information was lost. Solution: Disable image size options that depend on inline `style` attributes, as they cannot be preserved when saving forum posts. Steps to reproduce: 1. Go to Forum. 2. Create a new post. 3. Add an image and set its size to 50% or 25%. 4. Save the post — the image appears with its original size. opw-5173917 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#240442 Forward-Port-Of: odoo/odoo#234354
This update fixes an issue where restaurant employees were always redirected to the floor page after logging in, regardless of their configured default page (products or floor). The fix ensures that users are consistently directed to the products page, the intended home screen for restaurant POS operations, after login.
Original PR description
Steps to reproduce ------------------ 1. For a restaurant, set the default page as "register", i.e. the products page 2. Enable 3. Now login with an employee, and notice that the page after the login page is the floor page, not the products page as set in the configuration of (step 1). Why the issue ------------- After successfully logging in, we were redirecting the user either to the products page, always if it's not a restaurant, or to the floor page, always if it's a restaurant. That means we were not taking into consideration, for the restauarnt case, whether the default page is the floor page or the products page. The fix ------- Now we redirect users after logging using the `defaultPage` getter, which takes into consideration the `default_page` cofiguration for a restaurant PoS. opw-5359514 Forward-Port-Of: odoo/odoo#237784
This update fixes an issue where deferred accounting for misc entries wasn't correctly handling different account types. The change now analyzes the individual line's account type to determine the appropriate deferred account, ensuring more accurate financial reporting. This improves the reliability of deferred accounting processes.
Original PR description
The commit 42f823d6b8aa3d1cd171ae1603549ee95fc9d0f0 allows to use deferred on misc entries. However, there are many places in the code that were not updated. Usually they were in the form of `if move_type is sale, then deferred_type = income, else expense`. However we cannot rely on the move_type anymore for misc entries, because it will always take the `else` branch of the condition. Instead, if we have a misc entry, we should rely on the account type of the line that is being deferred, so we have more granularity. For this, we now compute the deferral account/journal for each line, and not per move. The logic inside the computation remains the same. Steps to reproduce: 1. Create a misc entry with two deferred lines (one expense, one revenue) 2. Post it 3. Check the generated deferrals, they all use the same deferred account and journal even though we have different account types opw-5194305
This update corrects a minor issue in how Odoo generates sequence dates, specifically related to ISO week numbering. The fix ensures that sequence dates consistently match the format used in comparison strings, preventing test failures and maintaining data accuracy. This improves the reliability of date-based processes within the system.
Original PR description
Versions -------- - saas-18.3+ Steps ----- 1. Run `test_ir_sequence_iso_directives` in January or February. Issue ----- Test fails due to the sequence generated having a leading zero on the ISO week number, whereas the comparison string doesn't. Cause ----- We get the week number from the comparison string from the `isocalendar` method as a simple `int`, hence we it doesn't automatically get formatted with a leading zero. Solution -------- In the comparison string, ensure the `isoy` and `isoweek` parts are always formatted with 2 width, adding a leading zero when needed. runbot-234592
This fix resolves a bug where internal transfer packing was incorrectly associating multiple lines with the wrong picking. The update ensures that each batch packing action creates a single line per picking, accurately reflecting the quantity of product moved. This prevents incorrect backorders and ensures accurate inventory tracking.
Original PR description
**Steps to reproduce:** - enable "packages" and "batch transfers" settings - open wharehouse management/operation type - select internal transfer - check "automatic batch" and group by "contact" -…
**Steps to reproduce:** - enable "packages" and "batch transfers" settings - open wharehouse management/operation type - select internal transfer - check "automatic batch" and group by "contact" - create two storable product with an on hand quantity of 10 - create a an internal transfer for the first product for a qty of 10 - mark it as to do - do the same for the second product and make sure that it's the same contact - open barcode and select batches - select the last batch created - scan WH-STOCK - enter and confirm a quantity of 4 for each line - click on put in pack (at this step we can already see that the two new lines created are associated wit the second picking, even though it should be one line per picking) - click on the +6 on each line and click on put in pack - validate **Current behavior:** - a back order has been created for the first picking - the first internal transfer has only delivered 4 units of the first product - the second internal transfer has delivered 10 of the second product and 5 of the first product **Expected behavior:** both pickings should have delivered 10 of their product **Cause of the issue:** The lines created when clicking on "put in pack" for the first time are both associated with the second picking because the line split: https://github.com/odoo/enterprise/blob/898e3e47cfe3b86230da2b146960983d7ad144d0/stock_barcode/static/src/models/barcode_picking_model.js#L514 and the picking_id of the new line is set to the values provided by the `_getNewLineDefaultValues` as the picking_id of the last selected `line`: https://github.com/odoo/enterprise/blob/24b4e49dbe16cb8bd40170abfc089dd64c3f34dd/stock_barcode_picking_batch/static/src/models/barcode_picking_batch_model.js#L280-L281 rather than from the values of the initial line it is split from. opw-4952964 Forward-Port-Of: odoo/enterprise#92891 Forward-Port-Of: odoo/enterprise#91378
This update resolves an issue where public holidays weren't being correctly identified in Odoo's scheduling calculations, particularly when working schedules lacked a company association. This prevented accurate leave management and scheduling, especially within organizations using multiple companies. The fix ensures holidays are recognized as working days when calculating leave requests.
Original PR description
This PR https://github.com/odoo/odoo/pull/236043 adds a constraint when calculating the public holidays that check for the company of the working schedule, while in some flows the working schedule has no company_id assigned. This will lead to some errors, as it won't recognize the day as a public holiday. As an example, the public holiday will be counted as a working day when taking leaves that include that day. opw-5401425 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#240554
This update enhances how other Odoo modules can customize activity actions, allowing them to inject specific behaviors like loading custom views or actions. By separating the action execution step, developers can now easily extend the system without duplicating existing logic, leading to a more flexible and adaptable Odoo environment.
Original PR description
The `openActivityGroup` method in `ActivityMenu` currently handles both the preparation of filters (domains, contexts) and the actual execution of the action. This coupling prevents other modules from intercepting the action execution to inject specific behaviors—such as loading a specific server-side action or specialized views—without completely overriding the method and duplicating the filter logic. This commit extracts the final execution step into a new method `executeActivityAction`. This allows extending modules (e.g., `documents`) to customize the action load (e.g., to ensure specific JavaScript hooks are initialized) while relying on the base implementation for domain and context generation. Task-5187045 Forward-Port-Of: odoo/odoo#240110 Forward-Port-Of: odoo/odoo#238377
This update resolves an issue where document previews weren't loading properly when accessed through the 'Activities' icon. The fix ensures the correct custom document view is loaded, allowing all features to function as expected regardless of the navigation source. This improves the user experience for accessing and viewing documents.
Original PR description
When navigating to documents from the 'Activities' systray icon, the system would load an action that correctly filtered for "My Activities" but lacked the specific view definitions of the main Documents app. This caused the 'List' view-switcher to load the default list view instead of the custom one, breaking features like document preview that depend on the custom view's JavaScript. This patch fixes the issue by ensuring that the correct, custom view definitions from the main Documents app are loaded. This guarantees that the custom list view and all its features work correctly, regardless of how the user navigates to it. This ensures the correct custom list view is loaded while preserving the "My Activities" filter. Task-5187045 Forward-Port-Of: odoo/enterprise#102171 Forward-Port-Of: odoo/enterprise#98979