Daily updates from Odoo
Navigate
Branch
Friday, December 19, 2025
188 changes
16 changes
Enhancements to existing features
This update ensures IoT boxes automatically align with the latest database version, improving data consistency and reliability. The system checks the database nightly and triggers a restart of the IoT boxes to apply the necessary code changes. This prevents discrepancies between the database and the IoT box’s code.
Original PR description
This PR adds the code which checks every midnight to see if the version of the database has changed. If so, it will update the iot box's code to align it to the database version Note: 1) the existing iot boxes will need to restart to get this cron job 2) Outside of database upgrade the code won't be upgraded with the cron Forward-Port-Of: odoo/odoo#240308 Forward-Port-Of: odoo/odoo#239049
Resolved issues and error corrections
This update fixes an issue where contacts without names or email addresses in Odoo's chatter interface were displaying as 'Unnamed'. Now, when a contact lacks this information, the system will automatically show their display name instead, providing a more user-friendly experience. This ensures all recipients are clearly identified within conversations.
Original PR description
Steps to reproduce =============== 1. Create a contact of type invoice address without name and email. 2. Go to any app with chatter. 3. Add this user to the recipient ----> Only the blue tick will be visible (recipient name will be empty) After this commit, we will use the display_name as a fallback to show in the chatter. Forward-Port-Of: odoo/odoo#229832 Forward-Port-Of: odoo/odoo#213545
This update simplifies the TDS (Tax Deducted at Source) warning system. Now, the system alerts users to collect a vendor's PAN (Permanent Account Number) whenever it's missing, rather than based on the TDS rate. This ensures users are consistently prompted to gather the necessary information for compliance.
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 align with Chilean localization rules by removing decimal formatting, resulting in a more accurate and professional invoice presentation.
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 a required tax group wasn't being created, leading to errors. The migration script now automatically creates all necessary tax groups if they don't already exist, ensuring proper tax setup after upgrades. This prevents errors related to missing tax groups.
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 ensures that user presence status is consistently updated after periods of inactivity. Previously, updates were missed if the user hadn't been away during the last status check. This improvement guarantees accurate user presence information for all users.
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 processing invoices with multiple CAF (Contribution Authority File) documents. The fix ensures the system correctly identifies and uses the lowest starting number for CAFs, preventing database errors and ensuring accurate invoice processing. This improves stability and reliability for users.
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
This update fixes an issue where the out-of-stock message on product pages was appearing as a single, overflowing line. The change ensures line breaks are preserved, allowing the message to wrap correctly and display properly within the product badge, improving the user experience. This resolves a visual inconsistency and enhances the clarity of product availability information.
Original PR description
- Before saas-18.4, the [out-of-stock](https://github.com/odoo/odoo/blob/saas-18.3/addons/website_sale_stock/static/src/xml/website_sale_stock_product_availability.xml#L8) message was rendered as…
- Before saas-18.4, the [out-of-stock](https://github.com/odoo/odoo/blob/saas-18.3/addons/website_sale_stock/static/src/xml/website_sale_stock_product_availability.xml#L8) message was rendered as plain text without any layout-specific classes, allowing the message to wrap naturally. **Reference of version saas-18.3** <img width="1920" height="768" alt="2025-12-16_18-53" src="https://github.com/user-attachments/assets/d7670fa4-6808-40d7-9bad-768d0637f366" /> - From saas-18.4, the [out-of-stock](https://github.com/odoo/odoo/blob/saas-18.4/addons/website_sale_stock/static/src/xml/website_sale_stock_product_availability.xml#L13-L16) message is rendered using `t-out`, which outputs plain text and collapses line breaks, causing the message to appear on a single line and overflow when used with `d-inline-flex`. See screenshots in the PR description (Before fix). <img width="1920" height="672" alt="2025-12-16_14-28" src="https://github.com/user-attachments/assets/927080cd-f2b0-45cd-ae0a-2917699c05f6" /> - Updated the layout to replace `d-inline-flex` with `d-flex` and apply `text-break` on the message container so long and dynamic texts wrap correctly inside the badge. See screenshots in the PR description (After fix). <img width="1918" height="682" alt="2025-12-16_14-31" src="https://github.com/user-attachments/assets/2cafdc61-e494-468a-9d41-08ab3c83b041" /> opw-5274850 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
YouTube recently changed how it handles video embedding, causing some of our website's videos to fail to load. This update corrects a configuration issue to ensure YouTube videos play correctly by enforcing the required security policy. 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 fixes an issue where internal transfers using the barcode scanner wouldn't correctly assign a result package when the package already contained items. The fix ensures that packages with content are now properly recognized as the destination for internal transfers, improving the reliability of the barcode picking process.
Original PR description
Issue ===== When scanning a package as result package, if the package is empty, it works, but if this package already has content, it doesn't work. How to reproduce ================ 1. Enable…
Issue ===== When scanning a package as result package, if the package is empty, it works, but if this package already has content, it doesn't work. How to reproduce ================ 1. Enable "Packages" and "Storage Locations" settings; 2. Create two packages with some content in WH/Stock/Shelf 1; 3. Create an empty package; 4. Create an internal transfer directly from the Barcode app; 5. Scan Shelf 1 barcode and scan first package; 6. Scan the empty package => It's assigned as the result package; 7. Confirm the operation; 8. Create another internal transfer; 9. Scan Shelf 1 barcode and scan second package; 10. Scan the no more empty package => This time, it's not assigned as the result package. Reason ====== A package was assigned as the result package only if one of the following conditions is matched: 1. The scanned package is empty (it's what's happening in 6.); 2. The selected line has no result package yet and the scanned package is in the selected line's destination location. Here, it doesn't work because since we move a package, the barcode line has already a destination package (the same then the source package.) Fix === For the condition 2., adapt the condition to make it works too if the selected line has the same package as the source and result package. [opw-5326234](https://www.odoo.com/odoo/project/49/tasks/5326234) Forward-Port-Of: odoo/enterprise#102051 Forward-Port-Of: odoo/enterprise#101357
This update resolves a ZATCA XML validation error caused by incorrect decimal precision in invoice calculations. The fix ensures that tax amounts are rounded to the required 10 decimal places, preventing validation failures and allowing invoices to successfully pass ZATCA checks. This improves the accuracy of ZATCA reporting.
Original PR description
**Steps to reproduce:** * Install the **Accounting** and **l10n_sa_edi** modules. * Go to `Sales` journal and in ZATCA section click on **Re-Onboard**. * Create Tax with 15% tax with **included…
**Steps to reproduce:** * Install the **Accounting** and **l10n_sa_edi** modules. * Go to `Sales` journal and in ZATCA section click on **Re-Onboard**. * Create Tax with 15% tax with **included price** set as **tax-included**. * Create a customer invoice. * Set **price_unit = 200**, **quantity = 7**, with **15% tax included** and confirm the invoice. * Generate the **ZATCA XML** by clicking **Process Now** in the info banner displayed above the invoice. * Submit the XML to **ZATCA validation**. **Observed behavior:** * ZATCA validation fails with error **BR-KSA-EN16931-11** * The XML uses **PriceAmount (BT-146)** rounded to **2 decimals** (e.g., 173.91). * ZATCA computes: **173.91 × 7 = 1217.37**, but the XML’s **LineExtensionAmount (BT-131)** is **1217.39**, creating a mismatch and triggering validation failure. **Cause:** * In v19, `_add_document_line_price_nodes()` inherited from `account.edi.xml.ubl_20` uses `float_round` with **product_price_dp = 2 decimals** for **PriceAmount**. * This precision is insufficient when ZATCA recalculates totals for tax-included prices, causing rounding discrepancies. **Fix:** * Override `_add_document_line_price_nodes()` in **l10n_sa_edi** to round `gross_price_unit_currency` to **10 decimal places** instead of 2. * Ensures PriceAmount has sufficient precision to satisfy ZATCA validation rules. opw-5346886
This update resolves an issue where German Sale Order reports were missing the 'Position' column and had broken formatting. The fix corrects a calculation error in the report template, ensuring that each sale order line is numbered correctly and the report displays properly.
Original PR description
Before this commit, when printing a Sale Order using the German localization, the "Position" column in the PDF report was empty. Additionally, the table formatting was broken due to this missing data. This issue occurred because the index variable used to calculate the line number in the report template (QWeb) was incorrect. This commit fixes the index logic in the report template. Now, the "Position" column correctly displays sequential numbers (1, 2, etc.), and the table formatting renders correctly. ticket-5225647 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 error that occurred when sending invoices with a Turkish recipient bank. The issue stemmed from incorrect data handling when generating the invoice XML, specifically related to identifying the recipient's country. The fix ensures the system correctly identifies the bank's country, allowing invoices to be successfully generated and sent.
Original PR description
For the `Türkiye` localization, sending an invoice by email with a recipient bank causes an error. Steps to reproduce: 1) Install `accountant` and `l10n_tr_nilvera_einvoice` modules with demo data.…
For the `Türkiye` localization, sending an invoice by email with a recipient bank causes an error. Steps to reproduce: 1) Install `accountant` and `l10n_tr_nilvera_einvoice` modules with demo data. 2) Switch to TR Company. 3) Create a customer with country set to `Türkiye`. 4) Open the TR company contact and on the Accounting page edit an existing bank account, add a new bank (e.g., 'Test-Bank'), and set `Send Money` to `Trusted`. 5) Create an invoice for the customer, confirm it, and send it by email. ref video: https://drive.google.com/file/d/1OoUzJ-Dr2uuy4yk9P-CKUS0L6OSgeyJ3/view?usp=sharing Error: KeyError: 'country_id' Root Cause: When sending the invoice, the system generates the invoice XML. In the method `_get_address_node` (see [1]), there is a special case to determine the correct country for `res.bank`. However, when `vals['partner']` is a `res.bank` record, no `model` is provided in `vals`, so it defaults to `res.partner`. The code then attempts to access `partner['country_id']`, which does not exist on `res.bank`, raising the error. FIX: Ensure the `model` is set to `res.bank` when `vals['partner']` is a `res.bank` record, ensuring the correct country value is used. [1]- https://github.com/odoo/odoo/blob/0190bb7faca1dd5ce38dfdacbb8fa446f06d59a3/addons/l10n_tr_nilvera_einvoice/models/account_edi_xml_ubl_tr.py#L165-L181 opw-5103598
This update fixes a potential parsing error in the HTML editor by ensuring it correctly identifies block-level elements, even when they are hidden using `display: none`. Previously, hidden elements could cause parsing failures. This change improves the overall stability and reliability of the HTML editor when dealing with complex QWeb templates.
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 resolves an issue where the Client Nihil field was incorrectly set to 'YES' for Belgian VAT reports, violating regulations regarding year-end nihilization. The PR restores the checkbox option for this setting, ensuring compliance with Belgian tax laws. This prevents incorrect XML export files for VAT returns.
Original PR description
## Issue: When exporting the XML for a VAT return, the client nihil field was incorrectly set to YES According to Belgian regulations, this is only allowed on the last report of the calendar year…
## Issue: When exporting the XML for a VAT return, the client nihil field was incorrectly set to YES According to Belgian regulations, this is only allowed on the last report of the calendar year https://finances.belgium.be/sites/default/files/downloads/165-625-directives-2019.pdf ## Cause: Prior to 18.3, nihil was a checkbox option on export Since 18.3, it is automatically selected based solely on a price formula, without checking the report’s date This PR brings back the Client Nihil checkbox in 19.0 But didn't change the default value Causing the issue to still be present https://github.com/odoo/enterprise/pull/99496 ## Steps to reproduce: - Select the Belgian company - Open the Tax Return and select the VAT Return - Click Returns and enter an opening date in January - Click Review for the first available report - Ignore errors and return to previous page - Click on Submit -> Download XML - Before the fix, ClientListingNihil is set to YES ## Potential remaining issue: The legal document specify that it should also be checked in case of "cessation d’activité" So it may be interesting to consider adding the option back opw-5184056 Forward-Port-Of: odoo/enterprise#98982
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 inline styles, preventing the intended image resizing. This change disables the use of inline styles for image sizing in forum posts, ensuring images are displayed as intended.
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
16 changes
Enhancements to existing features
This update ensures the IoT boxes automatically update their code to match the latest database version, occurring every midnight. This synchronization is triggered by a new cron job and requires a restart of existing IoT boxes to apply the changes. It prevents outdated code on the IoT boxes, improving overall system stability.
Original PR description
This PR adds the code which checks every midnight to see if the version of the database has changed. If so, it will update the iot box's code to align it to the database version Note: 1) the existing iot boxes will need to restart to get this cron job 2) Outside of database upgrade the code won't be upgraded with the cron Forward-Port-Of: odoo/odoo#240308 Forward-Port-Of: odoo/odoo#239049
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
2 changes
Resolved issues and error corrections
This update resolves an issue where multiple lines were being created for a single batch during the 'put in pack' process, leading to incorrect inventory reporting. The fix ensures that each batch creates a single line in the picking, accurately reflecting the delivered quantities. This improves inventory accuracy and reduces potential discrepancies.
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#92530 Forward-Port-Of: odoo/enterprise#91378
This update resolves a bug that occurred when multiple CAF documents were active within a document type, causing errors when opening invoices. The fix prioritizes the CAF with the lowest start number, ensuring gaps in document numbering are correctly filled and preventing system instability. This improves the reliability of invoice processing.
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
42 changes
New functionality added to Odoo
This update adds a dedicated return type for Stamp Taxes within the Turkish localization of Odoo Enterprise. This allows users to accurately file and track Stamp Tax returns, addressing a previous gap in reporting functionality. It aligns with recent changes to support Stamp Taxes.
Original PR description
Before: Stamp Taxes did not exist in the Turkish localization. No return type or reporting structure was available for them. After: Added a dedicated Stamp Tax return type to match the Stamp Taxes introduced in the linked PR. Impact: Enables users to file and track Stamp Tax returns separately and correctly. Related PR-https://github.com/odoo/odoo/pull/236197 TaskId-4953773
This update introduces the ability to automatically send signature requests to pre-defined contacts (users or partners) triggered by server actions. Odoo Studio users can now easily automate signature workflows across Odoo applications, streamlining document approvals. This improves efficiency and integration with automation processes.
Original PR description
Add the option of sending a signature request to pre-defined signers or linked fields to `res.users` or `res.partner` when a server action is ran. Odoobot does the sending of the signature request and the message post on the chatter of the reference record. This is a useful feature for using automations with Odoo Studio across all Odoo applications. task-5187133
This update introduces a new grid view for work entries within the Enterprise module, providing a more visual and detailed representation of employee hours. This allows for better tracking of work time, accounting for absences and incomplete hours, and facilitates payrun generation when payroll is enabled.
Original PR description
*=hr_work_entry_enterprise,hr_payroll,web_grid Added the grid view to the work entries enterprise module, accounting for unavailable days, incomplete hours per day, and allowing for generating payruns if payroll is installed. The column totals are formatted depending on the expected worked days and the total work entries on a given day. Task-5118840
Enhancements to existing features
This update enables users to unpin all types of WhatsApp channels within the Enterprise edition of Odoo. Previously, users could only unpin specific channel types. This change simplifies channel management and improves user flexibility.
Original PR description
Enterprise counter-part. https://github.com/odoo/odoo/pull/232501 task-4606867 task-5408790
This update enhances the Helpdesk module by allowing other Odoo modules to customize the criteria used to define Service Level Agreements (SLAs) for tickets. Previously, this customization was limited, but this change broadens flexibility and improves how SLAs are managed within the Helpdesk system. It aligns with existing practices for related domains.
Original PR description
Allow other modules to modify the _sla_find domain when adding SLAs to helpdesk tickets. This is already the case for extra and false domains, while the main domain is hardcoded up to this commit. Forward-Port-Of: odoo/enterprise#101624 Forward-Port-Of: odoo/enterprise#97501
This pull request enhances the employee view across both public and private settings, making it more uniform and user-friendly. The changes focus on visual consistency, improving the overall employee experience within the HR application. This ensures a more streamlined and professional appearance for employees.
Original PR description
The aim of this PR is to make the employee public and private views look similar task-4778704
This update allows users to now customize the meal type associated with individual product variants when sending data to Urbanpiper. Previously, the meal type was always tied to the product template, limiting flexibility. This enhancement ensures Urbanpiper receives the most accurate product information for each variant, improving order fulfillment.
Original PR description
Before this commit: ==== - Meal type was sent to Urbanpiper for product variant/attribute, but it was the same as product.template. If the user wants to send customized meal type for variants, then there is no mechanism for it. After this commit: ==== - Now the user can customize the meal type at the product variant/attribute level and can send it to Urbanpiper. - Default meal_type of product variants will be the same as product.template task-5114054 Linked PR : https://github.com/odoo/upgrade/pull/8632
This update introduces a new Gantt view for managing maintenance requests, providing a visual overview of equipment and work centers. It simplifies planning by allowing direct creation of requests from equipment and work centers, while also preventing scheduling conflicts and focusing on active maintenance tasks.
Original PR description
Purpose: -------- - It should be easier to visualize maintenance requests than what is possible today. The calendar view is useful but does not provide a comprehensive overview of all equipment or…
Purpose: -------- - It should be easier to visualize maintenance requests than what is possible today. The calendar view is useful but does not provide a comprehensive overview of all equipment or work centers, nor the ability to plan interventions easily. - It should be much easier to perform maintenance directly from an equipment or work center, instead of creating a maintenance request manually. - It should also be easy to quickly visualize which equipment is currently undergoing maintenance and update their status once the maintenance is completed. With this commit: ----------------- - Makes maintenance planning more easier to manage by adding gantt view by equipment/workcenter. - Replaced the `Maintenance Calendar` menu with `Planning by Equipment` and `Planning by Workcenter`, providing a more practical way to plan maintenance requests by resources rather than relying on the calendar view. - Allows creating maintenance requests directly from equipment or work center views, reducing manual effort. - Prevents scheduling conflicts by showing unavailable workcenter intervals due to workorders or non-working hours. - Removes the `Request Date` field from maintenance requests as it is redundant with `Scheduled Date`; `Scheduled Date` more accurately reflects the intended start of the maintenance request, whereas `Request Date` only indicates when the request was created. - The Gantt view defaults to filtering records for the respective workcenter/equipment by `Todo` and `Active`, excluding `Done` and `Archived` maintenance requests, to focus on the remaining active requests. - It also makes other views (e.g., Kanban, List, Pivot, etc.) of Maintenance Requests available alongside the Gantt view under `Planning by Equipment` or `Planning by Workcenter`, with the default grouping by equipment or workcenter respectively. - Improve planning by adding a Plan Popup for unscheduled maintenance requests. It is especially useful when maintenance planners have created requests but are not yet sure when they should be scheduled. - The Plan Popup applies default `Todo` and `Active` filters to prevent accidental planning of cancelled or already repaired requests. original-PR by srap: https://github.com/odoo/enterprise/pull/96510 Community PR : https://github.com/odoo/odoo/pull/237165 Upgrade PR: https://github.com/odoo/upgrade/pull/8938 task-4698325
This update enhances Odoo's website sitemap by ensuring only pages returning a successful 200 status code are included. This aligns with Google's best practices, improving the website's visibility in search results and ensuring accurate indexing. The changes also remove outdated redirect information, streamlining the sitemap.
Original PR description
*= website_helpdesk, website_helpdesk_forum, website_helpdesk_slides This commit improves sitemap generation by ensuring that only pages returning a 200 OK status are included. - Exclude URLs that have a corresponding `website.rewrite` record. - Resolve 301/302 redirects and include only the final target URL. - Remove redirecting routes which previously appeared in the sitemap while their actual destination URLs were missing. - Align sitemap behavior with Google guidelines, which recommend including only canonical URLs returning 200 OK responses. Example: - `[https://www.odoo.com/event/.../register`](https://www.odoo.com/event/.../register%60) (200) will be included. - `[https://www.odoo.com/event/...`](https://www.odoo.com/event/...%60) (301) will no longer appear in sitemap.xml. Community PR: https://github.com/odoo/odoo/pull/209542 task-4655590
This update allows users to directly customize their portal dashboard cards through the website builder. They can now modify card titles, descriptions, images, and visual styles like background color and borders, improving the user experience and allowing for more tailored information displays.
Original PR description
This commit introduces a new model `portal.entry` to manage portal dashboard cards and improves the customization experience from the different options. Users can now edit portal dashboard cards directly from the builder options, including modifying the card title and description, updating image through the media dialog, and customizing visual styling such as background color, border style, border width, and border radius. task-3894113
This pull request updates the views used for managing work entry types and work entry definitions within the HR payroll module. These changes enhance the user experience and improve the organization of related data, streamlining HR processes.
Resolved issues and error corrections
This update disables Intervat functionality within the l10n_be demo company data. This change prevents Intervat from being automatically set during testing with Runbots, ensuring more consistent and reliable demo environments. It's a minor improvement to the demo setup.
Original PR description
This commit set the `l10n_be_intervat_mode` to `disabled` in the l10n_be demo company. The reason why we are doing this it to avoid having intervat set by default on runbots. task-5404719 Forward-Port-Of: odoo/enterprise#101929
This update fixes an issue where rental receipts were incorrectly validated without warnings, even when incomplete. The change ensures that rental receipts are handled correctly, preventing validation errors and allowing for accurate tracking of partial rental returns. This improves the rental process for users.
Original PR description
Steps to reproduce: - Enable Rental pickings - Create a rental for a product, for 4 quantity - Process the delivery - Open the barcode app and open the reception - Scan the product once and validate…
Steps to reproduce: - Enable Rental pickings - Create a rental for a product, for 4 quantity - Process the delivery - Open the barcode app and open the reception - Scan the product once and validate Issue: The receipt is validated without issues nor warning, despite being incomplete. This is due to a bad mix of two changes: - #60801, which always sets the rental receipt as return of the delivery - #48788, which removes the backorder check for returns in barcode For regular returns made in barcode, it makes sense to avoid the backorder check, as from here we're processing a full picking return and we'd have the confirmation pop every time. However, things are different for rental receipts, as despite them being set as returns of the delivery, they're proper receipts that need to handle the partial receipt. To avoid the issue, rather than removing the backorder check whenever there's a return linked to the picking, now also checks that there isn't a rental order linked to the picking. opw-5265874 Forward-Port-Of: odoo/enterprise#101387
This update fixes a recurring issue where users were receiving duplicate order receipts due to delays in communication with the IoT printer. The fix ensures a unique identifier is used for all print requests, preventing the IoT box from processing the same action multiple times and eliminating the 'printing failed' error.
Original PR description
Currently multiple clients report double order receipts printing. This PR fixes the issue where due to slow network connection a request would be sent to the iot box but the iot box didn't reply in time to confirm the action finish. The user would then get an error showing 'printing failed' (due to a timout). If he cliks on retry the iot box would still print the previous receipt and then receive the new "retry" request with now a new action uuid which would also be printed because uuid is different from the 1st request. This PR adds a consistent uuid for both the initial and all the subsequent retry requests so that double actions would never be done by the iot box. Forward-Port-Of: odoo/enterprise#102266
This update resolves an issue impacting Swiss payroll calculations, specifically related to overtime payments (ST-Overtime) and the LPP (Lohn- und Premodifizierungs-Pauschale) tax. The fix ensures accurate and compliant payroll processing for Swiss employees, addressing a previous error.
Original PR description
Forward-Port-Of: odoo/enterprise#102249 Forward-Port-Of: odoo/enterprise#102161
This update fixes a misleading warning message displayed in the eCommerce shop when users try to add subscription products without a defined plan. The change ensures users receive a clear 'no valid combination' warning, improving the shopping experience and preventing confusion. This resolves a usability issue for subscription offerings.
Original PR description
Version: - saas-18.4 Steps to reproduce: - Install website_sale_subscription - Create a subscription product without a plan - Open product on eCommerce Issue: - When viewing a subscription product…
Version: - saas-18.4 Steps to reproduce: - Install website_sale_subscription - Create a subscription product without a plan - Open product on eCommerce Issue: - When viewing a subscription product without a subscription plan in the eCommerce shop, the system incorrectly shows the warning "This subscription is not compatible with the one already in your cart. Please order them separately or empty your cart." - This happens even if the cart is completely empty. - The method _is_add_to_cart_possible doesn’t find any valid combination to add to the cart, and because the product is marked as recurring, it always triggers the wrong message. Solution: - Add a condition to check if current product have any recurring price set if not then it will show the correct warning that 'This product has no valid combination.' Impact: - Users see clear and correct warnings on products without a subscription plan. task-5255749 Forward-Port-Of: odoo/enterprise#102251 Forward-Port-Of: odoo/enterprise#100929
This update corrects a bug where inaccessible folders were incorrectly included in document search results. Previously, searching for folders within a company structure would incorrectly display folders that were not accessible to the user. This fix ensures that only accessible folders are shown, improving data accuracy and user experience. Performance testing confirmed this as the optimal solution.
Original PR description
`user_folder_id` and `folder_id`'s `child_of` were not taking into account that the path could be broken if inaccessible folders are between accessible documents. E.g., the DB structure COMPANY └── Folder A └── Folder B (inaccessible to User A) └── Folder C Would appear to user A as COMPANY └── Folder A SHARED └── Folder C such that "Folder C" should not be found when searching `child_of` "Folder A" or "In Company". Note that more creativity would be necessary to fix this before 19.0 as the stored `folder_id` field could not be `_search`ed. Task-5231269 Forward-Port-Of: odoo/enterprise#99040
This update fixes an issue where a new offer page would reset to a blank state after a refresh. The change ensures that the correct employee context is maintained when refreshing the offer details, providing a consistent and accurate view for users. This improves the user experience and data integrity.
Original PR description
Steps to Reproduce ================== - Go to Employees - Choose an employee with no offers - Click on the "Offers - new" smart button (a form view will open with the correct employee name at the bottom) - Refresh the offer's page without saving (the employee field is emptied and the required Applicant field appears) Issue ================== The generate offer action that is triggered through the smart button returns a one-time action dictionary with the context. But that context is lost when we refresh the offer page as it's not saved anywhere. Fix ================== Replace the action dictionary with an action record for creating a new offer to ensure the context is maintained upon page refresh. Task-ID: 5059490 Forward-Port-Of: odoo/enterprise#102260
This update now automatically includes the XML file generated for Guatemalan e-invoices alongside the PDF when sending invoices to customers. Previously, only the PDF was sent. This change provides customers with both required files in one email, enhancing transparency and convenience.
Original PR description
Purpose: In the Guatemalan localization, when an electronic invoice is created, the email template to the customer already contains the PDF version of the DTE. However, the XML file, generated and…
Purpose: In the Guatemalan localization, when an electronic invoice is created, the email template to the customer already contains the PDF version of the DTE. However, the XML file, generated and sent to the SAT through Infile, is not attached to that email. Even though the SAT and Infile deliver the XML to the customer, it is more convenient and transparent if Odoo includes it directly in the outgoing invoice template email, so the customer receives both files in one place. Before this commit:- - Only PDF version is attached by default in customer email for e-invoices. - Name of edi document is prefixed with `Demo` if company is in demo environment (check parent company's environment in case of child company) (e.g. DEMO_certificate_INV_2025_00001.xml) and prefixed with `SAT` if company is in testing or production environment(e.g. SAT_certificate_INV_2025_00001.xml). After this commit:- - XML version is also attached by default along with PDF in customer email for e-invoices. - Name of edi document is always prefixed with `SAT`. task-5224521 Forward-Port-Of: odoo/enterprise#102322 Forward-Port-Of: odoo/enterprise#98978
A previous access restriction prevented HR Officers from generating offer documents. This fix updates the system to allow Officers to access the necessary data fields, ensuring they can complete this critical step in the hiring process. The change was made to align with recent HR module updates that tightened access controls.
Original PR description
Steps to reproduce: ------------------------- 1. Install Salary Configurator module. 2. Create a new user and assign Officer rights in Employees and Recruitment. 3. Login with that user. 4. Create a…
Steps to reproduce: ------------------------- 1. Install Salary Configurator module. 2. Create a new user and assign Officer rights in Employees and Recruitment. 3. Login with that user. 4. Create a new application and move it to 'Contract proposal' stage. 5. Click on the 'Generate Offer' button. Observation: ------------------------- An Access Error occurs, denying Read access to the `final_yearly_costs` field. Issue: ------------------------- In earlier versions, users had an additional access right that allowed them to access contract fields. After the HR modules were refactored, only HR Administrators and Payroll Users retained access to those fields. As a result users with only Officer rights in HR encountered an access error when generating an offer. Solution: ------------------------- Use `sudo()` to bypass access restrictions for the `final_yearly_costs` field when generating the offer. opw-5243280 Forward-Port-Of: odoo/enterprise#102250 Forward-Port-Of: odoo/enterprise#99478
This update enhances the visual appearance of the stock accounting module by updating company icons and improving the styling of buttons. This change provides a more polished and professional user experience for managing company-specific stock settings within Odoo Enterprise.
Original PR description
Forward-Port-Of: odoo/enterprise#99095
This update corrects a display issue in the Field Service module where task templates were incorrectly shown alongside real tasks. The fix ensures that only actual tasks are listed, improving the clarity and usability of the 'All Tasks' view. This resolves a potential confusion point for users.
Original PR description
Steps to Reproduce
- Navigate to Field Service > All Tasks.
- Observe that task templates are visible with tasks.
Issue
- Task templates are visible in the Field Service > All Tasks view, which is incorrect. Only real tasks should be listed.
Cause
- The domain in the view definition only filtered tasks by `is_fsm = True` and ` project_id != False`, but it did not exclude template tasks and sub-tasks of task templates.
Solution
- Added `('has_template_ancestor', '=', False)` to the domain so that only actual tasks are displayed in the Field Service > All Tasks view.
task-5079337
Forward-Port-Of: odoo/enterprise#102409
Forward-Port-Of: odoo/enterprise#94472This update fixes an issue where duplicated subscription deliveries weren't correctly reflecting delivered quantities. The change ensures that delivery dates are properly used to calculate quantities, leading to more accurate tracking of delivered items. This improves the reliability of subscription order reporting.
Original PR description
The use of date_deadline instead of date in the filter messes up the calculation of delivered quantities when you duplicate a delivery. Task: 4910572 Forward-Port-Of: odoo/enterprise#89550
This update corrects a test failure related to VAT number validation for Thailand. After implementing stricter VAT number checks, a test case failed because the previously used VAT number didn't meet the new format requirements. This ensures the Thailand reports function correctly and accurately.
Original PR description
Following the implementation of proper validation for VAT numbers for Thailand, this now fails as the one set in the test doesn't follow the proper format. Community PR: odoo/odoo#239616 Total credits to @vin-odoo Forward-Port-Of: odoo/enterprise#102404 Forward-Port-Of: odoo/enterprise#101905
This update corrects a bug in the web_studio module that was causing errors when users made minor changes to PDF reports. The fix ensures that insignificant edits don't trigger unnecessary diffs and errors, improving report editing stability. This prevents users from encountering 'Document is empty' errors when saving.
Original PR description
Example of steps: - Install sale_management and web_studio - Try to edit PDF Quote report - add /4 columns somewhere above the table - try to save - Error: Document is empty In this case, for some reason `html_editor` edits the external_report by changing the order of attributes on a node, which causes a diff, but not relevant for studio and won't produce any xpath operations. This commit handles this case by initializing the Studio view to `<data/>`. opw-5351588 Forward-Port-Of: odoo/enterprise#102416
This update resolves an issue where recurring revenue (MRR) calculations were incorrectly converting currency, leading to inaccurate reporting and missing achievement data. The fix ensures accurate currency conversion during reporting, guaranteeing correct revenue recognition and improved financial visibility.
Original PR description
Before this commit, the log amount_signed was converted to the currency of the company of the log before being converted to the currency of the current company. There were issues as sometimes we did not any value in sub_rate_query. The join would fail to find a row and therefore the achievement would not be displayed. Moreover, the conversion rate were not always correct. This commit reuse the logic of the sale_order_log_report. We convert the amount_signed of the log into the currency of the main company and we convert that amount into the currency of the current company. Forward-Port-Of: odoo/enterprise#101813
This update fixes an issue where clicking on activity counters in the systray didn't correctly filter documents. The change ensures users only see documents with relevant pending activities, aligning with standard Odoo behavior. This improves the user experience and accuracy of document views.
Original PR description
Clicking on activity counters (Late, Today, Future) in the systray relies on specific "search_default" keys to filter the target model's view. Previously, these specific activity filters were missing from the document search view or had the wrong name, causing the systray to fail to filter the documents correctly when redirected. This resulted in the user seeing all documents instead of only those with the relevant pending activities. Note: the 'My Activities' filter is set to invisible, to align with standard odoo behaviour. Task-5427921
This update corrects a warning message that appeared when scheduling work entries with start and end dates combined with durations. The change ensures that the system accurately prevents overlapping work entries, maintaining data integrity. This resolves a potential issue with scheduling conflicts.
Original PR description
Problem ---------- This warning message doesn't make sens with the transformation of work entries date_start/stop in date+duration. No overlap is possible. task-5349515 Forward-Port-Of: odoo/enterprise#100163
This update resolves a bug that occurred when multiple CAF ranges were active within a document type, causing errors during invoice processing. The fix ensures the system selects the CAF with the lowest starting number, allowing for proper gap filling and preventing database errors. This improves the reliability of invoice processing for users.
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
This update resolves an issue where the ISO 20022 XML generation consistently used two decimal places for currency amounts, leading to errors for currencies like JPY. The fix dynamically sets the decimal places based on the currency, ensuring accurate data formatting and preventing potential errors.
Original PR description
Issue: Generating the xml file for iso20022 always generates the amount with two decimals which is hard coded and can cause error for currencies without decimals for example JPY. Fix: The fix is to have the currency decimal number dynamically set through the currency decimal places field. task: 5242204 Forward-Port-Of: odoo/enterprise#101368
This update fixes an issue where XML reports were incorrectly including a slash ('/') when there was no comment provided. The change ensures that empty comment sections in XML reports are properly left blank, improving report accuracy and consistency. This resolves a minor formatting problem.
Original PR description
Since 17.0, we added a / when there was no comment in the comment section of the xml. This is wrong and should be left empty. opw-5242381 Forward-Port-Of: odoo/enterprise#102174 Forward-Port-Of: odoo/enterprise#100033
This update resolves an issue where online orders with dynamic attributes wouldn't appear in the POS system if the corresponding product variant wasn't created. Now, the system automatically creates the variant before processing the order, ensuring all online orders are correctly reflected in the POS.
Original PR description
Before this commit: --- - When an order was placed with a dynamic attribute and the corresponding variant was not created in Odoo, the order did not appear in POS. After this commit: --- - When an order is placed with a dynamic attribute and the variant does not exist in Odoo, the variant is first created and then the order is successfully placed in POS. task-5056425
This update automatically assigns team members to new tasks created from project templates, ensuring consistent resource allocation. Previously, the task assignment process was unreliable due to an issue with how task order was handled, now it correctly uses the task template to determine team members.
Original PR description
Before this commit, after having created the project from a project template, a loop is made to scheduled the task and check the roles set on the task template. The problem is looping on `zip(self.task_ids, project.task_ids)` cannot guarrantee the tasks in the both are in the same order than the tasks insertion since `task_ids` will depend on the order of the task model. To be sure, the task template is the one used to create the task in the project duplicated, the process should be done in the copy method of task instead of using `task_ids` of both projects. This commit first moves the logic implemented in action_create_from_template in `project_enterprise` module in the copy method of the task. Then, it improves the logic to assign the available resources to the new task planned based on the users set on the roles set on the task template related. task-5139714
This update ensures that AI server actions within Odoo Enterprise always include a prompt. Previously, missing prompts could lead to unexpected behavior. This change improves the reliability and usability of AI-powered features by preventing empty prompts.
Original PR description
In this commit we add an view contraint so that ai server actions are not allowed to have an empty prompt. We cannot make the field itself required since then all server actions will require it. Related 19.0 PR: https://github.com/odoo/enterprise/pull/102441 Task-5379758
This update prevents HR users from receiving unnecessary reminder emails. Previously, reminders were triggered by time-off requests or public holidays, even if the user didn't need to submit a timesheet. Now, reminders are only sent for active timesheet entries requiring user input, streamlining the process and reducing email clutter.
Original PR description
**Steps to reproduce:** - Install timesheet_grid_holidays - Create a user with no timesheet access - Create a leave and approve it as a manager - Set up employee reminders in timesheet settings - Run the timesheet reminder scheduled action **Issue:** HR users without timesheet app access or who haven’t submitted timesheets in the past 3 months were still receiving reminder emails. **Cause:** When a time-off is approved or a public holiday is recorded, it generates timesheet entries, which causes reminder emails to be sent incorrectly. **Fix:** Filter out time-off and public holiday entries when sending reminders. Now, reminders are only sent for actual timesheets that require user input. task-5085790 Forward-Port-Of: odoo/enterprise#102342 Forward-Port-Of: odoo/enterprise#95450
This update enhances the display of security class names on the transaction form, resolving an issue with inconsistent styling. The change utilizes a new Odoo markup system (odoomark) for more reliable and accurate presentation, improving the user experience and ensuring consistent security information is shown.
Original PR description
This commit refactors the way security classes are displayed on the transaction form view drpodown menu. It uses the new odoomark markup \v instead of hacky css to achieve proper styling to security classes display names. odoomark new markup PR: https://github.com/odoo/odoo/pull/239431 task-5418874
This update ensures that documents are automatically created when bank statements are linked to PDF or image attachments. Previously, attachments linked to bank statements weren't generating documents, but now this process is streamlined for better record-keeping of financial data. This improves the accuracy and completeness of accounting records.
Original PR description
In #99297, we synchronize the pdf attachments of bank statements at the attachment creation only. But when the attachment is linked to a bank statement afterward, no document is created. We improve this here by also creating a document when an attachment is linked to a bank statement. As images can also be "converted" into bank statements, we also synchronize the images linked to bank statement with Documents. Use-case: - install accountant and documents_account - Accounting -> Bank - Upload: a pdf or an image - Fill statement lines - Save Here the attachment is linked to the bank statement afterward (see _check_attachments method) so no document was created. Task-5424742
This update resolves an issue where deleting a shopfloor instruction suggestion caused errors. The fix ensures that adding a new suggestion after a deleted one functions smoothly, preventing a traceback related to quality point relationships. This improves the reliability of the shopfloor instruction suggestion process.
Original PR description
**BUG:** Traceback when **suggesting** deleting a BOM step from the shopfoor. **STEPS TO REPRODUCE:** - Open a shopfloor MO (with PLM installed) -- Add a suggestion step (MO > cog> Update…
**BUG:** Traceback when **suggesting** deleting a BOM step from the shopfoor. **STEPS TO REPRODUCE:** - Open a shopfloor MO (with PLM installed) -- Add a suggestion step (MO > cog> Update instructions > Improvement Suggestion > Add a step). -- Add a second suggestion step after the first one. -- Delete the second suggestion step (MO > cog> Update instructions > Improvement Suggestion > Delete a step). -- Add a third suggest suggestion step after the second one we just suggested deleting. -- > Traceback **ORIGIN:** First, when adding the suggestions: - 2 Quality Check (QC) are created on the **new_bom_id** in `add_quality_check_from_tablet.save()` - 2 Quality Point (QP) are also created in `add_check_in_chain()`, (only in mrp_workorder_plm override) - The 2nd new QC is linked to previous QC in `_insert_in_chain` Secondly, when deleting the 2nd added suggestion (_on the same MO, as suggestions are linked to the new bom_id and wont appear on other MOs until ECO is validated_): - The QP of the second QC is deleted (but the QC itself is not deleted) here: https://github.com/odoo/enterprise/blob/f91b0c8c41f40a71cbea3cd4f5ccc6873af3c004/mrp_workorder_plm/wizard/propose_change.py#L72-L74 Finally, when adding a new suggestion after the one we just suggested deleting, in `_add_check_in_chain`, a traceback happens by trying to access the QP point we deleted in the resequencing part of `_add_check_in_chain` here: https://github.com/odoo/enterprise/blob/eb716c18944ec50c9c8c74a2888ed5f3032a7b08/mrp_workorder_plm/models/mrp_workorder.py#L62-L63 **FIX:** We accept that not all QCs must have QPs `[0]` -> `[:1]` (see note on another approach idea) changing ```diff - point = check.point_id if check.point_id.operation_id == operation else points.filtered(lambda p: p._get_sync_values() == check.point_id._get_sync_values())[0] + point = check.point_id if check.point_id.operation_id == operation else points.filtered(lambda p: p._get_sync_values() == check.point_id._get_sync_values())[:1] ``` **NOTES:** -1 Another fix could have been to delete the QC at the same time as the QP but I did not find any `remove_from_chain` function to safely remove the QC from the chain of QC. Along those lines we could rethink the sequencing / resequencing of QC and QP as the logic seems to differ between both. -2 Added some comments to remove the field and the line setting the `is_deleted` field in master as it was not used anywhere in the code (the color highlighting in the ECO is done with `<list decoration-danger="change_type=='remove'" ...>`) Upgrade PR: https://github.com/odoo/upgrade/pull/9076 ticket #5180122 Forward-Port-Of: odoo/enterprise#101366
This update fixes a technical issue where the AI action feature would generate tracebacks when the prompt field was left blank. The fix skips parsing the prompt when empty, ensuring smoother AI action execution. Additionally, the AI system now anticipates scenarios where it needs information, preventing it from requesting further user input.
Original PR description
Prior to this commit, when the AI action prompt was left empty, we would get a traceback when that AI action was executed. The traceback would occurs because the prompt is an HTML field with the…
Prior to this commit, when the AI action prompt was left empty, we would get a traceback when that AI action was executed. The traceback would occurs because the prompt is an HTML field with the field selector plugin, which means that it requires parsing before it's sent to the LLM. There was no check during parsing whether the field is empty or not and thus a traceback would occur during processing. In this commit we added a check for whether the prompt field is empty or not and if it is, we skip parsing altogether. We still call the LLM but without the final-prompt. The pre-prompt with contextual information is still sent thus the LLM can still perform the action if it's simple enough. Also, if the AI server action prompt is ambiguous and the LLM "feels" like it needs additional input to complete its task, it might respond with an additional query to the user instead of calling one of its available tools. Thus, in this commit, we add an explicit instruction to the AI Server action pre-prompt which should convey to the LLM that it will not be able to get any additional input from the user and it should assume that any important information for performing its task will be hardcoded in its available tools. Task-5379758 Forward-Port-Of: odoo/enterprise#102441
This update corrects an issue in the Belgian payroll calculations (l10n_be_hr_payroll) related to the deferral of leaves and handling version updates during the month. The fix ensures more accurate PFA (Pension Funds Account) computations, improving payroll reliability and compliance. This impacts the accurate calculation of employee benefits.
Original PR description
Fix the PFA computations: - Fix number of leaves to defer to next months - Deal with change of version in middle of the month Forward-Port-Of: odoo/enterprise#102448
Features or functions removed from Odoo
This update removes outdated and unused code from the spreadsheet dashboard documents module. This cleanup improves the stability and maintainability of the system, ensuring efficient operation. The change was triggered by a previous update and doesn't impact current functionality.
Original PR description
These actions are no longer used since 0b4e8185698e263371916d63f26067fafa1628eb
Code cleanup and technical improvements
To align with the removal of IoT Box support in the community version, we've consolidated all related functionality into the Enterprise module. This ensures that future IoT Box integrations and support are handled exclusively within the Enterprise offering, streamlining our product development efforts.
Original PR description
As we decided to remove support for IoT Boxes in community, we have to move all community-IoT logic to Enterprise. This commit moves everything related to IoT from `point_of_sale` to `pos_iot`. Community PR: odoo/odoo#219256 Task: 4394403
7 changes
Resolved issues and error corrections
This update resolves an issue where document previews were not updating correctly after renaming documents. Previously, the preview displayed the old attachment name even after a successful rename. This change ensures that document previews always reflect the latest, correctly renamed document name, improving data consistency and user experience.
Original PR description
BUG 1: --------- **steps to reproduce**: 1. Install documents 2. Open any document 3. Go to Action > Rename 4. Rename the document 5. Preview it and read the name showed there **issue**: When…
BUG 1:
---------
**steps to reproduce**:
1. Install documents
2. Open any document
3. Go to Action > Rename
4. Rename the document
5. Preview it and read the name showed there
**issue**:
When previewing the document, it still shows the old attachment name.
**observation**:
When renaming a document, only the document name was updated. The attachment name remained unchanged, which caused inconsistencies:
1. In the All Records section, the document name is displayed correctly. https://github.com/odoo/enterprise/blob/459e8ddaf6f67a556d35bf00e0fbb68eb1500a94/documents/views/documents_document_views.xml#L130
2. But in the Preview, the old attachment name was still shown, as it is taken from the attachment:
https://github.com/odoo/enterprise/blob/459e8ddaf6f67a556d35bf00e0fbb68eb1500a94/documents/static/src/views/hooks.js#L373-L383
**solution**:
Use the document name when previewing it
BUG 2:
---------
**steps to reproduce**:
1. Install Documents.
2. Open any document.
3. Rename it via the chatter.
4. Try renaming it again via the details panel.
**issue**:
After renaming a document twice through the details panel, the preview still displayed the old document name.
**cause**:
On the first rename, the [insert](https://github.com/odoo/enterprise/blob/691115d8a0b31322f64d35d82dc8c9ddbfcd39b0/documents/static/src/core/document_service.js#L96-L129)) method creates a new [store.Document](https://github.com/odoo/enterprise/blob/691115d8a0b31322f64d35d82dc8c9ddbfcd39b0/documents/static/src/views/hooks.js#L367-L393) record with the updated attachment name. However, The write method (used by chatter) skips reloading the record and linked attachment data on the second rename.
Unlike the Rename button, which uses web_save (and triggers a record reload via web_read), the chatter directly calls write without refreshing the attachment.
**Solution**:
Ensure the preview uses the document name from the document record, keeping it consistent after multiple renames via the details panel.
**Example:** Try to rename a "Invoice.pdf" document to "Invoice_rename.pdf"
<details>
<summary>Click here to see the results:</summary>
Before:
<img src="https://github.com/user-attachments/assets/563b7fb9-709c-4651-8492-032a7f353730"/>
After:
<img src="https://github.com/user-attachments/assets/6fc6bdfe-dd1e-4f3c-aaf7-821c44fd135d"/>
</details>
opw-5065433
Forward-Port-Of: odoo/enterprise#101453
Forward-Port-Of: odoo/enterprise#95111This update allows administrators to now modify and permanently save the default size settings for sign item types within Odoo Enterprise. Previously, these sizes were fixed, limiting flexibility. This change ensures sign items can be configured to meet specific requirements without affecting new creations.
Original PR description
The default size of sign item types could not be modified. It can now be updated and stored persistently, without impacting the default size computation for newly created items. task-5420386
This update resolves a bug that occurred when multiple CAF documents were active within a document type, causing errors when opening invoices. The fix ensures the system selects the CAF with the lowest starting number, allowing for proper document sequencing and preventing database errors. This improves invoice processing reliability.
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
This update resolves an error that occurred when generating tax reports for companies not based in Belgium. The fix prevents the system from attempting to parse invalid VAT numbers, which previously caused a technical issue. This ensures accurate tax report generation for all company types.
Original PR description
**Steps to reproduce:** 1. Go to Companies and set a non-BE VAT on the current company, e.g., `US12345678` 2. Go to Accounting → Configuration → Fiscal Positions. 3. Create a new Fiscal Position and set the country to Belgium. 4. Enter a valid Foreign Tax ID, e.g.,` BE0477472701`, and save. 5. Create the taxes. **Issue:** A traceback is raised: `ValueError: invalid literal for int() with base 10: 'US12345678'` **Cause:** This happens because `_be_company_vat_communication` attempts to parse the company's VAT number even when the company does not belong to BE, resulting in invalid VAT formats such as "USxxxxxxx". **Solution:** Return an empty structured communication unless: - the VAT is valid, and - the detected country code is BE, and - the fiscal country is Belgium. This prevents parsing foreign or invalid VATs and avoids the traceback during foreign tax generation. **opw-5368016**
This update resolves an issue where employees acting as their own approvers couldn't modify their overtime requests. The fix adds necessary permissions to access work entries, allowing employees to correctly approve or reject their own time entries.
Original PR description
Employees set as themselves as approvers couldn't modify their attendances due to permission issues with other models. task-5427553
This update fixes a technical issue where payroll CFDIs generated in Mexico were missing crucial relationship information in their XML format. The change ensures that all payroll CFDIs accurately reflect the origin relationships (like substitutions and reimbursements), meeting regulatory requirements and preventing potential errors.
Original PR description
The module already computes and exposes `cfdi_relationado_data` during the CFDI generation process, but the corresponding XML node was never rendered in the CFDI template. As a result, payroll CFDIs with origin relationships (e.g. substitution, related UUIDs, reimbursements) were silently omitting the required `<CfdiRelacionados>` structure. This patch injects the missing XML section into the v4.0 template, iterating over each relation type and UUID, ensuring that the CFDI properly reflects the relationship metadata already computed by the model. Fixes the inconsistency between backend logic and XML output.
A test tour for GS1 barcode scanning was intermittently failing due to a timing issue during data updates. This fix ensures consistent behavior by applying a mutex to the barcode scanning process, preventing data inconsistencies and making the test reliable. The update also includes improvements to the tour trigger and helper methods for greater precision.
Original PR description
Runbot build error: [232683](https://runbot.odoo.com/odoo/runbot.build.error/232683)
13 changes
Resolved issues and error corrections
This update resolves a problem during the migration process where a required tax group wasn't being created, leading to errors. The migration script now automatically creates all necessary tax groups if they don't already exist, ensuring accurate tax setup after upgrades. This prevents errors related to missing tax groups.
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 resolves a test failure within the Odoo Enterprise system. The issue stemmed from a configuration error related to employee accounting records, specifically concerning future holiday calculations. The fix ensures accurate record creation during testing, preventing the test from failing.
Original PR description
fixing runbot error https://runbot.odoo.com/odoo/runbot.build.error/234639 on test test_mrp_analytic_account_employee_from_widget introduced by this PR https://github.com/odoo/enterprise/pull/85517
**cause of the error:**
Because there is a resource.calendar.leave without calendar_id,
without resource_id and at a date after today :
during the setupclass, when the employee is created,
_create_future_public_holidays_timesheets() creates an account.analytic.line.
So at the end of the test ,
self.env["account.analytic.line"].search([('employee_id', '=', self.employee1.id)])
returns 2 records instead of 1.
runbot-234639
Forward-Port-Of: odoo/enterprise#102282This update resolves an issue where overdue invoices were printed twice in follow-up PDF reports. Previously, manual follow-up emails generated PDFs with the invoice listed redundantly. This change ensures invoices appear only once, improving the clarity and accuracy of these reports for users.
Original PR description
Issue: In a manual follow-up printed as PDF, overdue invoices appear twice. Step to reproduce: - Have an overdue invoice - go to the Partner > accounting, - Send manual follow-up - In the wizard select Print and "Attach Invoices" Current behavior: The PDF display the reminder, the invoice, the report and the invoice again. Expected behavior: Invoice should appear only once in the follow-up PDF. Solution: When manually sending the follow-up, the wizard attaches the invoices to the follow-up. Therefore, they were added a second time at the end of the document in `_get_followup_attachments`. opw-5368870
This update resolves an issue where users without the 'Expenses Administrator' group couldn't digitize receipts attached to expenses. The fix removes this restriction, allowing all users to digitize receipts, improving the user experience and streamlining expense reporting. This change is a minor bug fix.
Original PR description
When a regular user tries to digitize the receipt attached to an expense, the `UserError(_("You don't have the rights to bypass the validation process of this expense."))` is raised. It seems that currently, the user needs to be in the Expenses Administrator group (`group_hr_expense_manager`) to digitize the receipt, which doesn't seem correct.
The fix is proposed here: https://github.com/odoo/odoo/pull/240401. In this PR, I only added a test, which requires the PR on odoo core to be merged first.This update resolves an issue where the Shopee Buyer ID, used for integration with the Shopee marketplace, could exceed the maximum value for an integer. By changing the data type to ‘Char’, this prevents errors and ensures accurate data storage. This improves the stability and reliability of the Shopee integration.
Original PR description
Shopee Buyer ID’ retrieved from the marketplace can, in some cases, exceed the maximum value of the Integer data type. It has been updated to use the Char data type to prevent the ‘out of range for type integer’ error.
This update streamlines the HTML Editor's testing process by separating individual test calls. Previously, tests shared timeouts, leading to unreliable results. Additionally, unnecessary helper functions for tag creation have been removed, simplifying the codebase and improving clarity. This change enhances test stability and maintainability.
Original PR description
Description of the issue/feature this PR addresses: I. Grouping multiple testEditor in a single test is bad practice because the timeout of it is then shared between the different testEditor calls rather than each having their own separate timers. This PR splits the calls of each testEditor to its own test. II. This PR removes helper functions used to create different types of tags. Instead of simplifying the code, these helpers introduced unnecessary complexity and confusion. task-5375867 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where holiday carryover days were incorrectly calculated, leading to a discrepancy in the number of days expiring. The change ensures that accrued holiday days are accurately added before the expiration date is determined, preventing incorrect counts and improving holiday management.
Original PR description
To reproduce: ============= - Create an accrual plan: - Carryover date: allocation - One level: - Accrues 2 days. - Accrual date: monthly on 1st of each month - Starts immediately on allocation start…
To reproduce:
=============
- Create an accrual plan:
- Carryover date: allocation
- One level:
- Accrues 2 days.
- Accrual date: monthly on 1st of each month - Starts immediately on allocation start date - Carryover policy: all days carry over - Carried over days validity: 3 months.
- Create an allocation that uses the above accrual plan on 23/09/2025:
- Starts on 01/07/2024
We should have 30 days in total with 24 expiring on 01/10/2025 but we only have 22 expiring on 01/10/2025.
Problem:
========
When `accrued_gain_time` of the accrual plan is 'start', in the `_process_accrual_plans` method, the property `expiring_days` is set when the first accrual still hasn't been added to the `number_of_days` (it is usually added at the [end of the loop](https://github.com/odoo/odoo/blob/18.0/addons/hr_holidays/models/hr_leave_allocation.py#L596)).
Solution:
=========
In the `_process_accrual_plans`, add the accrued days to the `number_of_days` before the `expiring_days` is set.
[opw-4963163](https://www.odoo.com/odoo/all-tasks/4963163)This update resolves an error that occurred when sending customer statements. Previously, removing the email template during the sending process caused a system error. The fix ensures the system correctly uses the specified email template or the current user's email address, improving the reliability of customer statement delivery.
Original PR description
Currently, an error occurs when a user sends a customer statement. **Steps to Reproduce ([Video](https://drive.google.com/file/d/1soOylzCVnNCNsWUBizeBQ9vfFlI5pzSP/view)):** - Install the…
Currently, an error occurs when a user sends a customer statement. **Steps to Reproduce ([Video](https://drive.google.com/file/d/1soOylzCVnNCNsWUBizeBQ9vfFlI5pzSP/view)):** - Install the `account_reports` module. - Go to `Invoicing` > `Customers` > `Customers`. - Switch to `List view`, select `a customer`, then click on `Actions` > `Open Customer Statements`. - Click `Send`, remove the `Email Template`, add a `subject`, and then click `Print & Send`. **Error:** `ValueError: Expected singleton: mail.template()` After [this commit], which checks whether the template has an email_from, when a user sends the customer statement and removes the email template, it still tries to access the template to fetch email_from for a particular customer [1]. If no email template is used, this results in an error [2] when going to extract the email_from. This commit ensures that email_from is taken from the email template if one is used; otherwise, it uses the current user's email address [3], which matches the default behavior. [this commit]: https://github.com/odoo/enterprise/commit/22c46e4f63e7b2dc0eee16fc807656cd4de21fb7 [1]- https://github.com/odoo/enterprise/blob/dc4d5633407ccc728d30de5ce2072a80c16b2766/account_reports/wizard/account_report_send.py#L246 [2]: https://github.com/odoo/odoo/blob/0dabb221225fba96c0e55779afadd9f12b369777/addons/mail/models/mail_render_mixin.py#L691-L693 [3]: https://github.com/odoo/odoo/blob/0dabb221225fba96c0e55779afadd9f12b369777/addons/mail/models/mail_thread.py#L2891-L2892 sentry-7106576491
This update prevents the system from attempting to check the Git repository when an IoT box isn't connected to a database. This improves efficiency and reduces potential issues related to disconnected devices, ensuring smoother operation.
Original PR description
This PR ignores the call to check_git_branch if no database is connected to the iot box. Forward-Port-Of: odoo/odoo#240610
This update fixes a potential issue where printing on Windows could cause the Odoo system to fail. By adding a safety net to catch printing errors, the system is now more stable and reliable for users on Windows.
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 automatically applies the 'Regime not subject to localization rules' fiscal position to invoices when a customer in Tenerife, Las Palmas, Ceuta, or Melilla is the delivery address. Previously, this required manual setup. This change simplifies invoice processing for Spanish businesses operating on the mainland and ensures compliance with local tax regulations.
Original PR description
Description of the issue/feature this PR addresses: If the company is on the mainland and the delivery address is in the states Tenerife, Las Palmas, Ceuta or Melilla, then the fiscal position 'Regime not subject to localization rules' (fp_not_subject_tai) should apply automatically. Current behavior before PR: In an invoice if the delivery address is in the states Tenerife, Las Palmas, Ceuta or Melilla, you had to set the fiscal position 'Regime not subject to localization rules' (fp_not_subject_tai) manually. Desired behavior after PR is merged: In an invoice when the partner shipping is in the state Tenerife, Las Palmas, Ceuta or Melilla, the fiscal position 'Regime not subject to localization rules' (fp_not_subject_tai) auto apply. @chklop @jco-odoo @rafaelbn please review MT-13114 @moduon --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects a minor issue in the Peppol registration process. Previously, the EAS field automatically received focus, which was confusing for users. This change removes the ability to focus the EAS field, ensuring the system correctly pre-selects it and streamlines the registration workflow.
Original PR description
During registration on Peppol, the eas field is focused first, which makes no sense as it's supposed to be correctly preselected, and users aren't supposed to touch it So this commit makes it non-focusable 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
A bug was preventing users from completing sign requests after a user was deleted. This fix addresses a problem where the system incorrectly handled missing user information when retrieving sign request items. By safely handling cases where user IDs are missing, the system now reliably allows users to complete sign requests without errors.
Original PR description
Currently an error occurs when a user tries to click `Valid & Send Compeleted Document` as follows below: - Install the `sign` module with demo data - Log in as the `demo` user and send 2 sign requests to the `admin` user - Now log in as the `admin` user and delete the `demo`user - Go to the sing and open sign request that was sent by the `demo` user - Complete the sign and click on `Valid & Send Compeleted Document` This issue occurred while retrieving the suggested sign request items. The code was accessing the `create_uid` of those items, but because the user had been deleted, `create_uid` was set to False instead of containing a valid user ID and user name. This commit fixes the above issue by handling cases where `item['create_uid']` is False. When `item['create_uid']` is False, the code now safely returns `False` instead of attempting to access its index. sentry-7116433081
4 changes
Resolved issues and error corrections
This update resolves an issue where the IoT box was incorrectly attempting to check out the correct Git branch when no database connection was present. This change improves stability and efficiency by avoiding unnecessary Git operations, ensuring the IoT box functions reliably.
Original PR description
This PR ignores the call to check_git_branch if no database is connected to the iot box.
This pull request resolves a bug related to FRGI testing within the Odoo spreadsheet module. The fix ensures accurate results are displayed during FRGI testing processes, improving data reliability. This update addresses a previously reported issue impacting spreadsheet functionality.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where DIN5008 invoices weren't showing Incoterm information. The change adds the necessary logic to include Incoterm codes and locations on these invoices, ensuring compliance with DIN5008 reporting requirements. This improves invoice accuracy and reporting for international transactions.
Original PR description
**Steps to reproduce:** 1. Install the modules account and l10n_din5008. 2. Go to Settings and set DIN5008 as the default invoice report template. 3. Navigate to Configuration → Settings and set a default Incoterm. 4. Create a new customer invoice. 5. Print the DIN5008 Invoice Report. **Issue:** The DIN5008 invoice report did not display the Incoterms, while other invoice layouts printed them correctly. **Cause:** This was due to missing logic in l10n_din5008 report to include Incoterm data. Confirmed with TSB that the DIN5008 layout should display Incoterms. **Fix:** This commit adds the Incoterm information to the DIN5008 template data: - Always include the Incoterm code - If an Incoterm location is set, display it as `CODE - LOCATION` **opw-5349267**
This update fixes an issue where users could inadvertently create invalid fields within SQL view models, like the 'sale_report'. Previously, manual creation of these fields caused disruptions to workflows. This change prevents the creation of these fields through Studio, ensuring data integrity and stability.
Original PR description
Prevent creating fields on SQL views ### Impacted versions: 17.0 and later ### Steps to reproduce: Create a new field on sale_report Open sales -> reporting -> sales -> measures ### Current behavior: When you try to create fields with Studio on models based on SQL views such as sale_report you will get a user error. However it's still possible to create these fields manually, which consequently will break some flows and it doesn't make sense to add fields Task: [5394158](https://www.odoo.com/odoo/project/49/tasks/5394158)