Daily updates from Odoo
Thursday, November 13, 2025
8 changes · master
Resolved issues and error corrections
Odoo Sign now checks PDF files before processing them, so encrypted or unreadable documents are rejected cleanly instead of causing an error. This helps users understand when a file cannot be used and prevents interruptions when creating sign documents or templates.
Original PR description
Currently, an error occurs when trying to upload an encrypted/invalid document in the Sign Documents. **Steps to reproduce:** 1. Install **Sign** module. 2. Try to upload the encrypted PDF in Sign Document or templates. **Sample files:** https://drive.google.com/drive/folders/1MkiFRgJOlv2zc6ZW3SJYnMwHZYy9CFtX?usp=drive_link **Errors:** ``` DependencyError - PyCryptodome is required for AES algorithm UnicodeDecodeError - 'utf-8' codec can't decode byte 0xa4 in position 0: invalid start byte ``` **Cause:** The `flatten_pdf` function calls `PdfFileReader`, which raises an error if the file is encrypted or cannot be read/decrypted properly. Also, adding AES encrypted document in already uploaded valid document will triggers the same error. **Fix:** This commit prevents a traceback when uploading invalid or encrypted PDF files by validating the PDF data beforehand. sentry-6913657420 Forward-Port-Of: odoo/enterprise#96830
GSTR-1 reporting now correctly checks eligible Point of Sale lines that have a unit of measure but are missing an HSN code. This helps businesses catch missing tax classification details in warnings while still excluding older POS lines that cannot be validated reliably.
Original PR description
Previously, POS move lines from the original POS entries were not considered during the HSN validation in the GSTR-1 report. As a result, lines without an HSN code were incorrectly skipped from the warning check. This commit updates the domain logic to ensure that: - POS move lines with a Unit of Measure (UoM) but without an HSN code are now included in the check. - Older POS lines without a UoM remain excluded from validation. opw-5252620 Forward-Port-Of: odoo/enterprise#99261
This fixes an issue where selecting several bank reconciliation lines and creating a statement could start from the wrong balance. The system now keeps track of the selected lines correctly, helping ensure statement balances are accurate.
Original PR description
When selecting multiple lines and doing a statement in the list view. The balance start was wrong because the computation relies on the active_ids that wasn't correctly filled. The reason is that during the refactoring: https://github.com/odoo/enterprise/commit/2335c953723dce66af8811fdfbfd5b811d42b109 We actually remove a custom widget allowing to pass the active_ids. task-5245426 Forward-Port-Of: odoo/enterprise#99013
The journal audit report now presents tax details more clearly, especially when taxes span multiple countries or have long names. This reduces clutter and makes the report easier to read and review without changing the underlying accounting data.
Original PR description
Improve the display of the tax details in the journal audit report. A few issues were spotted: * The header of the "Taxes Applied" table was not covering the full width when there are taxes related…
Improve the display of the tax details in the journal audit report. A few issues were spotted: * The header of the "Taxes Applied" table was not covering the full width when there are taxes related to multiple countries, fixed by using the right variable in the `colspan` * When taxes have long names, which happens easily with OSS etc, they were displayed on multiple lines in the table, making the table very long. This is fixed with the new `.name` css class, wrapping the line with an ellipsis. * When there are taxes related to multiple countries, the full name of the country was used. Since the vertical space is scarce, we display the country code instead. * A lot of space was wasted with poor usage of table elements. - The sub-tables were defined inside of `td` elements with fixed `colspan`. This doesn't make sense as they have nothing to do with the headers. By using a single `td` using the full width of the table, and splitting the tables inside of a flex element, we are now more free to have tables of different width depending on the content of the sub tables - The sub tables were using `table-layout: fixed` for no apparent reason. This is forcing thin columns (i.e. the country code) to take a lot of space, and making larger (larger amounts) columns overflow.
Swiss ISO 20022 payment files now avoid adding SEPA-specific details unless explicitly enabled. This helps prevent file rejections by Swiss banks that still require the older supported format, while allowing businesses to opt in when their bank supports the newer SEPA structure.
Original PR description
[REV] account_iso20022: Wrong XML generated for Switzerland This reverts commit https://github.com/odoo/enterprise/commit/a0e981171808d4e475249431424955ab2223f5da. This commit was introduced after…
[REV] account_iso20022: Wrong XML generated for Switzerland This reverts commit https://github.com/odoo/enterprise/commit/a0e981171808d4e475249431424955ab2223f5da. This commit was introduced after this fix https://github.com/odoo/enterprise/commit/c160b2ead711797ca7362649971038cc245c5611. Though that original fix was correct, it had some unwanted side-effects: due to the payment method being forced on some payments in order to use SEPA, the sepa_pain_version field was used to generate the corresponding XML nodes, most of the time keeping its default value of pain.001.001.09. For Swiss banks supporting pain.001.001.09 (which becomes mandatory in November 2026), it was not a problem, and everything worked fine. This was the case of the customer for whom the fix was made (ticket 4535542). For the ones still not supporting it, and expecting pain.001.001.03, the bank refused the file, since the it contained unsupported nodes, like BICFI, or a subnode to ReqdExctnDt. The commit we revert here tried to patch the symptoms without really understanding the cause of the issue, by not forcing the payment method everywhere. It breaks again the case of the original ticket (because ScvLvl is not passed to "SEPA" on EUR payments), and essentially makes no sense. We revert it in favor of a better fix. ticket-4535542 ======================= [FIX] account_iso20022: Swiss variant: introduce config parameter to force SEPA nodes in the file https://github.com/odoo/enterprise/commit/c160b2ead711797ca7362649971038cc245c5611 made it so we now force SEPA payments into Swiss ISO20022 files when they're made in EUR to an IBAN account. Though all in all correct, this fix forgot to consider the fact that the SEPA nodes would be generated using the sepa_pain_version field, with defaults to pain.001.001.09 version of the ISO standard. As it is today, the Swiss file is still generated using pain.001.001.03 in Odoo (some task will change that soon, since the support for that old version will be dropped in November 2026). Having such pain.001.001.09 nodes in the file causes it to be rejected by a lot of Swiss banks, because they don't support that version yet, or simply because of the file mixing both versions of the standard. Since no one had asked us to enforce SEPA nodes within the file before recently, we make the choice to keep the fix behavior only when a config parameter is explicitly set to enable it. In all other cases, the former behavior is restored. We also now display the PAIN version field in the journal's form view when this config parameter is set, to give more control on the format of the generated file. ticket-4535542 Forward-Port-Of: odoo/enterprise#99150 Forward-Port-Of: odoo/enterprise#98918
Folder selection lists outside the main Documents app no longer show actions such as open or rename. This avoids confusing options in settings and popup dialogs and prevents crashes when those actions are not available.
Original PR description
This cleans an initial that was done from 19.0 on, but had to account for stable requirements. Action icons (like 'Open Folder', 'Rename', etc.) were incorrectly appearing in list views outside of the main Documents app, for example, when selecting a folder in a settings menu or a popup dialog. This was confusing and caused a crash when an icon was clicked, as the required functionality was not loaded in those contexts. The fix removed the action icons from these secondary views.The icons are now correctly restricted to the main Documents list view, where they function as intended. Other views (like folder pickers) now behave as standard selection lists without errors. Task-5245425 Cleanup of Task-5166843
Fixes an issue that could block employees from activating Stripe expense cards when their language preference was already set. This helps companies complete expense card setup without encountering an unexpected error.
Original PR description
Currently an error occurs when user tries to activate a stripe card. Steps to replicate: - Install `hr_expense_stripe_demo`, `l10n_be`, and `hr_payroll` with demo data. - Use ngrok to portforward…
Currently an error occurs when user tries to activate a stripe card. Steps to replicate: - Install `hr_expense_stripe_demo`, `l10n_be`, and `hr_payroll` with demo data. - Use ngrok to portforward localhost to the public internet and open the link. - Switch to My Belgian Company. - `Settings > Expenses > Expense Card > Agree to T&C > Save > Click Connect`. - Select `Use Test Phone Number > Use Test Code > Save For Later`. - Create a new Employee named `Test` and click `Create User` (provide an email). - Under the `Personal` tab, set the value for the `Payslip Language` field. - Go to `Expenses > Cards > New`, assign Cardholder as `Test`, and save. - Click `Activate`, fill in the required fields, and save. - The error will appear. Error: `KeyError: False` Cause: - The error occurs because line [1] attempts to remove the `False` item from the `preferred_langs` OrderedSet. - Line [1] was added as a guard to remove any `False` value from `preferred_langs`, this occurs when an employee has no language set and hence it will be assigned as False. - However, if the employee has a language selected, there is no `False` value in the `preferred_langs` set, causing line [1] to raise a `KeyError: False`. Solution: - Using the python method `discard()`, we can safely remove any False value and function wont raise any error if False is not found in the `preferred_langs` OrderedSet. [1]: https://github.com/odoo/enterprise/blob/e1d8b1316ce822055a1b42c7f5893cfd1a3dd8a5/hr_expense_stripe/wizard/hr_expense_stripe_cardholder_wizard.py#L176 sentry-6975780020 Forward-Port-Of: odoo/enterprise#98216
The Colombian currency rate update service now uses the national bank's replacement API after the old service was shut down. This helps companies continue receiving official exchange rates automatically without disruption.
Original PR description
The previous SOAP API was decommissioned. A new API was provided that doesn't need SOAP anymore and is a bit simpler [1]. [1] https://suameca.banrep.gov.co/estadisticas-economicas/webService opw-4860262 Forward-Port-Of: odoo/enterprise#99152