Friday, September 26, 2025
30 changes · 18.0
Enhancements to existing features
Discuss calls can now automatically fall back to a server-assisted connection when direct peer-to-peer connections do not work. This improves call reliability for users on restrictive networks or in situations where direct connections are unstable.
Original PR description
This commit makes it so that in the case of unsuccessful peer-to-peer connections, the client will request to the Odoo server to upgrade the channel with a SFU. backport of: odoo/odoo#200122 and odoo/odoo#206411
The self-ordering interface has been simplified by removing visual clutter from the desktop QR code button and moving mobile QR code access into the menu. Settings are also clearer, with a renamed Settings action and a new option for free metal or wood stand references.
Original PR description
In this commit: ------------------- - Removed the QR code icon from the desktop view of the `Get QR Code` button. - Moved the QR code button from the navbar into the burger menu for mobile view. - Added a new reference option `Free Metal / Wood Stands` in settings. - Renamed the `Edit` menu item to `Settings`, to make the button functionality clear from the label as it leads the user to the settings page for the selected config. task:5003448
Peppol configuration now handles service lookup errors gracefully, so temporary service endpoint problems no longer block access to the setup wizard. This ensures users can still perform important actions such as unregistering even when non-critical service information is unavailable.
Original PR description
Handle `api/peppol/2/get_services` errors gracefully, without blocking critical section of peppol functionnal flow (deletion). If the API endpoint for services returns an error (which should not be affecting any users), the whole peppol config wizard is no longer accessible. The users will therefore not be able to unregister. no-task Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Creating repair orders is now much faster when the system has a very large number of quality rules to evaluate. This reduces long waits or timeouts for businesses using quality checks in repair workflows.
Original PR description
Description ----------- Creating a repair creates new `quality.check` based on `quality. point`s. When you have many matching points to explore, the `filtered_domain` can be pretty slow when processing linear the records to compute the intersection between the all points and the points that should be associated with the repair. This commit rewrites `_create_quality_checks_for_repair` to use a `search` instead if necessary, to offload the intersection search in the database. We also split the ids to not inject a large list of ids in the query. Benchmark --------- For a database that will have 500k `quality.point` that satisfies the domain of `quality.point._get_domain`, the invocation of `_create_quality_checks_for_repair` for creating a Repair takes (excluding the `create` call time): | | Before | After | |---------|------------------|-------| | Timings | Timeout (15+min) | 1 min | Reference --------- opw-4980036
Resolved issues and error corrections
This fixes an issue in the HTML editor where valid content such as links or images could be incorrectly removed or cause errors when inserted into preformatted text areas. It helps preserve user-entered formatting and prevents editing disruptions in affected content blocks.
Original PR description
In this previous [task], insertion in `pre` elements was filtered to prevent non-phrasing content from being inserted (as it is invalid per the html specification). Invalid elements were targeted using the wrong condition, resulting in an issue where any `ELEMENT_NODE` phrasing content inserted through `DomPlugin:insert` (such as links, images) caused an error if empty and was unwrapped if not. [task]: https://github.com/odoo/odoo/commit/216e9ebf02e8350b82ec676586d8bcaa2a446615 task-4984152
Point of Sale users can now type a name when creating or editing a customer in the customer popup. This fixes a regression that made the name field read-only in some PoS environments, blocking quick customer creation at checkout.
Original PR description
Before this commit, the partner name field in the PoS partner popup was rendered as a non-editable div when the field_partner_autocomplete widget was missing in the PoS JS environment. This caused users to be unable to type a name for new customers. The original workaround registered a DefaultField for field_partner_autocomplete, which suppressed the missing widget warning but broke editability. opw-5111958 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an issue where earlier manufacturing operations could show the wrong status after a backorder was completed. Businesses will see more accurate work order progress, reducing confusion for production teams tracking remaining manufacturing work.
Original PR description
In this bug, in backorder created for later work opertions, the `state` of initial operation is changed to `progress` after, the backorder is `done`. To produce the bug: 1- Create a Bill of Materials with at least two operations at two work centers 2- Create a manufacturing order and confirm it. 3- Complete the first operation and edit the quantity on the second operation so there is a backorder for the remaining quantity 4- In the second work order, the first operation initially appears as `Cancelled`. Once the second operation is completed, it will change to `In progress`. opw-4931653 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Survey description and end-message content now avoids an editor-only embedding method that prevented videos from appearing to respondents. This ensures shared survey pages show the intended media content reliably.
Original PR description
Embedded components do not render when the html field content is displayed outside the editor, as their mechanism relies on the editor plugin. Solution: --------- Disable embedded components for the survey messages (Description and End Message). Steps to reproduce: ------------------- * Create a new survey * Add a video as End Message or Description * Use the share link to view de survey * Video not showing Cause of the issue: ------------------- The new web_editor has a plugin system, and one option that is enabled by default is embedded_components. This option has been introduced in: https://github.com/odoo/odoo/commit/03f495c696030214c17e6479076571823513f60e According to the description: "It is forcibly set to false in HtmlMailField since embedded components can only be rendered inside Odoo." Observation : ------------ similar fix: https://github.com/odoo/odoo/commit/1446167e482745c71725563e56411948c3dd1f41 opw-5005752
Stock transfer validation now stops with a clear user error when there is nothing to process, instead of opening a backorder wizard that cannot create anything useful. This prevents confusion for warehouse users and avoids meaningless validation steps when all picked quantities are zero.
Original PR description
### Steps to reproduce: - Create and confirm a delivery with 2 moves: - 1 x product 1 - 1 x product 2 - Set the quantity of product 2 to 0 and mark it as picked - Validate the transfer #### > The…
### Steps to reproduce:
- Create and confirm a delivery with 2 moves:
- 1 x product 1
- 1 x product 2
- Set the quantity of product 2 to 0 and mark it as picked
- Validate the transfer
#### > The backorder wizard open's even though there is nothing to validate. Creating a backorder does nothing.
#### Cause of the issue:
Since there is a picked move, the picking validation does not pick every moves in the `pre_action_done` hook keeping only moves with empty qty as picked:
https://github.com/odoo/odoo/blob/9b41eb38403e64091b74e1ae53c79488aa48b499/addons/stock/models/stock_picking.py#L1208-L1209 Then, only the picked moves are processed in there `_action_done`: https://github.com/odoo/odoo/blob/9b41eb38403e64091b74e1ae53c79488aa48b499/addons/stock/models/stock_move.py#L1914 https://github.com/odoo/odoo/blob/9b41eb38403e64091b74e1ae53c79488aa48b499/addons/stock/models/stock_move.py#L1929-L1937 Which leads to an empty picking validation.
opw-5076640
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#227995This fixes an issue where sale orders linked to projects could become blocked if a related analytic account had been deleted. Users can now update the project on affected sale orders without encountering an error, improving reliability for sales and project workflows.
Original PR description
# Issue: In a sale order, if any of the so lines contains the ID of a deleted analytic account in its analytic_distribution field, then updating the project_id field is impossible as it raises an…
# Issue: In a sale order, if any of the so lines contains the ID of a deleted analytic account in its analytic_distribution field, then updating the project_id field is impossible as it raises an error. # Cause This is caused because _compute_analytic_distribution() tries to retrieve 'root_plan_id' from all ids without checking if records exists. # Fix This commit add an exists() check on analytic.accounts retrieved from analytic_distribution field and clear the non-existing records ids from the field. # Steps to reproduce - Install sale_project and accountant modules - Check "Analytic Accounting" in the Accounting settings - Create a new project "Test P", set it up "Billable", with a new Analytic account "Test AC" (field "Project" tab "Analytic") - Create a new sale order "Test SO", add a few products and set up the Project field to "Test P". Save the sale order. - Delete the analytic.account "Test AC" - Go back on "Test SO", try to change the field "Project" - a Missing error is thrown --- Current behavior before PR: When creating a sale order and binding it to a project with an analytic account, then deleting the analytic account, the field "Project" on the sale order can't be updated anymore. Desired behavior after PR is merged: When creating a sale order and binding it to a project with an analytic account, then deleting the analytic account, the field "Project" on the sale order can be updated. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents older translation entries from being deleted during upgrades when they were not formally marked as translated. Businesses upgrading Odoo can recover and keep more existing translated content instead of seeing fields unexpectedly revert to English.
Original PR description
After upgrading Odoo from earlier versions to versions >= Odoo 15.5, you will notice that some fields that were translated before, are now in English. This is likely because those translations were…
After upgrading Odoo from earlier versions to versions >= Odoo 15.5, you will notice that some fields that were translated before, are now in English. This is likely because those translations were not marked as `state='translated'` in the DB. However, the missing translations were removed from the `_ir_translation` table during the upgrade. With this patch, we still keep the conservative behavior of only auto-translating fields marked as `state='translated'` in the DB (which is still probably wrong, because user translations should remain the same; if Odoo was displaying translated text before the upgrade and it is not after it, that's probably a bug; but that's another story...), but we no longer delete the other fields. This way, you can still mark them as translated after the upgrade and use the new tooling provided in https://github.com/odoo/upgrade-util/commit/fd578e31973596bf7f283ea5c6ebbdfd3314f8bc to recover those translations after the upgrade. @moduon MT-11570 cc @aj-fuentes Forward-Port-Of: odoo/odoo#228404
Fixed an issue that could block users from archiving several Helpdesk teams at once when those teams were connected to different websites. This prevents an unexpected error and keeps routine Helpdesk administration smooth for multi-website businesses.
Original PR description
Currently, an error occurs when archiving multiple helpdesk teams linked to different websites. **Steps to reproduce:** - Install the `website_helpdesk` module. - Go to Website, Configuration >…
Currently, an error occurs when archiving multiple helpdesk teams linked to different websites. **Steps to reproduce:** - Install the `website_helpdesk` module. - Go to Website, Configuration > Websites and create two websites (`W1` and `W2`). - Go to Helpdesk, Configuration > Helpdesk Teams > create two teams (`T1` and `T2`). - Enable the `Website Form` (under `Help Center`), assign `W1` to `T1` and `W2` to `T2`. - Return to the list view, select both teams, and attempt to `archive` them. **Error:** `ValueError: Expected singleton: website(3, 1)` **Root Cause:** At [1], the code incorrectly uses `with_website.website_id.id`, when `multiple websites` are involved, this leads to an `error`. **Fix:** This commit prevents errors and ensures that users can archive multiple helpdesk teams linked to different websites [1]: https://github.com/odoo/enterprise/blob/8b72fdef63f634ccf436b49adbac5c1f9358c127/website_helpdesk/models/helpdesk.py#L102 sentry-6867906123
The Australian TPAR report now excludes customer payments when calculating Gross Paid amounts. This prevents unrelated incoming payments from inflating supplier taxable payment reporting, improving report accuracy for compliance.
Original PR description
Customer payment shoudn't be included in the TPAR report Steps: - Unarchive 10% TPAR tax - Make a bill for a partner X, set 10% TPAR tax on the invoice line and confirm - Create and confirm a customer payment for partner X - Go to 'Taxable Payments Annual Reports (TPAR)' -> The column 'Gross Paid' includes the customer payment Before this commit, we took all line from bank or cash journal to calculate the gross paid value. With this commit, we also restrict the lines to include only the one with 'asset_current' or 'liablility_current' account type. Ticket [link](https://www.odoo.com/odoo/project/967/tasks/5045457) opw-5045457 Forward-Port-Of: odoo/enterprise#95029
Opening the warehouse receipts view could crash when many transfers had many quality checks. This change reduces unnecessary memory use during that process, making the inventory workflow more reliable for large operations.
Original PR description
The fields `quality_check_todo` and `quality_check_fail` are calculated for stock.picking records by iterating all checks of a stock.picking. This causes a problem when clicking the "To Receive"…
The fields `quality_check_todo` and `quality_check_fail` are calculated for stock.picking records by iterating all checks of a stock.picking. This causes a problem when clicking the "To Receive" button for a warehouse in the inventory app, in case there are many transfers each with many quality checks. The function will default to loading all data associated with quality checks in memory through field prefetching. However, since quality checks have too much data (particularly because of the HTML fields) associated with them, the cache can quickly bloat causing an OOM error and crashing the worker. This PR disables the prefetcher for quality checks before iterating them, preventing this issue from happening since we only need very light fields in the loop. For a specific customer (opw-5025162), this was the case. ## Benchmarks: | No. stock.picking | avg no. quality checks | peak memory before | peak memory after | | ----------------- | ---------------------- | ------------------ | ----------------- | | 25 | 20 | 2771 mb | 235 mb | opw-5025162
This fixes a Point of Sale issue that prevented users from entering a customer name when creating a new customer during a POS session. Cashiers can now save new customer records without seeing the invalid name field error.
Original PR description
**Steps to reproduce:** - Install `point_of_sale` - Open a POS session - Click on customer (bottom left) -> Create new customer - Try to enter the name and save **Issue:** - Unable to set customer name - Error shown: "Invalid field: Name" **Cause:** - after commit https://github.com/odoo/odoo/commit/0635af99d3617511e82ebe20155296e86e87c92c the field_partner_autocomplete widget was set as the default for missing fields. But the name field of res.partner also uses this widget without a default value, which blocks entering a customer’s name when creating a new record. https://github.com/odoo/odoo/blob/0635af99d3617511e82ebe20155296e86e87c92c/addons/point_of_sale/static/src/app/missing_fields.js#L14 **Solution:** - Remove 'field_partner_autocomplete' widget from the missing field component, as we can't set a default value for name. opw-5113044 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an invoicing error in the Mexican extended electronic invoicing flow when the USD currency has been deactivated. Businesses can now confirm and send affected CFDI invoices without being blocked by a currency lookup issue.
Original PR description
**Steps to Reproduce:** 1. Install `l10n_mx_edi_extended` module without demo data. 2. Set company's country to "Mexico" and switch Fiscal Localization. 3. Deactivate USD currency. 4. Configure CFDI…
**Steps to Reproduce:** 1. Install `l10n_mx_edi_extended` module without demo data. 2. Set company's country to "Mexico" and switch Fiscal Localization. 3. Deactivate USD currency. 4. Configure CFDI Certificate and activate Testing mode in PAC. 5. Create a new product with "UNSPSC Category". 6. Create an invoice with CFDI to the public and "Definitive" in External Trade. 7. Confirm and send the invoice. **Sample certificate:** Certificate file: https://drive.google.com/file/d/1kklNGeRtR08erxWRPfIdeiwheDibcB8M/view?usp=drive_link Private key file: https://drive.google.com/file/d/1VJnKVo1doA4cCYPeZBHXKT4JGkbHhOhk/view?usp=drive_link Private key password: 12345678a **Error:** `ValueError - Expected singleton: res.currency()` **Cause:** When sending the invoice, the system attempts to retrieve the USD currency to compute exchange rates. Since the search only considers active currencies, this results in no record being returned, which raises an error in further computation. **Fix:** This commit handles the case when USD currency is deactivated. sentry-6860601127
Warehouse teams can now select which IoT printer is used for shipping labels instead of the system automatically picking the first compatible printer. This helps route labels to the right printer for each picking type, reducing misprints and operational confusion.
Original PR description
Printing shipping labels is performed from the backend, once the shipping info are received in the chatter. The printing command is sent to the frontend via the user bus, then though longpolling to the iot box. This commit adds the possibility to select a printer instead of choosing automatically the first (with the right report associated) on the list. As the change is made on a stable version, we are using system parameters to store the selected printer without adding a new field. We associate a printer with the picking type, in order for to be able to have different printers by default on different picking types. Task: 4792491
Product information now displays correctly for products with variants in Point of Sale sessions. Cashiers can again see the product name, price, and inventory details, helping them answer customer questions and complete sales accurately.
Original PR description
When opening the `product information` of a product with variants in a POS session We do not see the product name, price and inventory information OPW-4544324 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Barcode scanning no longer crashes when a warehouse picking includes a kit product variant with its own packaging. This helps warehouse teams process packaged kit variants reliably in the Barcode app.
Original PR description
In the barcode application, scanning a picking order containing a kit product variant with packaging will raise a Traceback. ### Steps to reproduce: 1. Enable packagings on inventory configuration.…
In the barcode application, scanning a picking order containing a kit product variant with packaging will raise a Traceback. ### Steps to reproduce: 1. Enable packagings on inventory configuration. 2. Create a product, that as a least 2 variants. 3. Add a packaging to one of the variants. 4. Create a BoM for created product (kit type). 5. Create a picking order for the variant with packaging. 6. Print the picking operation to scan the code through barcode. 7. Go to barcode and try to scan it, this will trigger the traceback. ### Cause of the issue: Scaning a barcode will call get_barcode_data during this call it will retrieve the information about the picking order and call _get_stock_barcode_data: https://github.com/odoo/enterprise/blob/f2dd6326c2084ed467c3e4c3e9d931f41309ad79/stock_barcode/controllers/stock_barcode.py#L91 _get_stock_barcode_data will obtain the packaging methode for the products. https://github.com/odoo/enterprise/blob/f2dd6326c2084ed467c3e4c3e9d931f41309ad79/stock_barcode_mrp/models/stock_picking.py#L13-L16 since in our use case the product has variant the packaging information is not inside product_tmpl_id.packaging_ids and thereof it will not retrieve the packaging information. ### Fix: We don't need to use product_tmpl_id.packaging_ids because of its compute and set methods (and the fact that the product_variant_ids field is required), the product_tmpl_id.packaging_ids will always be included in the product_tmpl_id.product_variant_ids.packaging_ids: https://github.com/odoo/odoo/blob/eb88370e2fc1887e8c88dfd8dbeadce23bb7abe5/addons/product/models/product_template.py#L430-L441 our fix will allow for packaging in the variant to be considered when there is more than only one variant. opw-4852875
Point of Sale users can once again print customer invoices through connected IoT printers instead of only downloading the PDF. The printer selection flow was also streamlined so the same printing process can be reused reliably in more places.
Original PR description
This PR contains two commits, the first is a refactoring, and the second is the invoice printing itself. - **[REF] iot: extract printer select into separate function** Before this commit, the printer…
This PR contains two commits, the first is a refactoring, and the second is the invoice printing itself.
- **[REF] iot: extract printer select into separate function**
Before this commit, the printer selection wizard was tightly coupled to
the IoT report handler, and the call to send to the printer was
duplicated in the wizard and the handler.
After this commit, the printer selection wizard is contained in a
function that will always return the selected printers directly to the
caller, whether the dialog needs to be opened or not. The wizard is
simplified as a result and the print call always occurs in the handler.
This refactoring will allow other places to use the printer selection
wizard, namely for invoice printing.
- **[FIX] pos_iot: print invoices via IoT**
In the commit https://github.com/odoo/enterprise/commit/07418d7544ceecfef38257db8f59bf845a0b0769, the invoice PDF downloading was refactored to
bypass the `ir.actions.report` model, instead working directly via an
action on the invoice model. A side effect of this is that it broke
printing invoices via the IoT, as it relies on the report printing
action to function.
To fix this, this commit introduces an override in `pos_iot` for the
`account_move_service`, which will print the invoice PDF via the IoT
instead of downloading it directly (if a printer is associated with the
report).
task-5109814This fixes issues in Discuss calls where a user's microphone could appear muted or be muted incorrectly when joining, and where warning indicators could disappear during connection recovery. The update helps users better understand their call status and reduces confusion during call setup or reconnection.
Original PR description
This commit fixes: - the SFU could send outdated information about our own session during the initialisation of the connection. This can lead to the microphone being muted when joining a call if the updates occur when the user rtc session is marked as mute when querying the audio stream. - the warning indicator was hidden if the connection state was undefined this could lead to a missing warning during some recovery steps when session data is reset.
This fixes an issue where increasing a sales order quantity after using a custom multi-step delivery route could create the wrong extra transfer quantity, or no transfer at all. Businesses using personalized warehouse routes will now get accurate stock movements when order quantities change, reducing fulfillment errors.
Original PR description
**Steps to reproduce:** - enable multi-step routes setting. - navigate to warehouse management/locations create a new location (the "test location"). - select "internal location" for the location…
**Steps to reproduce:** - enable multi-step routes setting. - navigate to warehouse management/locations create a new location (the "test location"). - select "internal location" for the location type. - select WH for the parent location - navigate to warehouse management/warehouses and select the warehouse corresponding to WH. - set the warehouse in 3 steps delivery. - click on the routes smart button. - click on the "deliver in 3 steps (pick+pack+ship)" route. - add a rule, for the action select "push to", for the operation type select "internal transfers", for the source location select the "test location" you just created and for destination location select "WH/Output". - save. - create a storable product and set an on-hand quantity - create a new sale order for 1 quantity of this product and confirm it - click on the picking smart button, change the destination location to the test location and validate - open the sale order and change the quantity to 3 **Current behavior:** A new picking is created from stock to packing zone (which is the expected behavior) but the quantity is 1 **Expected behavior:** The quantity should be 2. If we only increase the quantity by 1 on the sale order it does not even create the new picking **Cause of the issue:** The warehouse_id field is invisible in stock.rule form view when the action is push. Therefore, the rule is created without a warehouse_id. Also, moves created from a rule have the same warehouse_id as the rule. https://github.com/odoo/odoo/blob/a729578afb7fed79aac2d622aae4da4c0917f8e5/addons/stock/models/stock_rule.py#L275 So, when we validated our first move (from stock to the test location), this created a second move (from test location to output) that does not have a warehouse id (because it was created from our own push rule that we created). When we update the quantity of the sale ordre line, _action_launch_stock_rule calls _get_quantity_procurement to compute the current quantity on the moves. This method then calls _get_outgoing_incoming_moves to get the initial move created from the rule. In this case this should return only the first move created. But because the second move does not have a warehouse_id, it's rule.id is added to triggering_rule_ids. https://github.com/odoo/odoo/blob/a729578afb7fed79aac2d622aae4da4c0917f8e5/addons/sale_stock/models/sale_order_line.py#L315-L317 And the move is later added to the outgoing moves that will be returned. https://github.com/odoo/odoo/blob/a729578afb7fed79aac2d622aae4da4c0917f8e5/addons/sale_stock/models/sale_order_line.py#L322-L329 So the two moves are returned and the sum of the quantities of the moves is 2 instead of 1. https://github.com/odoo/odoo/blob/a729578afb7fed79aac2d622aae4da4c0917f8e5/addons/sale_stock/models/sale_order_line.py#L292-L294 So the product quantity for the procurement will be 1 (3-2) instead of 2 (3-1). https://github.com/odoo/odoo/blob/a729578afb7fed79aac2d622aae4da4c0917f8e5/addons/sale_stock/models/sale_order_line.py#L386 opw-5039249
Field service sales created from tasks now use the customer’s assigned pricelist instead of the product’s default price. This ensures customers are billed according to their agreed pricing when service work is validated.
Original PR description
Before this commit, the service line on the sale order ignored the customer’s pricelist and used the product’s default price. Steps to reproduce: - Assign a fixed-price pricelist to a customer. - Create an FSM task for them and add a timesheet. - Validate the task and check the service line price. After this commit, the service line correctly reflects the price from the assigned pricelist. task-4830183
Printed invoices now show early payment discount amounts with cash rounding applied. This prevents customers from seeing a slightly incorrect amount due when both discounts and cash rounding are used.
Original PR description
**Steps to reproduce** - Create a tax of 8.1% - Activate and create a cash rounding with rounding precision 0.05 - Use the existing '2/7 Net 30' payment term (or create a new 2% early discount one) - Create a new invoice: - Add payment terms - Add cash rounding method - Add line with price 50, 8.1% tax - Invoice total will be 54.05 **Issue** Print the invoice: The invoice will show "$ 52.97 due if paid before 09/12/2025" However 52.97 is the amount with just the 2% early payment discount applied With cash rounding applied, it should display 52.95 This occurs because when retrieving the amount from the invoice template the system applies only the early payment discount opw-4914545 [Ticket link](https://www.odoo.com/odoo/project/49/tasks/4914545) Forward-Port-Of: odoo/odoo#225759
Turkish Nilvera e-invoice imports now save progress after each document instead of waiting until the whole batch finishes. This reduces the risk of losing already imported documents if a timeout or error happens during larger imports.
Original PR description
Following bcab79c0ba9b550726164d80a22b50e689a2789c we are no longer committing changes in `_l10n_tr_nilvera_get_documents` as we loop through documents. The idea behind having that commit inside the loop was to avoid having to rollback all changes if we timeout or an error occurs. This is especially important when importing the current maximum amount of documents (30). This commit restores that behavior. No Task ID.