Daily updates from Odoo
Friday, June 5, 2026
301 changes
20 changes
Enhancements to existing features
This update allows for easier customization of Unsplash image access within our SaaS environment. Previously, a key limitation prevented modules from overriding the Unsplash access key, now patchable methods have been added for retrieval. This change ensures greater flexibility and control over image sourcing for SaaS users.
Original PR description
__Before commit__ The Unsplash querying logic was moved out of the controller in odoo/odoo@e5151524. The Unsplash access key was now retrieved directly using the ICP instead of using the dedicated method of the controller. This made it impossible for a module to override the access key used by `_fetch_unsplash_images`, which is required on SaaS. __After commit__ Add some patchable methods to retrieve the Unsplash access key and app ID.
Resolved issues and error corrections
This update corrects an issue with the data sent to UrbanPiper for store updates, ensuring accurate store information is transmitted. Additionally, a previously removed test case has been restored, and the delivery provider is now hidden from payment method views. These changes improve the reliability and presentation of UrbanPiper integration.
Original PR description
Fixes the UrbanPiper store timings payload used in store update requests. Also restores the preparation display assertion in `test_01_order_flow`, which was accidentally removed during refactoring. Additionally, hides the delivery provider in the payment method view. Task-6065459 Runbot Err-[242023](https://runbot.odoo.com/odoo/error/242023)
This update resolves an issue where validating delivery costs on confirmed sales orders (with 'Lock Confirmed Sales' enabled) would trigger an error. The fix prevents the system from incorrectly applying carrier prices to delivery lines when a real-cost invoicing policy is used, ensuring smooth order processing even on locked sales.
Original PR description
Sale module has setting `Lock Confirmed Sales`, which particularly doesn't allow order line modification on a confirmed order. However, when a delivery carrier is set up with Invoicing Policy = Real cost, validating the picking pushes the actual carrier price onto the delivery line, writing `price_unit` and `name`. On a locked SO this raises a UserError. Fix it by excluding the delivery line's `price_unit` and `name` from the protected fields, only when the write originates from `_add_delivery_cost_to_so`. The code path is identified by the context `allow_delivery_cost_update`, so a regular UI edit of those fields on a locked SO is still blocked. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#266511 Forward-Port-Of: odoo/odoo#265721
This update resolves an issue where users were blocked from uploading documents to requests linked to records they didn't have full access to. By adding a special permission bypass, users can now upload documents regardless of their access level to the related record, improving usability and workflow efficiency.
Original PR description
Issue: Users are currently blocked from uploading requested documents if the request is linked to a record they do not have access to (e.g., User A links Record X to a request assigned to User B, but User B lacks read/write access to Record X). The system throws an error because the user cannot create an attachment for that record. Fix: Add .sudo() on the attachment creation process. task-6107099 Forward-Port-Of: odoo/enterprise#113698
This update fixes an issue where payments for Mexican invoices were being sent to CFDI multiple times, leading to inaccurate payment records. The change ensures the 'Update Payments' button only appears after the invoice payment is fully reconciled, preventing duplicate submissions and maintaining accurate financial reporting.
Original PR description
Issue: Sending payments to SAT before its full amount is reconciled allow sending the same invoice payment several times to CFDI. Steps to reproduce: - In a Mexican company - Create an invoice A of…
Issue: Sending payments to SAT before its full amount is reconciled allow sending the same invoice payment several times to CFDI. Steps to reproduce: - In a Mexican company - Create an invoice A of $40 to Inmobiliaria CVA - Confirm and send to CFDI - Go to bank, create a new Bank transaction of $80 - reconcile with Invoice A - Go to invoice A => click on button "Update payments" (it doesn't appear in previous versions) - Then sheet CFDI and Download There is the first XML sent to CFDI with payment for invoice A - Create an invoice B of $40 to Inmobilira CVA - Confirm and send to CFDI - reconcile the transaction with Invoice B - Go to invoice B - Click on button "Update payments" - Then sheet CFDI and Download There is the second XML sent to CFDI with payment for invoices A and B Invoice A payment was sent twice to CFDI Expected behavior: - The "Update payment" button should appear only once the invoice payment is fully reconciled. Current behavior: - The update payment button appear once the invoice is reconciled with a payment. The method `_l10n_mx_edi_cfdi_invoice_get_payments_diff` is called twice, once to check whether it's needed to display the "Update button" and once when you try to update the payment (called only after clicking on said button). opw-5432421 Forward-Port-Of: odoo/enterprise#119244 Forward-Port-Of: odoo/enterprise#108355
This update prevents incorrect tax calculations on COGS lines generated from vendor bills. Previously, manual tax adjustments were overwritten due to the system applying product taxes to these internal operations. This change ensures COGS lines accurately reflect internal costs without tax implications.
Original PR description
Issue: After manually modifying the taxes on a vendor bill that generates COGS lines, confirming the vendor bill causes the taxes to revert to their original values before the manual edit. This…
Issue: After manually modifying the taxes on a vendor bill that generates COGS lines, confirming the vendor bill causes the taxes to revert to their original values before the manual edit. This happens because the product’s purchase taxes are applied to the generated COGS lines, which triggers the tax recomputation logic and overwrites the manually adjusted tax amounts. However, COGS lines represent internal operations and should not have taxes applied to them Steps to reproduce: 1. Turn on Anglo-Saxon accounting 2. Turn on automatic accounting 3. Make a FIFO product category and make the valuation automatic 4. Make a new product and set the FIFO product category on it 5. Make sure the product has a vendor tax set 6. Make a purchase order for 10 of the FIFO product category at $10 7. Create and validate the receipt for 10 8. Make a sales order for 6 of the FIFO product category at $10 9. Create and validate the delivery for 6 10. Create the vendor bill for 10 the purchase order created above (make sure that there is a tax set on the vendor bill; the vendor tax that was set on the product). Make this vendor bill set for 10 at $20 11. Edit the tax at the bottom of the total 12. Confirm the vendor bill 13. Notice that the tax at the bottom of the total changes 14. Reset the vendor bill 15. Remove the purchase tax from the product 16. Confirm the vendor bill again and notice that the tax at the bottom of the total does not change this time Cause: On confirmation, the COGS lines on the vendor bill will be generated and “_compute_tax_ids” will be triggered on those lines. Since COGS lines have a “product_id” set on them, those lines will receive the purchase tax set on the product. Setting the “tax_ids” on those COGS lines will cause tax computation to trigger again, which will reset the manually edited tax amount to the new computed amount. However, since COGS lines come in pairs that are equal and opposite in amount, the taxes from both COGS lines will cancel out, and the new computed tax amount does not change Solution: Skip setting the purchase taxes of the product onto COGS lines in “_compute_tax_ids” opw-6110692 Forward-Port-Of: odoo/odoo#268434 Forward-Port-Of: odoo/odoo#265352
This update fixes a crash issue in the Point of Sale interface when a large number of customers are stored in the browser cache. The change limits the number of partners rendered during searches, improving performance and stability, particularly when dealing with extensive customer lists. This ensures a smoother user experience for POS operations.
Original PR description
Currently, it's possible to experience very slow loading speed of the partner list and/or browser crashes in the POS when there are thousands of customers stored in the browser cache. This appears to…
Currently, it's possible to experience very slow loading speed of the partner list and/or browser crashes in the POS when there are thousands of customers stored in the browser cache.
This appears to be caused by a few reasons compounding together:
1. While we limit the number of customers in the initial render of the list, there is no limit during the search. Therefore, if there are thousands of customers matching the search pattern loaded in the browser cache, the browser will attempt to render equally as many `PartnerLine` components.
2. A 100 ms debounce time is fast enough to trigger the render after each key stroke. 200~300ms is the industry standard for Software UI debounce.
3. For each customer rendered in the list, we may perform a search for its parent partner amongst all loaded customers with the function `PosStore.getPartnerCredit()`.
This PR aims at reducing the number of partner lines rendered in a short period of time and thus, at improving speed and avoiding crashes.
Steps to reproduce:
1. Create a fresh db + install the point_of_sale with demo data
2. Populate the res.partner model by a factor of 100 to reach 4000+ partners
3. Update the following system parameter to make sure that we load all partners in the browser cache when we open the POS session:
- `point_of_sale.limited_customer_count` -> 5000
4. Open a POS session and and click on the `Customer` button to render the partner list
5. Type `adm` in the search bar at normal typing speed
6. Crash
Ticket: opw-5435973
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#258667This update fixes an error in the import of Italian vendor invoices (l10n_it_edi) where pension fund tax was incorrectly applied to all invoice lines with the same VAT rate. The fix extracts the specific tax exemption reason from the invoice data, ensuring the correct tax is applied to the first line, leading to accurate financial reporting.
Original PR description
In `l10n_it_edi` vendor bill import, the pension fund tax was incorrectly applied to all invoice lines sharing the same VAT rate, even though they have different `l10n_it_tax_exemption_reason`s, resulting in wrong entries and document total. We now extract the Tax Exemption reason from the `DatiCassaPrevidenziale` node, and use it to search the correct tax. Steps to reproduce: 1. Install `account` and `l10n_edi_it` 2. In the `4% INPS` tax, set `TC22` in pension fund type and `N2.2` in exoneration 3. Import bill from the ticket 4. See the pension fund tax is applied to all the lines. It should only be applied only to the first one. Ticket [link](https://www.odoo.com/odoo/project.task/6212975) opw-6212975 Forward-Port-Of: odoo/odoo#267066 Forward-Port-Of: odoo/odoo#265821
This update resolves a potential error that could occur when creating new PDP reporting flows. Previously, the system would crash if it tried to compare dates when the due period dates were initially empty. This fix ensures the system handles missing dates gracefully, improving the stability and reliability of the reporting process.
Original PR description
PDP reporting flows compute their period status from the due period dates. On a new or incomplete flow record, those dates can still be empty during form/onchange initialization. The compute then tried to compare today's date with `False`, which could crash generic form creation. This patch makes the compute handle missing period dates before doing date comparisons. runbot.build.error-939459 Forward-Port-Of: odoo/odoo#268002
This update prevents Odoo from crashing when the Barcode Lookup API returns a broken image URL. Previously, an invalid URL would cause an error. Now, the system gracefully handles these errors, safely ignoring the bad URL and continuing to function correctly.
Original PR description
[FIX] product_barcodelookup: avoid crash on invalid image URLs **Steps to Reproduce:** - Install Sales module. - Configure a valid Barcode Lookup API key. - Create a product without an image. - Set a…
[FIX] product_barcodelookup: avoid crash on invalid image URLs
**Steps to Reproduce:**
- Install Sales module.
- Configure a valid Barcode Lookup API key.
- Create a product without an image.
- Set a barcode whose returned image URL is broken or returns HTTP 404
(e.g. `8426904171073`).
- Select the product and trigger the server action:
`Action -> Get Pictures from Barcode Lookup`
Issue:
**During image fetching:**
- Barcode Lookup API successfully returns product data and image URLs.
- `_get_image_from_url()` attempts to download the image.
- The image URL responds with HTTP 404.
- `barcode_lookup_request()` returns a dict for non-200 responses.
- `_get_image_from_url()` assumes the response is always a `requests.Response`
object and directly accesses: `response.status_code`
- This causes: `AttributeError: 'dict' object has no attribute 'status_code'`
**Root Cause:**
- `barcode_lookup_request()` returns inconsistent response types:
- `requests.Response` for successful requests
- `dict` for failed requests
- _get_image_from_url() does not handle the dict response before accessing
response attributes.
**Solution:**
- Make barcode_lookup_request() always return a One Response
object.
- Move the response validation to the callers instead of returning custom
dict objects.
**Result:**
- No RPC crash when image URLs are invalid or return 404.
- Broken image URLs are safely ignored.
**OPW-6200749**
Forward-Port-Of: odoo/enterprise#116925This update resolves a crash that occurred when the Discuss app was initially loaded with demo data. The issue stemmed from an infinite loop within the app's data storage, triggered by how new conversations were added. By tracking changes to the data storage more accurately, this fix prevents the crash and ensures stable operation.
Original PR description
Backport of https://github.com/odoo/odoo/pull/267790 Before this commit, when loading discuss app initially with demo data, sometimes there was a crash from maximum stack. This happens due to…
Backport of https://github.com/odoo/odoo/pull/267790 Before this commit, when loading discuss app initially with demo data, sometimes there was a crash from maximum stack. This happens due to infinite loop in discuss store with field `livechats`, which as a computed inverse `appAsLivechat`: - Initially the field `livechats` has 2 conversations `[1, 2]` - When adding conversation `3`, the `appAsLivechat` auto-computes to add this conversation to `livechats`, which triggers these field commands: 1. `appAsLivechat`: `[["REPLACE", 3]]` 2. `livechats`: `[["ADD.noinv", DiscussApp]]` This is fine by itself, but somehow the `"ADD.noinv"` triggers a `[["DELETE.noinv", 1]]` on the inverse field `appAsLivechat`, which is then turned by the versioning system into a `[["REPLACE", [3]]]`, which in turn does a `[["DELETE.noinv", 1]]` and so on infinitely. The `"DELETE.noinv"` is turned into `"REPLACE"` by the versioning of fields, which is ok, but it does it mistakenly with only considering new field `[3]` rather than having also `[1, 2]` that was there before. The history lacks `[1, 2]` so that's why it can't `"REPLACE"` with these values, even though the saved data already has them, but then the store is aware of deletion of these records, hence the infinite loop. The underlying issue is that live chats `[1, 2]` were added in store without any track in history. This comes from some internal operations on record lists that apply related change on inverse, but this is done immediately with `.add()` or `.delete()` which doesn't reach the tracking of history of field version in `updateFields()`. This commit fixes the issue by converting the `[inverse].add()` and `[inverse].delete()` into `updateFields()`, so that this is the same operation but it makes it tracked by the field version history. Task-6073452
This update fixes an issue where discounts entered with commas (used as decimal separators in some regions) were incorrectly interpreted as zero. The change ensures that discount values, regardless of the decimal separator used, are accurately applied to orders, preventing revenue loss and improving order accuracy.
Original PR description
Before this commit, if comma was used as decimal separator, the fixed discount valu was added to the order as zero discount. opw-6268557 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#267954
This update resolves an issue where inserting certain website snippets (like alerts) within restricted editable areas created HTML errors. The fix prevents the snippet from being broken down into invalid elements, ensuring the website builder functions correctly and produces valid HTML. This improves the overall stability and usability of the website building tool.
Original PR description
### [FIX] website: prevent inserting block snippet with powerbox in inlines Inserting block snippet with powerbox when the selection is inside an editable part limited to an element that can only…
### [FIX] website: prevent inserting block snippet with powerbox in inlines Inserting block snippet with powerbox when the selection is inside an editable part limited to an element that can only contain inline nodes leads to invalid html (like `<div>` inside `<span>`). This commit disables insertion of block snippets when the selection is such a part of the document. Steps to reproduce: - Open website builder - Put cursor in "copyright" at the bottom of the footer - Type `/alert` and press enter - Bug: `<div>` element is inserted inside `<span>`, that is invalid html task-6259092 ### [FIX] website: prevent unwrapping `s_blockquote` on insert with powerbox When the snippet `s_blockquote` was inserted with the powerbox or pasted from clipboard in an unbreakable element which does not allow blocks as children, the `<blockquote>` element itself was abandonned and its children were inserted instead. This lead to insertion of a broken snippet. This commit marks the `s_blockquote` snippet as "unsplittable" so that always stays in one piece when inserted. Steps to reproduce: - Open website builder - Put cursor in a link - Type `/blockquote` and press enter - Bug: the snippet's children are inserted, instead of snippet itself task-6259092 Forward-Port-Of: odoo/odoo#267111
This update resolves a bug where reports with sections would always revert to the first section after a soft reload. The fix ensures that the last opened section is correctly restored, improving the user experience when refreshing reports with multiple sections. This prevents user frustration and ensures accurate report viewing.
Original PR description
When opening a report with sections, we dont save the last opened section. So following a soft-reload, it always redirect to the first section. To reproduce: - Install l10n_fr_reports - Set up the Tax Returns - Open the Tax Report from the Fiscal Declaration - Open the 2069 RCI - Click on the line "Add new section" which trigger a soft reload *or find another way to trigger a soft reload from a report with sections*
This update resolves an issue where invoicing users were unable to access related reporting data within invoices. By allowing invoicing users to read PDP flow relations, this change enables them to properly utilize e-reporting fields and buttons, improving invoice processing efficiency. This fix was triggered by a build error and aligns with existing workflows.
Original PR description
Allow invoicing users to read PDP reporting flows. Invoice views can read PDP flow relations to evaluate e-reporting-related fields or buttons. Users with invoicing access could open the invoice but were blocked when Odoo tried to read the linked PDP flow. runbot.build.error-939457 Forward-Port-Of: odoo/odoo#268462
This update resolves an issue where Romanian E-Factura invoices were being rejected due to exceeding character limits for product names, descriptions, and notes. The fix automatically truncates these fields to the required maximum lengths (100, 200, and 300 characters respectively) to ensure compliance with Romanian regulations. This prevents invoice errors and successful E-Factura transmission.
Original PR description
**Steps to reproduce:** - Install Accounting and l10n_ro_edi - Switch to a Romanian localization (e.g. RO Company) - Configure Romanian E-Factura - Create an invoice with a product having a name…
**Steps to reproduce:** - Install Accounting and l10n_ro_edi - Switch to a Romanian localization (e.g. RO Company) - Configure Romanian E-Factura - Create an invoice with a product having a name longer than 100 chars - Confirm the invoice - Send E-Factura to SPV - Fetch E-Factura status **Issue:** The invoice is rejected with the following error: "[BR-RO-L100]-The allowed maximum number of characters for the Item name (BT-153) is 100." **Similar issue with the product description:** "[BR-RO-L200]-The allowed maximum number of characters for the Item description (BT-154) is 200." **Similar issue with the note (i.e. Terms and Conditions):** "[BR-RO-L300]-The allowed maximum number of characters for the Invoice note (BT-22) is 300." **Solution:** Truncate the name of the product to 100 chars in the electronic invoice, the description of the product to 200 and the note to 300. opw-5964904 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#268351 Forward-Port-Of: odoo/odoo#265811
This update fixes an issue where a bank transaction creation process would unexpectedly crash when encountering an error. The fix ensures the quick create form is properly closed and the error is displayed, improving the user experience and preventing data loss. This resolves a technical glitch impacting bank transaction functionality.
Original PR description
**Problem:** When an error is thrown upon creating a bank transaction in the kanban view, a traceback occurs due to trying to access the quickCreateState which does not exist in this context (`this` = BankRecQuickCreateController). **Steps to Reproduce:** - Force the suspense account of the bank journal to be False - Go to bank transactions of that journal in kanban view and try to create a new transaction -> Traceback **Solution:** The expected behavior is for the quick create to be closed, then throw the error. Therefore, onCancel() can be called before throwing the error. opw-6186901 Forward-Port-Of: odoo/enterprise#118842
This update prevents eLearning challenge participants from being listed in the email headers, enhancing privacy and data security. The previous system inadvertently revealed participant details, which has now been corrected through a refined approach to email header configuration.
Original PR description
**Steps to reproduce:** - Install eLearning app with gamification - Go to Settings > Gamification Tools > Challenges - Set a challenge with multiple participants (portals / internals) - Set its state…
**Steps to reproduce:** - Install eLearning app with gamification - Go to Settings > Gamification Tools > Challenges - Set a challenge with multiple participants (portals / internals) - Set its state to Done - Notification email is sent to every participants - They can see each other in the mail header (portal user can see all other portal users, internal user can see all portal users) **Issue:** Since [1] external recipients are added in the mail header, but this is not adequate for every flows (here there is no need for the participants to be aware of each other). **Fix:** In [2] this issue was mitigated by removing the `'X-Msg-To-Add'` from the header for models which don't need it. Then in [3] the solution was replaced by a more generic approach using `_CUSTOMER_HEADERS_LIMIT_COUNT = 0`. [1] https://github.com/odoo/odoo/commit/42aaaef59d21558438c767c6dd8a21674e5df9df [2] https://github.com/odoo/odoo/commit/e6c13ce4436b3c8b3a2058d2ccf65a7da1b256b2 [3] https://github.com/odoo/odoo/commit/c4dbd868b9c7e26f11db4d2cacef7ffce6c87082 opw-6099745 Forward-Port-Of: odoo/odoo#267192
This update simplifies how Odoo determines user locations. Previously, the system relied on a complex database lookup. Now, if a country cannot be identified, it defaults to using the user's recorded city, providing a more reliable and straightforward solution. This change enhances location accuracy and reduces potential issues.
Original PR description
This reverts commit fd7e3393158fc637c555f612a54f3e8c7c72bd96. Then we provide a simpler fix by defaulting to the city record if a country cannot be resolved. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#267866
This update fixes an issue where refund amounts on POS orders were incorrectly calculated as payments, leading to inaccurate unpaid balance figures. The change ensures that refund order lines are properly treated as returns, accurately reflecting the outstanding balance on the associated sale order. This improves the reliability of financial reporting for POS transactions.
Original PR description
POS refund order lines have a positive `price_subtotal_incl` but represent money returned to the customer. `_compute_amount_unpaid` was treating them as paid amounts, causing the unpaid balance on the linked sale order to be understated. opw-6190337 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#263241
13 changes
Resolved issues and error corrections
This update simplifies how Odoo determines user locations. It reverts a previous change and now defaults to using the user's recorded city if a country cannot be identified. This improves location accuracy and reliability, particularly in areas with incomplete geo-location data.
Original PR description
This reverts commit fd7e3393158fc637c555f612a54f3e8c7c72bd96. Then we provide a simpler fix by defaulting to the city record if a country cannot be resolved. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a performance issue in the Point of Sale interface where a large number of customers in the browser cache could cause slow loading and browser crashes. The change limits the number of partners rendered during searches, improving speed and stability for users.
Original PR description
Currently, it's possible to experience very slow loading speed of the partner list and/or browser crashes in the POS when there are thousands of customers stored in the browser cache. This appears to…
Currently, it's possible to experience very slow loading speed of the partner list and/or browser crashes in the POS when there are thousands of customers stored in the browser cache.
This appears to be caused by a few reasons compounding together:
1. While we limit the number of customers in the initial render of the list, there is no limit during the search. Therefore, if there are thousands of customers matching the search pattern loaded in the browser cache, the browser will attempt to render equally as many `PartnerLine` components.
2. A 100 ms debounce time is fast enough to trigger the render after each key stroke. 200~300ms is the industry standard for Software UI debounce.
3. For each customer rendered in the list, we may perform a search for its parent partner amongst all loaded customers with the function `PosStore.getPartnerCredit()`.
This PR aims at reducing the number of partner lines rendered in a short period of time and thus, at improving speed and avoiding crashes.
Steps to reproduce:
1. Create a fresh db + install the point_of_sale with demo data
2. Populate the res.partner model by a factor of 100 to reach 4000+ partners
3. Update the following system parameter to make sure that we load all partners in the browser cache when we open the POS session:
- `point_of_sale.limited_customer_count` -> 5000
4. Open a POS session and and click on the `Customer` button to render the partner list
5. Type `adm` in the search bar at normal typing speed
6. Crash
Ticket: opw-5435973
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#258667This update resolves an issue where inserting certain website snippets (like alerts) within restricted editable areas created invalid HTML. The fix prevents the snippet from being broken down into smaller elements, ensuring the website builder generates valid and functional code. This improves the reliability and usability of the website design tool.
Original PR description
### [FIX] website: prevent inserting block snippet with powerbox in inlines Inserting block snippet with powerbox when the selection is inside an editable part limited to an element that can only…
### [FIX] website: prevent inserting block snippet with powerbox in inlines Inserting block snippet with powerbox when the selection is inside an editable part limited to an element that can only contain inline nodes leads to invalid html (like `<div>` inside `<span>`). This commit disables insertion of block snippets when the selection is such a part of the document. Steps to reproduce: - Open website builder - Put cursor in "copyright" at the bottom of the footer - Type `/alert` and press enter - Bug: `<div>` element is inserted inside `<span>`, that is invalid html task-6259092 ### [FIX] website: prevent unwrapping `s_blockquote` on insert with powerbox When the snippet `s_blockquote` was inserted with the powerbox or pasted from clipboard in an unbreakable element which does not allow blocks as children, the `<blockquote>` element itself was abandonned and its children were inserted instead. This lead to insertion of a broken snippet. This commit marks the `s_blockquote` snippet as "unsplittable" so that always stays in one piece when inserted. Steps to reproduce: - Open website builder - Put cursor in a link - Type `/blockquote` and press enter - Bug: the snippet's children are inserted, instead of snippet itself task-6259092 Forward-Port-Of: odoo/odoo#267111
This update prevents Odoo from crashing when the Barcode Lookup API returns a broken image URL. Previously, an invalid URL would cause an error. Now, the system safely ignores these errors and continues to function correctly, ensuring a smoother user experience.
Original PR description
[FIX] product_barcodelookup: avoid crash on invalid image URLs **Steps to Reproduce:** - Install Sales module. - Configure a valid Barcode Lookup API key. - Create a product without an image. - Set a…
[FIX] product_barcodelookup: avoid crash on invalid image URLs
**Steps to Reproduce:**
- Install Sales module.
- Configure a valid Barcode Lookup API key.
- Create a product without an image.
- Set a barcode whose returned image URL is broken or returns HTTP 404
(e.g. `8426904171073`).
- Select the product and trigger the server action:
`Action -> Get Pictures from Barcode Lookup`
Issue:
**During image fetching:**
- Barcode Lookup API successfully returns product data and image URLs.
- `_get_image_from_url()` attempts to download the image.
- The image URL responds with HTTP 404.
- `barcode_lookup_request()` returns a dict for non-200 responses.
- `_get_image_from_url()` assumes the response is always a `requests.Response`
object and directly accesses: `response.status_code`
- This causes: `AttributeError: 'dict' object has no attribute 'status_code'`
**Root Cause:**
- `barcode_lookup_request()` returns inconsistent response types:
- `requests.Response` for successful requests
- `dict` for failed requests
- _get_image_from_url() does not handle the dict response before accessing
response attributes.
**Solution:**
- Make barcode_lookup_request() always return a One Response
object.
- Move the response validation to the callers instead of returning custom
dict objects.
**Result:**
- No RPC crash when image URLs are invalid or return 404.
- Broken image URLs are safely ignored.
**OPW-6200749**
Forward-Port-Of: odoo/enterprise#116925This update fixes an issue where discounts entered with a comma (used in some regions) were incorrectly interpreted as zero. The change ensures that discount values, regardless of the decimal separator used, are accurately applied to orders, preventing revenue loss and ensuring correct pricing.
Original PR description
Before this commit, if comma was used as decimal separator, the fixed discount valu was added to the order as zero discount. opw-6268557 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#267954
This update optimizes how Odoo recalculates styles in large tables, like the Accounting > Balances Sheets. By using a more targeted approach, the system now responds faster during window resizing, scrolling, and sorting, leading to a smoother user experience.
Original PR description
Avoid using the :has() selector and use a specific class on the body instead to replicate the same behavior. This reduces work during the "Recalculate Style" phase (for example when hovering rows in large tables such as the Accounting > Balances Sheets). It lowers recalculation time during window resizes, heavy scrolling, and table sorting by preventing broad selector matches and limiting style checks to elements with the specific class. similar fix: https://github.com/odoo/enterprise/pull/118535 Forward-Port-Of: odoo/odoo#266954
This update fixes a restriction that prevented invoicing users from accessing key reporting data within Odoo. Now, invoice views can read related PDP flow information, allowing for accurate evaluation of e-reporting fields and buttons. This ensures invoicing users have the complete information they need.
Original PR description
Allow invoicing users to read PDP reporting flows. Invoice views can read PDP flow relations to evaluate e-reporting-related fields or buttons. Users with invoicing access could open the invoice but were blocked when Odoo tried to read the linked PDP flow. runbot.build.error-939457 Forward-Port-Of: odoo/odoo#268462
This update corrects a bug in the Point of Sale system's cash rounding method (DOWN). Previously, overpayments were incorrectly absorbed as rounding offsets, resulting in incorrect change calculations. This fix ensures accurate change calculations and a more reliable transaction experience.
Original PR description
With the DOWN cash rounding method, `asymmetricRound` used `this.isNegative(a)` to decide whether to invert the rounding direction. `isNegative` internally applies the configured method before comparing. This caused `asymmetricRound` to return 0 for genuinely negative remainders, making `appliedRounding` absorb the full overpayment as a rounding offset and zeroing out the change. opw-6268670 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#268272
This update fixes an issue where a bank transaction creation process would unexpectedly crash when an error occurred. The fix ensures the quick create form is properly closed and the error is displayed, improving the user experience and preventing data loss. This resolves a minor disruption in the bank transaction workflow.
Original PR description
**Problem:** When an error is thrown upon creating a bank transaction in the kanban view, a traceback occurs due to trying to access the quickCreateState which does not exist in this context (`this` = BankRecQuickCreateController). **Steps to Reproduce:** - Force the suspense account of the bank journal to be False - Go to bank transactions of that journal in kanban view and try to create a new transaction -> Traceback **Solution:** The expected behavior is for the quick create to be closed, then throw the error. Therefore, onCancel() can be called before throwing the error. opw-6186901 Forward-Port-Of: odoo/enterprise#118842
This update resolves an issue where participant emails were unintentionally visible in notification emails within the eLearning gamification app. The fix removes unnecessary header information, ensuring participant privacy and preventing users from seeing each other's email addresses within the system. This improves the user experience and aligns with data protection best practices.
Original PR description
**Steps to reproduce:** - Install eLearning app with gamification - Go to Settings > Gamification Tools > Challenges - Set a challenge with multiple participants (portals / internals) - Set its state…
**Steps to reproduce:** - Install eLearning app with gamification - Go to Settings > Gamification Tools > Challenges - Set a challenge with multiple participants (portals / internals) - Set its state to Done - Notification email is sent to every participants - They can see each other in the mail header (portal user can see all other portal users, internal user can see all portal users) **Issue:** Since [1] external recipients are added in the mail header, but this is not adequate for every flows (here there is no need for the participants to be aware of each other). **Fix:** In [2] this issue was mitigated by removing the `'X-Msg-To-Add'` from the header for models which don't need it. Then in [3] the solution was replaced by a more generic approach using `_CUSTOMER_HEADERS_LIMIT_COUNT = 0`. [1] https://github.com/odoo/odoo/commit/42aaaef59d21558438c767c6dd8a21674e5df9df [2] https://github.com/odoo/odoo/commit/e6c13ce4436b3c8b3a2058d2ccf65a7da1b256b2 [3] https://github.com/odoo/odoo/commit/c4dbd868b9c7e26f11db4d2cacef7ffce6c87082 opw-6099745 Forward-Port-Of: odoo/odoo#267192
This update fixes an issue where credit notes couldn't be created if the system encountered archived bank accounts. The fix ensures that the system explicitly checks for inactive bank accounts, preventing validation errors and allowing credit notes to be successfully processed. This improves invoice confirmation and reduces potential disruptions to financial workflows.
Original PR description
When creating a credit note, it is possible for the compute method _compute_partner_bank_id to be called in a context where active_test is falsy, leading to moves that cannot be validated because it…
When creating a credit note, it is possible for the compute method _compute_partner_bank_id to be called in a context where active_test is falsy, leading to moves that cannot be validated because it would raise with the following error message: > The recipient bank account linked to this invoice is archived. So you cannot confirm the invoice. The state of the 'active_test' ctx key cannot be known in advance in a compute and should not be assumed as True; according to the framework team: > In practice, a compute method cannot expect active_test to have > a particular value. It may be invoked with any context. There is no > "context purge" done by the ORM. The computation may be "prepared" > with a context (the one of modified()) and actually done with another > context (code accessing the field before some explicit flush). In > other words, if the compute method searches for a record that matches > some conditions, and if that record cannot be inactive, then this > condition must be explicit in the search domain (or in the context). opw-6229286 Forward-Port-Of: odoo/odoo#267398
This update resolves a technical issue that prevented users from correctly sorting fiscal positions when they were linked to companies outside their authorized access. The fix ensures that the system handles company hierarchies properly, preventing errors and improving data accuracy. This change enhances the reliability of financial reporting.
Original PR description
_get_first_matching_fpos() sorts fiscal positions by company specificity using `f.company_id.parent_ids`. The `parent_ids` field on `res.company` is compute_sudo=True, but `convert_to_record` still builds the resulting recordset in the caller's environment and then calls `filtered('active')` on it. When the fiscal position belongs to a child company whose parent is outside the current user's allowed companies, reading `active` on the parent company record raises an AccessError.
opw-6266568
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#267747This update resolves an issue where enabling the 'Sales Credit Limit' setting caused access errors when creating new users. The problem stemmed from a default value being incorrectly applied to a restricted field due to inheritance within the system's data model. This fix ensures proper access controls are enforced during user creation.
Original PR description
# How to reproduce - Install the Accounting module - In the settings, enable "Sales Credit Limit" - Remove the Accounting access rights of the current user - Try to create a new user # The issue An…
# How to reproduce - Install the Accounting module - In the settings, enable "Sales Credit Limit" - Remove the Accounting access rights of the current user - Try to create a new user # The issue An access error is raised on the field `credit_limit` # Cause Enabling the "Sales Credit Limit" setting will create an `ir.default` for the `credit_limit` field. This field is restricted to a specific group : https://github.com/odoo/odoo/blob/e3b0ca11d99b2ef819cdad68b169112cd73668b6/addons/account/models/partner.py#L515-L518 When creating a record, we check field permissions before adding default values, so the creation of the user is fine. However, since `res.users` inherits from `res.partners`, a new partner will also be created, but this time with the default values in `vals_list`, which will trigger an access right error. # Proposed solution Back port of this commit : https://github.com/odoo/odoo/pull/267193 Access right checks when creating a record were introduced in 18.3 by : https://github.com/odoo/odoo/commit/15132342960df76fcefd3284a9eff2d4d3273150 opw-6240494 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#268303 Forward-Port-Of: odoo/odoo#268039
12 changes
Enhancements to existing features
This update improves the speed of searching for partners (customers and suppliers) within the Point of Sale system. By optimizing the search process, particularly on large databases, the system responds more quickly, leading to a smoother and more efficient user experience. This change focuses on internal performance improvements.
Original PR description
Improve partner search response time on large databases (1M+ rows): - Implement smart field selection based on input type (phone, email, text). - Use prefix search (=ilike) for identifiers and exact match for barcodes. - Remove expensive sorting by complete_name in the backend. - Increase search limit to 500 to reduce network round-trips. task-id: 6143737 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#260347
Resolved issues and error corrections
This update fixes an issue where inserting certain website snippets (like alerts) within limited editable areas resulted in broken HTML. The fix prevents the creation of invalid HTML structures, ensuring snippets insert correctly and reliably within the website builder. This improves the overall user experience and stability of the website building tool.
Original PR description
### [FIX] website: prevent inserting block snippet with powerbox in inlines Inserting block snippet with powerbox when the selection is inside an editable part limited to an element that can only…
### [FIX] website: prevent inserting block snippet with powerbox in inlines Inserting block snippet with powerbox when the selection is inside an editable part limited to an element that can only contain inline nodes leads to invalid html (like `<div>` inside `<span>`). This commit disables insertion of block snippets when the selection is such a part of the document. Steps to reproduce: - Open website builder - Put cursor in "copyright" at the bottom of the footer - Type `/alert` and press enter - Bug: `<div>` element is inserted inside `<span>`, that is invalid html task-6259092 ### [FIX] website: prevent unwrapping `s_blockquote` on insert with powerbox When the snippet `s_blockquote` was inserted with the powerbox or pasted from clipboard in an unbreakable element which does not allow blocks as children, the `<blockquote>` element itself was abandonned and its children were inserted instead. This lead to insertion of a broken snippet. This commit marks the `s_blockquote` snippet as "unsplittable" so that always stays in one piece when inserted. Steps to reproduce: - Open website builder - Put cursor in a link - Type `/blockquote` and press enter - Bug: the snippet's children are inserted, instead of snippet itself task-6259092 Forward-Port-Of: odoo/odoo#267111
This update corrects a technical error within the IoT module that was preventing warning messages from being logged correctly. The fix ensures that logging data is formatted properly, avoiding a type error and preventing potential disruptions to monitoring and reporting. This improves the reliability of our IoT data tracking.
Original PR description
Error: ``` TypeError: Logger._log() got an unexpected keyword argument 'ip' ``` Cause: - The `**new_iot_record` unpacks the dictionary into keyword arguments for `Logger._log()` instead of supplying it as the value for the third `%s` placeholder in the warning message, causing the error because `_log()` doesn't accept keywords such as `version` or `ip`. sentry-7522168864
This update resolves a payment issue that occurred when using the Viva POS system in self-order mode. A recent change attempted to use a method unavailable in self-order, causing errors. The fix simply adds a fallback to the standard POS configuration, ensuring payments now process correctly.
Original PR description
The PR odoo/odoo#267280 changed the Viva class to use the `getCashier` method to determine the `cashRegisterId`, however this method does not exist in self order, so an error is always thrown. This commit fixes the issue by simply adding a `?` so that it falls back to the POS config name. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects a bug in the Point of Sale cash rounding method (DOWN). Previously, the system incorrectly absorbed overpayments as rounding offsets, resulting in incorrect change calculations. This fix ensures accurate change calculations when using the DOWN cash rounding method.
Original PR description
With the DOWN cash rounding method, `asymmetricRound` used `this.isNegative(a)` to decide whether to invert the rounding direction. `isNegative` internally applies the configured method before comparing. This caused `asymmetricRound` to return 0 for genuinely negative remainders, making `appliedRounding` absorb the full overpayment as a rounding offset and zeroing out the change. opw-6268670 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#268272
This update fixes a restriction that prevented invoicing users from accessing necessary data within the PDP reporting flows. Now, invoice views can read these flows, allowing for accurate evaluation of e-reporting fields and buttons. This ensures invoicing users have the complete information they need.
Original PR description
Allow invoicing users to read PDP reporting flows. Invoice views can read PDP flow relations to evaluate e-reporting-related fields or buttons. Users with invoicing access could open the invoice but were blocked when Odoo tried to read the linked PDP flow. runbot.build.error-939457 Forward-Port-Of: odoo/odoo#268462
This update resolves a problem where sorting fiscal positions based on company specificity could cause errors when accessing company data. The fix ensures that company data is accessed securely, preventing access errors related to user permissions and child company relationships. This improves the stability and reliability of fiscal position sorting.
Original PR description
_get_first_matching_fpos() sorts fiscal positions by company specificity using `f.company_id.parent_ids`. The `parent_ids` field on `res.company` is compute_sudo=True, but `convert_to_record` still builds the resulting recordset in the caller's environment and then calls `filtered('active')` on it. When the fiscal position belongs to a child company whose parent is outside the current user's allowed companies, reading `active` on the parent company record raises an AccessError.
opw-6266568
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#267747This update resolves a problem where users accessing archived documents through certain methods (like widgets or direct URLs) would incorrectly display a 'not found' message. This fix ensures that archived documents are correctly opened, improving the user experience and preventing frustration. It's a follow-up to previous related improvements.
Original PR description
When a user tries to access an archived document via * a many2one widget * `/odoo/documents.document/<id>` * a discuss notification they end up in "All" with a toast specifying that the document was not found. Follow-up of Task-6068437 (follow up of Task-5386466). Task-6214488 Forward-Port-Of: odoo/enterprise#119463 Forward-Port-Of: odoo/enterprise#117229
This update fixes an issue where a bank transaction creation process would unexpectedly crash when encountering an error. The fix ensures the quick create form is properly closed and the error is displayed, preventing data loss and improving the user experience. This enhances stability and reliability for bank transaction management.
Original PR description
**Problem:** When an error is thrown upon creating a bank transaction in the kanban view, a traceback occurs due to trying to access the quickCreateState which does not exist in this context (`this` = BankRecQuickCreateController). **Steps to Reproduce:** - Force the suspense account of the bank journal to be False - Go to bank transactions of that journal in kanban view and try to create a new transaction -> Traceback **Solution:** The expected behavior is for the quick create to be closed, then throw the error. Therefore, onCancel() can be called before throwing the error. opw-6186901 Forward-Port-Of: odoo/enterprise#118842
This update fixes a technical issue where email notifications within the gamification eLearning app were unintentionally revealing the identities of all participants to each other. The change removes a header that exposed user details, ensuring only intended recipients receive notifications and preventing unwanted visibility. This enhances user privacy and data security.
Original PR description
**Steps to reproduce:** - Install eLearning app with gamification - Go to Settings > Gamification Tools > Challenges - Set a challenge with multiple participants (portals / internals) - Set its state…
**Steps to reproduce:** - Install eLearning app with gamification - Go to Settings > Gamification Tools > Challenges - Set a challenge with multiple participants (portals / internals) - Set its state to Done - Notification email is sent to every participants - They can see each other in the mail header (portal user can see all other portal users, internal user can see all portal users) **Issue:** Since [1] external recipients are added in the mail header, but this is not adequate for every flows (here there is no need for the participants to be aware of each other). **Fix:** In [2] this issue was mitigated by removing the `'X-Msg-To-Add'` from the header for models which don't need it. Then in [3] the solution was replaced by a more generic approach using `_CUSTOMER_HEADERS_LIMIT_COUNT = 0`. [1] https://github.com/odoo/odoo/commit/42aaaef59d21558438c767c6dd8a21674e5df9df [2] https://github.com/odoo/odoo/commit/e6c13ce4436b3c8b3a2058d2ccf65a7da1b256b2 [3] https://github.com/odoo/odoo/commit/c4dbd868b9c7e26f11db4d2cacef7ffce6c87082 opw-6099745 Forward-Port-Of: odoo/odoo#267192
This update fixes an issue where the Balance Sheet report export was incorrectly including all accounts instead of the selected one when using the date filter. The fix removes a filtering step that was unintentionally introduced, ensuring the report accurately reflects the user's chosen account selection. This improves the reliability of financial reporting.
Original PR description
Steps: - Open Balance Sheet report and unfold lines - Open the General Ledger from a line with an account - On GL report, change date filter - Export XLSX report -> We export all accounts instead of the one selected in the search bar Cause: Since f8dceec74e44ffe4aef67655be8811c96da91eba we filter out the filter if a default account is defined in the context which is the case in the `caret_option_open_general_ledger` method Fix: Remove the filtering as the behavior that was fixed by the mentioned commit does not happen anymore. opw-6234427 Forward-Port-Of: odoo/enterprise#119315 Forward-Port-Of: odoo/enterprise#119156
This update resolves an issue where enabling the 'Sales Credit Limit' setting caused access errors when creating new users. The problem stemmed from a default value being incorrectly applied to a restricted field due to inheritance in the system's data structure. This fix ensures proper access controls are enforced during user creation.
Original PR description
# How to reproduce - Install the Accounting module - In the settings, enable "Sales Credit Limit" - Remove the Accounting access rights of the current user - Try to create a new user # The issue An…
# How to reproduce - Install the Accounting module - In the settings, enable "Sales Credit Limit" - Remove the Accounting access rights of the current user - Try to create a new user # The issue An access error is raised on the field `credit_limit` # Cause Enabling the "Sales Credit Limit" setting will create an `ir.default` for the `credit_limit` field. This field is restricted to a specific group : https://github.com/odoo/odoo/blob/e3b0ca11d99b2ef819cdad68b169112cd73668b6/addons/account/models/partner.py#L515-L518 When creating a record, we check field permissions before adding default values, so the creation of the user is fine. However, since `res.users` inherits from `res.partners`, a new partner will also be created, but this time with the default values in `vals_list`, which will trigger an access right error. # Proposed solution Back port of this commit : https://github.com/odoo/odoo/pull/267193 Access right checks when creating a record were introduced in 18.3 by : https://github.com/odoo/odoo/commit/15132342960df76fcefd3284a9eff2d4d3273150 opw-6240494 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#268303 Forward-Port-Of: odoo/odoo#268039
4 changes
Enhancements to existing features
This update simplifies VAT reporting for Odoo users in Norway. The default VAT periodicity has been set to bi-monthly (every 2 months), aligning with the standard reporting frequency used in Norway. This change reduces the administrative burden for Norwegian businesses using the Odoo Enterprise system.
Original PR description
Set the default VAT periodicity for Norwegian companies to every 2 months, aligning with the most commonly used reporting frequency in Norway. task-6209940 Forward-Port-Of: odoo/enterprise#117054
Resolved issues and error corrections
This update resolves an issue where users were blocked from uploading documents to requests linked to records they didn't have full access to. By adding a '.sudo()' function to the attachment creation process, users can now upload documents regardless of their access rights to the associated record, improving usability and workflow efficiency.
Original PR description
Issue: Users are currently blocked from uploading requested documents if the request is linked to a record they do not have access to (e.g., User A links Record X to a request assigned to User B, but User B lacks read/write access to Record X). The system throws an error because the user cannot create an attachment for that record. Fix: Add .sudo() on the attachment creation process. task-6107099 Forward-Port-Of: odoo/enterprise#113698
This update fixes an issue where the 'Cancel Reason' wasn't being properly transmitted to the Peruvian EDI (SUNAT) documents when reversing invoices. Now, the credit note generated accurately reflects the user-specified cancellation reason, ensuring compliance with Peruvian tax regulations. This improves data accuracy and reporting for Peruvian businesses using Odoo.
Original PR description
### Issue before this commit: When reversing an invoice in a Peruvian company, the "Cancel Reason" entered in the credit note window is not propagated to the Peruvian EDI tab of the resulting Credit…
### Issue before this commit: When reversing an invoice in a Peruvian company, the "Cancel Reason" entered in the credit note window is not propagated to the Peruvian EDI tab of the resulting Credit Note. Only the Credit Reason is successfully reported. ### Steps to reproduce the issue: 1. Download Accounting and l10n_pe 2. Switch to PE company 3. Create an invoice and confirm it 4. Create a credit note for the invoice with a cancel reason and a credit reason and click the reverse button 5. See that in the Peruvian EDI tab only the Credit Reason is reported but not the Cancel Reason ### Cause of the issue: In the l10n_pe_edi module, the override of the _prepare_default_reversal method maps the l10n_pe_edi_refund_reason to the new move's values, but completely omits the mapping of the wizard's textual reason field to the l10n_pe_edi_cancel_reason field of the resulting credit note. ### Reason to introduce the fix: To ensure the generated credit notes contain all required information for the Peruvian EDI (SUNAT). Mapping the cancel reason guarantees that the electronic document accurately reflects both the refund code and the descriptive cancellation text provided by the user. opw-6238525 Forward-Port-Of: odoo/enterprise#118479
This update resolves an issue where cancelled journal entries were incorrectly showing in the reconciliation view, preventing successful reconciliation and causing data inconsistencies. The fix removes a previous refactor that allowed draft entries, ensuring cancelled entries are now properly excluded from reconciliation processes.
Original PR description
Issue: Cancelled journal entries were visible in the "Journal Items to Reconcile" view (action_move_line_posted_unreconciled) because the action domain had no filter to exclude them. This caused…
Issue: Cancelled journal entries were visible in the "Journal Items to Reconcile" view (action_move_line_posted_unreconciled) because the action domain had no filter to exclude them. This caused reconciliation failures, no reconciliation happened, and the cancelled record remained in the view. This regression was introduced during a refactor to allow draft entries in the reconciliation view, where the posted-state condition was removed from the domain: Enterprise commit: https://github.com/odoo/enterprise/commit/003cffabda7d91a6d10d58942ed972ca5e17366d As a result, cancelled journal items also became visible, causing reconciliation attempts to fail while the records remained in the view. Also, we are not allowed to reconcile cancelled move lines, and we already have the validation for this [here](https://github.com/odoo/odoo/blame/a236f67776616f6facdefb0117a6ffdde9b7c84c/addons/account/models/account_move_line.py#L2627) Issue is reproducible on runbot. Here is the video reference: https://drive.google.com/file/d/1ojIDxHn5Yst8gVFy8JyhwtJoDSSSJsmK/view?usp=sharing - OPW: 6247870 Forward-Port-Of: odoo/enterprise#118843 Forward-Port-Of: odoo/enterprise#118773
11 changes
Enhancements to existing features
This update implements webhooks for Peppol documents within the French localization (l10n_fr_pdp) module. This was previously missing in the 18.0 release and is now enabled through integration with the IAP platform, ensuring compliance with French tax regulations. It improves data exchange efficiency for French business operations.
Original PR description
We did not have webhooks in 18.0 for Peppol and we did not have time to implement / test it during the FW-porting. This commit adds the route on community side that is called from IAP. task-None IAP PR: https://github.com/odoo/iap-apps/pull/1639
This update improves the DEP7 export process by switching from PDF to JSON files, aligning with regulatory requirements for German tax reporting (BMF/RKSV). The new JSON format is machine-readable and optimized for compatibility with official BMF tools, ensuring accurate and compliant data submissions.
Original PR description
In this commit: ------------------- - Updated the DEP7 export to generate a zip with JSON files instead of PDF, in compliance with BMF (RKSV) requirements. - The export now produces a valid JSON document containing the machine-readable data expected by the official BMF tools. - The filename format has also been adjusted to follow common conventions (e.g. `Name_Duration_DEP_KassenID.json`). Task: 6071034
This update introduces a new button to streamline the process of reregistering accounts between Peppol and PDP for French users. This change addresses a previous issue during testing where the demo company's settings were incorrectly configured, causing problems with the reregistration flow. It improves usability and ensures a smoother transition for users managing their PEPPOL accounts.
Original PR description
#### [IMP] l10n_fr_pdp: fix visibility for peppol (non-PDP) #### [IMP] account_peppol,l10n_fr_pdp: reregister This commit adds a button so that users can reregister more easily. This is i.e. useful to switch from Peppol to PDP for French users. #### meta task-6265603 Forward-Port-Of: odoo/odoo#267946
Resolved issues and error corrections
This update resolves an issue where users in Peru couldn't generate Closing Entries after the introduction of the Tax Returns feature. The fix creates a specific Peruvian tax report variant, ensuring the correct VAT closing workflow is triggered and users are prompted to configure tax accounts.
Original PR description
### Issue Since the introduction of the Tax Returns feature in 18.3, it was no longer possible to generate a Closing Entry as the button has been replaced by Returns The Return mechanism implies that…
### Issue Since the introduction of the Tax Returns feature in 18.3, it was no longer possible to generate a Closing Entry as the button has been replaced by Returns The Return mechanism implies that you need a Return Type in order to make a Closing Entry using the Validate button Additionally, using the Generic Tax Report by default creates a risk in Multi-VAT environments, as it mixes taxes from all countries instead of isolating Peruvian taxes ### Cause The new 18.3 accounting workflow requires at least one active Return Type associated with a country-specific report variant to display the Return options and process the closing entry Peru was relying on the Generic Tax Report, without a dedicated report variant No Return Type was configured, which blocked Odoo's automatic VAT closing workflow and prevented the system from prompting the user to configure the required closing accounts ### Steps to reproduce - Install `l10n_pe_reports` and `accountant` - Switch to a PE Company - Go to the Tax Report Before the fix, no Returns button is available for any of the existing reports, making it impossible to use Odoo's automatic process to configure the tax accounts and trigger the closing entry ### Notes This is fixed by creating a dedicated Peruvian tax report variant directly in Enterprise that inherits from the generic tax report A custom handler is added to force the domain filtering on Peruvian taxes only, and a corresponding Return Type is defined to restore the full closing entry process safely opw-5978673
This change corrects a recent issue that prevented users from adding certain products to sales orders when using a mobile device. Specifically, it removes a restriction on product domains, now allowing users to add products with `sale_ok=False` and non-rental products to rental orders. This improves usability and flexibility for mobile sales operations.
Original PR description
This commit reverts 6e8a2d9c2d80044f6ee33c96871accf0aa83f4eb which introduce regression by ignoring product domain from `_domain_product_id`. Due to this issue, you can add products with `sale_ok=False` in SOL using a phone. Also you could add non-rental product in rental orders. opw-6218312
This update fixes a bug where the 'Cancel Reason' wasn't being properly transmitted when reversing invoices in Peruvian companies. Now, the credit note generated for the reversal will include the user-specified cancellation reason, ensuring accurate reporting to the Peruvian tax authority (SUNAT) and compliance with regulations.
Original PR description
### Issue before this commit: When reversing an invoice in a Peruvian company, the "Cancel Reason" entered in the credit note window is not propagated to the Peruvian EDI tab of the resulting Credit…
### Issue before this commit: When reversing an invoice in a Peruvian company, the "Cancel Reason" entered in the credit note window is not propagated to the Peruvian EDI tab of the resulting Credit Note. Only the Credit Reason is successfully reported. ### Steps to reproduce the issue: 1. Download Accounting and l10n_pe 2. Switch to PE company 3. Create an invoice and confirm it 4. Create a credit note for the invoice with a cancel reason and a credit reason and click the reverse button 5. See that in the Peruvian EDI tab only the Credit Reason is reported but not the Cancel Reason ### Cause of the issue: In the l10n_pe_edi module, the override of the _prepare_default_reversal method maps the l10n_pe_edi_refund_reason to the new move's values, but completely omits the mapping of the wizard's textual reason field to the l10n_pe_edi_cancel_reason field of the resulting credit note. ### Reason to introduce the fix: To ensure the generated credit notes contain all required information for the Peruvian EDI (SUNAT). Mapping the cancel reason guarantees that the electronic document accurately reflects both the refund code and the descriptive cancellation text provided by the user. opw-6238525 Forward-Port-Of: odoo/enterprise#118479
This update fixes a display issue where the 'Out of Office until...' date in team discussions was incorrectly showing the previous day when users were in negative timezones. The fix ensures the date is always displayed in UTC, resolving the timezone conversion problem and providing accurate leave information.
Original PR description
Issue: ---------------------------------------- When in a negative timezone, the "Out of Office until..." text in discuss shows the day before. Steps to reproduce:…
Issue: ---------------------------------------- When in a negative timezone, the "Out of Office until..." text in discuss shows the day before. Steps to reproduce: ---------------------------------------- - Change the timezone of the user to "America/Toronto" for example - Have an employee currently on leave until tomorrow - Open discuss to chat with this employee - The "Out of Office until..." shows today's date Cause: ---------------------------------------- When calling `toLocaleString()` without a timezone specified in the options, the date is converted to local time (in the browser's timezone). Here `persona.out_of_office_date_end` is just a date, `deserializeDateTime()` converts it to a timestamp, so the same day at 0am. Then if the timezone is negative, the timestamp becomes an hour the previous day when calling `toLocaleString()`. The format we give `DateTime.DATE_MED` doesn't include hours, so we just display the previous date. Solution: ---------------------------------------- Add `timeZone:"UTC"` in the options to avoid the timezone conversion. opw-6252040 Forward-Port-Of: odoo/odoo#267677 Forward-Port-Of: odoo/odoo#267479
This update resolves an issue where invoices generated from the Odoo website's e-commerce orders were incorrectly configured to generate CFDI (Mexican electronic invoicing) publicly. The change ensures that invoices are only CFDIed publicly when the customer provides all necessary information, streamlining the process and aligning with business requirements.
Original PR description
There is no reason why we would always cfdi to public when creating orders from the e-commerce. When the customer give all their info, the invoice should not be cfdi to public. opw-6180766 Forward-Port-Of: odoo/enterprise#119171 Forward-Port-Of: odoo/enterprise#116061
This update fixes a bug that prevented the system from properly importing discounts applied to vendor bills when those bills are generated using the KSeF (Polish e-Invoice) system. The change ensures that discount information, indicated by a specific XML node, is now correctly processed during the import, leading to accurate billing data. This improves compliance with Polish tax regulations.
Original PR description
When fetching vendor bills from KSeF, the XML node "P_10" is used to indicate a discount per unit on a line. This node is currently being ignored when parsing the file. Official documentation: https://ksef.podatki.gov.pl/media/gn2kt4gl/broszura-informacyjna-struktury-logicznej-e-faktury-fa-1-wersja-anglojezyczna.pdf opw-6235460 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#267235
This update resolves an issue where invoicing users were unable to access related PDP flow data. By allowing invoicing users to read these flows, the change enables them to properly display and utilize e-reporting-related fields and buttons within invoices. This improves the functionality for invoicing processes.
Original PR description
Allow invoicing users to read PDP reporting flows. Invoice views can read PDP flow relations to evaluate e-reporting-related fields or buttons. Users with invoicing access could open the invoice but were blocked when Odoo tried to read the linked PDP flow. runbot.build.error-939457 Forward-Port-Of: odoo/odoo#268462
This update resolves an issue where participant emails were unintentionally revealed in notification emails within the gamification eLearning app. The fix prevents users from seeing each other's email addresses, enhancing privacy and user experience. This ensures compliance with data protection policies.
Original PR description
**Steps to reproduce:** - Install eLearning app with gamification - Go to Settings > Gamification Tools > Challenges - Set a challenge with multiple participants (portals / internals) - Set its state…
**Steps to reproduce:** - Install eLearning app with gamification - Go to Settings > Gamification Tools > Challenges - Set a challenge with multiple participants (portals / internals) - Set its state to Done - Notification email is sent to every participants - They can see each other in the mail header (portal user can see all other portal users, internal user can see all portal users) **Issue:** Since [1] external recipients are added in the mail header, but this is not adequate for every flows (here there is no need for the participants to be aware of each other). **Fix:** In [2] this issue was mitigated by removing the `'X-Msg-To-Add'` from the header for models which don't need it. Then in [3] the solution was replaced by a more generic approach using `_CUSTOMER_HEADERS_LIMIT_COUNT = 0`. [1] https://github.com/odoo/odoo/commit/42aaaef59d21558438c767c6dd8a21674e5df9df [2] https://github.com/odoo/odoo/commit/e6c13ce4436b3c8b3a2058d2ccf65a7da1b256b2 [3] https://github.com/odoo/odoo/commit/c4dbd868b9c7e26f11db4d2cacef7ffce6c87082 opw-6099745 Forward-Port-Of: odoo/odoo#267192
1 change
Resolved issues and error corrections
This update resolves an issue where users were blocked from uploading documents to requests linked to records they didn't have full access to. By adding a special permission bypass, users can now upload documents regardless of their direct access rights to the related record, improving workflow efficiency.
Original PR description
Issue: Users are currently blocked from uploading requested documents if the request is linked to a record they do not have access to (e.g., User A links Record X to a request assigned to User B, but User B lacks read/write access to Record X). The system throws an error because the user cannot create an attachment for that record. Fix: Add .sudo() on the attachment creation process. task-6107099 Forward-Port-Of: odoo/enterprise#113698
13 changes
Enhancements to existing features
This update streamlines the import of invoices by introducing a generic reload flow. The system now intelligently prioritizes structured XML attachments over OCR-processed versions, ensuring data accuracy and efficiency. This change improves the reliability of invoice data within the system.
Original PR description
The account module now provides a generic reload flow for imported invoices. Keep the OCR-specific reload data behavior for invoices which must be handled by OCR, while letting invoices with regular imported source attachments fall back to the generic account reload flow. task-6159853 ----------------------------------------------------------------------------------------------------------------- In case there is a structured attachment like xml whether it's the original imported attachment or an embedded one, disable the OCR logic as structured attachments are 100% accurate and don't require digitization tokens so we should always prefer them, for example if the uploaded file is an xml having a pdf as an embedded attachment or the uploaded is a pdf having an xml as an embedded attachment then in both cases we will prefer the xml. task-6158911
Resolved issues and error corrections
This update corrects a bug in the appointment Gantt view that caused new bookings to default to midnight instead of the intended start time. The fix replaces a mistaken override with the correct method, ensuring accurate booking start times are used.
Original PR description
The [commit] replaced the `onAddClicked` method with `_onNewClicked`, and updated all related calls and overrides accordingly. However, the appointment Gantt view override was mistakenly changed to override a non-existent `_onAddClicked` method, leaving the custom logic unused. As a result, bookings created through the `New` button in the Gantt view used midnight (12:00 AM) instead of the time derived from the custom logic as the default start datetime. This commit fixes the issue by correctly overriding `_onNewClicked`. [commit]: https://github.com/odoo/enterprise/commit/bc779c9ec5295f8d1fe06e8432c518c78c606ea2 Forward-Port-Of: odoo/enterprise#118799
This update resolves an issue where inserting a prompt banner using the `/prompt` command wouldn't allow users to undo the banner's creation. The fix ensures that undo functionality correctly removes prompt banners, improving usability and preventing unexpected content.
Original PR description
Problem: After inserting a prompt banner, undo does not remove it. Cause: History commands were ignored when the selection was inside the prompt banner, preventing undo from handling banner insertion. Solution: Handle history commands even when the selection is inside the prompt banner. Steps to reproduce: - Insert a prompt banner using `/prompt` + Enter. - Press Ctrl + Z. - Observe that the banner is not removed. task-6230530 Forward-Port-Of: odoo/enterprise#118248 Forward-Port-Of: odoo/enterprise#117845
This update fixes an issue where check amounts weren't being properly rounded in the Philippines (PH) version of Odoo. Previously, the check amount in words displayed with a decimal component and 'ONLY'. Now, the decimal is rounded, ensuring accurate check formatting and compliance with PH regulations.
Original PR description
Current behaviour: --- When paying with checks, the amount is not rounded in the check amount in words string. Steps to reproduce: --- 1. Switch to PH company 2. Set setting Check Layout as "Print Check - PH" 3. Create a new vendor bill 4. Add a product with a specific price like 91490.15 5. Confirm the bill, click on Register Payment 6. Select Payment Method "Checks", Create Payment 7. Go to the payment, Amount in Words is wrong 8. Ninety-One Thousand Four Hundred Ninety And 15000000001/100 ONLY Expected behaviour: --- The decimal amount should be rounded, and "ONLY" shouldn't appear. Fix: --- Rounded the pay amount And backported: https://github.com/odoo/enterprise/commit/bb6c9848665709c14c5113b2c98976f869cd473b opw-6058344 Forward-Port-Of: odoo/enterprise#117679 Forward-Port-Of: odoo/enterprise#116717
This update resolves an issue where the company's XBRL reports were failing validation by the NBB due to missing data disclosures. The changes add the necessary disclosures, ensuring reports pass validation and comply with regulatory requirements. This prevents potential delays or errors in report submission.
Original PR description
This commit adds missing explanatory disclosure datapoints to the generated XBRL report. The missing disclosures resulted in failing validation when report is submitted to NBB. The datapoints are only added if the original value was non-zero. For example, the tangible assets disclosures are only added if the tangible assets in balance sheet is non-zero. Additionally, only disclosures that were reported as causing a failing validation were added. task-5977199 Forward-Port-Of: odoo/enterprise#117853
This update corrects a bug that prevented quality checks from running correctly when a product's manufacturing operations were modified. The change adjusts how the system handles lot references, ensuring compatibility with recent Odoo updates. This resolves an error related to invalid data and improves the reliability of the quality control process.
Original PR description
## Steps to reproduce: - Install the `quality_mrp` module. - Create a new product. - Create a Quality Point with: Type: Measure, Control per: Product/Operation Operations: Manufacturing - Create and…
## Steps to reproduce: - Install the `quality_mrp` module. - Create a new product. - Create a Quality Point with: Type: Measure, Control per: Product/Operation Operations: Manufacturing - Create and confirm MO for the product. - Update the Quality Point: Remove the 'manufacturing' operation type and add 'receipts' type. Change Control per to 'Quantity'. - Open the MO and start a quality check. - Enter an invalid measure and try to validate it. ## Error: `AttributeError - 'mrp.production' object has no attribute 'lot_producing_id'` ## Cause: Since commit https://github.com/odoo/odoo/commit/4bb4e08066449177f89382718ceadd840ce90d0e, the `lot_producing_id` field on MO was replaced by the Many2many field `lot_producing_ids`. Invalid references to the removed field lead to an error. ## Fix: This commit uses the first lot/serial from the MO. Note: Multiple produced lots are only possible for serial-tracked products. sentry-7511513479 Forward-Port-Of: odoo/enterprise#119231
A recent update incorrectly removed filtering during automatic Stripe expense reconciliation, causing all expense lines to be incorrectly reconciled. This fix ensures that only the relevant transaction lines are reconciled, resolving a critical issue with Stripe expense reporting and preventing inaccurate financial records.
Original PR description
In 1f6f4ee3, the account reconciliation filtering was removed from the automatic reconciliation. This broke the reconciliation as all lines would be taken into the reconciliation after-hand Steps to reproduce: - Install `hr_expense_stripe_demo` - Create a Stripe account in the settings - Refresh the account status until validated - Top-up the account in the accounting dashboard - Create a virtual card and activate it - Simulate a transaction with capture - Submit the expense created after checking it has at least one tax - Approve and post the expense - Check the reconciled transaction in the stripe journal - All the lines of the expense move have been reconciled Forward-Port-Of: odoo/enterprise#119269
This update resolves an issue where users were blocked from uploading documents to requests linked to records they didn't have full access to. By adding a '.sudo()' function to the attachment creation process, users can now successfully upload documents, regardless of their access rights to the related record. This improves usability and ensures requests can be properly documented.
Original PR description
Issue: Users are currently blocked from uploading requested documents if the request is linked to a record they do not have access to (e.g., User A links Record X to a request assigned to User B, but User B lacks read/write access to Record X). The system throws an error because the user cannot create an attachment for that record. Fix: Add .sudo() on the attachment creation process. task-6107099 Forward-Port-Of: odoo/enterprise#113698
This update fixes an issue where payments for Mexican invoices were being sent to CFDI multiple times, leading to inaccurate reporting. The fix ensures the 'Update Payments' button only appears after the full invoice payment is reconciled, preventing duplicate submissions and maintaining accurate financial records.
Original PR description
Issue: Sending payments to SAT before its full amount is reconciled allow sending the same invoice payment several times to CFDI. Steps to reproduce: - In a Mexican company - Create an invoice A of…
Issue: Sending payments to SAT before its full amount is reconciled allow sending the same invoice payment several times to CFDI. Steps to reproduce: - In a Mexican company - Create an invoice A of $40 to Inmobiliaria CVA - Confirm and send to CFDI - Go to bank, create a new Bank transaction of $80 - reconcile with Invoice A - Go to invoice A => click on button "Update payments" (it doesn't appear in previous versions) - Then sheet CFDI and Download There is the first XML sent to CFDI with payment for invoice A - Create an invoice B of $40 to Inmobilira CVA - Confirm and send to CFDI - reconcile the transaction with Invoice B - Go to invoice B - Click on button "Update payments" - Then sheet CFDI and Download There is the second XML sent to CFDI with payment for invoices A and B Invoice A payment was sent twice to CFDI Expected behavior: - The "Update payment" button should appear only once the invoice payment is fully reconciled. Current behavior: - The update payment button appear once the invoice is reconciled with a payment. The method `_l10n_mx_edi_cfdi_invoice_get_payments_diff` is called twice, once to check whether it's needed to display the "Update button" and once when you try to update the payment (called only after clicking on said button). opw-5432421 Forward-Port-Of: odoo/enterprise#119244 Forward-Port-Of: odoo/enterprise#108355
This update fixes a calculation error in the Canadian Profit and Loss report. Previously, operating expenses were incorrectly added to gross profit, leading to inaccurate Net Operating Income figures. Now, the report correctly calculates Net Operating Income as Gross Profit minus Operating Expenses, ensuring accurate financial reporting.
Original PR description
Steps to reproduce: 1. Install the Accounting app with the Canadian localization (l10n_ca) 2. Open the Profit and Loss report 3. Review the Net Operating Income line Issue: The Net Operating Income value is incorrectly calculated; operating expenses are being added to gross profit instead of subtracted, producing an incorrect result. Expected behavior: Net Operating Income should equal Gross Profit - Operating Expenses opw-6265192 Forward-Port-Of: odoo/enterprise#119165
This update dynamically adjusts the number of pages processed when uploading PDFs to the AI chat feature. Previously, uploads were limited to 5 pages. Now, the system can handle larger documents, improving the efficiency of AI-powered conversations. This change ensures a smoother experience for agents and users.
Original PR description
Prior to this commit, when uploading a document (i.e. during a chat with an agent). Only a part of its pages would get parsed and sent to the API (5 pages). With this commit, the number of pages is made dynamic by the use of a new context key `ai_max_pdf_pages`. This variable is still set for the document autosorting features since it is not required to read the full document. Default value is None (no limit). Forward-Port-Of: odoo/enterprise#119452 Forward-Port-Of: odoo/enterprise#119338
Code cleanup and technical improvements
This update replaces `useState` with `proxy` across several Odoo addons (Owl3) to enhance stability and performance. This refactoring primarily impacts the web_enterprise, web_gantt, web_grid, and web_studio modules, ensuring a smoother user experience and more reliable operation.
Original PR description
In Owl3, uses of `useState` or replace with `proxy`. This commit changes all those uses for addons in the range [w..]. *: web_enterprise,web_gantt,web_grid,web_map,web_mobile,web_studio,web_studio_ai_fields,website_generator,website_helpdesk_forum,website_knowledge,whatsapp,
This update replaces a reliance on global website settings with a context-based approach, ensuring consistent website behavior across different Odoo environments (like CRON jobs). This change improves the stability and predictability of website-dependent features, resolving a potential issue with inconsistent website identification. The goal is to eliminate fallback mechanisms for a more robust system.
4 changes
Resolved issues and error corrections
This update resolves an issue where users were blocked from uploading documents to requests linked to records they didn't have full access to. By adding a temporary 'sudo' permission during the upload process, users can now successfully attach documents, improving workflow efficiency. This ensures requests can be properly documented regardless of user access levels.
Original PR description
Issue: Users are currently blocked from uploading requested documents if the request is linked to a record they do not have access to (e.g., User A links Record X to a request assigned to User B, but User B lacks read/write access to Record X). The system throws an error because the user cannot create an attachment for that record. Fix: Add .sudo() on the attachment creation process. task-6107099 Forward-Port-Of: odoo/enterprise#113698
This update resolves an issue where users would become locked out of the documents list view after editing a row and clicking away. The fix ensures the view correctly exits edit mode, allowing users to continue working without interruption. This improves usability and prevents data loss.
Original PR description
Problem: When a user selects a row, attempts to edit a cell, and then clicks away without saving, the view becomes unusable. The selected row remains highlighted, and the system prevents the selection of other lines. The user is locked out until they click the "Save" or "Discard" buttons. Cause: The UI becomes stuck in edit mode. The `onGlobalClick` event handler within `documents_list_renderer` was missing the method call to exit edit mode. Solution: Updated `onGlobalClick` to correctly trigger the method to leave edit mode. task-6059836 Forward-Port-Of: odoo/enterprise#119008 Forward-Port-Of: odoo/enterprise#113000
This update resolves a critical issue preventing CFDI (Mexican electronic invoice) stamping for payslips with IMSS incapacity leaves. The fix ensures the required 'ImporteMonetario' attribute is correctly included and the 'DiasIncapacidad' value is formatted as an integer, aligning with SAT regulations and preventing validation errors.
Original PR description
The Incapacidad node in the nomina 1.2 complement had two issues preventing CFDI stamping for payslips with IMSS incapacity leaves: 1. The ImporteMonetario attribute was missing entirely. This is a…
The Incapacidad node in the nomina 1.2 complement had two issues
preventing CFDI stamping for payslips with IMSS incapacity leaves:
1. The ImporteMonetario attribute was missing entirely. This is a
conditional attribute defined in the SAT XSD (nomina12.xsd) to
express the monetary amount of the incapacity. Without it, the
SAT rejects the CFDI with validation error NOM95:
'El atributo Deduccion:Importe no es igual a la suma de los
nodos Incapacidad:ImporteMonetario, ya que la clave expresada
en Nomina.Deducciones.Deduccion.TipoDeduccion es 006.'
2. The DiasIncapacidad attribute was rendered as a float (e.g. '11.0')
instead of an integer ('11'). The XSD defines it as xs:int with
minInclusive=1, so the float representation caused error 301
(XML mal formado).
Per the SAT filling guide, the ImporteMonetario value depends on
the context:
- Default: the amount comes from deduction 006 (Descuento por
incapacidad), which is the discount applied to the worker.
- Exception: when perception 014 (Subsidios por incapacidad) exists,
the amount comes from that perception instead, representing the
subsidy paid to the worker.
When neither deduction 006 nor perception 014 exist on the payslip,
the attribute is omitted (None) to comply with its conditional
nature in the XSD.This update fixes a limitation in how properties are exported from records when using Odoo's spreadsheet edition. Previously, sub-properties weren't supported. Now, support is added, but to maintain consistency with older versions, sub-properties are filtered out for the spreadsheet edition until version 19.2.
Original PR description
* = [documents_spreadsheet] When exporting properties from records in the web kanban and list views, sub-properties created within a record were previously not supported. Support for exporting these sub-properties has now been added. However, in spreadsheet this should only be enabled from saas-19.2 onwards (where it is already available). To keep the behavior aligned with the usual flow on earlier versions, this filters out the sub-properties exported from the record in `spreadsheet_edition`. community: https://github.com/odoo/odoo/pull/264267 task-6123524
13 changes
New functionality added to Odoo
This update enhances the Arabic localization (l10n_ar) module to seamlessly integrate with wsmtxca encryption. Previously, there were limitations in handling encrypted transactions within the Arabic accounting system. This change ensures proper processing and reporting of encrypted financial data, improving compliance and security.
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
Enhancements to existing features
This update introduces a new button to streamline the reregistration process for French users, particularly those transitioning between Peppol and PDP systems. It addresses a previous testing issue where changes to the demo company's Peppol settings caused problems during the reregistration flow. This enhancement improves usability and simplifies a key business operation.
Original PR description
#### [IMP] l10n_fr_pdp: fix visibility for peppol (non-PDP) #### [IMP] account_peppol,l10n_fr_pdp: reregister This commit adds a button so that users can reregister more easily. This is i.e. useful to switch from Peppol to PDP for French users. #### meta task-6265603
This update enhances the synchronization of point-of-sale (POS) transactions with Fiskaly, a key partner for German businesses. It separates retail and restaurant order flows, optimizing data transmission and ensuring accurate reporting by only sending updated product quantities during restaurant kitchen synchronization. This improves the reliability of financial data.
Original PR description
In this commit: ------------------ - Maintain separate Fiskaly transaction flows for retail (short tx) and restaurant (long tx) orders as discussed with the Fiskaly team. - `Initialize order transactions` with an empty payload when the `first product` is added. - Start `receipt transactions` with an empty payload when the `first payment line` is added. - For retail flows, no intermediate order updates are sent to Fiskaly before finalization. - For restaurant flows, create additional transaction updates during kitchen synchronization. Ensure already synchronized products are not resent, and only newly added or updated quantities are included in the payload. - `Finalize order and receipt transactions` with complete order lines and payment details when we validate the order. task: 6208963 Reference: <img width="1863" height="1285" alt="de_tss_flow" src="https://github.com/user-attachments/assets/9140788e-7948-4a08-9f11-27197b22ca8b" />
Resolved issues and error corrections
This update resolves inconsistencies in Odoo's lot valuation system when products are valued without assigned lots. Previously, discrepancies arose with negative lot quantities, but this fix now allows for negative lot valuations, enabling more flexible stock management. It ensures accurate valuation even when physical lot quantities don't perfectly match the valued amounts.
Original PR description
There have been multiple issues that happened when enabling/disabling lot valuation. Odoo is flexible with the reservation/consumption of lots on StockQuant without lots. This means that while your…
There have been multiple issues that happened when enabling/disabling lot valuation. Odoo is flexible with the reservation/consumption of lots on StockQuant without lots. This means that while your product is valued by lot/SN, you can still end up with a discrepancy between your lot quantity on hand and your lot quantity valued. You can be in a situation where you don't have any negative lots on hand, but the valuation shows the negative amount. If you tried to fix the discrepancy by setting the StockQuant to zero, you are blocked because a lot/SN is required. If you tried to disable the valuation by lot configuration, it was allowed (because no negative quants on hand), but the valuation remaining data would be broken. This PR aims to fix the methods '_svl_empty_stock' and '_svl_replenish_stock' by supporting negative lots. OPW-4888289 --- One way to break the lot valuation: https://github.com/user-attachments/assets/b5f0d8c5-d798-4110-9564-951d0be9dcc6 --- After this PR: - `_svl_empty_stock` simply set the valuation for the lot/product to 0, it's not an OUT/IN svl, and no need to call `_run_fifo` or `_run_fifo_vacuum` (perf++). - The user can enable/disable lot valuation with negative lots - When enabling the lot valuation, the lot valuation will be replenished even if the global quantity is 0. - The user can disable lot valuation when they have a quant without lot. - The user can NOT enable lot valuation when they have a quant without lot. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update strengthens the process for obtaining SIREN numbers used for KYC compliance in France. Previously, the system relied on a simple first nine digits of the company ID, which was unreliable for some users. Now, a validation helper method is implemented to ensure accurate SIREN data capture, improving the integrity of the French KYC process.
Original PR description
Currently we just take the first 9 numbers of the `company_id` and say it is the SIREN. On IAP we have some people who just seem to have put their company name. After this commit we use a helper method that does some simple validation at least. task-None
This update fixes a potential problem where users could accidentally trigger mass email campaigns without proper targeting, leading to unwanted spam. The change restricts the 'Retry' button's functionality when a mailing is linked to a marketing automation campaign, ensuring emails are sent according to campaign filters. A new test has been added to prevent future issues.
Original PR description
When a mailing is managed by a marketing automation campaign, its target domain is dynamically handled by the campaign's activities. If a user clicks the "Retry" button directly on the mailing…
When a mailing is managed by a marketing automation campaign, its target domain is dynamically handled by the campaign's activities. If a user clicks the "Retry" button directly on the mailing template, it bypasses the campaign filters and queues the mailing for the entire target model, causing unintended mass spam. This commit fixes the issue by: 1. Raising a UserError in `action_retry_failed` if the mailing is linked to marketing automation (`use_in_marketing_automation`). 2. Hiding the "Retry" button in the frontend view to prevent confusion. 3. Adding a unit test to ensure this edge case is caught in the future. Steps to reproduce: 1. Create a marketing campaign with a filter and an email activity. 2. Run the activity and ensure at least one email trace fails. 3. Open the mailing template via the "Templates" smart button. 4. Click the "Retry" button on the template form. 5. The mailing is placed in the standard queue, bypassing the domain and targeting all records of the underlying model. OPW-6220106 Forward-Port-Of: odoo/enterprise#119391 Forward-Port-Of: odoo/enterprise#118759
This update resolves a technical issue preventing the French Payroll (l10n_fr_pdp) module from functioning correctly. The fix involved adding a missing import statement, ensuring the module integrates properly with Odoo. This ensures accurate French tax reporting.
Original PR description
task-None
This update fixes an issue where DATEV exports incorrectly populated EU-specific fields for customers outside the European Union. The change ensures that the correct country information (`Land` field) is used for non-EU customers, aligning with DATEV's requirements and improving data accuracy. This ensures compliance and accurate reporting.
Original PR description
### Issue: In DATEV customer and supplier exports, partners outside the European Union still had the `EU-Land` and `EU-UStID` fields filled However, these fields must only be used for EU countries…
### Issue: In DATEV customer and supplier exports, partners outside the European Union still had the `EU-Land` and `EU-UStID` fields filled However, these fields must only be used for EU countries For non-EU countries, the `Land` field should be filled instead, and is required whenever the country is not Germany https://developer.datev.de/en/file-format/details/datev-format/format-description/debitorskreditors ### Cause: `_l10n_de_datev_get_partner_list` did not distinguish between EU and non-EU countries As a result, any partner with a VAT number could populate `EU-Land` and `EU-UStID`, even if the country was outside the EU Greece also requires a special case: its VAT prefix is `EL` so the `EU-Land` too, while the country code used in `Land` must remain `GR` ### Steps to reproduce: - Install `l10n_de_reports` and switch to the DE company - Create a customer in Switzerland with a valid VAT number - Create and confirm an invoice for that customer - Go to Accounting → Audit Reports → General Ledger - Select the full year - From the gear menu, export DATEV DATA (zip) - Open the `EXTF_customer_accounts` file ### Before the fix: `EU-Land` and `EU-UStID` are filled for the Swiss customer, while `Land` is empty ### After the fix: `EU-Land` and `EU-UStID` are empty for non-EU countries such as Switzerland, while `Land` is correctly filled `Land` is filled using the following priority: 1. Partner country_code 2. Country extracted from the VAT number 3. Empty opw-5902565
This update resolves an issue where the website's menu system would unexpectedly close. By closing the extra menu before opening the main site menu, the system now operates more reliably, preventing errors and ensuring a consistent user experience. This improves the overall stability of the website.
Original PR description
[FIX] website: close the extra menu before opening site menu Update of the extra menu item is done multiple times (cfr `afterFontsloading`). If the extra menu item and the site menu were already open before an update of the extra menu item, the result is a close of the site menu. This can lead to undeterministic error. To solve the problem, the extra menu dropdown is closed before opening the site menu. runbot-240955 Forward-Port-Of: odoo/odoo#266376
This update enhances the accuracy of Afip invoice data transmission by automatically calculating default unit of measure values when product information is missing. This resolves a previous issue where invoices without products would fail Afip web service validation, ensuring compliance and smoother financial reporting. The changes also include a fix for handling UOM codes.
This update resolves an issue in the French VAT reporting module (l10n_fr_pdp) where data was incorrectly structured within XML files. The fix ensures that data is properly nested as a child node, preventing errors in VAT calculations and reporting. This ensures accurate VAT reporting for French businesses using the Odoo system.
Original PR description
'Content' was set as an attribute of 'IncludedNote' instead of a child node. See ppf messages 164, 166 & 168
This update resolves an issue where reloading the Point of Sale (POS) system could cause data loss and errors. The fix prevents a race condition between sending a beacon and initiating a new web request, ensuring a smoother and more reliable POS reload experience. This improves overall system stability and user experience.
Original PR description
When the user reloads the POS while the session is in opening_control, the beforeunload sendBeacon and the new pos_web request race. If the beacon is processed first it deletes the session and load_data fails. task-6259527 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update prevents the KSeF vendor bill cron job from failing when encountering a single invalid XML file. Instead, errors are logged, and the process continues to successfully create valid invoices from the batch, improving reliability and preventing data loss.
Original PR description
Description of the issue/feature this PR addresses: Issue: When downloading vendor bills from KSeF via the cron, the system attempts to parse the XML files sequentially. If a single XML file is…
Description of the issue/feature this PR addresses: Issue: When downloading vendor bills from KSeF via the cron, the system attempts to parse the XML files sequentially. If a single XML file is missing something that is expected, the parser raises a UserError. This unhandled exception halts the entire cron job and rolls back the database transaction, clogging up the rest of the queue. Solution: This PR wraps the l10n_pl_edi_get_ksef_bill_vals_from_xml parsing step inside a try/except block within the batch download loop. If a UserError is encountered for a specific invoice, the error is logged as a warning, and the cron proceeds. Current behavior before PR: A single malformed XML file causes the cron to fail completely. Valid invoices in the same batch are not created due to the halted queue. Desired behavior after PR is merged: The cron successfully processes the batch of downloaded XMLs even if one or more files are invalid. Errors on specific invoices are logged for the user to investigate, while the rest of the valid vendor bills in the batch are succesfully created. opw-6218288 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
9 changes
Resolved issues and error corrections
This update corrects an issue in the l10n_lu_reports module that caused incorrect balance sheet reports due to incorrect values in XML fields. Specifically, fields 2955 and 2956 must be set to zero, as dictated by eCDF regulations. Fixing this ensures reports are accepted by the eCDF system, preventing rejection and maintaining accurate financial reporting.
Original PR description
Before this commit, fields 2955 and 2956 in the balance sheet could be incorrect. 2955 must always be blank (not exist) and 2956 must always be 0 per: https://ecdf-developer.b2g.etat.lu/ecdf/forms/popup/CA_PLANCOMPTA/2020/en/2/rules page 116 + 117 If they are not these values specifically, submitting the XML to eCDF results in the report being rejected. Steps to reproduce: - Install l10n_lu_reports - Create a journal entry for a closed year (2025) that debits account 142000 and credits another account that starts with a 1 - Go to the balance sheet for 2025 - Download the XML for the report - 2955 is present and 2956 is either not present or is not 0 (behavior varies between versions) Ticket [link](https://www.odoo.com/odoo/project.task/6246564) opw-6246564
This update significantly speeds up the process of synchronizing participants with marketing campaigns. By optimizing a key function, the time taken to update campaign lists has been reduced dramatically – from over 51 seconds to just 0.65 seconds. This improvement will enhance the responsiveness of campaign management and improve user experience.
Original PR description
Replace search_read with search_fetch to avoid unnecessary _read_format call in backend context. Use OrderedSet instead of a custom _uniquify_list helper to get O(1) membership tests when computing records to add or remove from campaigns. Benchmark on a campaign with 115k participants: | Before PR | After PR | |:---------:|:--------:| | 51.71s | 0.652s | opw-6055334
This update resolves a technical problem that prevented PDFs from being correctly attached to invoices when using the Nilvera e-invoicing system. The change ensures compatibility with Python 3.14's stricter data validation rules, allowing the system to handle PDF files properly.
Original PR description
This commit resolves an error encountered when running on Python 3.14, which enforces stricter base64 validation. When adding a PDF to the invoice, the PDF is fetched using the Nilvera client. This client performs an HTTP request and returns a raw binary response, not a base64 representation. However, the Attachment interface handles raw binary data via the 'raw' field, whereas the 'datas' field strictly expects base64-encoded values. runbot-938173
This update fixes a problem where Odoo's error messages related to translation files were unclear, making it difficult to identify the specific file causing the issue. Now, Odoo logs the exact path of the problematic translation file, significantly improving debugging and troubleshooting for translation errors. This enhances the overall stability and usability of the Odoo platform.
Original PR description
Description of the issue/feature this PR addresses: #184630 The error message is unclear as to which is the file containing the error. Current behavior before PR: Before this commit, Odoo would show a not helpful message like: [lang: es][format: po] This does not specify or help the developer to locate the file that contains the error. Desired behavior after PR is merged: After the commit, we correctly log the path of the file that raised the error. closes #184630 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where images in email marketing templates were stretched and distorted when paired with long text. The change removes unnecessary styling, ensuring images maintain their aspect ratio and fit naturally alongside the text, providing a cleaner and more professional email experience.
Original PR description
The media list snippet forces the image to fill the height of its row. The image column carries align-self-stretch and the image carries h-100, so when the text next to the image is longer than the…
The media list snippet forces the image to fill the height of its row. The image column carries align-self-stretch and the image carries h-100, so when the text next to the image is longer than the image is tall, the row grows to fit the text and the image is stretched to that height (and cropped through object-fit: cover). The longer the text, the more the image is distorted. Drop h-100 from the image and align-self-stretch from its column in the s_media_list snippet and in the mass_mailing_themes templates that reuse it. With no forced height the image keeps its natural aspect ratio and the row height follows its content, so the image is laid out next to the text instead of being stretched to match it. Steps to reproduce: 1. Open Email Marketing and create a new mailing. 2. Select the Blogging template for the mail body. 3. In a media item, replace the text next to an image with a very long paragraph. => The image is stretched and cropped to match the height of the text. Ticket [link](https://www.odoo.com/odoo/project.task/5117571) opw-5117571
This update resolves an issue where updating the extra menu caused the main website menu to unexpectedly close. By closing the extra menu before opening the site menu, the system now behaves consistently and avoids unpredictable errors. This ensures a smoother user experience for website visitors.
Original PR description
[FIX] website: close the extra menu before opening site menu Update of the extra menu item is done multiple times (cfr `afterFontsloading`). If the extra menu item and the site menu were already open before an update of the extra menu item, the result is a close of the site menu. This can lead to undeterministic error. To solve the problem, the extra menu dropdown is closed before opening the site menu. runbot-240955
This update optimizes how Odoo compiles QWeb templates, resulting in faster performance. The change addresses a performance issue introduced in Markupsafe version 2.1.4, specifically related to how it handles HTML tags, leading to significant speed improvements for template rendering.
Original PR description
Starting version 2.1.4 of markupsafe, they decided to adapt the striptags function to use in-python-loops instead of the original implemenation that relied on pre-compiled regex. A problem has been…
Starting version 2.1.4 of markupsafe, they decided to adapt the striptags function to use in-python-loops instead of the original implemenation that relied on pre-compiled regex. A problem has been spotted with qweb templates that used striptags with large inputs, which led to the investigation of this function and it was found that the old implementation is actually faster. The new implementation of markupsafe is O(N x M), where n is the number of tags and M being the length of the input string. The old regex approach does a single c-level scan to check the existence of the regex which is performing much better. The benchmark cases are in the form `<case_description>_<number_of_tags>`. We can see that the only cases where the current implementation is slightly faster is when there are no tags in the input which can be explained by the fact that the while loops will simply exit early. The time lost in the regex implementation is likely due to the deeper call stack to scan for the regex. Apart from that, the old implementation is consistently much more performant, for both small and large inputs. Benchmarks: | Case | Regex µs | Current µs | Speedup | |----------------------------------------|----------|--------------|----------| | plaintext_no_tags_50k_words | 2937.05 | 2795.78 | 0.95x ← current_implementation | | html_entities_only_no_tags_5k | 4843.88 | 4818.92 | 0.99x ← current_implementation | | comments_only_1k | 382.75 | 1985.56 | 5.19x ← regex_old_implementation | | comments_containing_tags_1k | 234.88 | 1243.65 | 5.29x ← regex_old_implementation | | comments_only_50k | 21047.84 | 21081024.01 | 1001.58x ← regex_old_implementation | | comments_containing_tags_50k | 13948.90 | 11301014.95 | 810.17x ← regex_old_implementation | | short_tags_5k | 915.32 | 28235.99 | 30.85x ← regex_old_implementation | | short_tags_20k | 3603.37 | 876001.98 | 243.11x ← regex_old_implementation | | short_tags_50k | 10648.04 | 9064394.50 | 851.27x ← regex_old_implementation | | nested_divs_1k_deep | 148.99 | 880.14 | 5.91x ← regex_old_implementation | | nested_divs_10k_deep | 1730.14 | 54162.25 | 31.31x ← regex_old_implementation | | tags_with_many_attrs_2k | 1165.15 | 16554.24 | 14.21x ← regex_old_implementation | | tags_with_many_attrs_20k | 12659.77 | 7297957.10 | 576.47x ← regex_old_implementation | | multiline_tags_20k | 10227.63 | 5476065.12 | 535.42x ← regex_old_implementation | | mixed_comments_with_tags_text_2k | 309.79 | 3034.69 | 9.80x ← regex_old_implementation | | mixed_comments_with_tags_text_10k | 1593.39 | 79993.58 | 50.20x ← regex_old_implementation | This PR is needed because requirements.txt in Odoo specifies the following dependency: MarkupSafe==2.1.5 ; python_version >= '3.12' \# (Noble) This means that all versions running Ubuntu Noble, will be having the same issue introduced in version 2.1.4 of markupsafe. opw-5999688 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where the Italian EDI bill import process only recognized the first tax listed in vendor XML files. Now, all taxes specified in the XML are correctly applied, ensuring accurate VAT calculations and reporting for Italian businesses. This improves data integrity and compliance.
Original PR description
Previously, the Italian EDI vendor bill import only processed a single tax per line. When the XML contained multiple tax entries, only the first one was considered and the remaining taxes were ignored. This fix updates the import logic to properly read and apply all taxes provided in the XML, ensuring the vendor bill accurately reflects the full tax structure defined in the file. task-5258180
This update resolves an issue where moving Odoo databases via the command line would inadvertently deregister subscription codes. The new `--move` flag ensures the database's original UUID is retained during a move, maintaining proper database registration. This improves the reliability of server-to-server database transfers.
Original PR description
### What & why `odoo db load` always calls `restore_db(..., copy=True)`, which forces the generation of a new `dbuuid` via `ir.config_parameter.init(force=True)`. That is the right default when…
### What & why `odoo db load` always calls `restore_db(..., copy=True)`, which forces the generation of a new `dbuuid` via `ir.config_parameter.init(force=True)`. That is the right default when *duplicating* a database, but it breaks the intended behaviour when *moving* a database between servers: Enterprise subscription codes are registered against the database UUID, so regenerating it deregisters the moved database. The web database manager already lets the user choose between copying and moving (the `copy` flag of the `/web/database/restore` route), but the CLI exposed no equivalent and forced a copy unconditionally. The CLI is the better tool for server-to-server moves: it isn't subject to reverse-proxy upload/timeout limits and can run unattended or interactively. ### Steps to reproduce the current limitation 1. On server A: `odoo db dump mydb mydb.zip` (Enterprise DB registered to its UUID) 2. On server B: `odoo db load mydb mydb.zip` 3. `database.uuid` has changed → the subscription is deregistered ### Fix Add a `--move` flag to `odoo db load` that maps to `restore_db(copy=False)`, keeping the original UUID. The default remains `copy=True`, so existing behaviour is unchanged. ```sh odoo db load mydb mydb.zip # unchanged: restore as a copy (new UUID) odoo db load --move mydb mydb.zip # new: restore as a move (keep the UUID) ``` ### Backport request This would be greatly appreciated as a backport to 18.0, 17.0, and 16.0 as well. Those are precisely the versions that ship the `odoo db` CLI subcommand, so the fix is applicable to all of them — which is why the backport range is 16.0 → 19.0 and stops at 16.0.