Tuesday, August 19, 2025
83 changes
Enhancements to existing features
Avatars linked to contact records can now be clicked to open the same profile popover used for users. This makes partner-related many-to-many avatar fields more useful by giving quick access to contact information directly from the view.
Original PR description
With this commit, the AvatarCardPopover supports having an id of a `res.partner` record in the props. This allows components like KanbanMany2ManyTagsAvatarUserField (that use AvatarCardPopover) to be used with a Many2Many field related to `res.partner`. In such cases, the avatars will now be clickable and will display the avatar card popover. fixes: task-4640810
The Romanian localization now includes the new 11% and 21% VAT rates introduced by recent legislation. Tax group definitions were also aligned for more consistent accounting setup and reporting.
Original PR description
This PR adds new taxes and tax groups for 11% and 21% after new VAT law was introduced in Romania. It also fixes tax groups of some taxes and make it more consistent. TaskID:4979168 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222478 Forward-Port-Of: odoo/odoo#221238
This change reduces unnecessary loading of large email-related data when processing mail records. It helps prevent memory issues and improves performance for mail operations, especially when handling large messages or high volumes.
Original PR description
Modifications are made around read, filtered, list comprehension. The read function usually does not prefetech fields other than stated. But in this case, since the fields are related fields from…
Modifications are made around read, filtered, list comprehension. The read function usually does not prefetech fields other than stated. But in this case, since the fields are related fields from another model, The fields of the other model are prefeteched. This includes the body which can be very big in size and cause an out of memory error. Filtered does not need other fields and keeps them unnecessarily in cache. List comprehension where it has a reference to specific field inside the model also triggers the prefetecher. Benchmark: | |Number of queries| SQL time| Python time|| |-------|----------------------------|----------------|---------------|-| |with prefetch| 82| 1.887 | 7.898| Out of memory| |Without prefetch| 120| 0.385 | 5.973| | The benchmark with the prefetch was done locally with increasing the memory limit. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#211075 Forward-Port-Of: odoo/odoo#183893
Romanian SAF-T reporting has been updated to include the correct tax types and codes for newly introduced taxes under recent Romanian tax law. This helps companies keep tax reports aligned with legal requirements and reduces the risk of incorrect regulatory submissions.
Original PR description
New taxes were introduced in Romania as per the new tax Law. The PR https://github.com/odoo/odoo/pull/221238/files added new taxes in community. This PR updates the SAF-T Tax Type and Code for the newly added taxes. TaskID:4979168 Forward-Port-Of: odoo/enterprise#92094 Forward-Port-Of: odoo/enterprise#91512
Resolved issues and error corrections
The website events list now uses the visitor’s local day when applying the “Today” filter, instead of relying on UTC. This prevents events near midnight from appearing on the wrong day or being hidden for users in non-UTC time zones.
Original PR description
The filters use today in UTC to fetch events in db. The commit fixes this by located today first and then converts it in UTC. related odoo/odoo@bfd55de7c846a0d523e4de4b17020341d8fcfd23 task-4796181 Forward-Port-Of: odoo/odoo#213205
Point of Sale now ignores payment attempts that were canceled on a payment terminal when matching incoming terminal payments. This prevents a canceled payment from a previous order from blocking payment confirmation on a new order, helping cashiers complete sales without manual recovery.
Original PR description
If you made an order and tried to pay with a payment terminal (like Adyen) then canceled the payment on the terminal. Then leave the order and create a new order, add different products, and try to…
If you made an order and tried to pay with a payment terminal (like Adyen) then canceled the payment on the terminal. Then leave the order and create a new order, add different products, and try to pay again, pay on the terminal, the payment will not be transmitted to the PoS and the order would still be waiting for payment. Steps to reproduce: ------------------ * Create a pos payment method using adyen * Open a PoS session * Create an order with a product * Pay with the adyen payment method * Cancel the payment on the terminal * Leave the order * Create a new order with different products * Try to pay with the adyen payment method * Validate the payment on the terminal > Observation: The payment will not be transmitted to the PoS and the order will still be waiting for payment. Why the fix: ---------------- The issue occurs because the canceled payment line is still considered as a pending payment line. And when the payment will be receiven on the pos it would take the canceled payment line as the pending one. opw-4805704 Forward-Port-Of: odoo/odoo#222325 Forward-Port-Of: odoo/odoo#219054
This fixes an issue where choosing a record from a search dialog could unexpectedly open the record form instead of selecting it. Users can now reliably select records in these dialogs, including fields configured through Studio, reducing confusion and workflow interruptions.
Original PR description
Example of steps: - install web, purchase and studio - add a many2one with studio anywhere and choose purchase.order.line - close studio - try to use this new field, select "Search more" - select a random record - It opens the form view record instead of select It This is because purchase order line has an openAction that forces the opening of a form view. However, for a select_create_dialog, we must bypass this action to allow nothing except selection. To do this, a new prop has been added, “allowOpenAction,” in the list_controller, which will be true by default, but will be false for select_create_dialog. opw-4958121 Forward-Port-Of: odoo/odoo#223253 Forward-Port-Of: odoo/odoo#222602
French companies using Point of Sale can now display the self-service invoicing QR code on customer receipts in this version. This backport keeps the change focused and stable while adding coverage to help prevent regressions.
Original PR description
This commit backports parts of https://github.com/odoo/odoo/commit/4fd28add5c22614a4e5a386a440617edefed6d67, which originally was only merged into master, since it's unstable. Here however, we only backport the bare minimum to make the invoice QR code visible on the receipt, while keeping the changes stable. We also backport the test. opw-4981573
Fixed an issue where applications created from a talent pool could miss the expected acknowledgment email after assigning a job position. The recruitment flow now sets the correct application stage upfront, ensuring candidates receive the proper communication consistently.
Original PR description
### Steps to reproduce: - Create a talent pool - Check the application created under this pool - Set a job position in this application - Notice the email that got sent - Naviagte to the talent pool - Create a new application - Notice the acknowledgment email won't be sent ### Cause: When creating a new application from the talent pool we don't set a stage_id so it will get computed after creating the application so when checking in _track_template it won't exist in changes. https://github.com/odoo/odoo/blob/9ec4e0d3c5f1aaff0b36dc5def1e69b8285c3be1/addons/hr_recruitment/models/hr_applicant.py#L535-L544 ### Fix: When adding a new application through pool we check the stage related to the job we are assigning to the applicant and we set it so it will exist in changes when checking the email template that should be sent. opw-4925221 Forward-Port-Of: odoo/odoo#220367
Fixed an issue where Point of Sale orders with the same product on multiple lines could show an inflated delivered quantity in sales reporting. This ensures delivery totals are allocated correctly, improving report accuracy for ship-later POS orders.
Original PR description
If you made a sale with multiple lines having the same product, the qty_delivered was not correctly computed on the different lines. Steps to reproduce: ------------------- * Activate the ship later…
If you made a sale with multiple lines having the same product, the qty_delivered was not correctly computed on the different lines. Steps to reproduce: ------------------- * Activate the ship later option in the PoS settings * Open PoS * Add any product with a quantity of 5 * Apply a discount of 20% to the line * Click on the same product so that they are added as a second line * Change the quantity of the second line to 3 * Validate the order and use the ship later option * Validate the picking * Go to the sale report and check the qty_delivered for the product > Observation: The qty_delivered is doubled, 16 instead of 8. Why the fix: ------------ The qty_delivered was computed by summing the quantities of all moves for the product, but it did not take into account that the same product could be present in multiple lines of the same order. We now make sure to dispatch the delivered quantity correctly across the different lines of the order, ensuring that the qty_delivered is accurate. opw-4826487 Forward-Port-Of: odoo/odoo#221373
Fixes an issue where guests could not see the newsletter subscription checkbox during checkout after the website checkout page had been customized. When the Newsletter option is enabled in Website Settings, the related customized checkout view is now activated too, keeping the signup option visible for shoppers.
Original PR description
Reproduction Steps: --------------------------------------------------- To reproduce the issue first we need to create cowed view, follow the steps below: - Ensure that the website and…
Reproduction Steps: --------------------------------------------------- To reproduce the issue first we need to create cowed view, follow the steps below: - Ensure that the website and website_sale_mass_mailing modules are installed. - Navigate to Website > Shop. - Select any product and add it to the cart. - click on Proceed to checkout then checkout. - On the checkout page, you will see the address form. - Click on "Add a new address". - Now "Edit" the website page (e.g., make the City label bold). This will create a cowed view for the address page. Now, follow the final steps to reproduce the actual issue: - Enable the "Newsletter" option from Website Settings. - Log out of the database. - Go to the website shop, add a product to the cart, and proceed to checkout. - On the address page, the subscription checkbox is not visible for a "Guest" user. Root Cause: -------------------------------------------- The subscription checkbox does not appear because the cowed view of the newsletter is not activated. Solution: --------------------------------------- As of SaaS 17.3, a new module `website_sale_mass_mailing` was introduced, which adds the "Newsletter" option in Website Settings. When this option is enabled, the newsletter view is automatically activated. However, the corresponding cowed views are not automatically activated, causing the subscription checkbox to be missing during guest checkout. To fix this, we ensure that the corresponding cowed view is also activated when the "Newsletter" option is enabled. Related Link: https://github.com/odoo/odoo/pull/154604/files OPW-4860002 UPG-2978748 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#223255 Forward-Port-Of: odoo/odoo#214989
This fixes inconsistencies between the rating pop-up reply box and the regular chatter, so customer feedback discussions behave the same way in both places. Users should see more reliable message actions and composer behavior when responding to ratings in portals, eLearning, and shared project pages.
Original PR description
portal, portal_rating, rating, website_slides task-4743757 Forward-Port-Of: odoo/odoo#222517 Forward-Port-Of: odoo/odoo#221050
Property fields are now handled more consistently in field selection screens, avoiding confusing separators and unsupported options. This improves usability when building domains, grouping lists, using server actions, and rendering mail templates with property values.
Original PR description
Bug === When inserting properties in a domain, or in the server action form view, the property separator should not be visible. Improve the alignment of the pencil / drag property icon. Task-4896271
The accounting auto-post process now stops retrying the same journal entry after a posting failure. This prevents repeated error messages and excessive database records, helping scheduled accounting tasks remain stable.
Original PR description
**Steps to reproduce:** - For simplicity, create a new account. - Create a new journal entry, with one line on the newly created account. - Set the date to today or older. - Set auto-post to "At…
**Steps to reproduce:** - For simplicity, create a new account. - Create a new journal entry, with one line on the newly created account. - Set the date to today or older. - Set auto-post to "At date". - Make sure the journal has autocheck_on_post set to True. - Keep the journal entry in draft, and duplicate it until you have 100 copies. (Make sure auto-post is set to "At date" on all of the copies aswell) - Set the newly created account to 'Deprecated'. - Manually execute the scheduled action "Account: Post draft entries with auto_post enabled and accounting date up to today" **Issue:** The scheduled action fails and then falls into an infinte loop, and logs an error on the chatter every minute, which could lead to thousands of mail_message records beign created. **Cause:** If the autopost scheduled action fails on a certain move, it marks it as 'move.checked = False'. So that when it is calls itself again (if the number of moves to post is greater than or equal to 100), it won't fetch the same move and fail again. But having 'journal_id.autocheck_on_post = True' in the search domain allows autopost to fetch the same move it marked before (if the journal allows it), which leads to an infinite loop. **Solution:** If autopost fails on a move, set 'auto_post' to 'no' so it won't be fetched again. opw-4815790 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#214946 Forward-Port-Of: odoo/odoo#213642
This fixes an inventory issue where subcontracted products tracked by lot or serial number could create duplicate stock records during purchasing and receipt. Businesses will see more accurate on-hand quantities and fewer misleading reservations for subcontracted items.
Original PR description
Problem: When a purchase order for a subcontracted product tracked by lots/serials is confirmed, the "Procurement: run scheduler" action creates a stock reservation in the subcontracting location.…
Problem: When a purchase order for a subcontracted product tracked by lots/serials is confirmed, the "Procurement: run scheduler" action creates a stock reservation in the subcontracting location. This reservation is created without a lot or serial number. When the finished product is later received with its lot/serial, the system tries to use the untracked reservation to define a source for the move, but will still create a new quant line because of the destination. This results in two quants, leading to incorrect inventory levels: - A positive quant for the product with the correct lot/serial. - A negative quant for the same product without a lot/serial, with a hanging reservation. Solution: The reservation mechanism in _clean_reservations() is now bypassed for stock moves that should have a lot or serial number, but do not. This ensures that when the tracked product is received, no redundant quants are created. Steps to reproduce on Runbot (tested on 18.3 and 18.0): 1. Create a new product and track by lots 2. Add a BOM for this product, setting type to Subcontracting 3. Create a PO for the product and confirm it 4. With debug enabled, go to Inventory > Operations > Procurement: run scheduler To see the issue: 5. Go to Inventory > Reporting > Locations 6. Search for the product, note the quant line at the subcontractor location with no lot number 7. Return to the PO and recieve, specifying lot number 8. Go to Inventory > Reporting > Locations 9. Search for the product again, note that there are now 2 quant lines at the subcontractor location when the quantity on hand should have zeroed out opw-4935822 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix ensures Slovenian domestic customers without VAT numbers are treated as domestic rather than EU customers. It helps post revenue to the correct domestic accounts, improving accounting accuracy for local transactions.
Original PR description
Before this PR: - Domestic customers without VAT were incorrectly mapped to EU fiscal position, causing domestic revenue accounts (760000) to be mapped to EU accounts (761000). After this PR: - Added new domestic fiscal position for non-VAT customers to ensure proper account mapping for domestic transactions. Task-4918960 Forward-Port-Of: odoo/odoo#223249 Forward-Port-Of: odoo/odoo#217311
Fixes an issue that could block Fleet users from importing vehicle data when the model year was provided as a number in CSV or spreadsheet files. The system now handles these year values consistently, preventing import errors and reducing manual cleanup.
Original PR description
Currently, when users import a CSV or XLSX file into the Fleet app containing the `model_year` field as an integer, an error is raised. **Steps to Reproduce:** 1) Install **Fleet** app(with Demo…
Currently, when users import a CSV or XLSX file into the Fleet app containing the `model_year` field as an integer, an error is raised. **Steps to Reproduce:** 1) Install **Fleet** app(with Demo Data). 2) Open Fleet App and Import [this file](https://docs.google.com/spreadsheets/d/1KJgVTM7KeAVcHR-TQg86gO4in53G7NyR/edit?usp=sharing&ouid=101212513075316114369&rtpof=true&sd=true). 3) Click on Test or Import. **Error:** `UndefinedFunction: operator does not exist: text = integer` **Root Cause:** Since PR https://github.com/odoo/odoo/pull/197440, the `model_year` field was changed from a `char` to a `selection`. The selection values are generated by the `_get_year_selection` method at [1], which returns a list of integers. However, when these integer value is compared at [2], a type mismatch occurs because the expected type is `text`, not `integer`. **Solution:** This fix ensures that `_get_year_selection` returns a list of **strings** instead of `integers`, so that the values match the expected type at [2] [1]- https://github.com/odoo/odoo/blob/4806b08dcfc965cdbd463269be078f8da9f48863/addons/fleet/models/fleet_vehicle.py#L34-L36 [2]- https://github.com/odoo/odoo/blob/4806b08dcfc965cdbd463269be078f8da9f48863/odoo/addons/base/models/ir_fields.py#L451 sentry-**6663249660**
The Attendance kiosk no longer mistakes public website users without passwords for trial database users. This keeps the kiosk limited to the configured Barcode/RFID mode instead of showing extra check-in choices, reducing confusion for employees using multi-company websites.
Original PR description
### Steps to reproduce: - Install Attendance and Website modules - Have a company 'Company A' - Create a new company 'Company B' - Set the Attendance kiosk mode to 'Barcode / RFID' for both companies…
### Steps to reproduce: - Install Attendance and Website modules - Have a company 'Company A' - Create a new company 'Company B' - Set the Attendance kiosk mode to 'Barcode / RFID' for both companies - Update all websites to be related to Company B - Go to the Kiosk mode for Company B - Notice it makes you choose between the 3 check in types while we only chose 'Barcode / RFID' ### Cause: When openning the kiosk mode it will check if the database is a trial one or if the user doesn't have a password and if so we assume that the database is a trial one. If it is a trial database we set the kiosk mode as 'settings' which shows all check in types when openning the kiosk mode. https://github.com/odoo/odoo/blob/9ec4e0d3c5f1aaff0b36dc5def1e69b8285c3be1/addons/hr_attendance/controllers/main.py#L101-L102 https://github.com/odoo/odoo/blob/9ec4e0d3c5f1aaff0b36dc5def1e69b8285c3be1/addons/hr_attendance/controllers/main.py#L185-L196 When creating a new company and set website for it we create a public user for this company and normally we don't set password for this user as no one is gonna login using it. ### Fix: We check if the user doesn't have a password and if he is not a public user. As we assume that if he is a public user he won't have a password anyways. opw-4916329 Forward-Port-Of: odoo/odoo#220355
Razorpay payment providers can no longer be enabled and published before required account credentials are configured. This helps prevent merchants from accidentally offering a payment option that cannot process transactions correctly.
Original PR description
## Version 17.0+ No OAuth in 16.0 ## Issue Razorpay can be enabled and published without being properly configured. ## Steps to reproduce - Go to `Payment Providers` and open `Razorpay`; - Set the state to `Enabled` and publish without providing any credentials. ## Fix Added constraints and revised account linking logic, similar to Stripe. Based on 1b6a7aeb245f0007675943ed7aacf5064e46fe61 suggested by ALSH. opw-4922315 Forward-Port-Of: odoo/odoo#222530 Forward-Port-Of: odoo/odoo#219943
This fix prevents point of sale receipts from being printed or requested twice when customers pay online through self-order QR flows. It also avoids errors when the register tab was inactive during payment, helping staff complete orders smoothly without crashes or duplicate print handling.
Original PR description
`* = pos_online_payment_self_order` **Installation:** `pos_online_payment_self_order` and `payment_demo` **POS Shop Configuration:** - **Restaurant** mode. - Self-order mode: **"QR menu +…
`* = pos_online_payment_self_order` **Installation:** `pos_online_payment_self_order` and `payment_demo` **POS Shop Configuration:** - **Restaurant** mode. - Self-order mode: **"QR menu + Ordering"**. - Enable **online payment** method for self-order. - Activate **Automatic Receipt Printing**. **Steps to Reproduce:** - Open the register. - Place an order and choose **Online Payment**, and validate it (**QR** code appears). - **Deactivate** the register tab (e.g., by opening another browser tab). - **Pay** the amount by scanning the code (can use phone). - Wait for the payment to **succeed**. - Switch to the original register tab. **Error:** Frontend: `TypeError: Cannot read properties of null (reading 'cloneNode')` Backend: `ValueError - This order has already been printed automatically.` **Case 1: Register tab is active** No crash occurs, the receipt printing pop-up is triggered twice: 1. When the order is auto-validated and printed [(Ref 1)](https://github.com/odoo/odoo/blob/52badedb4edb4018bbf400af4f48f81aa597654a/addons/point_of_sale/static/src/app/screens/payment_screen/payment_screen.js#L391-L401) 2. When the `ONLINE_PAYMENT_STATUS` notification with status success is received [(Ref 2)](https://github.com/odoo/odoo/blob/52badedb4edb4018bbf400af4f48f81aa597654a/addons/pos_online_payment_self_order/static/src/overrides/services/pos_store.js#L16-L17) **Case 2: Register tab is inactive (hidden)** - The auto-print logic fails due to the DOM element (`el`) being `null`, skipping the first print and leading to a `TypeError` at [1]. - When the tab becomes visible again (`visibilitychange` event), a backend call is triggered to `get_order_to_print` at [2], which fails with a `ValueError` because the order was already flagged as printed. [1] - https://github.com/odoo/odoo/blob/52badedb4edb4018bbf400af4f48f81aa597654a/addons/point_of_sale/static/src/app/services/printer_service.js#L55-L57 [2] - https://github.com/odoo/odoo/blob/8fb3776b54a17307979733e7f155939d7d87d9d2/addons/pos_online_payment_self_order/models/pos_order.py#L19-L20 **Fix:** This commit ensures each order is printed only once: - If the tab is active and auto-print works, skip printing on visible status. - If the tab is inactive and auto-print fails, fallback printing is allowed via the visibility change event. Sentry - 6707550067
The system now ensures the main HR documents folder is assigned to HR officers when users are created or updated. This helps keep sensitive HR documents accessible to the right staff, especially when companies are set up before HR users exist.
Original PR description
related to : odoo/enterprise#87731 -> make root Hr folder HR officer only instead of employee folder : we need to do it at user write (or creation) to ensure that hr users are correctly added on the folder, as that folder is created at company creation (and no hr user exists yet). Task-4869292
Grouped bill payments now keep the memo details from each individual payment instead of replacing them with internal workflow text. This helps suppliers receive complete and accurate payment references when multiple bills are paid together.
Original PR description
The payment memo of grouped bills should always consist of the concatenation of individual payments memos. This commit is a partial revert of the changes done in this PR https://github.com/odoo/odoo/pull/162762 The original task was intended to improve internal workflows and should not have impacted payment communications to suppliers. task-4936572 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#223256 Forward-Port-Of: odoo/odoo#218787
Non-recurring products sold through subscription upsell orders are now correctly included in the Sales Analysis Report. This gives teams a more accurate view of delivered quantities and revenue for standard products sold as part of upsell activity.
Original PR description
Problem: The non-recurring products added through upsell Sales Orders are not included in the Sales Analysis Report. This results in missing sales data for those products, leading to inaccurate…
Problem:
The non-recurring products added through upsell Sales Orders are not included in the Sales Analysis Report. This results in missing sales data for those products, leading to inaccurate reporting.
Purpose:
To ensure that non-recurring products added through upsell Sales Orders are correctly included in the Sales Analysis Report (report_all_channels_sales_action). This fix updates the report's domain filter to include upsell orders when the product is not recurring, resolving the issue of missing sales data for such products.
Steps to reproduce the bug:
1. Create a Sales Order (SO):
Add two products to the order:
- One recurring product (e.g., a subscription-based product with a recurring billing policy).
- One non-recurring (standard) product.
2. Confirm the SO
3. Generate an Invoice for the confirmed SO.
4. Validate the Invoice and deliver the non-recurring product (process the delivery order fully).
5. Create an Upsell Sales Order:
- From the original SO, create a new upsell SO.
- Add the same non-recurring product again.
6. Navigate to the Non-Recurring Product Page:
- Open the Product form for the non-recurring item.
- Click on the "Sold" smart button (shows delivered/sold quantities in the past 365 days).
- This opens the Sales Analysis Report (report_all_channels_sales_action) filtered by this product.
Issue:
The upsell Sales Order is not included in the Sales Analysis Report for the non-recurring product. As a result, the delivered quantity or revenue from upsell SOs is missing from the report for non-recurring products.
opw-4940977
Forward-Port-Of: odoo/enterprise#92559Users working with Kenyan companies can now search products by KRA item code without triggering an error. This fixes a broken search option in the Sales product list and helps teams find the right products more reliably.
Original PR description
This commit odoo/enterprise@c17ebfc7cdf2b218945280e6e3bd09f2b9ee8adc added a [searchview](https://github.com/odoo/enterprise/blob/17.0/l10n_ke_edi_oscu/views/product_views.xml#L74-L84) for `l10n_ke_item_code` but it never worked. as `l10n_ke_item_code` in `product.template` is non-stored field, we generally get error in console about it. fast forward to newer version e.g. saas-18.3, searching on non-stored fields raises traceback on frontend. Step to reproduce: - install L10N_ke and sale_management - switch to kenya company - go to product in sales app - type something in search bar and select 'kra item code' from autocomplete Observation: - nothing happens on frontend - on backend we receive a error `ERROR odoo.osv.expression: Non-stored field product.template.l10n_ke_item_code cannot be searched.` Fix: - we introduce a search method for l10n_ke_item_code field opw-4985176 Forward-Port-Of: odoo/enterprise#91526
Sales users can now request DHL shipping rates on quotations without running into an access error. This keeps the shipping workflow working as expected while still protecting restricted DHL account details.
Original PR description
Versions -------- - saas-18.3+ Steps ----- 1. Have DHL (legacy) as a delivery method; 2. log in as demo user; 3. create a quotation with a shippable product; 4. click "Add shipping"; 5. select DHL; 6. click "Get rate". Issue ----- > Access Error: > You do not have enough rights to access the field "dhl_account_number" on Shipping Methods (delivery.carrier). Cause ----- The error gets thrown in the `_set_dct_bkg_details` method. In previous versions, the `dhl_account_number` field would still be in cache after `srm.check_required_value` was called, as this method checks whether the `carrier.dhl_account_number` field is non-empty in sudo mode. As of saas-18.3, field access is checked even if the value is available in cache, resulting in the access error. Solution -------- Use `sudo` to retrieve the `dhl_account_number`. opw-4899776