Daily updates from Odoo
Thursday, June 25, 2026
254 changes
19 changes
Enhancements to existing features
This update introduces a new automated process that runs every Sunday to reset configuration settings related to development tools (devtools). This ensures that features temporarily disabled for production environments are automatically re-enabled before the weekly update on Monday, streamlining the update process.
Original PR description
We add a new cron to re enable disabled features by unsetting devtools keys in configuration. This cron is meant to run every sunday at the end of the day, right before the monday update. Forward-Port-Of: odoo/odoo#270306
This update automatically sends emails to companies when their Stripe connected accounts are flagged for potential restrictions due to KYC compliance. Stripe handles verification, and these emails alert businesses to address any required documentation updates, preventing account limitations. This ensures timely compliance and minimizes disruption to business operations.
Original PR description
When a company tries to create a connected account, some official documentation need to be submitted to Stripe. Stripe takes care of the KYC steps and might restrict some account which don't meet the requirements. Odoo receives the details about the error and the date of the restriction. This task aims at sending automatic emails to the said companies to let them know that they need to fix the identified issues. task: 5441662 Forward-Port-Of: odoo/enterprise#107918
Resolved issues and error corrections
This update corrects a problem where new accounting tags weren't being properly applied during the Danish localization module's setup. Moving the tag mapping process to occur after the database is loaded ensures all tags are present, preventing errors and data inconsistencies. This resolves a foreign key violation that previously caused issues with account cleanup.
Original PR description
The tag remapping was running in pre-migrate, before the module's data files are loaded. This caused the tag swap to be silently skipped for any new tag that didn't exist yet, and the subsequent…
The tag remapping was running in pre-migrate, before the module's data files are loaded. This caused the tag swap to be silently skipped for any new tag that didn't exist yet, and the subsequent cleanup to fail with a FK violation on account_account_account_tag.
```py
File "/home/odoo/src/odoo/saas-19.2/odoo/sql_db.py", line 417, in execute
self._obj.execute(query, params)
psycopg2.errors.ForeignKeyViolation: update or delete on table "account_account_tag" violates foreign key constraint "account_account_account_tag_account_account_tag_id_fkey" on table "account_account_account_tag"
DETAIL: Key (id)=(356) is still referenced from table "account_account_account_tag".
```
Moving to post-migrate ensures all new account tags are present in the database before the remapping and cleanup run.
upg-[4341331]
[4341331]: https://upgrade.odoo.com/odoo/upgrade.request/4341331?debug=1
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#269809This update fixes an issue where rental prices weren't correctly formatted on the website, appearing without the necessary slash separator. The fix ensures that rental prices and durations are displayed clearly and accurately, improving the user experience for customers renting products. This resolves a visual inconsistency.
Original PR description
Steps to produce: --- - Install the `Rental and eCommerce `modules. - Create a rental product and configure a rental price for it. - Add an optional product from the Sales tab. - Publish the product…
Steps to produce: --- - Install the `Rental and eCommerce `modules. - Create a rental product and configure a rental price for it. - Add an optional product from the Sales tab. - Publish the product on the website. - Open the product page on the website and click` Add to Cart`. Issue: --- - In the product configurator, the rental price is displayed without the `/` separator between the price and the rental duration period. Cause: --- - The string used to generate the rental duration label does not include the `/` separator. Fix: --- - Add the missing `/` separator to the rental duration label so that rental prices are displayed correctly. Before: --- <img width="974" height="185" alt="image" src="https://github.com/user-attachments/assets/64a88a60-bcc0-4657-97fd-584da57d0aff" /> After: --- <img width="967" height="188" alt="image" src="https://github.com/user-attachments/assets/b4d50019-1db4-4817-a8ce-446cc3c55df4" /> opw-6293015 Forward-Port-Of: odoo/enterprise#121246 Forward-Port-Of: odoo/enterprise#120223
This update fixes an issue where customer addresses in the Field Service kanban view would be cut off and displayed incorrectly due to a design element that didn't properly constrain the address width. The fix ensures that long customer addresses now fit neatly within the kanban card, improving readability and usability. This improves the visual presentation of customer information.
Original PR description
Steps to reproduce: - 1. Open the Field Service planning view in kanban. 2. Make sure a shift's customer has a long address (long street lines). 3. Look at that shift's card in the kanban view. Issue: - The customer address overflows the card and is clipped at its right edge instead of staying within the card boundaries. Cause: - The customer is rendered with the `many2one` widget and `show_address`, which marks each address line `text-truncate`. Truncation only works inside a width-bounded container, but the field root `.o_field_many2one` is an inline-flex item with the default `min-width: auto`, so it grows to fit the longest address line instead of shrinking to the card. As a result, `text-truncate` never engages and the address spills past the card. Fix: - Add the `min-w-0` class to the partner field so the flex item shrinks to the available card width. task-6272209 Forward-Port-Of: odoo/enterprise#119248
This update resolves an issue where Purchase Orders remained flagged as 'Late Receipts' even after a backorder was cancelled. The fix now correctly excludes both 'done' and 'cancel' pickings when determining if a purchase order is overdue, ensuring accurate reporting and a cleaner user experience. This prevents unnecessary alerts and improves order management.
Original PR description
Steps to reproduce: ------------------- - Create a Purchase Order with an expected Arrival date in the past - Confirm the Purchase Order - Validate the receipt partially and create a backorder -…
Steps to reproduce: ------------------- - Create a Purchase Order with an expected Arrival date in the past - Confirm the Purchase Order - Validate the receipt partially and create a backorder - Cancel the generated backorder - Open the Purchase Orders list and check the 'Late Receipts' Issue: ------ The Purchase Order still appears in the 'Late Receipts' filter even though there is no remaining receipt to process. Cause: ------ The 'Late Receipts' filter relies on the computed search field `is_late`: https://github.com/odoo/odoo/blob/324df67c099ab18c6fe7c8f77212cf809debf383/addons/purchase/views/purchase_views.xml#L439 The search domain for this field is generated by `purchase.order._search_is_late()`: https://github.com/odoo/odoo/blob/324df67c099ab18c6fe7c8f77212cf809debf383/addons/purchase/models/purchase_order.py#L176 In `purchase_stock`, `_get_domain_is_late()` extends the base domain to identify Purchase Orders that still have receipts pending: https://github.com/odoo/odoo/blob/324df67c099ab18c6fe7c8f77212cf809debf383/addons/purchase_stock/models/purchase_order.py#L264-L267 After a partial receipt: - the original receipt is in state `done`, - a backorder is created and linked to the Purchase Order, - the backorder is later cancelled and moves to state `cancel`, - the Purchase Order line still has `qty_received < product_qty`. The existing domain excludes only `done` pickings when determining whether a receipt is still pending. As a result, a cancelled backorder is still treated as an unfinished receipt, causing the Purchase Order to remain visible in the 'Late Receipts' filter. Fix: ---- Exclude both `done` and `cancel` pickings when determining whether a Purchase Order has pending receipts. A cancelled backorder indicates that the remaining quantity will not be received through that transfer. Therefore, once all related pickings are either completed or cancelled, the Purchase Order should no longer be considered late. --- opw-6266046 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#268488
This update resolves a technical issue impacting the processing of Mexican tax invoices (CFDI). The system was struggling to handle complex cancellation scenarios due to a limitation in the database index. Switching to a different index type allows for smoother and more efficient handling of these invoices, particularly those with multiple related documents.
Original PR description
The field `l10n_mx_edi_cfdi_origin` can contain a large number of associated UUIDs, especially in complex cancellation scenarios. The default B-tree index fails when this field exceeds 2704 bytes, which occurs after approximately 20 UUIDs. By switching to a trigram index, we avoid the entry size limit of PostgreSQL's B-tree nodes. This ensures that invoices with many related documents can be processed while maintaining efficient search performance for partial matches on this field. **Video before the fix:** https://youtu.be/24u0HbxwIH8 **Video after the fix:** https://youtu.be/sUelv1HZMvI Forward-Port-Of: odoo/enterprise#118868
This update fixes an issue where the sandwich rule incorrectly excluded public holidays from leave calculations. Now, when 'Include Public Holidays as Working Day' is selected, the system accurately determines the correct leave duration, including weekend days as part of the calculation. A new test case has been added to ensure this fix works as expected.
Original PR description
Problem: When a time off type is configured with "Include Public Holidays as Working Day", the sandwich rule was still treating public holidays as non-working days. This caused the sandwiched weekend days to not be included in the leave duration. Example: Employee applies leave from May 15 (Friday, Public Holiday) to May 18 (Monday). Expected duration is 4 days since May 15 is a working day and May 16-17 (weekend) should be sandwiched. Instead, only 1 day was calculated. Fix: Now when "Include Public Holidays as Working Day" is enabled, the correct number of days are calculated in the sandwich rule. Also added a test case to verify that public holidays are correctly treated as working days during sandwich rule evaluation. Task-4570118 Forward-Port-Of: odoo/odoo#271261 Forward-Port-Of: odoo/odoo#266624
The Time Off Balance report was incorrectly calculating remaining days when overlapping allocations existed. This fix ensures the report accurately reflects the remaining time off by correctly deducting leave days from allocations based on their overlap periods. This prevents overestimation of available time off.
Original PR description
The Time Off Balance report shows incorrect remaining days when overlapping allocations exist and a leave only overlaps the later one. ### **Steps to reproduce:** 1) Install time off app. 2) Create a…
The Time Off Balance report shows incorrect remaining days when overlapping allocations exist and a leave only overlaps the later one. ### **Steps to reproduce:** 1) Install time off app. 2) Create a simple time off type. - Create Allocation A (10 days, 01-01-2024 to 31-12-2025) - Create Allocation B (10 days, 01-01-2025 to 31-12-2026) 3) Create a leave of 1 day on 01-01-2026 4) Open the Balance report ### **Observed Behavior:** The report shows 20 remaining days. ### **Expected Behavior:** The report should show 19 remaining days (20 allocated - 1 taken). ### **Cause:** In the taken_per_allocation CTE at [1], each leave is joined to every allocation it overlaps. The [fifo_balances] CTE then uses the formula: ``` GREATEST(alloc_days - GREATEST(taken - prior_cumulative_alloc, 0), 0) ``` This subtracts the prior allocation capacity (A = 10 days) from the taken count (B = 1 day). Since 1 - 10 = -9, GREATEST(-9, 0) = 0, so zero days are deducted from B. The formula wrongly assumes that prior allocations can absorb leaves that do not overlap with them. [1]- https://github.com/odoo/odoo/blob/f0fa79fa21d2005dd5cd132c18b2be45424166a6/addons/hr_holidays/report/hr_leave_employee_type_report.py#L126-L142 [fifo_balances]: https://github.com/odoo/odoo/blob/f0fa79fa21d2005dd5cd132c18b2be45424166a6/addons/hr_holidays/report/hr_leave_employee_type_report.py#L145-L164 ### **Fix:** Ensure that leaves are only deducted from allocations they actually overlap by calculating the balance using the delta of cumulative leaves within an overlap group. This prevents earlier allocations from absorbing leaves that occur outside their validity period. **opw-6150161** Forward-Port-Of: odoo/odoo#271596 Forward-Port-Of: odoo/odoo#263029
This update ensures the Clickall tool, used for automated accounting dashboard testing, correctly handles the new version 2 (v2) of Odoo Fin's favorite institutions endpoint. By adding a mock, we prevent the tool from making direct requests to production servers, maintaining a safe and isolated testing environment.
Original PR description
This commit follows up on [1] by extending the Odoo Fin request mock to cover the new version 2 (v2) favorite institutions endpoint. Previously, a mock was introduced to prevent the Clickall tool from making real external HTTP requests to `production.odoofin.com` when displaying the accounting dashboard. This update ensures that the newly introduced v2 URL is also safely intercepted, keeping the automated tests fully isolated from production servers. runbot-234936 [1] : https://github.com/odoo/odoo/commit/c6451015f1b01c3e1defe4a576989fd4bfdf2cdb Forward-Port-Of: odoo/odoo#271804
This update fixes a previous issue where commission losses were incorrectly calculated for employees on long-term sickness or partial incapacity leave. The change ensures that these employees are not subject to commission deductions, aligning with standard payroll practices. This update improves accuracy and fairness in commission calculations for a specific employee group.
Original PR description
Partial incapacity and long term sickness are not elligible to loss on commissions. Forward-Port-Of: odoo/enterprise#121514
This update fixes an issue where changing the quantity of a Purchase Order Line (POL) in Multi-Step Routes incorrectly updated the associated receipt quantity. The fix ensures that quantity adjustments are accurately reflected, preventing discrepancies between the sale order and the purchase order receipt.
Original PR description
### Steps to reproduce: - In the settings enable: Multi-Steps Routes - Inventory > Configuration > Warehouse Management > Routes - Unarchive MTO - Create a storable product P with MTO buy and a set…
### Steps to reproduce: - In the settings enable: Multi-Steps Routes - Inventory > Configuration > Warehouse Management > Routes - Unarchive MTO - Create a storable product P with MTO buy and a set vendor - Create and confirm a sale order for 1 unit of P - Confirm the assocaited PO and change the pol quantity from 1 to 10 > the associated receipt is updated from 1 to 10 - Change the pol quantity from 10 to 7 #### > The quantity on the receipt is updated from 10 to 16. ### Cause of the issue: Changing the quantity of the POL will adapt the picking related quantity via these lines: https://github.com/odoo/odoo/blob/3bf89b4f467390807c20f7b007a875a77542e76f/addons/purchase_stock/models/purchase_order_line.py#L115-L117 https://github.com/odoo/odoo/blob/3bf89b4f467390807c20f7b007a875a77542e76f/addons/purchase_stock/models/purchase_order_line.py#L342-L349 by creating new stock moves to be merged: https://github.com/odoo/odoo/blob/3bf89b4f467390807c20f7b007a875a77542e76f/addons/purchase_stock/models/purchase_order_line.py#L220-L251 Now, the issue is that this flows relies both on a negative `qty_to_attach` of `1 - 10 = -9` and a positive `qty_to_push` of `7 - 1 = 6`. However, the `qty_to_attach` is only used if is positive: https://github.com/odoo/odoo/blob/3bf89b4f467390807c20f7b007a875a77542e76f/addons/purchase_stock/models/purchase_order_line.py#L243-L251 The receipt is therefore updated by a `+6` move to push but not by the `-9` move to attach. Leading to a 10 -> 16 rather than 10 -> 7 result. opw-6218307 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#270547 Forward-Port-Of: odoo/odoo#264994
This change optimizes the automated posting of invoices by preventing the cron job from repeatedly rescheduling entire batches when individual invoices fail to post. Previously, a batch failure triggered thousands of unnecessary retries. Now, failed invoices are simply marked as unpostable, reducing system load and improving performance.
Original PR description
Before this change, cron jobs triggering `_autopost_draft_entries` would gracefully handle batch-level failures by logging the error and retry one by one. As a result, `_process_job`, with success 0 done and remaining number, marked the cron run as partially completed and triggered `_reschedule_asap`. When a batch contained only problematic records, the cron job could be rescheduled thousands of times per day. With this change, if a move in the batch fails to post, we set its `auto_post` to `no`, together with the existing message-posting logic in the chatter, to prevent repeated retries for failed records. Related ticket: opw-6303194 opw-5364851 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#271509
This update fixes a visual bug where outdated cluster bubbles remained visible on the company map after zooming or panning. The issue stemmed from a technical error in how the map library handled removing old cluster icons. This change ensures that clusters are properly updated and removed, providing a cleaner and more accurate map display for users.
Original PR description
Steps to reproduce: =================== 1. Install website_customer, set a Google Maps API key and publish a few companies with coordinates 2. Open /customers 3. Open the map and zoom in a few times…
Steps to reproduce: =================== 1. Install website_customer, set a Google Maps API key and publish a few companies with coordinates 2. Open /customers 3. Open the map and zoom in a few times => stale blue cluster bubbles remain on the map Cause: ====== On the partner map, zooming or panning left old cluster bubbles behind: the blue count icons piled up and never disappeared, even at the closest zoom level. `ClusterIcon` is meant to be a google.maps.OverlayView. The bundled `markerclusterer.js` wires that up by copying every enumerable https://github.com/odoo/odoo/blob/aed1619c34b1f65bd9a3d155fe76a82d404ef5e7/addons/website_google_map/static/src/lib/markerclusterer.js#L213-L221 OverlayView.prototype member onto ClusterIcon.prototype. Google Maps now ships its own OverlayView.prototype.remove, and that copy overwrites ClusterIcon's own `remove()` with it, As a result, when a cluster icon is removed, `ClusterIcon.remove()` is never executed. Consequently, `ClusterIcon.prototype.onRemove()` is not triggered, the cluster icon's DOM element is never detached from the map, https://github.com/odoo/odoo/blob/aed1619c34b1f65bd9a3d155fe76a82d404ef5e7/addons/website_google_map/static/src/lib/markerclusterer.js#L1167 and stale cluster bubbles accumulate after every redraw, zoom, or pan operation. Solution: ========= Inherit from OverlayView through the prototype chain instead of copying it, so ClusterIcon's own remove() is kept and actually detaches the icon. opw-6128531 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#270733
This update resolves a problem where the Italian POS fiscal printer would intermittently stop printing orders due to unsupported characters in product or payment method names. The fix replaces these characters with spaces, ensuring complete and accurate printing of fiscal receipts, as outlined in official EPSON documentation.
Original PR description
Steps to reproduce: - Setup an Italian fiscal printer - Modify the name of a product to use the non-blocking space character "\ "; - In the POS, create an order with the product. Error: the fiscal device will stop midway in the printing process and return an incomplete response to the frontend. The issue can also be reproduce if the character is included in the payment method name or the POS config name. Solution: When formating the xml command, replace all non-supported character by a space character. The non-supported character list is provided by the official [EPSON fiscal printer documentation](https://support.epson.net/setupnavi/?PINF=bsmanual&OSC=WS&LG2=EN&MKN=FP-90III%20RT) in the document "ePOS Fiscal Print Solution Development Guide". Other: Rename the file "dispaly_text.xml" to "display_text.xml". [opw-6244089](https://www.odoo.com/odoo/project/49/tasks/6244089) Forward-Port-Of: odoo/enterprise#121538 Forward-Port-Of: odoo/enterprise#120169
This update resolves an issue where attendees received duplicate emails when rescheduling meetings. The fix prevents a nested calendar event write, which was causing the original and subsequent updates to trigger multiple notifications. This ensures attendees only receive one notification for meeting date changes.
Original PR description
Steps to reproduce: 1. Install CRM, Calendar, and Contacts. 2. Create a contact with an email address you can receive emails on. 3. Configure an outgoing email server. 4. Open a CRM lead and create a…
Steps to reproduce: 1. Install CRM, Calendar, and Contacts. 2. Create a contact with an email address you can receive emails on. 3. Configure an outgoing email server. 4. Open a CRM lead and create a meeting activity using the calendar. 5. Add the created contact as an attendee of the meeting. 6. Return to the lead and click the Reschedule button on the activity. 7. Select the same meeting and change its start date to a future date. Issue: - Attendees receive the meeting date-change email twice. Root cause: - When a calendar event linked to an activity is rescheduled, the event write syncs the new start date to the related activity through `_sync_activities`. That activity write was not marked as calendar-originated after commit https://github.com/odoo/odoo/commit/bc090486bd7810b1b0af1bae398255a2d6615f09, so `mail.activity.write` treated the updated deadline as an activity-originated change and wrote back to the same calendar event. https://github.com/odoo/odoo/blob/8cbb0fe91a35fcdb4a7e4e1a7e8afe40b1691f11/addons/calendar/models/calendar_event.py#L779 https://github.com/odoo/odoo/blob/8cbb0fe91a35fcdb4a7e4e1a7e8afe40b1691f11/addons/calendar/models/mail_activity.py#L24-L33 - This created a nested calendar event write. Both the nested write and the original write then triggered attendee date-change notifications, resulting in duplicate emails. Solution: - Pass the existing `calendar_event_meeting_update` context flag when syncing calendar event changes to linked activities. This prevents the activity sync from writing back to the event while preserving activity-to-event rescheduling. opw-6209956 Forward-Port-Of: odoo/odoo#269950 Forward-Port-Of: odoo/odoo#266675
This update fixes a display issue in the Helpdesk module where ticket labels in list and form views didn't match the labels shown in the Kanban view. The fix removes outdated label fields from the views, ensuring all ticket views show the correct, up-to-date state selections.
Original PR description
Steps to reproduce: ------------------------ 1. Install Helpdesk 2. Go to All Tickets and check the kanban state selection value 3. Go to Settings > Field Selection and search for kanban_state in…
Steps to reproduce:
------------------------
1. Install Helpdesk
2. Go to All Tickets and check the kanban state selection value
3. Go to Settings > Field Selection and search for kanban_state in `helpdesk.ticket` model
4. Change one of the state selection values (e.g., "Ready" to "Testing Ready")
5. Go back and check the state selection value in list and form views
Current behavior:
-----------------------
Kanban view correctly shows the updated label (e.g., "Testing Ready"),
but list and form views still display the old default value (e.g., "Ready").
Root cause:
---------------
The [state_selection](https://github.com/odoo/odoo/blob/c09cefdb0ed68b1b7367b77b18a5ee5d66c94900/addons/web/static/src/views/fields/state_selection/state_selection_field.js#L57-L65) widget uses `legend_${state}` field values when available.
Since list and form views included these legend fields, the widget resolved labels from them
instead of the actual selection values, causing inconsistent display.
Fix:
-----
Remove `legend_normal`, `legend_blocked`, and `legend_done` fields from the list and form views,
So the widget falls back to the real selection labels, consistent with how the kanban view behaves.
Reference commit: https://github.com/odoo/enterprise/commit/65f3b88254e3a66e2c5dcb5142d30f6b1996d999
opw-6238765
Forward-Port-Of: odoo/enterprise#119707This update resolves an issue where users without fleet access could not import UBL invoices referencing vehicles. Now, users with vendor bill import permissions can successfully import UBL invoices containing vehicle references, improving data import flexibility. This ensures accurate recording of transactions regardless of user access rights.
Original PR description
When a user has no rights to access the fleet models but is allowed to import vendor bills, he should be able to import a bill (UBL) with referenced vehicle(s) inside. task-6289956 Forward-Port-Of: odoo/odoo#269447
This update resolves a bug where JSON data couldn't be displayed when clicked in the l10n_in_edi module. The issue stemmed from a change in how binary fields handle data, requiring a conversion to the correct binary format. Now, JSON data is correctly displayed.
Original PR description
**Description of the issue this PR addresses:** This issue was introduced after the refactoring of binary fields [odoo/odoo#244421](https://github.com/odoo/odoo/pull/244421) ,where Binary fields now expect proper binary data and treat string values as base64. The JSON data was passed as a string to a binary field. After the BinaryValue change, this string was treated as base64, which caused a decoding error. **Before this Commit:** Clicking the JSON button resulted in an error: `binascii.Error: Only base64 data is allowed` Due to this, the JSON data could not be viewed. **After this Commit:** JSON data is now converted into the correct binary format using Odoo’s binary handling `(odoo.tools.Binary)` and it displays correctly. [Related Commit](https://github.com/odoo/odoo/commit/41fe2ebdb9cc37341362d7af829c087a5f72f9f1#diff-d3b35dffff8313ee07a08bceb336f03d6130bf001e3b0daa32b098cefcf95c3b) [Full Error Details ](https://pastebin.com/v12sD2vf)
22 changes
Enhancements to existing features
This update automatically sends emails to companies when their connected Stripe accounts are flagged for potential restrictions due to KYC requirements. Stripe handles compliance checks, and this change ensures Odoo proactively notifies businesses about issues needing immediate attention, preventing disruptions to their services. It addresses a critical process to maintain compliance and minimize potential service interruptions.
Original PR description
When a company tries to create a connected account, some official documentation need to be submitted to Stripe. Stripe takes care of the KYC steps and might restrict some account which don't meet the requirements. Odoo receives the details about the error and the date of the restriction. This task aims at sending automatic emails to the said companies to let them know that they need to fix the identified issues. task: 5441662 Forward-Port-Of: odoo/enterprise#107918
Resolved issues and error corrections
This update corrects a problem where new accounting tags weren't being properly processed during an update, leading to database errors. By moving the tag remapping process to occur after the module's data is loaded, the system now correctly handles all new tags and avoids the previous database conflicts.
Original PR description
The tag remapping was running in pre-migrate, before the module's data files are loaded. This caused the tag swap to be silently skipped for any new tag that didn't exist yet, and the subsequent…
The tag remapping was running in pre-migrate, before the module's data files are loaded. This caused the tag swap to be silently skipped for any new tag that didn't exist yet, and the subsequent cleanup to fail with a FK violation on account_account_account_tag.
```py
File "/home/odoo/src/odoo/saas-19.2/odoo/sql_db.py", line 417, in execute
self._obj.execute(query, params)
psycopg2.errors.ForeignKeyViolation: update or delete on table "account_account_tag" violates foreign key constraint "account_account_account_tag_account_account_tag_id_fkey" on table "account_account_account_tag"
DETAIL: Key (id)=(356) is still referenced from table "account_account_account_tag".
```
Moving to post-migrate ensures all new account tags are present in the database before the remapping and cleanup run.
upg-[4341331]
[4341331]: https://upgrade.odoo.com/odoo/upgrade.request/4341331?debug=1
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#269809This update resolves a technical issue preventing the Spanish E-Invoice module (l10n_es_edi_verifactu) from functioning correctly during upgrades. The fix ensures the necessary 'certificate' module is loaded first, preventing a critical error that blocked the module's operation. This ensures a smoother upgrade process and correct functionality for users utilizing the Spanish E-Invoice feature.
Original PR description
### Issue `l10n_es_edi_verifactu` builds an inheritance on `certificate.certificate` and loads that module's views/demo, but only declares `depends: ['l10n_es']`. With `certificate` not guaranteed to…
### Issue `l10n_es_edi_verifactu` builds an inheritance on `certificate.certificate` and loads that module's views/demo, but only declares `depends: ['l10n_es']`. With `certificate` not guaranteed to load first, building the registry without it already present raises: ``` TypeError: Model 'certificate.certificate' does not exist in registry. ``` ### Cause `models/certificate.py` → `_inherit = 'certificate.certificate'`; manifest `data` loads `views/certificate_certificate_views.xml` and `demo/demo_certificate.xml`. Yet `certificate` is absent from `depends`. Every sibling (`l10n_es_edi_facturae`/`sii`/`tbai`, `l10n_sa_edi`) already depends on `certificate`. Present since the module was added in `02f8d5525eb7`. ### Notes - Opened on **18.0** so it **forward-ports to 19.0** (both stable branches carry the bug). `master` already has the equivalent change via #234729 — the forward-port there should be a no-op. - Surfaced via an 18.0→19.0 OpenUpgrade migration that force-updates `verifactu` before `certificate` loads; also reproducible on a plain install where `certificate` isn't otherwise pulled in first. Forward-Port-Of: odoo/odoo#271827 Forward-Port-Of: odoo/odoo#271496
The Time Off Balance report was incorrectly calculating remaining days when overlapping allocations existed. This fix ensures the report accurately reflects the remaining time off by correctly deducting leaves from overlapping allocations. This resolves a discrepancy between the reported balance and the actual available time.
Original PR description
The Time Off Balance report shows incorrect remaining days when overlapping allocations exist and a leave only overlaps the later one. ### **Steps to reproduce:** 1) Install time off app. 2) Create a…
The Time Off Balance report shows incorrect remaining days when overlapping allocations exist and a leave only overlaps the later one. ### **Steps to reproduce:** 1) Install time off app. 2) Create a simple time off type. - Create Allocation A (10 days, 01-01-2024 to 31-12-2025) - Create Allocation B (10 days, 01-01-2025 to 31-12-2026) 3) Create a leave of 1 day on 01-01-2026 4) Open the Balance report ### **Observed Behavior:** The report shows 20 remaining days. ### **Expected Behavior:** The report should show 19 remaining days (20 allocated - 1 taken). ### **Cause:** In the taken_per_allocation CTE at [1], each leave is joined to every allocation it overlaps. The [fifo_balances] CTE then uses the formula: ``` GREATEST(alloc_days - GREATEST(taken - prior_cumulative_alloc, 0), 0) ``` This subtracts the prior allocation capacity (A = 10 days) from the taken count (B = 1 day). Since 1 - 10 = -9, GREATEST(-9, 0) = 0, so zero days are deducted from B. The formula wrongly assumes that prior allocations can absorb leaves that do not overlap with them. [1]- https://github.com/odoo/odoo/blob/f0fa79fa21d2005dd5cd132c18b2be45424166a6/addons/hr_holidays/report/hr_leave_employee_type_report.py#L126-L142 [fifo_balances]: https://github.com/odoo/odoo/blob/f0fa79fa21d2005dd5cd132c18b2be45424166a6/addons/hr_holidays/report/hr_leave_employee_type_report.py#L145-L164 ### **Fix:** Ensure that leaves are only deducted from allocations they actually overlap by calculating the balance using the delta of cumulative leaves within an overlap group. This prevents earlier allocations from absorbing leaves that occur outside their validity period. **opw-6150161** Forward-Port-Of: odoo/odoo#271596 Forward-Port-Of: odoo/odoo#263029
This update fixes an issue where self-invoicing URLs on receipts were incorrectly displayed. Now, the URLs are generated accurately, ensuring proper integration with invoicing systems. This improves the accuracy of self-invoicing processes for our point-of-sale operations.
Original PR description
Before this commit: ------------------------- - The self-invoicing URL on the receipt was displayed as `undefined/pos/ticket`. After this commit: ------------------------- - The self-invoicing URL is now generated correctly and displayed properly on the receipt. Task-6271261 Forward-Port-Of: odoo/odoo#271611 Forward-Port-Of: odoo/odoo#270052
This update resolves an issue where outdated cluster bubbles remained visible on the company map after zooming or panning. The fix corrects a technical error in how the map's cluster icons were managed, ensuring that old icons are properly removed when the map updates. This improves the visual clarity and accuracy of the map for users.
Original PR description
Steps to reproduce: =================== 1. Install website_customer, set a Google Maps API key and publish a few companies with coordinates 2. Open /customers 3. Open the map and zoom in a few times…
Steps to reproduce: =================== 1. Install website_customer, set a Google Maps API key and publish a few companies with coordinates 2. Open /customers 3. Open the map and zoom in a few times => stale blue cluster bubbles remain on the map Cause: ====== On the partner map, zooming or panning left old cluster bubbles behind: the blue count icons piled up and never disappeared, even at the closest zoom level. `ClusterIcon` is meant to be a google.maps.OverlayView. The bundled `markerclusterer.js` wires that up by copying every enumerable https://github.com/odoo/odoo/blob/aed1619c34b1f65bd9a3d155fe76a82d404ef5e7/addons/website_google_map/static/src/lib/markerclusterer.js#L213-L221 OverlayView.prototype member onto ClusterIcon.prototype. Google Maps now ships its own OverlayView.prototype.remove, and that copy overwrites ClusterIcon's own `remove()` with it, As a result, when a cluster icon is removed, `ClusterIcon.remove()` is never executed. Consequently, `ClusterIcon.prototype.onRemove()` is not triggered, the cluster icon's DOM element is never detached from the map, https://github.com/odoo/odoo/blob/aed1619c34b1f65bd9a3d155fe76a82d404ef5e7/addons/website_google_map/static/src/lib/markerclusterer.js#L1167 and stale cluster bubbles accumulate after every redraw, zoom, or pan operation. Solution: ========= Inherit from OverlayView through the prototype chain instead of copying it, so ClusterIcon's own remove() is kept and actually detaches the icon. opw-6128531 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#270733
This update ensures the Clickall tool, used for automated accounting dashboard testing, correctly handles requests to the new Odoo Fin v2 favorite institutions endpoint. By extending the existing request mock, we maintain isolation from production servers and prevent potential issues during testing, ensuring reliable automated test results.
Original PR description
This commit follows up on [1] by extending the Odoo Fin request mock to cover the new version 2 (v2) favorite institutions endpoint. Previously, a mock was introduced to prevent the Clickall tool from making real external HTTP requests to `production.odoofin.com` when displaying the accounting dashboard. This update ensures that the newly introduced v2 URL is also safely intercepted, keeping the automated tests fully isolated from production servers. runbot-234936 [1] : https://github.com/odoo/odoo/commit/c6451015f1b01c3e1defe4a576989fd4bfdf2cdb Forward-Port-Of: odoo/odoo#271804
This update fixes an issue where changing the quantity of a Purchase Order Line (POL) in MTO scenarios didn't accurately reflect the updated stock quantities. The fix ensures that receipt quantities are correctly adjusted when the POL quantity is modified, preventing discrepancies between sales and purchase records. This improves inventory accuracy and reporting.
Original PR description
### Steps to reproduce: - In the settings enable: Multi-Steps Routes - Inventory > Configuration > Warehouse Management > Routes - Unarchive MTO - Create a storable product P with MTO buy and a set…
### Steps to reproduce: - In the settings enable: Multi-Steps Routes - Inventory > Configuration > Warehouse Management > Routes - Unarchive MTO - Create a storable product P with MTO buy and a set vendor - Create and confirm a sale order for 1 unit of P - Confirm the assocaited PO and change the pol quantity from 1 to 10 > the associated receipt is updated from 1 to 10 - Change the pol quantity from 10 to 7 #### > The quantity on the receipt is updated from 10 to 16. ### Cause of the issue: Changing the quantity of the POL will adapt the picking related quantity via these lines: https://github.com/odoo/odoo/blob/3bf89b4f467390807c20f7b007a875a77542e76f/addons/purchase_stock/models/purchase_order_line.py#L115-L117 https://github.com/odoo/odoo/blob/3bf89b4f467390807c20f7b007a875a77542e76f/addons/purchase_stock/models/purchase_order_line.py#L342-L349 by creating new stock moves to be merged: https://github.com/odoo/odoo/blob/3bf89b4f467390807c20f7b007a875a77542e76f/addons/purchase_stock/models/purchase_order_line.py#L220-L251 Now, the issue is that this flows relies both on a negative `qty_to_attach` of `1 - 10 = -9` and a positive `qty_to_push` of `7 - 1 = 6`. However, the `qty_to_attach` is only used if is positive: https://github.com/odoo/odoo/blob/3bf89b4f467390807c20f7b007a875a77542e76f/addons/purchase_stock/models/purchase_order_line.py#L243-L251 The receipt is therefore updated by a `+6` move to push but not by the `-9` move to attach. Leading to a 10 -> 16 rather than 10 -> 7 result. opw-6218307 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#270547 Forward-Port-Of: odoo/odoo#264994
This change optimizes the automated posting process by preventing the cron job from repeatedly rescheduling entire batches of transactions when individual records fail to post. Previously, failures triggered thousands of unnecessary retries. Now, failed transactions are marked as 'no-post' to stop further attempts, improving system performance and stability.
Original PR description
Before this change, cron jobs triggering `_autopost_draft_entries` would gracefully handle batch-level failures by logging the error and retry one by one. As a result, `_process_job`, with success 0 done and remaining number, marked the cron run as partially completed and triggered `_reschedule_asap`. When a batch contained only problematic records, the cron job could be rescheduled thousands of times per day. With this change, if a move in the batch fails to post, we set its `auto_post` to `no`, together with the existing message-posting logic in the chatter, to prevent repeated retries for failed records. Related ticket: opw-6303194 opw-5364851 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#271509
This update resolves an issue where event titles were sometimes saved as blank ('(no title)') when created quickly through the calendar. The fix ensures that all event data, including the title, is saved correctly, regardless of how the event was created. This improves the user experience and prevents data inconsistencies.
Original PR description
When creating an event using the quick create form from the calendar view if the user saves the record while the title is still being edited (using alt+c) the record will be saved with the default title: "(no title)" The code currently relies on the record data being up to date by the time onRecordSave is reached. However in the case of a text field, it is only saved when blurred. While there is a mechanism to blur the field when saving using a hotkey, it is completely asynchronous from the save logic of the form. To ensure all fields have comitted their data at save time, the framework has a mechanism to "request changes" which notifies all fields to update the record with their latest value and waits for them to do so. We can simply reuse this mechanism to ensure the data is up to date at recordSave time already, as we don't expect fields to have any changes after it. task-6321702 Forward-Port-Of: odoo/odoo#271473
This update fixes an issue where the composer in Odoo (used for creating emails) wasn't correctly handling text editing after inserting mentions. Specifically, it added a small character (a zero-width no-break space) to ensure the cursor moved to the end of the line, improving the user experience. This ensures users can accurately edit and format their emails.
Original PR description
### Purpose of this PR: - Inserting a mention in the composer results in a paragraph ending with a bare `<a>` element and no trailing text node. This causes the browser to mishandle the End key, moving the caret to the start of the next paragraph instead of the end of the current line. - Fix by appending a \uFEFF (zero-width no-break space) text node. task-6295924 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#271160 Forward-Port-Of: odoo/odoo#269699
This update resolves an issue where Purchase Orders remained flagged as 'Late Receipts' even after a backorder was cancelled. The fix ensures that cancelled backorders are no longer incorrectly considered as pending receipts, improving the accuracy of the 'Late Receipts' filter and streamlining the purchasing process.
Original PR description
Steps to reproduce: ------------------- - Create a Purchase Order with an expected Arrival date in the past - Confirm the Purchase Order - Validate the receipt partially and create a backorder -…
Steps to reproduce: ------------------- - Create a Purchase Order with an expected Arrival date in the past - Confirm the Purchase Order - Validate the receipt partially and create a backorder - Cancel the generated backorder - Open the Purchase Orders list and check the 'Late Receipts' Issue: ------ The Purchase Order still appears in the 'Late Receipts' filter even though there is no remaining receipt to process. Cause: ------ The 'Late Receipts' filter relies on the computed search field `is_late`: https://github.com/odoo/odoo/blob/324df67c099ab18c6fe7c8f77212cf809debf383/addons/purchase/views/purchase_views.xml#L439 The search domain for this field is generated by `purchase.order._search_is_late()`: https://github.com/odoo/odoo/blob/324df67c099ab18c6fe7c8f77212cf809debf383/addons/purchase/models/purchase_order.py#L176 In `purchase_stock`, `_get_domain_is_late()` extends the base domain to identify Purchase Orders that still have receipts pending: https://github.com/odoo/odoo/blob/324df67c099ab18c6fe7c8f77212cf809debf383/addons/purchase_stock/models/purchase_order.py#L264-L267 After a partial receipt: - the original receipt is in state `done`, - a backorder is created and linked to the Purchase Order, - the backorder is later cancelled and moves to state `cancel`, - the Purchase Order line still has `qty_received < product_qty`. The existing domain excludes only `done` pickings when determining whether a receipt is still pending. As a result, a cancelled backorder is still treated as an unfinished receipt, causing the Purchase Order to remain visible in the 'Late Receipts' filter. Fix: ---- Exclude both `done` and `cancel` pickings when determining whether a Purchase Order has pending receipts. A cancelled backorder indicates that the remaining quantity will not be received through that transfer. Therefore, once all related pickings are either completed or cancelled, the Purchase Order should no longer be considered late. --- opw-6266046 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#268488
This update resolves an issue where a key feature of our website tours was intermittently failing. The fix ensures the tour correctly identifies the target element before the drag-and-drop action, making the tour more reliable and consistent for users. This improves the overall user experience.
Original PR description
The tour `conditional_visibility_4` has non-deterministic failure, that appears to be caused by the `drag_and_drop` step dragging the element that was the target before the click of the previous step. This commit adds a step to ensure the target is the expected element before the "drag" step starts. runbot-242425
This update resolves a bug where the 'Suggest Forecasted Demand' button disappeared when the 'Forecasted Stock' row was hidden in the Master Production Schedule. This ensures the button is always visible, allowing users to accurately adjust forecasted demand. This fix improves the usability of the planning module.
Original PR description
Steps to reproduce:
1. Install Manufacturing.
2. Enable 'Master Production Schedule' in the Settings.
3. Go to [Manufacturing -> Planning -> Master Production Schedule].
4. Ensure 'Demand Forecast' and 'Forecasted Stock' rows are enabled from the dropdown.
5. Observe the edit pencil button next to 'Forecasted Demand' is visible.
6. Hide 'Forecasted Stock' using the rows filter dropdown.
Issue:
The edit pencil button ("Suggest Forecasted Demand") next to the 'Forecasted Demand' row disappears when the 'Forecasted Stock' row is hidden.
Expected behavior:
The edit pencil visibility should not be affected by the 'Forecasted Stock' row.
opw-6240596
Forward-Port-Of: odoo/enterprise#120208This update fixes an issue where quality alerts weren't created when receiving inbound emails without a company assigned. The fix ensures that a default company ID is used, preventing errors and guaranteeing that all email-based quality alerts are properly recorded. This improves the reliability of our quality tracking system.
Original PR description
Steps to reproduce 1. Install quality 2. Create an incoming email server 3. Go to Quality > Configuration > Quality Teams > Team > add alias email 4. Do not fill the company field 5. Send email to this alias 6. Fetch emails from incoming email server Issue: - Record is not created in the quality alert Root cause: - For the Quality alert model, the field `company_id` is required, but while we fetch emails We haven't set the `company_id` on the quality alert team, resulting in trying to insert a null value on the quality alert model. Solution: - Give a default value to company_id. - Raise a validation error on not having a company_id - Update alias default values on changing company_id opw-5917791 Forward-Port-Of: odoo/enterprise#118516 Forward-Port-Of: odoo/enterprise#109947
This update ensures that all tax unit members, not just the main company, have read access to tax return checks. This allows for quicker resolution of issues related to failing checks, improving overall operational efficiency and reducing potential delays.
Original PR description
Before this commit: Tax Unit Members other than main company have read access to tax returns but don't have read access to tax return checks. After this commit: Tax Unit members other than main company are given read access to tax return checks also, so they can fix checks failing because of them. task-5951364 Forward-Port-Of: odoo/enterprise#113118
This update resolves a technical issue preventing receipt printing in the Italian POS module. Previously, a race condition caused the printer to become blocked after the first receipt, requiring a page refresh. The fix now ties printing to the 'Skip Preview Screen' option, ensuring reliable receipt generation.
Original PR description
Module: l10n_it_pos Steps to reproduce: - In the POS settings, enable "Automatic Receipt Printing"; - Enable "ePos Printer" to make the "Skip Preview Screen" option appear; - Disable "Skip Preview…
Module: l10n_it_pos Steps to reproduce: - In the POS settings, enable "Automatic Receipt Printing"; - Enable "ePos Printer" to make the "Skip Preview Screen" option appear; - Disable "Skip Preview Screen"; - Disable "ePos Printer"; - Set up an Italian Fiscal Printer; - Open a POS session and process a first order. Issue: After the first receipt, no other messages (price display, receipt, open register) are sent to the fiscal printer. A page reload is required. Issue: After the first receipt, no other messages (price display, receipt, open register) are sent to the fiscal printer. A page reload is required. Cause: When "Automatic Receipt Printing" is true but "Skip Preview Screen" is false, a race condition occurs. `afterOrderValidation` triggers a print job while simultaneously transitioning to the `ReceiptScreen`. When the `ReceiptScreen` mounts, it triggers a second fiscal print job before the first has resolved. This creates a deadlock in `toHtml` of `renderService`, permanently blocking the printer queue. Solution: Since the italian localisation sending the receipt to the fiscal printer is mandatory, the printing route is now tied to the "Skip Preview Screen" option. Enterprise PR: https://github.com/odoo/enterprise/pull/112654 [opw-5979212](https://www.odoo.com/odoo/project/49/tasks/5979212) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#271191 Forward-Port-Of: odoo/odoo#256932
This update resolves a bug that prevented receipt printing after the initial order in the Italian POS module. The fix ensures receipts are consistently printed by tying the printing process to the 'Skip Preview Screen' option, simplifying the setup for Italian users. Redundant settings have been removed to improve stability.
Original PR description
Module: l10n_it_pos Steps to reproduce: - In the POS settings, enable "Automatic Receipt Printing"; - Enable "ePos Printer" to make the "Skip Preview Screen" option appear; - Disable "Skip Preview…
Module: l10n_it_pos Steps to reproduce: - In the POS settings, enable "Automatic Receipt Printing"; - Enable "ePos Printer" to make the "Skip Preview Screen" option appear; - Disable "Skip Preview Screen"; - Disable "ePos Printer"; - Set up an Italian Fiscal Printer; - Open a POS session and process a first order. Issue: After the first receipt, no other messages (price display, receipt, open register) are sent to the fiscal printer. A page reload is required. Cause: When "Automatic Receipt Printing" is true but "Skip Preview Screen" is false, a race condition occurs. `afterOrderValidation` triggers a print job while simultaneously transitioning to the `ReceiptScreen`. When the `ReceiptScreen` mounts, it triggers a second fiscal print job before the first has resolved. This creates a deadlock in `toHtml` of `renderService`, permanently blocking the printer queue. Solution: Since the italian localisation sending the receipt to the fiscal printer is mandatory, the printing route is now tied to the "Skip Preview Screen" option. UI settings are adjusted to hide the redundant auto-print checkbox when an IT fiscal printer is configured. Community PR: https://github.com/odoo/odoo/pull/256932 [opw-5979212](https://www.odoo.com/odoo/project/49/tasks/5979212) Forward-Port-Of: odoo/enterprise#121257 Forward-Port-Of: odoo/enterprise#112654
This update fixes a display issue in the Helpdesk module where ticket labels in list and form views didn't match the labels shown in the Kanban view. The fix removes outdated label fields from the views, ensuring all ticket views now accurately reflect the selected state values. This improves consistency and clarity for users.
Original PR description
Steps to reproduce: ------------------------ 1. Install Helpdesk 2. Go to All Tickets and check the kanban state selection value 3. Go to Settings > Field Selection and search for kanban_state in…
Steps to reproduce:
------------------------
1. Install Helpdesk
2. Go to All Tickets and check the kanban state selection value
3. Go to Settings > Field Selection and search for kanban_state in `helpdesk.ticket` model
4. Change one of the state selection values (e.g., "Ready" to "Testing Ready")
5. Go back and check the state selection value in list and form views
Current behavior:
-----------------------
Kanban view correctly shows the updated label (e.g., "Testing Ready"),
but list and form views still display the old default value (e.g., "Ready").
Root cause:
---------------
The [state_selection](https://github.com/odoo/odoo/blob/c09cefdb0ed68b1b7367b77b18a5ee5d66c94900/addons/web/static/src/views/fields/state_selection/state_selection_field.js#L57-L65) widget uses `legend_${state}` field values when available.
Since list and form views included these legend fields, the widget resolved labels from them
instead of the actual selection values, causing inconsistent display.
Fix:
-----
Remove `legend_normal`, `legend_blocked`, and `legend_done` fields from the list and form views,
So the widget falls back to the real selection labels, consistent with how the kanban view behaves.
Reference commit: https://github.com/odoo/enterprise/commit/65f3b88254e3a66e2c5dcb5142d30f6b1996d999
opw-6238765
Forward-Port-Of: odoo/enterprise#119707This update fixes a display issue where the Incoterm (shipping term) wasn't showing on purchase quotation reports. After a recent code update, the fix ensures that this important information is now correctly presented, improving clarity for purchasing teams. This ensures accurate reporting and better understanding of shipping costs.
Original PR description
After a refactor the incoterm and location didn't show on the purchase quotation Task-id: 6206523
This update fixes an issue where custom inline shadows weren't correctly recognized by the HTML builder, leading to incorrect shadow displays. Now, elements with inline shadows are properly detected, and cleaning custom shadows also removes Bootstrap shadow classes. This ensures consistent and accurate shadow rendering across Odoo.
Original PR description
Before this PR, , since [1], elements with an inline `box-shadow` and no custom shadow class were not detected as custom shadows by the builder option. This could make existing snippets show the wrong shadow state. After this PR, elements with an inline `box-shadow` are treated as custom shadows by the builder option, and cleaning the custom shadow also removes Bootstrap shadow classes. [1]: https://github.com/odoo/odoo/commit/55890082db7879bef3a976c84ab336bdacf76818 task-6251151
This update fixes a bug in the Point of Sale ticket screen that allowed users to repeatedly refund orders, even fully refunded ones. The change prevents users from increasing the quantity of a refund order, ensuring that refunds are processed correctly and avoiding potential financial discrepancies. This improves the reliability of the refund process.
Original PR description
In the ticket screen, clicking an order line selected it for refund and incremented its quantity without checking whether the line could actually be refunded. As a result, a refund order (whose lines carry a negative quantity) could itself be refunded, and already fully refunded lines could be refunded again. opw-6314527 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
6 changes
Resolved issues and error corrections
This update corrects a problem where new accounting tags weren't being properly applied during the setup process. Moving the tag remapping to occur after the database is loaded ensures all new tags are recognized, preventing errors and data inconsistencies. This improves the accuracy of Danish accounting records.
Original PR description
The tag remapping was running in pre-migrate, before the module's data files are loaded. This caused the tag swap to be silently skipped for any new tag that didn't exist yet, and the subsequent…
The tag remapping was running in pre-migrate, before the module's data files are loaded. This caused the tag swap to be silently skipped for any new tag that didn't exist yet, and the subsequent cleanup to fail with a FK violation on account_account_account_tag.
```py
File "/home/odoo/src/odoo/saas-19.2/odoo/sql_db.py", line 417, in execute
self._obj.execute(query, params)
psycopg2.errors.ForeignKeyViolation: update or delete on table "account_account_tag" violates foreign key constraint "account_account_account_tag_account_account_tag_id_fkey" on table "account_account_account_tag"
DETAIL: Key (id)=(356) is still referenced from table "account_account_account_tag".
```
Moving to post-migrate ensures all new account tags are present in the database before the remapping and cleanup run.
upg-[4341331]
[4341331]: https://upgrade.odoo.com/odoo/upgrade.request/4341331?debug=1
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#269809This update resolves an issue where Purchase Orders incorrectly appeared in the 'Late Receipts' filter after a backorder was cancelled. The fix ensures that cancelled backorders are no longer considered as pending receipts, accurately reflecting the status of the purchase order. This improves the accuracy of the 'Late Receipts' report.
Original PR description
Steps to reproduce: ------------------- - Create a Purchase Order with an expected Arrival date in the past - Confirm the Purchase Order - Validate the receipt partially and create a backorder -…
Steps to reproduce: ------------------- - Create a Purchase Order with an expected Arrival date in the past - Confirm the Purchase Order - Validate the receipt partially and create a backorder - Cancel the generated backorder - Open the Purchase Orders list and check the 'Late Receipts' Issue: ------ The Purchase Order still appears in the 'Late Receipts' filter even though there is no remaining receipt to process. Cause: ------ The 'Late Receipts' filter relies on the computed search field `is_late`: https://github.com/odoo/odoo/blob/324df67c099ab18c6fe7c8f77212cf809debf383/addons/purchase/views/purchase_views.xml#L439 The search domain for this field is generated by `purchase.order._search_is_late()`: https://github.com/odoo/odoo/blob/324df67c099ab18c6fe7c8f77212cf809debf383/addons/purchase/models/purchase_order.py#L176 In `purchase_stock`, `_get_domain_is_late()` extends the base domain to identify Purchase Orders that still have receipts pending: https://github.com/odoo/odoo/blob/324df67c099ab18c6fe7c8f77212cf809debf383/addons/purchase_stock/models/purchase_order.py#L264-L267 After a partial receipt: - the original receipt is in state `done`, - a backorder is created and linked to the Purchase Order, - the backorder is later cancelled and moves to state `cancel`, - the Purchase Order line still has `qty_received < product_qty`. The existing domain excludes only `done` pickings when determining whether a receipt is still pending. As a result, a cancelled backorder is still treated as an unfinished receipt, causing the Purchase Order to remain visible in the 'Late Receipts' filter. Fix: ---- Exclude both `done` and `cancel` pickings when determining whether a Purchase Order has pending receipts. A cancelled backorder indicates that the remaining quantity will not be received through that transfer. Therefore, once all related pickings are either completed or cancelled, the Purchase Order should no longer be considered late. --- opw-6266046 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#268488
This pull request resolves several test failures related to the Blackbox POS integration for Belgium. It corrects issues with test setup, data loading, and order synchronization, ensuring accurate reporting and functionality. The changes improve the reliability of the Blackbox tests and the overall POS system.
Original PR description
1. The `m160` and `m161` mutations for `sign_copy_sale` test didn't set the `l10n_be_short_signature` field on the order, so the `TicketScreen.print` override would fail the check and the…
1. The `m160` and `m161` mutations for `sign_copy_sale` test didn't set the `l10n_be_short_signature` field on the order, so the `TicketScreen.print` override would fail the check and the `blackbox.signCopy` would not be called, causing the test to fail. 2. The `l10n_be_pos_blackbox_urban_piper` tests would crash on `undefined id` on the prep display path of `pos_enterprise`, where the data service will try to load up the prep display data, but it's not loaded in the test bundle. So I created a special setupEnv method for blackbox with urban piper which unpatches the prep display (same mechanism as pos_enterprise) 3. After removing the path for the tests, they would fail for the `expectGeneralProperties` step. By default it expects the `ticketMedium` to be `PAPER`, but there is no printer configured on the tests, so the actual medium is `DIGITAL`. 4. The tests expect the cost center to be `PLATFORM`. There was a patch on `InputGenerator`, which would return platform if the order has a `delivery_provider_id` set. But the patch never fired. I moved the patch directly on the order model, which is where the cost center value is computed. 5. The `test_l10n_be_pos_blackbox_sign_sale_backend_offline` test would endTour prematurely before the orders finished syncing, then check that all the orders are synced. I added an extra isSynced() step to ensure the orders are synced before ending the tour Task-[6320705](https://www.odoo.com/odoo/1737/tasks/6320705) Forward-Port-Of: odoo/enterprise#121455
This update resolves an issue where new modules could fail to install correctly when containing data for deleted records. The fix corrects a technical error within the `l10n_sa_edi` module, ensuring smoother and more reliable module installations. This prevents data loss and improves the overall stability of the system.
Original PR description
Installing a new module should be safe even when the module contains new data for records that have been deleted. It is not the responsibility of the localization to make sure of that. The fix in `l10n_sa_edi` had 2 issues: * calling `self.env.ref` instead of `self.ref` * Checking for the existence of records even in the case of installing the CoA for the first time on a company, which obviously doesn't contain anything. This results in always ignoring the data.
This update resolves an issue where the CoA reload process unintentionally modified existing financial reports. The CoA framework is now responsible for managing these records, ensuring data integrity and preventing unexpected changes. This change improves the stability and reliability of financial reporting within the system.
Original PR description
It is the burden of the CoA framework to check for that. See community commit for more information.
This update resolves a technical error preventing the Spanish E-Invoice module (`l10n_es_edi_verifactu`) from functioning correctly during upgrades. The fix ensures the necessary 'certificate' module is loaded first, preventing a system error that blocked the module's operation. This ensures a smoother upgrade process and reliable functionality for users.
Original PR description
### Issue `l10n_es_edi_verifactu` builds an inheritance on `certificate.certificate` and loads that module's views/demo, but only declares `depends: ['l10n_es']`. With `certificate` not guaranteed to…
### Issue `l10n_es_edi_verifactu` builds an inheritance on `certificate.certificate` and loads that module's views/demo, but only declares `depends: ['l10n_es']`. With `certificate` not guaranteed to load first, building the registry without it already present raises: ``` TypeError: Model 'certificate.certificate' does not exist in registry. ``` ### Cause `models/certificate.py` → `_inherit = 'certificate.certificate'`; manifest `data` loads `views/certificate_certificate_views.xml` and `demo/demo_certificate.xml`. Yet `certificate` is absent from `depends`. Every sibling (`l10n_es_edi_facturae`/`sii`/`tbai`, `l10n_sa_edi`) already depends on `certificate`. Present since the module was added in `02f8d5525eb7`. ### Notes - Opened on **18.0** so it **forward-ports to 19.0** (both stable branches carry the bug). `master` already has the equivalent change via #234729 — the forward-port there should be a no-op. - Surfaced via an 18.0→19.0 OpenUpgrade migration that force-updates `verifactu` before `certificate` loads; also reproducible on a plain install where `certificate` isn't otherwise pulled in first. Forward-Port-Of: odoo/odoo#271827 Forward-Port-Of: odoo/odoo#271496
2 changes
Resolved issues and error corrections
This update resolves an issue where vendor bills in foreign currencies (like USD) were incorrectly flagged as 'Partially matched' during GSTR-2B reporting. The fix ensures that amounts are correctly converted to the company's base currency (INR) for accurate reconciliation, preventing reporting errors.
Original PR description
**Steps to reproduce:** * Install the **l10n_in_reports** module. * Go to **Accounting → Configuration → Settings**, and enable **Multi-Currencies**. * Activate a foreign currency (e.g., USD) and set…
**Steps to reproduce:** * Install the **l10n_in_reports** module. * Go to **Accounting → Configuration → Settings**, and enable **Multi-Currencies**. * Activate a foreign currency (e.g., USD) and set an exchange rate. * Create a new vendor bill for an Indian vendor, setting the currency to USD. * Add lines to the bill and apply IGST/GST taxes, then confirm the bill. * Go to **Accounting → Reporting → GST Return Period** and initiate GSTR-2B matching for the period corresponding to the bill (using a valid JSON payload where the amounts are correctly reported in INR). **Observed behavior:** * The vendor bill is incorrectly marked as "Partially matched" instead of "Fully matched", accompanied by an exception stating that the total amount as per GSTR-2B does not match. **Cause:** * The GSTR-2B data fetched from the GST portal always reports values in the company's base currency (INR). * The `match_bills` method was directly comparing the GSTR-2B INR amounts ( `bill_total` and `bill_taxable_value`) against the bill's `amount_total` and `amount_untaxed` fields. * Because these fields return values in the document's foreign currency (e.g., USD), the mismatch triggers an exception and flags the bill as partially matched. **Fix:** * Modified the matching logic to compare GSTR-2B values against `abs(amount_total_signed)` and `abs(amount_untaxed_signed)`. * This ensures that the amounts evaluated during reconciliation are always correctly converted and compared in the company's base currency (INR). opw-6311097 Forward-Port-Of: odoo/enterprise#121563 Forward-Port-Of: odoo/enterprise#120967
This update resolves an issue where quality checks remained active after merging multiple Manufacturing Orders. Previously, the merge process didn't trigger the standard cleanup, leading to lingering quality check entries. Now, when Manufacturing Orders are merged, pending quality checks are correctly deleted, and the 'Quality Checks' button disappears.
Original PR description
Version: -------- - 18.0+ Steps to reproduce: ------------------- - Install `quality_mrp` - Create a manufactured product with a BoM - Create a Quality Point for the `Manufacturing` operation of that…
Version: -------- - 18.0+ Steps to reproduce: ------------------- - Install `quality_mrp` - Create a manufactured product with a BoM - Create a Quality Point for the `Manufacturing` operation of that product - Create and confirm multiple Manufacturing Orders - Verify that each MO generates a quality check - From the MO list view, select the MOs and merge them from the gear menu(merge) Issue: ------ When Manufacturing Orders are merged, All MOs are cancelled but it keep their quality checks in the 'To Do' state. As a result: - The quality checks remain linked to cancelled MOs - The 'Quality Checks' smart button is still displayed on cancelled MOs Expected behavior: ------------------ - Pending quality checks should be deleted when the MO is cancelled - The 'Quality Checks' smart button should no longer be displayed Cause: ------ A previous fix introduced logic to remove pending quality checks when a Manufacturing Order is cancelled: odoo-dev@db93bd2 This logic was implemented in `action_cancel()` by unlinking quality checks associated with the cancelled MO: https://github.com/odoo/enterprise/blob/20bc0eb5c2cec67eecd3b44450934e23370b48f2/quality_mrp/models/mrp_production.py#L94-L97 However, when MOs are merged, the merge flow does not call `action_cancel()`. Instead, it directly invokes `_action_cancel()` on the source Manufacturing Orders: https://github.com/odoo/odoo/blob/aca0b7289c68fc7a75d47ab313f5f791ebf30f7d/addons/mrp/models/mrp_production.py#L2480 Since the quality check cleanup is implemented only in `action_cancel()`, it is bypassed during the merge process. As a result, the source MOs are cancelled but their pending quality checks remain in place. --- opw-6260735 Forward-Port-Of: odoo/enterprise#121536 Forward-Port-Of: odoo/enterprise#119525
3 changes
Resolved issues and error corrections
This update corrects a bug where quality checks remained active after merging multiple Manufacturing Orders. Previously, the merge process didn't trigger the standard cleanup of these checks. Now, when MOs are merged, pending quality checks are automatically removed, preventing unnecessary clutter and ensuring data accuracy. This improves the user experience and streamlines the manufacturing workflow.
Original PR description
Version: -------- - 18.0+ Steps to reproduce: ------------------- - Install `quality_mrp` - Create a manufactured product with a BoM - Create a Quality Point for the `Manufacturing` operation of that…
Version: -------- - 18.0+ Steps to reproduce: ------------------- - Install `quality_mrp` - Create a manufactured product with a BoM - Create a Quality Point for the `Manufacturing` operation of that product - Create and confirm multiple Manufacturing Orders - Verify that each MO generates a quality check - From the MO list view, select the MOs and merge them from the gear menu(merge) Issue: ------ When Manufacturing Orders are merged, All MOs are cancelled but it keep their quality checks in the 'To Do' state. As a result: - The quality checks remain linked to cancelled MOs - The 'Quality Checks' smart button is still displayed on cancelled MOs Expected behavior: ------------------ - Pending quality checks should be deleted when the MO is cancelled - The 'Quality Checks' smart button should no longer be displayed Cause: ------ A previous fix introduced logic to remove pending quality checks when a Manufacturing Order is cancelled: odoo-dev@db93bd2 This logic was implemented in `action_cancel()` by unlinking quality checks associated with the cancelled MO: https://github.com/odoo/enterprise/blob/20bc0eb5c2cec67eecd3b44450934e23370b48f2/quality_mrp/models/mrp_production.py#L94-L97 However, when MOs are merged, the merge flow does not call `action_cancel()`. Instead, it directly invokes `_action_cancel()` on the source Manufacturing Orders: https://github.com/odoo/odoo/blob/aca0b7289c68fc7a75d47ab313f5f791ebf30f7d/addons/mrp/models/mrp_production.py#L2480 Since the quality check cleanup is implemented only in `action_cancel()`, it is bypassed during the merge process. As a result, the source MOs are cancelled but their pending quality checks remain in place. --- opw-6260735 Forward-Port-Of: odoo/enterprise#121536 Forward-Port-Of: odoo/enterprise#119525
This update streamlines the calculation of French VAT within the Odoo system. By removing unnecessary dependencies on account move data, the system now computes VAT more efficiently, reducing potential delays and improving overall performance. This change addresses a previous build error and prevents unnecessary recalculations when partner information is updated.
Original PR description
- This removes dependency on account move fields to company : Build error 939448 - This removes dependency on account move fields to commercial_partner_id fields (avoid recompute all moves on partner info change) Forward-Port-Of: odoo/odoo#271822 Forward-Port-Of: odoo/odoo#269701
This update corrects a problem within the planning module's automated testing process. The fix ensures that test data is self-contained, preventing issues with undo operations affecting previously allocated hours. This improves the reliability of our planning test suite.
Original PR description
Fix by creating the planning role directly within the test, making it self-contained. runbot error-939985 Forward-Port-Of: odoo/enterprise#121111
39 changes
New functionality added to Odoo
This update introduces a new debugging tool within the POS system that allows users to quickly assess the status of all connected IoT devices. The tool groups device information by IoT box, providing a clear overview of device health and enabling faster troubleshooting. This improves operational efficiency and reduces downtime related to IoT integrations.
Original PR description
This commit adds a button to the Debug widget that tests every IoT device configured in the POS. The device statuses are grouped by IoT box and displayed to the user. task-6322718 <img width="622" height="360" alt="image" src="https://github.com/user-attachments/assets/e778946b-5ad6-40cc-bd76-729a58755551" />
This update adds a new command introduced in the recent o-spreadsheet update to the list of publicly available commands. This ensures users can easily access and utilize the latest functionality within the spreadsheet module. It's a straightforward addition to improve usability.
Original PR description
Last o-spreadsheet update added a new command, so we need to add it to the public command list.
This update introduces the ability to define and use 'computed measures' within Odoo's spreadsheet edition. This allows users to automatically calculate new metrics based on existing data, providing more sophisticated reporting and analysis capabilities directly within the spreadsheet interface. It improves the flexibility and power of the spreadsheet functionality.
Enhancements to existing features
This update enhances the tracking of sickness leave by allowing a relapse leave to be linked to its original leave. This simplifies payroll calculations and improves the user experience by providing better visibility into leave history. The changes also automate the selection of the previous day's leave as the default for relapse leaves.
Original PR description
We wanted to add a new field to hr_leave to link a relapse leave to the origin leave, to ease tracking, payroll calculations and improve UX. -Added a new M2O field to link the origin leave. -Adeed a new M2M field to compute the allowed origin leaves to choose from. -default the origin leave if exist a leave the day before the new leave start date. Task#6209556
This update adds a payment reference to invoices generated from Amazon orders. This enhancement improves traceability and simplifies reconciliation between Amazon sales data and Odoo invoices, leading to more accurate financial reporting.
Original PR description
Set `payment_reference` on invoices from `amazon_order_ref` during invoice creation to improve traceability and reconciliation for Amazon orders. Task: 6140292
This update simplifies the 'Print Planning' action within the Project app, renaming it to 'Print' for clarity. It also removes an unnecessary header from the printed schedule, allowing the full page to be used for the table. This improves the user experience and presentation of project schedules.
Original PR description
The Gantt and Calendar "Print Planning" action lives in the Project app and is confusing alongside the Planning app, so rename it to simply "Print". The printed schedule also uses `web.internal_layout`, which adds a date/company/ page header and reserves top margin for it. Switch the report to `web.basic_layout` so the header is removed and the table can use the full page. task-6186527
This update enhances the Gantt view's user experience by improving the display of pill titles and adding a toggle to show dependencies. It also introduces finer-grained time precision for scheduling tasks, resulting in a more intuitive and accurate planning tool.
Original PR description
*: web_studio, planning, planning_field_service, pos_appointment, project_enterprise, sale_planning, hr_holidays_gantt Refines the Gantt view layout and interaction model with the following updates: - Clip pill titles cleanly on overflow rather than displaying an ellipsis. - Map double-clicks directly to the form dialog wrapper, buffering single clicks to isolate the popover action. - Introduce a "Show dependencies" action toggle in the reschedule dropdown (persisted in localStorage). - Hide all connector lines when the dependency toggle is disabled, unless their anchor pill is actively hovered. - Propagate connector line highlighting whenever its source or target pill is hovered. - Adapt the pill and connector highlight style to their color. - Widen the connector bullet hitbox to facilitate interaction. - Add a new quarter-day (6h) cell precision configuration for week and month view scales. - Remove useless divs from the gantt_renderer_controls file. task-6159075
This update strengthens the connection between employee records and their associated documents. Now, when uploading documents, they're automatically linked to the employee, and employees can easily view all their linked documents regardless of location. This streamlines document access and management for HR staff.
Original PR description
This commit adds more synchronization between the documents and the employee by implementing the points below. - Add the support of the `hr.employee` model in the res_model of documents. - When coming from the context of the employee, uploading the file leads to linking the employee by default to the res_model. - Open the base action_open_documents for employee when the bridge is enabled, allowing to show all documents linked to the employee irrespective of their location (See Task-5948278). Task-6072094
This update enhances the user experience on the Helpdesk portal by simplifying search functionality and improving ticket display. Specifically, the search now prioritizes ticket descriptions and messages, and ticket names are no longer truncated, providing a clearer view for support agents and customers.
Original PR description
This commit: - Replace search on "Customer" and "Helpdesk Team" with "Description" and "Messages". - Display folded stage's pill in green. - Allow ticket names to wrap instead of being truncated. task-6197601
This update simplifies tax management for records where taxes are calculated externally. The toggle to manually set included/excluded taxes has been hidden to prevent user interference and ensure accurate calculations, particularly when integrated with Avalara for US and EDI for Brazil. This change maintains data consistency and avoids potential tax filing errors.
Original PR description
A new way to manage price-included/-excluded taxes was recently added [1]. We hide the toggle if taxes are calculated externally, because for these records the tax calculator is in charge and the user shouldn't be tempted to change what they determined. Doing so doesn't have the intended effect anyway: - Confirming the record will recalculate the taxes anyway, - If you somehow force it to be different, Odoo won't be in sync with Avalara which causes unexpected tax filing (for US) or EDI (for Brazil), [1] https://github.com/odoo/enterprise/pull/114100 task-6327486
This update adds a 'Print Yield Copy' button to delivery guides in Chile, aligning with local regulations. This allows for the physical signing of fiscal documents, ensuring compliance with Chilean tax requirements. The change improves the functionality of delivery guides for businesses operating in Chile.
Original PR description
*: _stock Purpose: In Chile, all fiscal PDF documents printed also needs to print a "yield copy." The copy has an extra block of information that allows fiscal documents to be signed physically (yielded). Since Electronic Delivery Guides are fiscal valid PDFs, a yield copy needs to be implemented. When a delivery guide is created for a delivery order, a "Print Yield Copy" button will appear next to "Print Delivery Guide" button. This button will print the yield copy of the delivery guide when clicked. task-6180890
This update introduces a standardized method for extracting VAT numbers from various Odoo modules, simplifying VAT reporting and reconciliation. The change creates a reusable function to remove country codes from VAT numbers, ensuring consistency and accuracy across different reports and localization modules. This improves data quality and reduces manual effort for users.
Original PR description
In this commit: - Create a new generic method '_get_clean_vat_number' in res_partner - This method will be used to extract the numeric part of a VAT number by removing its country_code prefix. Community PR: https://github.com/odoo/odoo/pull/229461 Task [link](https://www.odoo.com/odoo/project.task/5117804) task-5117804
Resolved issues and error corrections
This update resolves a stability issue in the Gantt chart module. Enabling user chatter previously caused test crashes due to missing data. This commit adds the necessary model changes to ensure compatibility and reliable operation.
Original PR description
Enabling user chatter caused crashes in tests because the mock user model was missing expected fields. This commit adds the necessary model inheritances to provide those fields. **Community PR:** odoo/odoo#265502 **Task**: 4933086
This update streamlines the layout of quantity buttons within the Odoo inventory barcode interface. Previously, a confusing button arrangement and inconsistent delete functionality caused user friction. Now, the layout is more intuitive, and the delete button's behavior has been clarified to only remove lines from the view, improving the user experience.
Original PR description
This commit improves the layout of quantity buttons in barcode in both cases of physical inventory and transfers. ### Before this commit: 1- The fulfill button disappeared if `quantity done == demand…
This commit improves the layout of quantity buttons in barcode in both cases of physical inventory and transfers. ### Before this commit: 1- The fulfill button disappeared if `quantity done == demand - 1` which causes the increment and decrement buttons to shift their positions, that caused confusion to the user. 2- The delete button (red trash button) in case of physical inventory count was used to set the count of the product to 0 and remove the line from barcode view. 3- The "?" button (to mark the quantity as not set yet while inventory count) appeared whether the quantity on line was set to a number >= 0. 4- The button for registering components was among the lower buttons (increment, decrement, and fulfill). ### After this commit: 1- The fulfill button still disappears when `quantity done == demand - 1` but an empty spacer replaces it, which causes other buttons to hold positions. 2- The delete button now only appears when the user adds a product by themselves using the form or scanning the product (not while the product is in an inventory request). Also the functionality is of the button is now different, it just removes the line from the barcode view without affecting the inventory count at all. 3- The "?" button now only appears if the quantity = 0. 4- The button for registering components is no next to the edit button. Upgrade PR: https://github.com/odoo/upgrade/pull/10224 Task-6095725
This update resolves an issue where the website link wasn't correctly populated when creating a lead through the AI-powered CRM tool. The fix ensures that the visitor's website information is accurately captured, improving the lead generation process. This prevents missing website data from being associated with new leads.
Original PR description
see: https://github.com/odoo/odoo/pull/252766 ERROR: Subtest TestAiCrmLivechatTools.test_create_lead_tool_from_livechat (login='public_user') Traceback (most recent call last): File…
see: https://github.com/odoo/odoo/pull/252766
ERROR: Subtest TestAiCrmLivechatTools.test_create_lead_tool_from_livechat (login='public_user') Traceback (most recent call last):
File "/data/build/odoo/odoo/tools/safe_eval/evaluation.py", line 431, in safe_eval
return unsafe_eval(c, globals_dict, None)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "ir.actions.server(272,)", line 1, in <module>
File "/data/build/odoo/odoo/tools/safe_eval/runtime.py", line 659, in safe_call
return callee(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/enterprise/ai_crm/models/crm_lead.py", line 16, in _ai_create_lead
self.create(self._ai_prepare_lead_creation_values({
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/enterprise/ai_crm_livechat/models/crm_lead.py", line 21, in _ai_prepare_lead_creation_values
if 'website' in self.env and (visitor := channel.livechat_visitor_id):
^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'discuss.channel' object has no attribute 'livechat_visitor_id'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/data/build/odoo/odoo/tests/common.py", line 2949, in with_users
func(self, *args, **kwargs)
File "/data/build/enterprise/ai_crm_livechat/tests/test_ai_crm_livechat_tools.py", line 17, in test_create_lead_tool_from_livechat
tool.with_context({'discuss_channel': livechat_channel})._ai_tool_run(None, {
File "/data/build/enterprise/ai/models/ir_actions_server.py", line 288, in _ai_tool_run
self._run_action_code_multi(eval_context=eval_context)
File "/data/build/odoo/odoo/addons/base/models/ir_actions.py", line 1012, in _run_action_code_multi
safe_eval(self.code.strip(), eval_context, mode="exec", filename=str(self))
File "/data/build/odoo/odoo/tools/safe_eval/evaluation.py", line 437, in safe_eval
raise ValueError('%r while evaluating\n%r' % (e, expr))
ValueError: AttributeError("'discuss.channel' object has no attribute 'livechat_visitor_id'") while evaluating "ai['result'] = record.sudo()._ai_create_lead(name, contact_name, description, email, phone, team_id, tag_ids, priority, country_id, state_id, city, zip_code, street, job_position)"This update resolves an issue where users assigned to sign requests ('Own Templates' group) were encountering an 'Access Error' when attempting to sign documents. The fix utilizes `sudo()` to correctly access document counts, ensuring these users have the necessary permissions to open and sign documents. This improves the user experience for sign requests created with the 'Own Templates' access right.
Original PR description
Steps to Reproduce: 1. create a new user (UserB) and grant the 'User: Own Templates' access right. 2. send a new Sign Request to UserB. 3. log in with the UserB account and try to sign the document. Issue: An 'Access Error' message is displayed instead of opening the document to sign. Cause: `go_to_document` and `go_to_signable_document` read `self.template_id.document_ids` to compute `document_count`, and the `sign.template` record rule for `group_sign_user` only grants access to the template owner. Users assigned to sign request created from that template do not have access to the template itself, so reading `document_ids` raises an `AccessError` before the document can be opened. Solution: Used `sudo()` in both methods to compute document_count.
This update resolves an issue preventing proper grouping in the resource search view based on job position. The fix ensures that users can now filter and group resources accurately, improving search efficiency. This enhancement streamlines resource management within the Enterprise module.
Original PR description
In a recent commit, we added the job position to the resource search view. However, the group by was not working because the field was not stored. This is now fixed in this commit. task-6329358
A previous bug caused an unwanted 'Uninstall modules' prompt to appear after saving settings, specifically when the Website Form module was installed. This fix ensures the module remains installed regardless of the Website Form setting, as it's now essential for displaying Field Service information in the portal. This prevents unnecessary user disruption.
Original PR description
Steps to reproduce: - 1. Install `website` and `planning_field_service` (so `website_planning_field_service` auto-installs). 2. Open Settings and click Save. Issue: - An "Uninstall modules" wizard…
Steps to reproduce: - 1. Install `website` and `planning_field_service` (so `website_planning_field_service` auto-installs). 2. Open Settings and click Save. Issue: - An "Uninstall modules" wizard pops up offering to remove `website_planning_field_service`. Cause: - Since the module is now `auto_install` with its `post_init_hook` removed, it is installed alongside `website` and `planning_field_service` while the setting remains disabled by default. On Save, `set_values` re-derives the `module_website_planning_field_service` field from a company `search_count`, setting it to False when no company has the feature enabled, even though the module is installed. Base `execute()` then sees `module_* = False` on an installed module and re-offers the uninstalls. Fix: - Make `set_values` install-only: enabling the setting still installs the module, but disabling it no longer attempts to uninstall it. The module is now also used to show or hide Field Service information in the portal, so it must remain installed even when the Website Form feature is disabled. task-6330718
This update resolves issues where AI record creation and updates were failing due to missing history data, leading to blank responses for users. Additionally, the system was incorrectly duplicating AI search filters during record reloads. The fix ensures AI history is properly captured and filters are applied only once, improving the reliability and performance of AI-powered record operations.
Original PR description
## Issue Pending tool results were missing from history we read for create/update, potentially producing empty responses. Also the create/ update soft reload actions are duplicating the AI search filters in the records' search view if the view is already open and filters are already set. ## Fix Refresh the session history after pending tool calls and avoid reapplying AI search criteria when restoring existing search state. task-id-6329071
This update fixes an issue where shift report PDFs displayed unnecessarily large pills for single-line shift names. The change ensures shift pill sizes are now correctly optimized for single-line names while still accommodating longer names that wrap to multiple lines. This improves the visual clarity and consistency of shift reports.
Original PR description
### Steps to reproduce: 1. Go to Planning. 2. Create a shift with a short name that easily fits on a single line. 3. Click Actions > Print to generate the PDF report. 4. Observe the printed shift pill. ### Issue: Single-line shift pills look unusually large because they take up unnecessary vertical space on the printed report. ### After: The pill now correctly shrinks to fit a single-line name natively, while still expanding downward if a longer name wraps to a second line. task-5062148
A recent update to Odoo's user interface broke the way certain fields, specifically the VAT field, are displayed. This fix corrects the broken XPath expressions, ensuring the VAT field is correctly rendered across multiple Odoo localization modules. This resolves a display issue impacting financial reporting.
Original PR description
The refactor of identifiers on both the partner and company views broke some xpaths. This commits aims at repairing those. See https://github.com/odoo/odoo/pull/262274 See https://github.com/odoo/enterprise/pull/115838 task-none
This update resolves a critical issue where salary rounding wasn't correctly applied in Belgian payroll tests due to a missing company country setting. Additionally, a fix was implemented to address overlapping test data in scheduling tests, preventing errors and ensuring accurate shift splitting. These changes improve the reliability of payroll calculations and scheduling functionality.
This update resolves an issue where sign templates with auto-filled fields would incorrectly display placeholders instead of the actual values, or fail to generate documents. The fix ensures falsy auto-filled values are properly preserved, preventing errors and guaranteeing accurate sign document generation.
Original PR description
Version: - 19.0 Steps to reproduce: - Create a sign template with a readonly sign item linked to an auto field. - Use a reference record where the linked field value is empty or False. - Send the…
Version: - 19.0 Steps to reproduce: - Create a sign template with a readonly sign item linked to an auto field. - Use a reference record where the linked field value is empty or False. - Send the document for signing. - Complete the signing flow. Issue: - Readonly sign items linked to auto-filled values could not properly handle falsy values. Empty values could trigger the error "Some required items are not filled" and completed sign requests displayed the sign item placeholder instead of the actual auto-filled value. - completed document generation could fail when rendering falsy values for textarea sign items. Cause: - Falsy auto-filled values were ignored during constant item population and replaced by the sign item placeholder. Additionally, readonly constant items were included in required field validation and completed sign requests continued to display placeholders when the stored value was empty. - document rendering assumed sign item values were always strings for textarea sign items but when auto field is empty it value can be False. Fix: - Preserve falsy values when populating readonly constant items, exclude constant items from signer validation, and hide placeholders for empty auto-filled constant items when displaying completed sign requests. - Normalize falsy values to prevent crashes and allow completed documents to be generated correctly. Forward-Port-Of: odoo/enterprise#121299 Forward-Port-Of: odoo/enterprise#121009
This update fixes a scheduling issue with semi-monthly payrolls. Previously, payslips were incorrectly aligned with the month's halves, resulting in overlapping periods. The change now ensures payslips start on the 16th of the month, accurately reflecting the payroll schedule.
Original PR description
Issue: ---------------------------------------- The start date of semi-monthly payslips on second half of the month is the 15 which is also the end date of the first half of the month. Steps to reproduce: ---------------------------------------- - Have an employee with a semi-monthly payroll - When in the first half of the month, create a payslip for this employee - The payslip is from 1st to 15th - Do the same when in the second half of the month - The payslip is from 15th to end of the month Cause: ---------------------------------------- In `_schedule_period_start()` we set the start date to th 15th for semi-monthly payslips. Solution: ---------------------------------------- Set it to the 16th. opw-6281556 Forward-Port-Of: odoo/enterprise#120887 Forward-Port-Of: odoo/enterprise#120172
This update fixes an issue where the system incorrectly rejected zero measurements from caliper devices in IoT data. This ensures accurate reporting of measurements, particularly when a device isn't detecting anything. The update also includes a minor typo correction.
Original PR description
Fix a check on the IoT response that incorrectly rejected valid measurements of 0 from caliper devices Also fix a typo opw-6184669 Forward-Port-Of: odoo/enterprise#121226 Forward-Port-Of: odoo/enterprise#121116
This update resolves an issue where users were encountering access errors when using the timesheet suggestion dropdown. The fix prevents the timer from suggesting tasks the user no longer has permission to view, ensuring a smoother timesheet experience. This improves usability and prevents potential disruptions for users.
Original PR description
Steps to reproduce: - 1. Log in as a user who can see their own timesheets and has already logged time on tasks that are now in projects they can no longer read (e.g. Marc Demo in the demo data). 2. Open the Timesheets timer in the systray and check in. 3. Click the task field to open the suggestions dropdown. Issue: - An access error is raised when the task dropdown is opened. Cause: - The timer's `project.task` `name_search` override suggests recently used tasks via `account.analytic.line.sudo()._get_recently_used_records()`. The sudo surfaces task ids the user can no longer read. `name_search` returns them, raising the access error. Fix: - Filter the aggregation result so only tasks the user can read are returned. task-6319815 Forward-Port-Of: odoo/enterprise#121345
A minor typo in the payroll warning system was causing incorrect alerts. This update corrects the typo, ensuring that payroll warnings are accurately identified and displayed to users. This resolves a potential disruption to payroll reporting.
Original PR description
The DMFA submission payroll warning was incorrectly matched by _get_payroll_translation because of a small typo task-6326554
This update resolves an issue where PrintRec components could receive incorrect data values. Previously, these components weren't properly validated, which could lead to unexpected behavior. This fix ensures data integrity for PrintRec components, particularly when used in production environments.
Original PR description
This commit fixes the props validation of PrintRec* components since they can receive `false` on some property. Before the components were not validated because they were mounted with a production mode app.
This update resolves a technical issue impacting work order duration calculations. A recent code change shifted a related function, but a critical component – accounting for travel time – was missed. This fix, triggered by a runbot error, ensures accurate work order duration reporting.
Original PR description
get_duration was moved from mrp_workorder to mrp in odoo/odoo#267113 and odoo/enterprise#118753 However, _intervals_duration missed the trip This solves runbot error 940411
This update enhances the helpdesk system by adding tests to ensure auto-reminder emails are sent correctly before tickets are automatically closed. It also corrects a calculation error in the reminder timer, preventing delays in sending these important notifications. This improves the efficiency of our support process and ensures timely communication with customers.
Original PR description
- add tests for the auto reminder email before auto-closing tickets - fix issue with the reminder timer calculation --- task-5438678 Forward-Port-Of: odoo/enterprise#120540
Features or functions removed from Odoo
This update removes redundant app creation within Odoo, streamlining the system and reducing potential errors. By eliminating unnecessary app instances, we minimize the risk of configuration issues and simplify debugging, ultimately improving stability.
Original PR description
See commit messages for detail - https://github.com/odoo/odoo/pull/267998
Code cleanup and technical improvements
Replaced \`useLayoutEffect\` with \`onMounted\` because \`useLayoutEffect\` is deprecated in OWL3. The effect used an empty dependency array (\`() => []\`), meaning it ran exactly once after the first render — which maps directly to \`onMounted\`. No reactive tracking or DOM measurement was needed, so \`onMounted\` is the correct and minimal replacement. The \`useLayoutEffect\` refactored in this PR has test coverage — below are some tests that failed when the effect was commented out: - @docu
Original PR description
Replaced \`useLayoutEffect\` with \`onMounted\` because \`useLayoutEffect\` is deprecated in OWL3. The effect used an empty dependency array (\`() => []\`), meaning it ran exactly once after the first render — which maps directly to \`onMounted\`. No reactive tracking or DOM measurement was needed, so \`onMounted\` is the correct and minimal replacement. The \`useLayoutEffect\` refactored in this PR has test coverage — below are some tests that failed when the effect was commented out: - @documents/kanban_view/Check actions with preview - @documents/kanban_view/Download button availability - @documents/kanban_view/Ensure previewer shows correct name after renaming a document see runbot build: https://runbot.odoo.com/runbot/batch/2593689/build/114684050
This update removes an outdated code element (`useLayoutEffect`) that was causing instability in the Knowledge module. Replacing it with `onMounted` ensures the module functions reliably and aligns with current Odoo standards. Successful automated tests confirm the change.
Original PR description
Replaced `useLayoutEffect` with `onMounted` because `useLayoutEffect` is deprecated in OWL3. The effect called `toggler.click()` once when the toggler element became available on mount. `onMounted` is the correct replacement: the toggler ref's el is present at mount time, so a single `onMounted(() => this.toggler.el?.click())` fires synchronously at the same lifecycle point, matching the original timing without the deprecated hook. The useLayoutEffect refactored in this PR has test coverage — below are some tests that failed when the effect was commented out, and are now passing: - @knowledge/options_dropdown/Move Article - FAIL: WebSuite.test_unit_desktop (in html_editor,knowledge suite) - FAIL: MobileWebSuite.test_unit_mobile (in html_editor,knowledge suite) see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2596678/build/114854269
This update replaces an outdated code component with a modern version compatible with Odoo's latest framework (OWL3). This ensures the appointment screen functions correctly and avoids potential issues with deprecated code. The change was verified through automated testing, confirming the functionality remains intact.
Original PR description
Replaced `useLayoutEffect` with `useEffect` (OWL3) because `useLayoutEffect` is deprecated in OWL3. The single `useLayoutEffect` was reacting to `this.props.actionName`: when `actionName ===…
Replaced `useLayoutEffect` with `useEffect` (OWL3) because `useLayoutEffect` is deprecated in OWL3. The single `useLayoutEffect` was reacting to `this.props.actionName`: when `actionName === 'manage-booking'` it makes an async `data.call` to open the booking gantt view, then dispatches `doAction` / `switchView`. This is not derived state and does not load data into component state — it dispatches an action, making OWL3 `useEffect` the correct replacement. OWL3 `useEffect` auto-tracks reactive values read in its body, so `this.props.actionName` is tracked automatically without an explicit dep array. The `useLayoutEffect` refactored in this PR has test coverage — below are some tests that failed when the effect was commented out, and are now passing: - `@pos_appointment/unit/screens/action_screen/ActionScreen => useEffect`: Expected gantt view action, received null - `FAIL: TestFrontend.test_appointment_kanban_view_date_filter`: Tour failed at 'Go to kanban view' step - `FAIL: TestUi.test_pos_restaurant_appointment_tour_basic`: Tour failed at 'Check that the booking gantt view is shown' see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2596700/build/114854622
This update improves the way mock server data is structured and serialized, aligning it with recent changes in the Odoo Enterprise platform. Specifically, the mock models used in various modules (ai, approvals, voip, whatsapp, etc.) have been updated to use a new field list DSL and `as_dict()` serialization, ensuring better compatibility and data consistency. This change enhances the reliability of the mock server environment for testing and development.
Original PR description
Enterprise companion of the community commit "[REF] mail, *: match mock server Store to python implementation". Migrate the mock server mock models to the new `_store_<name>_fields` field list DSL and `as_dict()` serialization. https://github.com/odoo/odoo/pull/271117
This update simplifies the underlying model structure within Odoo's Web Studio. As part of a larger migration to a newer version (Owl 3), the team has replaced older model definitions with more modern `t-model` and `t-model.proxy` structures. This change improves the long-term maintainability and stability of Web Studio applications.
Original PR description
As part of the migration from `owl 2` to `owl 3`, this commit replaces uses of `t-custom-model` with `t-model` or `t-model.proxy`.
This update centralizes the configuration for printing IoT reports using a standardized registry. This change enhances flexibility and maintainability by allowing for easier updates and modifications to report printing methods for IoT printers, without requiring direct code changes.
Original PR description
we now use the registry to define the method to print reports using IoT printers. see odoo/odoo#271560
This update simplifies the codebase by replacing older model structures (`t-custom-model`) with newer, more efficient ones (`t-model` and `t-model.proxy`) as part of the ongoing migration to Owl 3. This change improves the underlying system's performance and maintainability.
Original PR description
* = [ai_website] As part of the migration from `owl 2` to `owl 3`, this commit replaces uses of `t-custom-model` with `t-model` or `t-model.proxy`.
This update simplifies the underlying data structure within the Enterprise module by replacing older model types with newer, more efficient `t-model` and `t-model.proxy` structures. This change is part of a larger migration from `owl 2` to `owl 3`, ensuring the system remains current and optimized for future development.
Original PR description
As part of the migration from `owl 2` to `owl 3`, this commit replaces uses of `t-custom-model` with `t-model` or `t-model.proxy`.
3 changes
Resolved issues and error corrections
This update ensures the preparation time is accurately displayed in the backend order view, even when only a single item is being prepared. Previously, the system didn't update the preparation time field when a single orderline was present, leading to inaccurate order tracking. This fix guarantees consistent preparation time calculations for all orders.
Original PR description
## Steps to reproduce: - Open the restaurant and the linked preparation display - Send a single product to the kitchen - On the preparation display, click on the line - In the backend go to the order…
## Steps to reproduce: - Open the restaurant and the linked preparation display - Send a single product to the kitchen - On the preparation display, click on the line - In the backend go to the order - The Preparation Time field will be empty ## Why the fix: With the current implementation, we only update the **preparation_time** on the orderline if we still have some orderlines to make, and if we don't, we change the state to the next stage in the preparation display https://github.com/odoo/enterprise/blob/a14d1b8ed84aae4e274a674c6aa24130a378bef5/pos_enterprise/static/src/app/components/order/order.js#L112-L116 This means that if there is a single orderline on the order, clicking on the line will only move it to the next stage, and won't trigger the backend calculation to update the preparation_time. We now always trigger the calculation of the preparation_time when a line is clicked, as it is weird for it to be triggered only when we have multiple lines waiting. It needs to be done in an asynchronous manner, as concurrent database calls would cause wrong values if we called **syncStateStatus** and **changeStateStageAnimation** at the same time. opw-6283017
This update resolves an issue where foreign currency vendor bills were incorrectly flagged as 'Partially matched' by the GSTR-2B reporting system. The fix ensures that amounts are correctly converted to the company's base currency (INR) during reconciliation, leading to accurate GSTR-2B matching.
Original PR description
**Steps to reproduce:** * Install the **l10n_in_reports** module. * Go to **Accounting → Configuration → Settings**, and enable **Multi-Currencies**. * Activate a foreign currency (e.g., USD) and set…
**Steps to reproduce:** * Install the **l10n_in_reports** module. * Go to **Accounting → Configuration → Settings**, and enable **Multi-Currencies**. * Activate a foreign currency (e.g., USD) and set an exchange rate. * Create a new vendor bill for an Indian vendor, setting the currency to USD. * Add lines to the bill and apply IGST/GST taxes, then confirm the bill. * Go to **Accounting → Reporting → GST Return Period** and initiate GSTR-2B matching for the period corresponding to the bill (using a valid JSON payload where the amounts are correctly reported in INR). **Observed behavior:** * The vendor bill is incorrectly marked as "Partially matched" instead of "Fully matched", accompanied by an exception stating that the total amount as per GSTR-2B does not match. **Cause:** * The GSTR-2B data fetched from the GST portal always reports values in the company's base currency (INR). * The `match_bills` method was directly comparing the GSTR-2B INR amounts ( `bill_total` and `bill_taxable_value`) against the bill's `amount_total` and `amount_untaxed` fields. * Because these fields return values in the document's foreign currency (e.g., USD), the mismatch triggers an exception and flags the bill as partially matched. **Fix:** * Modified the matching logic to compare GSTR-2B values against `abs(amount_total_signed)` and `abs(amount_untaxed_signed)`. * This ensures that the amounts evaluated during reconciliation are always correctly converted and compared in the company's base currency (INR). opw-6311097 Forward-Port-Of: odoo/enterprise#121563 Forward-Port-Of: odoo/enterprise#120967
This update resolves an error that occurred when the 'Company Car (To order)' option was enabled in the salary configurator, specifically when the module wasn't set up with demo data. The fix ensures the system checks for both the option being enabled and a car model selected before attempting to process the data, preventing a critical error.
Original PR description
## Steps to Reproduce: 1. Install `l10n_be_hr_contract_salary` without demo data. 2. Create a Belgian company and switch to it. 3. Create an employee. 4. Create a contract for the employee. 5. Click Generate Offer and open the Salary Configurator. 6. Enable the 'Company Car (To order)' option. ## Error: `AttributeError: 'NoneType' object has no attribute 'split'` ## Cause: When the salary configurator is used without demo data, no car model is selected. The method assumes that select_wishlist_car_total_depreciated_cost always contains a value and directly calls split() on it, resulting in an error, when the field is None. ## Fix: This commit checks that both the company car option is enabled and a car model has been selected before trying to extract the model ID. sentry-7554712017 Forward-Port-Of: odoo/enterprise#121527 Forward-Port-Of: odoo/enterprise#121138
5 changes
Resolved issues and error corrections
This update enables the automatic sending of a ‘payment_sent’ message (CDV 211) from purchase invoices through the PDP. Previously, this notification was only available for sales invoices. This ensures suppliers are promptly informed of payment status, streamlining the financial process and improving data accuracy.
Original PR description
## Summary - Enable outbound CDV 211 (`payment_sent`) from purchase invoices in `l10n_fr_pdp`. - Wizard exposes `payment_sent` for purchase documents with MPA payload and payment date. - Cron sends…
## Summary - Enable outbound CDV 211 (`payment_sent`) from purchase invoices in `l10n_fr_pdp`. - Wizard exposes `payment_sent` for purchase documents with MPA payload and payment date. - Cron sends PD for sales and `payment_sent` for purchases; lifecycle residual computed separately per type. ## Multi-repo issues - odoo/odoo#268018 — CDV 211 `payment_sent` on purchase bills ## Related PRs - *(Odoo CE only — no Akretion/OCA changes for this campaign)* ## Test plan - [ ] `odoo-bin -d test --test-tags=/l10n_fr_pdp:TestPdpMessages.test_purchase_payment_sent_lifecycle --stop-after-init` ## Merge order 1. Merge this PR on `odoo/odoo` 18.0 when approved. ## Reviewers & code owners - Requested review: @smetl @chklop - PDP / lifecycle context: @malb-odoo @baje @videc @sveaw --- ## Résumé - Émission sortante du CDV 211 (`payment_sent`) depuis les factures fournisseur dans `l10n_fr_pdp`. - Assistant : `payment_sent` sur les achats avec charge MPA et date de paiement. - Cron : PD pour les ventes, `payment_sent` pour les achats ; résidu de cycle de vie calculé séparément. ## Issues multi-dépôts - odoo/odoo#268018 — CDV 211 `payment_sent` sur factures fournisseur ## PR associées - *(Odoo CE uniquement — pas de changement Akretion/OCA)* ## Tests - [ ] `odoo-bin -d test --test-tags=/l10n_fr_pdp:TestPdpMessages.test_purchase_payment_sent_lifecycle --stop-after-init` ## Ordre de fusion 1. Fusionner cette PR sur `odoo/odoo` 18.0 après revue. ## Revue & auteurs du code - Review demandée : @smetl @chklop - Contexte PDP / cycle de vie : @malb-odoo @baje @videc @sveaw Fixes #268018
This update resolves an issue where importing UBL files containing invoice lines with zero quantity and amount would cause a division-by-zero error, leading to import failures. The fix ensures the system handles these zero-value lines correctly, improving the reliability of UBL import processes.
Original PR description
**PROBLEM** When importing a ubl with a line with an invoiced qty of 0 and an amount of 0, there is division by zero. **STEP TO REPRODUCE** 1. upload a ubl file with an empty line as a vendor bill (there is one in the bugfix ticket). 2. notice the import fails because of a division by zero. The division by zero was introduced by https://github.com/odoo/odoo/pull/265261 opw-6260558
This update corrects a test failure within the French invoicing module (l10n_fr_pdp) that occurred when only the basic Invoicing module was installed. The fix adds the necessary 'in_payment' state, which was present in the full 'enterprise' version of the Accounting module. This ensures the test suite runs correctly and avoids potential disruptions.
Original PR description
The `in_payment` state does not exist in community with only the Invoicing module installed. It is added in `enterprise` in the Accounting module. runbot.build.error-939451
This update corrects a previous issue where the GT Document Type field was incorrectly required when creating vendor bills for vendors outside of Guatemala. The change ensures the field is only mandatory for Guatemalan vendors, streamlining the billing process and improving usability for international transactions. This resolves a user experience problem.
Original PR description
Currently, the GT Document Type field is required when creating vendor bills for non-Guatemalan vendors. **Steps to reproduce:** - Install the `l10n_gt_edi` module and switch to a GT Company. -…
Currently, the GT Document Type field is required when creating vendor bills for non-Guatemalan vendors. **Steps to reproduce:** - Install the `l10n_gt_edi` module and switch to a GT Company. - Create a new vendor bill for a vendor whose country is not Guatemala. **Observation:** The `GT Document Type` field is required even though the selected vendor is not based in Guatemala. **Root Cause:** At [1], `_compute_l10n_gt_edi_available_doc_types` only checks the company country and ignores the vendor's country, causing GT available document types to be computed for foreign vendors as well. As a result, `l10n_gt_edi_available_doc_types` is populated and the view at [2] incorrectly makes `l10n_gt_edi_doc_type` required. **Fix:** This commit ensures the GT Document Type field is only required for Guatemalan vendors. [1]: https://github.com/odoo/enterprise/blob/7a80db5b5550bf75e4ce5337e869c42386c8a71c/l10n_gt_edi/models/account_move.py#L144-L171 [2]: https://github.com/odoo/enterprise/blob/7a80db5b5550bf75e4ce5337e869c42386c8a71c/l10n_gt_edi/views/account_move_views.xml#L27 opw-6315872
This update fixes an issue where closing the NemHandel registration wizard left outdated proxy information, causing problems when reopening it. Now, closing the wizard properly removes the proxy, ensuring a fresh start each time and preventing data inconsistencies. This improves the user experience for NemHandel registration.
Original PR description
Closing the NemHandel registration wizard (via the 'X' button / esc button) previously persisted the IAP proxy user. This caused issues when reopening the wizard, as stale proxy data prevented a clean retry. Now, closing the wizard triggers the same logic as the deregister button: the proxy user is deleted from the IAP/Odoo instance. This ensures that reopening the wizard always starts a fresh registration with editable values. Task-6075214 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
1 change
Resolved issues and error corrections
This update resolves a technical issue where the Intrastat report generation would fail when a company record lacked a country ID. The fix ensures a safer fallback mechanism in the SQL query, preventing errors and improving report reliability. This ensures accurate reporting for all companies.
Original PR description
When there is no `country_id` on the company we get `False`. The generated query then fail at: ``` ... CASE WHEN (code.country_id IS NULL OR code.country_id = false) THEN code.code ELSE NULL END AS commodity_code, ... ``` with: ``` ERROR: operator does not exist: integer = boolean LINE 12: ... WHEN (code.country_id IS NULL OR code.country_id = false) T... ```