Wednesday, February 25, 2026
17 changes · saas-18.4
Resolved issues and error corrections
This fix prevents the website/page editor from crashing when embedded components contain certain text patterns in their saved settings. It preserves required embedded component data while keeping the existing sanitization safeguards in place, improving editing reliability for users.
Original PR description
Prior to this commit, since DOMPurify v3.1.2 (and more precisely since usage of v3.1.5 in Odoo), the JS sanitization process aggressively removes html attributes with `-->`, `<style` and `<title` for…
Prior to this commit, since DOMPurify v3.1.2 (and more precisely since usage of v3.1.5 in Odoo), the JS sanitization process aggressively removes html attributes with `-->`, `<style` and `<title` for security reasons (see [1]). However `html_editor` embedded components use `data-attributes` (`data-embedded-props` and `data-embedded-state`) to store various kind of data as a JSON string. Obviously, such JSON strings easily match the DOMPurify regex and these attributes are therefore removed, which results in an Editor crash. There are multiple reasons why such values are acceptable as is for the `html_editor` usage: - only `HTMLElement` instances are sanitized, never a string, therefore there is no `DOMParser` to trick with invalid HTML. - values in these attributes are always/exclusively parsed as JSON strings, and the editor will crash if the value is not a legit JSON. - values in these attributes are HTML escaped by the python sanitizer when the serialized html is sent to the server. - values in the JSON parsed object are at worst rendered as plain text (never as HTML or other parsed formats). - values in the JSON parsed object are never executed as JS (only serializable primitives are stored). Therefore, the suggested solution is to encode the values during sanitization, and decode just after, to keep the rest of the codebase simple and explicit. [1]: https://mizu.re/post/exploring-the-dompurify-library-hunting-for-misconfigurations#dompurify-gt-3.1.2-safe-for-xml task-5960707 Forward-Port-Of: odoo/odoo#250210
The website media dialog now stops image uploads cleanly when users click Discard, preventing files from continuing to upload in the background. This avoids error screens and gives users a more predictable experience when cancelling large uploads.
Original PR description
Steps to Reproduce: Open the website module. Open the media upload dialog to upload an image by either double-clicking the logo or replacing the existing image. Upload a large file. Abort the upload…
Steps to Reproduce: Open the website module. Open the media upload dialog to upload an image by either double-clicking the logo or replacing the existing image. Upload a large file. Abort the upload before it finishes by clicking the 'Discard' button in the media dialog box. After performing these steps, a traceback is observed. Before this commit: Image upload failures would throw uncaught exceptions. These exceptions would interrupt the flow and result in a poor user experience with no clear feedback. Even after clicking the discard button the image was still getting uploaded. After this commit: Uploads can be safely aborted when the media dialog is discarded. Ongoing XHR requests and RPC calls are properly cancelled. The upload loop stops immediately when an abort is triggered with no traceback. Users get a predictable and clean exit instead of a broken state. Files are no longer uploaded after clicking Discard. task-4752497 Correction Pr for: https://github.com/odoo/odoo/pull/250030 Original PR from Issue: https://github.com/odoo/odoo/pull/219081 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Branch companies can now select contacts owned by their parent company when creating customer invoices or vendor bills. This fixes a visibility issue in Accounting that prevented valid parent-company contacts from appearing in contact dropdowns, reducing duplicate contact creation and invoice processing friction.
Original PR description
Currently, when operating in a branch company, contacts belonging to the parent company are not visible in the partner dropdown on Invoices or Vendor Bills. ### **Steps to reproduce:** 1) Create a…
Currently, when operating in a branch company, contacts belonging to the parent company are not visible in the partner dropdown on Invoices or Vendor Bills.
### **Steps to reproduce:**
1) Create a multi-company hierarchy (Company A -> Branch B).
2) Create a contact owned by Company A.
3) Switch the current company to Branch B.
4) Go to Accounting > Customers > Invoices and create a new invoice.
5) Try to select the contact created in step 2.
### **Current/Buggy Behavior:**
The contact does not appear in the search results.
### **Expected Behavior:**
The contact should be selectable.
### **Root Cause:**
since commit https://github.com/odoo/odoo/commit/67169c42061cb51bc68f6c74f0674a670dd04f58,
the partner model supports the standard
`check_company=True` mechanism, and record rules were updated to allow
branches to access partners of their parent company.
However, the `partner_id` field on the `account.move` form view still
retained a explicit domain: `[('company_id', 'in', (False,
company_id))]` as shown at [1].
This domain overrides the standard `check_company` behavior.
due to which it restricts the selection to partners owned by the current company
(the branch) or partners with no company set. It explicitly excludes
partners owned by the parent company.
### **Fix:**
Remove the domain at [1],
This allows the field to rely on the standard `check_company=True`
logic, which correctly handles the multi-company hierarchy and allows
branches to select parent company partners.
[1]- https://github.com/odoo/odoo/blob/6b7b83449739932aa8420ef8fcd888116e3c0f8a/addons/account/views/account_move_views.xml#L896
**opw-5484611**
Forward-Port-Of: odoo/odoo#244671This fix ensures the website builder interface is temporarily blocked while certain page update actions are reloading. It prevents users from interacting with the sidebar during slow network conditions, reducing confusion and avoiding accidental changes while the update is still in progress.
Original PR description
When we perform a reloadable action in the builder, the builder's UI is not blocked, unlike in previous versions before the html_builder [refactoring] Steps to reproduce the issue: - Open website, and click on the header - In the dev tools, set the network throttling to 3G or slow 4G - Change the header's template => Notice that the sidebar is not blocked, while it should be. [refactoring]: https://github.com/odoo/odoo/commit/9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 task-5952793
When an employee forwards a supplier bill to the purchases email alias, Odoo now avoids assigning that employee as the vendor if the real supplier cannot be matched. This keeps OCR processing accurate and prevents missing bill details from being filled using the wrong partner information.
Original PR description
Currently we have an issue with OCR flow, where if internal users forward an email from an internal email address, the internal user is added as vendor Steps to reproduce: - Setup email alias for journal "Purchases" - From an internal user email, forward a supplier bill to the vendor bill alias Issue: If the supplier is not already a registered partner, the bill will be created with the internal user set as partner. This will break OCR flow where the missing document fields will be auto populated from the bill opw-5487368 Forward-Port-Of: odoo/odoo#246352
This fix ensures payslips calculate worked days and out-of-contract days correctly when an employee's contract starts or ends during the current month. It also prevents attendance work entries from being created for employees who do not have an active contract, reducing payroll inaccuracies.
Original PR description
Problems: ------- 1. For a new employee, with a contract starting in the current month but before today: in the payslip for the current month number of days of attendance and days of out of contract…
Problems: ------- 1. For a new employee, with a contract starting in the current month but before today: in the payslip for the current month number of days of attendance and days of out of contract are not correct Same for an employee, with a contract ending in the current month (before today) 2. In both cases above worked entries are not generated correctly (from today to the end of month) 3. Additional bug: If we create an employee with no contract and create a payslip draft for him for the current month, work entries with type "Attendance" will be created Objective: --------- Problems 1 and 2 : date_version was equal to today (date of the employee's creation), so number of attendance days was calculated as ( end_of_payslip_month - today ) or ( today - start_of_payslip_month ) Problem 3 : Work entries are generated even when there is no active contract Solution: --------- Problems 1 and 2: This commit adds an additional part (already exists in v19) in the method write() of hr.version which sets date_version = contract_date_start Problem 3: by generating work entries check if contract_date_start is filled Tests ware added in odoo/hr: test_hr_version.py and in enterprise/hr_payroll: test_new_employee_worked_days, test_payslip_empty_contract.py task-5430759
Re-deliveries are no longer treated as customer returns when shipping labels are prepared. This ensures carriers such as UPS receive the correct multiple-package information and generate all expected labels.
Original PR description
Issue ----- When doing delivery -> return -> re-delivery, only one label is received even when there are mutliple packages to be "re-delivered". Steps to reproduce ----- - Create a UPS delivery -…
Issue ----- When doing delivery -> return -> re-delivery, only one label is received even when there are mutliple packages to be "re-delivered". Steps to reproduce ----- - Create a UPS delivery - Multiple packages - Validate transfer - Return - Validate IN - Return again - Add the UPS under the "additional info" tab - Ensure still multiple packages - Validate OUT Cause ----- When preparing the shipping data, we go through https://github.com/odoo/enterprise/blob/913e55abc4a9aa58509aa2a60d378fb552de554d/delivery_ups_rest/models/delivery_ups.py#L120-L121 which leads us to do https://github.com/odoo/odoo/blob/89733b0e4d1e9a57dd25f552db4e6330a6b14cdf/addons/stock_delivery/models/delivery_carrier.py#L142-L155 so we end up with a single package to send to the delivery service. The reason `is_return_picking` is true is because the compute method only checks for an existing move with an `origin_returned_move_id`. https://github.com/odoo/odoo/blob/89733b0e4d1e9a57dd25f552db4e6330a6b14cdf/addons/stock_delivery/models/stock_picking.py#L53-L58 From a delivery flow perspective, it doesn't make much sense to consider outgoing shipments as returns. ----- Ticket: opw-5866100 Forward-Port-Of: odoo/odoo#246946
Fixes an issue where split receipt lines for the same purchased product could each be valued using the full billed amount. This ensures inventory valuation matches the actual received quantities, improving cost accuracy for purchasing and stock accounting.
Original PR description
**Steps to reproduce:** - create a storable avco automated product - in the purchase tab, select control policy : "on invoice quantitites" - create and confirm a purchase order for 100 qty at 1 unit…
**Steps to reproduce:** - create a storable avco automated product - in the purchase tab, select control policy : "on invoice quantitites" - create and confirm a purchase order for 100 qty at 1 unit price - on the picking, unhide the description column - change the description for the move - go back to the purchase order and change the quantity to 105 - (because we changed the description, the new move created with a quantity of 5 is not merged to the existing one of 100 and we now have two moves on the picking) - create and confirm the bill - validate the picking - select the valuation smart button **Current behavior:** the svl with a quantity of 100 has a total value of 105 the svl with a quantity of 5 has a total value of 105 **Expected behavior:** the svl with a quantity of 100 should have a value of 100 the svl with a quanitty of 5 shoul have a total value of 5 **Cause of the issue:** When the picking is validated, action_done is created on the two moves. In the stock_account override: - first the super method is called As a consequence the state of the two moves becomes 'done' and the qty_received of the linked purchase order line becomes 105. - then product_price_update_before_done is called on the two moves before creating the svls. https://github.com/odoo/odoo/blob/2f00b0085574653ca1a8f734ef91893a4a1c1a7c/addons/stock_account/models/stock_move.py#L352 Inside product_price_update_before_done, for each move, we call _get_price_unit. https://github.com/odoo/odoo/blob/2f00b0085574653ca1a8f734ef91893a4a1c1a7c/addons/stock_account/models/stock_move.py#L426 For the first move, in the purchase_stock override of _get_price_unit : - to get the received qty we call _get_qty_received_without_self() https://github.com/odoo/odoo/blob/2f00b0085574653ca1a8f734ef91893a4a1c1a7c/addons/purchase_stock/models/stock_move.py#L50 and because the super method of action_done was already called, qty_received of the purchase order line is 105, so _get_qty_received_without_self will return 5. https://github.com/odoo/odoo/blob/2f00b0085574653ca1a8f734ef91893a4a1c1a7c/addons/purchase_stock/models/stock_move.py#L108-L113 So received_qty is 5 and later remaining_qty will be 100 https://github.com/odoo/odoo/blob/dc57ea4d306f8745d37f2c5d2c3d3fa4bcaf7253/addons/purchase_stock/models/stock_move.py#L86 - but because no svl was created yet receipt_value will stay 0 and later remaining_value will be 105 https://github.com/odoo/odoo/blob/dc57ea4d306f8745d37f2c5d2c3d3fa4bcaf7253/addons/purchase_stock/models/stock_move.py#L55-L60 Therefore price_unit will be 1.05 (105/100) instead of 1 https://github.com/odoo/odoo/blob/2f00b0085574653ca1a8f734ef91893a4a1c1a7c/addons/purchase_stock/models/stock_move.py#L95 For the second move, the problem is the same and the price unit ends up being 21 (105/5) **fix** We do not take into account the move(s) for the same product of the same picking in the remaining value (because svls are not created yet) so we should not take them into account in the remaining quantity. the problem is very similar to https://github.com/odoo/odoo/pull/235601 In this other PR it happend because we had multiple move for the same product because they were in a batch, and in this PR we have the issue because we have multiple move for the same product because they didn't merge due to the description difference. opw-5429501 Forward-Port-Of: odoo/odoo#250263 Forward-Port-Of: odoo/odoo#247640
Fixed an issue where Spanish Point of Sale orders converted into full invoices could be reported with the wrong VeriFactu invoice type. This helps ensure invoice records stay aligned with Spanish tax reporting requirements when a simplified sale is later replaced by a full invoice.
Original PR description
To reproduce ------------- 1. Install `l10n_es_edi_verifactu_pos`, and select the ES company 2. Make an order in PoS with a price less than 400, and don't invoice it. 3. Close the PoS session, then…
To reproduce ------------- 1. Install `l10n_es_edi_verifactu_pos`, and select the ES company 2. Make an order in PoS with a price less than 400, and don't invoice it. 3. Close the PoS session, then go to PoS > Orders, and select the previously made order 4. It will have a Verifactu generated document with invoice type as 'F2', which is correct since it's a simplified order. 5. Click invoice to invoice the order; the invoice is no longer simplified. Notice now that the new Verifactu document has an invoice type of 'F1', which corresponds to a normal non simplified invoice. However, since the new invoice is replacing an old simplified one, it should be of type 'F3' instead. The fix ------- When fully invoicing, we check if the order had a linked Veri*factu document of type F2, which means we are now replacing it and should set the type of the new invoice to F3 instead of F1. Sources: -------- Difference between 'F1', 'F2', and 'F3' invoice types: https://sede.agenciatributaria.gob.es/Sede/iva/sistemas-informaticos-facturacion-verifactu/preguntas-frecuentes/procedimientos-facturacion.html?faqId=bdbd20022fe06910VgnVCM100000dc381e0aRCRD opw-5343973 Forward-Port-Of: odoo/odoo#242274
This update fixes an issue where the names of Ecuadorian invoicing regimes didn't comply with government regulations. The changes ensure that all invoice data sent to the Ecuadorian tax authority (SRI) uses the correct, officially mandated terminology. This ensures compliance and avoids potential delays or errors in invoice processing.
Original PR description
[FIX] l10n_ec_edi: fiscal localizations name The name of the regimes for the Ecuadorian localization does not respect the government requirements Steps to reproduce: 1. Install l10n_ec_edi module 2. Go to Settings > Invoicing > Ecuadorian Localization 3. In Electronic Invoicing > Regime, the names of the regimes do not respect government requirements Solution: Change the name of the fiscal localizations to respect the requirements Add a computed field used to map the name of the regime to the technical name of the regime used in SRI documents We write them in Spanish because we always want the name of the regime to be in Spanish in the XML invoice sent to the government, even if the user didn't install any other language. opw-5221871 Forward-Port-Of: odoo/enterprise#105914
This update fixes an issue in the barcode picking interface where adding multiple extra products triggered a disruptive confirmation dialog repeatedly. Now, the dialog opens only once and allows users to easily select and deselect extra products before confirming, streamlining the process and reducing user frustration.
Original PR description
When adding extra products in the barcode picking interface, the confirmation dialog did not handle correctly the scan of multiple extra items. Before: Scanning multiple extra products successively opened (mutex + promise) the dialog multiple times. The user had to confirm/cancel each extra product addition one by one. After: The dialog is now only opened once and updated when scanning multiple extra products before confirming. The user can select/deselect the extra products to add before validating. [opw-5193269](https://www.odoo.com/odoo/project/49/tasks/5193269) Forward-Port-Of: odoo/enterprise#107932 Forward-Port-Of: odoo/enterprise#104932
This update fixes a bug where deleting a partially signed offer would incorrectly delete the associated employee. The fix ensures the employee is only deleted when archived and without other active offers, preventing data loss and maintaining accurate employee records. This improves data integrity and user experience.
Original PR description
Version – saas-18.4 ### Issue: When an applicant has both a partially signed offer and a fully signed offer, deleting the partially signed one also deletes the employee that was created from the fully signed offer. ### Steps to Reproduce: - Create two offers for an applicant. - Fully sign the first offer and partially sign the second one. - Delete the partially signed offer. The employee created from the fully signed offer is also deleted. ### Cause: Due to this issue, the employee record is incorrectly deleted from the system, which is not expected behavior. ### Fix: Improved the employee deletion logic by deleting the employee only when: - the employee is archived, and - they do not have any other offers besides the one being deleted. ### Impact: The employee will no longer be deleted when another partially signed offer for the same applicant is removed. --- Task – 5347109
This update resolves a bug where the booking view wouldn't load after refreshing the Manage Booking page in our POS system. The fix ensures the booking view renders correctly, improving the user experience for managing appointments. This change was made to maintain a smooth and reliable booking process.
Original PR description
Steps: ----- - Install pos_appointment and pos_urban_piper modules. - Open a session for an UrbanPiper-configured POS. - Open the Manage Booking page. - Refresh the page. Issue: ----- - The booking view is not rendered after a page refresh. Cause: ----- - An awaited request in the posStore setup caused the `ActionComponent` not to be rendered yet when the `doAction` was called. Fix: ----- - First render the `ActionComponent`, then fetch the action data, and finally call `doAction`, so the action is executed seamlessly without interruption. Task-5713125
This update fixes an issue where worked days were incorrectly calculated for employees without contracts or when contracts didn't fully align with payslip periods. The change adjusts date boundaries to accurately reflect attendance and out-of-contract days, ensuring payroll accuracy. Thorough testing has been implemented to validate these fixes.
Original PR description
Problem: ------- In several scenarios, Worked Days are incorrectly computed when the employee has no contract or when the contract does not fully overlap with the payslip period. Case 1: - Create an…
Problem: ------- In several scenarios, Worked Days are incorrectly computed when the employee has no contract or when the contract does not fully overlap with the payslip period. Case 1: - Create an employee without a contract - Create a payslip for this employee for the current month: You'll see X days of attendance (= today until the end of the payslip period) and Y days of out of contract (= number of days from the start of the payslip period until today) - Create a payslip for this employee for the previous month: you'll see ( Z_prev + Y ) days out of contract ( Z_prev = number of working days in the previous month) - Create a payslip for this employee for the next month: you'll see Z_next days of attendance (Z_next = number of working days in the next month) Case 2: - Create a new employee with a contract starting during the current month - Create a payslip for this employee for the previous month - Out-of-Contract days are incorrectly computed as: contract_start_date - previous_month_start. Case 3: - Create an employee with a contract ending during this month - Create a payslip for this employee for the next month - Out-of-Contract days are incorrectly computed as: next_month_end - contract_end_date. Solution: -------- When generating work days lines: - Explicitly handle employees without a contract. - Use adjusted date bounds when the contract does not overlap the payslip period. Several tests were added to cover these scenarios, as well as the tests the corresponding commit in odoo/odoo (PR odoo: 241978) task-5430759
This update resolves an issue where scanning packaging barcodes didn't correctly associate with related lots, leading to incorrect inventory tracking. The fix ensures that packaging barcodes accurately link to the correct lots during scanning, improving the accuracy of stock management.
Original PR description
When scaning a lot after a packaging, the lot won't recognize the packaging and will not work properly ### Steps to reproduce: * In the settings enable packagings * Create a storable product P with…
When scaning a lot after a packaging, the lot won't recognize the packaging and will not work properly ### Steps to reproduce: * In the settings enable packagings * Create a storable product P with Units as uom, a barcode and tracked by lots * Create new lots with barcode for Product P * Inventory > Configuration > Product > Units & Packagings * Click on pack of 6 > Packaging Barcodes > New * Create one for your product with a different barcode * Go to barcode > Operations > eg. internal transfer > New * Scan packaging barcode * Scan one of the lots -> Issue, the lot create a new line, and will not find the packaging ### Observation: When scanning a barcode, it will first try to find a match with existing lines, In our case, it will find a match with the line of the packaging, but since the line is considered as "completed" since there was no expected quantity since we create a new picking: https://github.com/odoo/enterprise/blob/13d815457d47846d5391c9a2dc1ed244ef64b6c4/stock_barcode/static/src/models/barcode_picking_model.js#L1497-L1501 It will erase the line, to avoid to overfill a completed line: https://github.com/odoo/enterprise/blob/13d815457d47846d5391c9a2dc1ed244ef64b6c4/stock_barcode/static/src/models/barcode_model.js#L1459-L1460 and since, it decided to ignore that line, it will not find another lines, and will create a new one : https://github.com/odoo/enterprise/blob/13d815457d47846d5391c9a2dc1ed244ef64b6c4/stock_barcode/static/src/models/barcode_model.js#L1535 Additional Issues ----------------- Issue 1 : When scaning a packaging, lot1, packaging, lot2, all the packagings will be linked to the first lot, which doesn't allow us to scan multiple lots. Issue 2 : When having sublines with different uoms, it will add the quantity without considering the differences in uoms ### Steps to reproduce: * In the settings enable packagings * Create a storable product P with Units as uom, a barcode and tracked by lots * Create new lots with barcode for Product P * Inventory > Configuration > Product > Units & Packagings * Click on pack of 6 > Packaging Barcodes > New * Create one for your product with a different barcode * Create a packaging 2 with barcode for product A * Go to barcode > Operations > eg. internal transfer > New * Scan packaging 1 barcode * Scan one of the lot 1 * Scan packaging 1 * Scan lot 2 -> Issue 1, the packaging 2 will be link to lot 1, it won't be possible to link any packaging to another lot. * Scan packaging 2 -> Issue 2, it create a subline (excpeted), but the sum that appear on the main grouped line is wrong, it doesn't considere the difference in uoms ### Observation: Issue one : When scanning a barcode, it will first try to find a match with existing lines, since the uom is the same it will not be erased by the full line check https://github.com/odoo/enterprise/blob/13d815457d47846d5391c9a2dc1ed244ef64b6c4/stock_barcode/static/src/models/barcode_model.js#L1456-L1460 and since, it found a line, it will just add it's self to the line Issue Two: When creating the group lines it will first calculate the sum of all the quantities: https://github.com/odoo/enterprise/blob/8774388a7b1b2ca2c08c752026ac1a20dbc10347/stock_barcode/static/src/models/barcode_model.js#L248-L254 And after inside of groupSublines it will choose the main line and it's uom and use the previous sum for the total quantity: https://github.com/odoo/enterprise/blob/8774388a7b1b2ca2c08c752026ac1a20dbc10347/stock_barcode/static/src/models/barcode_picking_model.js#L1456-L1461 opw-5189492 opw-5408372 Forward-Port-Of: odoo/enterprise#108214 Forward-Port-Of: odoo/enterprise#98701
This update fixes an error in how holiday pay recovery is calculated for employees with non-standard working schedules (e.g., 40 hours/week). Previously, the calculation used a default 38-hour week, leading to incorrect deductions. This change ensures accurate recovery amounts based on the employee's actual working hours.
Original PR description
**Steps to Reproduce:** 1 - create an employee in Belgium company with hourly rate 20.62 and 40h/week working schedule 2 - Set 10 paid time off to this employee 3 - Set 2000 euros in recovery amount…
**Steps to Reproduce:** 1 - create an employee in Belgium company with hourly rate 20.62 and 40h/week working schedule 2 - Set 10 paid time off to this employee 3 - Set 2000 euros in recovery amount holiday n-1 4 - Set 10 days in recovery day holiday n-1 5 - Employee takes 5 paid time off in February and 5 in December 6 - Do one payslip for this employee for February and validate it 7 - Do one payslip for this employee for December Current behaviour : - the holiday n-1 amount for February = 824.80 - the holiday n-1 amount for December = 742.32 Expected behaviour : - the holiday n-1 amount for December should be 20.62 (hourly_rate) * 5 (days) * 8 (hours) = 824.80 **Reason** - The daily recovery amount was calculated using hardcoded standard working hours (38h/week) instead of the employee's actual schedule (40h/week), causing an incorrect deduction rate for non-standard schedules. **Solution** - Replace the hardcoded reference with the actual hours per week from the employee's resource calendar to ensure the correct hourly rate is applied. Forward-Port-Of: odoo/enterprise#107941 Forward-Port-Of: odoo/enterprise#106205
This update resolves an issue preventing users from exporting BOE reports when using multi-company mode with companies having different VAT numbers. The fix ensures the report options correctly consider all companies in the branch hierarchy, allowing for successful export.
Original PR description
**Steps to reproduce:** * Install the **l10n_es_reports** module. * Create a parent company with two branch companies with all has different VATs. * Enable **multi-company mode** with all companies selected. * Go to tax report `Mod 390` * From gear icon clck on `BOE`. **Observed behavior:** * A warning appears: Please select the main company and its branches in the company selector to proceed. * Not able to export BOE. **Cause:** * This is because the tax report's options only consider one of the two companies (because they have different VAT numbers). The button is not declared as branch_allowed, so when clicked, it checks whether all the companies of the branch hierachy are in the options => they're not => error. **Fix:** * Added the `'branch_allowed': True` to the `BOE` button options. opw-5891472 Forward-Port-Of: odoo/enterprise#107252