Daily updates from Odoo
Thursday, November 13, 2025
36 changes · master
Enhancements to existing features
Belgian point-of-sale blackbox messages are now queued so the register can continue more quickly when an immediate response is not required. This improves reliability and reduces delays for workflows such as pro forma sales while preserving communication with the fiscal device.
Original PR description
In this commit, we introduce a queuing mechanism for blackbox messages to make all interactions with the blackbox faster and more reliable. This is particularly useful for messages that do not require the response from the blackbox to continue the workflow such as pro forma sales messages. Forward-Port-Of: odoo/enterprise#98040 Forward-Port-Of: odoo/enterprise#90747
Tax return generation is now more efficient by grouping repeated checks and updates, reducing delays when saving fiscal year settings or refreshing returns. The change also prevents manually created draft returns from being removed incorrectly, helping preserve user-entered accounting work.
Original PR description
- batched _compute_company_ids on returns - batched return to unlink in _generate_or_refresh_all_returns - removed redondant call to _generate_or_refresh_all_returns in…
- batched _compute_company_ids on returns - batched return to unlink in _generate_or_refresh_all_returns - removed redondant call to _generate_or_refresh_all_returns in action_save_onboarding_fiscal_year since we want to call it only when a value is changed and that's already handled in the write on the company. - batched _is_available_for on reports - make only one write on the company (and one call to _generate_or_refresh_all_returns) when writing or create the fiscal year wizard. - dont delete return created manually with a date before the date of the account_opening_date and not yet posted. Detected from runbot error: https://runbot.odoo.com/odoo/runbot.build.error/231463 A small workaround is needed on the company when writing the changes from the fiscal year wizard. This is because related fields are writen one by one, which then trigger multiple times _generate_or_refresh_all_returns. To prevent this, we are batching all the write on the company from the fiscal year wizard in one write. The opening_date need to be handled separatly since it's not a related field but still need to be writen on the company, if removed from the vals during the create it's then not possible to save the wizard anymore. Also fixed a bug where the returns manually created before the account_opening_date would be deleted if they were not posted before the next call to _try_create_returns_for_fiscal_year. **Detailed Explanation** We can see the tour being broken when trying to save on the wizard: <img width="1366" height="768" alt="image" src="https://github.com/user-attachments/assets/9443251c-aee1-4fbe-be2f-27c11bcbb77d" /> So we can do a flamegraph to take a look at what's happening on that database during that time and we can see 2 majors time uses, a call to `_generate_or_refresh_all_returns` triggered by a write on the wizard and a call to `action_save_onboarding_fiscal_year` <img width="1396" height="855" alt="image" src="https://github.com/user-attachments/assets/a9d310da-2787-4806-951d-e50b8c1da2a8" /> The first call to `_generate_or_refresh_all_returns` took about 7.8s, the second one took about 1.1s First, we can see a lot of `_compute_company_ids` calls, this is because we have `precompute=True` on this field due to it being needed in the different access rules. Since all the returns that are created have similar main company, tax unit and return type, we can easily batch them to only call `_get_company_ids` once for all the returns that will be created. Resulting in the following flamegraph: <img width="1422" height="866" alt="image" src="https://github.com/user-attachments/assets/c52c88c7-0263-44fb-a16c-52456673dc92" /> The first call to `_generate_or_refresh_all_returns` took about 0.8s, the second one took about 1.2s Another little change we can do is to remove the call to `_generate_or_refresh_all_returns` during `action_save_onboarding_fiscal_year` and adding the forced_date from the first one to the second one. <img width="1294" height="844" alt="image" src="https://github.com/user-attachments/assets/7ad55d06-ecd4-4957-b514-71fffa6de00c" /> We now end up with one call to `_generate_or_refresh_all_returns` that takes 1.4s BUT, we can still do better. We can see that all we did previously was only do to one thing less. The "real" problem was the many search calls done in `_is_available_for` during the `_init_options_variants`. <img width="1268" height="693" alt="image" src="https://github.com/user-attachments/assets/ebae398d-dfdd-4c1e-99ac-44f25e5875e7" /> After the final change, we are down to 0.9s ! One thing to keep in mind, all those flamegraph were done on a dump of a database from a nightly test, which had many companies created as well as **every** modules installed, which means every return types, reports, ... This means those performance improvements wont be as useful on small databases. Forward-Port-Of: odoo/enterprise#95760
The Brazilian localization now shows a specific tooltip explaining how to fill in the Incoterm location for export documents. This helps users provide the city or shipping location required for Brazilian EDI submissions, reducing confusion during export invoicing.
Original PR description
Purpose: Incoterm location is a field that will be widely used with Brazilian Exportation of Goods. It is required by the Brazilian EDI to send the incoterm location in its request specifying the city or location from which the goods are shipped. The field should have a tooltip explaining its specific purpose for the Brazilian EDI. related task-4802462 task-5180499
Belgian 281.50 account tags now include Belgium as their country, making them easier to group and identify in reporting. This helps businesses reuse these tags more reliably in Belgium-specific tax and accounting processes.
Original PR description
Account tags for 281.50 are specific to Belgium. With this PR, the country is added to those tags, allowing easier group by and enabling their use in other cases as well. task-5236632 Forward-Port-Of: odoo/enterprise#98759
Financial reports now use a clearer internal grouping method for report columns. This helps make report generation more reliable and easier to maintain without changing how business users interact with the reports.
Original PR description
task-5164369
A new setting lets users choose to disable barcode lookup instead of being forced to keep it active when an API key is automatically provided. This gives SaaS customers clearer control over the feature and can guide them through uninstalling the module when they no longer want to use it.
Original PR description
### Issue: Currently, the `product_barcodelookup` feature is disabled only when no API key is configured: https://github.com/odoo/enterprise/blob/86937d9c974125d60f6e2e9dc6bf0b048e20e489/product_barcodelookup/models/product_template.py#L199-L203 https://github.com/odoo/enterprise/blob/86937d9c974125d60f6e2e9dc6bf0b048e20e489/product_barcodelookup/tools/barcode_lookup_service.py#L7-L11 FHowever, for SaaS users, the API key is hardcoded, which makes it impossible to disable the feature without uninstalling the module. ### Improvement: The purpose of this commit is to add a boolean setting that allows users to explicitly disable the barcode lookup feature by proposing to uninstall the module for them. Community: https://github.com/odoo/odoo/pull/232794 opw-5096468
The report editor now automatically places the cursor in the first editable area when a report opens. This makes it clearer where users can begin editing, especially for new or blank reports, and shows the relevant placeholder guidance immediately.
Original PR description
Before this commit it was a bit hard to see where to click to start editing a report especially a blank or new one. After this commit, we focus the first hintable node that we can discover. This will: 1. Put the selection and cursor in that element 2. Trigger the hint plugin that will display the relevant placeholder task-4936527
The Belgian POS blackbox queue is now cleared when point-of-sale data is reloaded. This helps prevent repeated queued calls from getting stuck in an unexpected loop, improving stability for affected POS sessions.
Original PR description
This commit adds a clear of the blackbox queue when reloading data. This could avoid potential unexpected deadloop of calls in the queue. Forward-Port-Of: odoo/enterprise#99252
The spreadsheet interface now supports dark mode using shared styling variables, giving users a more comfortable viewing option in low-light environments. This also simplifies future visual maintenance by avoiding separate dark-mode stylesheets.
Original PR description
This commits implements dark mode for the user interface in o-spreadsheet. We can drop the drak mode-specific stylesheets and use CSS variables using `light-dark()` instead. Task: 5082659
The POS opening flow no longer checks Belgian blackbox driver versions before a session starts. This avoids an unnecessary startup check while still notifying users if an update is needed when they use blackbox features.
Original PR description
When introducing the blackbox queue service, we added a check at the opening of the POS to ensure that the blackbox drivers were up to date. This check is done at the start of session opening. It is now not necessary anymore, if the drivers are not up to date, an error will also be shown to the user when they try to use a blackbox functionality. Forward-Port-Of: odoo/enterprise#99014
Record creation controls in kanban and list views now use proper buttons, so they are automatically disabled while another action such as saving is in progress. This prevents users from accidentally triggering conflicting actions on slow connections, reducing crashes and improving reliability across affected workflows.
Original PR description
Before this commit, the `Add a record` in x2many kanban was a `<div>`, and the `Add a line` (and other "creates") in lists were `<a>`. Using buttons is semantically more correct. Morevoer, buttons are disabled when an action is ongoing in the webclient. For instance, when the form view is being saved, buttons are disabled. This allows to avoid concurrent and unwanted behaviors. Before this commit, such a behavior could happen with x2manys: in a form view with some changes (and on a slow network), click on the save icon, and directly click to add a record in the x2many. That "add" request was done on the current version of the static list, but that static list was replaced by a new one when the record is reloaded (post save), so a crash occured. By using `<button>`, those actions are automatically disabled when saving, thus removing the race condition.
User-facing wording has been updated from “Shipping Methods” or sales-level “Carrier” labels to “Delivery Methods” across supported delivery and marketplace integrations. This makes sales and delivery settings more consistent and easier to understand, while keeping carrier wording where it still applies to warehouse or provider-specific operations.
Original PR description
delivery_* = bpost, dhl, easypost, envia, fedex, sendcloud, shiprocket, starshipit, ups, usps, ups_rest, delivery_easypost, delivery_shiprocket, l10n_br_edi_website_sale, sale_amazon, sale_shopee…
delivery_* = bpost, dhl, easypost, envia, fedex, sendcloud, shiprocket,
starshipit, ups, usps, ups_rest, delivery_easypost, delivery_shiprocket,
l10n_br_edi_website_sale, sale_amazon, sale_shopee
With this PR:
---
1. Renamed 'Shipping Methods' to 'Delivery Methods'
* Renamed all user-facing labels of "Shipping Method(s)" to "Delivery Method(s)"
for consistent terminology across apps and improved user clarity, without
altering terminology used by specific delivery providers or third-party
integrations.
2. Renamed 'Delivery Carrier'/ 'Carrier' to 'Delivery Methods'
* A `Carrier` label is used at the stock level, while `Delivery Method` is used at
the sales level.
* A Delivery Method represents the complete carrier process along with the
required parameters defined at the sales level, whereas a Delivery Carrier
(or Carrier) is used at the transfer/picking level, where the focus is on
which carrier actually ships the goods rather than the full delivery
configuration.
* Therefore, all relevant occurrences of Delivery Carrier have been updated to
Delivery Method.
* The remaining occurrences of Carrier/Delivery Carrier refer either to
stock-level usage, delivery provider's internal labels, or
localization-specific terminology.
Impact:
-------
- This avoids confusion between "Shipping Method" and "Delivery Method", as
"Delivery Method" better reflects how an order is handed over to the customer,
making the terminology clearer and more contextual.
- Clarifies when "Delivery Method" vs. "Carrier" should be used by keeping "Carrier"
terminology where it correctly reflects stock-level operations, while ensuring sales-level
terminology remains consistent.
task-4720174Currency rates will now use only values from before the requested date, reflecting that rates apply to the following day and should remain stable during the day. This improves consistency in accounting, reporting, payments, and electronic invoicing where exchange rates affect financial amounts.
Original PR description
Currency rates are valid for the next day and should not change during the day. Use only rates strictly earlier than the requested date task-5173684
This update standardizes module information such as authors, licenses, website links, and app page references across many Odoo Enterprise apps. It improves consistency and trust in app listings without changing day-to-day product behavior.
Several automated tests were adjusted to match a recent change in how incoming email processing returns results. This helps keep quality checks reliable across invoicing, helpdesk, and Belgian SODA import features without changing user-facing behavior.
Original PR description
message_process now returns a recordset, tests are updated to not browse the return value anymore and simply use it as is.
This update simplifies how tag displays are customized in several Odoo apps, making it easier to keep tag-related screens consistent and adaptable. Users should see little direct change, but teams benefit from cleaner maintenance and more reliable future improvements.
Original PR description
* account_reports,helpdesk,knowledge,planning This commit adds a slot to the component TagsList and removes the tag part of its template so the component does not render tags anymore. M2m tags fields needed to be updated to support this change. The change allows these field to define their tag more easily. task-4660360
Resolved issues and error corrections
This update simplifies a styling workaround used in spreadsheet side panels. It helps keep the interface consistent while reducing overly complex rules that could make future maintenance harder.
Original PR description
Because of a really strong rule in o_spreadsheet lib that forced the box-sizing property pretty much everywhere, we came up with a super dense rule to counteract it inside odoo and specifically inside the side panels. This commits aims to simplify it at best with the common denominator of those rules. Task-4878174 Forward-Port-Of: odoo/enterprise#99240 Forward-Port-Of: odoo/enterprise#98876
Connecting a bank with payments disabled no longer creates an alarming error report. The system now treats this expected setup condition as a warning, reducing false error alerts while keeping the bank connection flow clearer for users and support teams.
Original PR description
Currently, an error occurs when a user connects a bank that has payments not enabled. **Steps to replicate:** * Install `account_online_payment` * Invoicing > Bank > dropdown menu and connect the…
Currently, an error occurs when a user connects a bank that has payments not enabled. **Steps to replicate:** * Install `account_online_payment` * Invoicing > Bank > dropdown menu and connect the demo bank. **Error:** `Non-blocking error during payment activation: To activate payments, you must first enable them when connecting a bank account.` **Root cause:** * The error happens because payment is disabled on the bank page. As `is_payment_enabled` is `False` in the `data` at [1], which comes from [2],and that `data` comes from a response in the super call at [3]. **Solution:** * Since this error comes from a `UserError`, it would be better to use logger warning instead of logger error. [1]: https://github.com/odoo/enterprise/blob/b5ff6fff193a7197b3983985c8af13512d677146/account_online_payment/models/account_online_link.py#L18 [2]: https://github.com/odoo/enterprise/blob/b5ff6fff193a7197b3983985c8af13512d677146/account_online_payment/models/account_online_link.py#L24 [3]: https://github.com/odoo/enterprise/blob/b5ff6fff193a7197b3983985c8af13512d677146/account_online_synchronization/models/account_online.py#L963-L970 sentry-6936347663 Forward-Port-Of: odoo/enterprise#99227
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
This fixes an intermittent issue where moving articles in the Knowledge sidebar could prevent the next selected article from opening correctly. Users should see more reliable editing behavior after reorganizing Knowledge articles.
Original PR description
Before this commit, the `test_knowledge_main_flow` tour sometimes failed. That tour creates articles, then d&d one of them in the sidepanel to re-organize articles, and then clicks on a previously…
Before this commit, the `test_knowledge_main_flow` tour sometimes failed. That tour creates articles, then d&d one of them in the sidepanel to re-organize articles, and then clicks on a previously created article to continue editing it. The tour failed on that step, as the previously created clicked article wasn't properly selected/displayed in the editor. The race condition was that two (non synchronized) calls to the `load` function of the model were done: one after the move because the move could have altered the displayed article (1) and one because we selected another article to open by clicking in the sidebar (2). (1) is done without resId (reload the current article) and (2) is done with the id of the clicked article. Depending on the order these two calls are done, we end up with the clicked article displayed (if (2) is done after (1)), or with the current article still displayed, but reloaded ((1) done after (2)). This commit fixes the race condition by forcing the reload of the current record for (1), instead of blindly reloading the model, which might have changed/been requested something else meanwhile. runbot error~182073 Forward-Port-Of: odoo/enterprise#99174
BACS payment export files now correctly round payment amounts when converting pounds to pence. This prevents rare cases where amounts such as £645.30 could be exported as one penny less, helping avoid payment discrepancies.
Original PR description
**Issue description:** When creating a BACS batch payment that contains a payment with an amount that can't be represented well in float (like 645.30), the generated BACS batch file will have a wrong amount (due to float precision) as the amount is represented in pence. **Steps to reproduce:** 1. Create a BACS vendor payment with amount = 645.30 2. Add this payment to a BACS batch payment. 3. Confirm the batch to generate the export file. In the file you will notice that the amount in the payment line is 64529 pence instead of 64530. opw-5159413 Forward-Port-Of: odoo/enterprise#99180
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.
Opening Studio on calendar views now works even when a calendar field is limited to specific user groups. This prevents an unexpected crash and lets authorized users continue editing calendar views normally.
Original PR description
Have a calendar view that has a field A. the field A has a group on it, defined either in python or in the XML. Before this commit, opening studio in the calendar view crashed, because calendar did not support yet those fields that are marked with studio_no_fetch in their attributes. After this commit, there is no crash Forward-Port-Of: odoo/enterprise#99254 Forward-Port-Of: odoo/enterprise#98903
The document sharing panel now shows the correct guidance for the “Access through link” option. This avoids confusion when users configure link-based access, helping them understand the sharing settings more accurately.
Original PR description
This commit fix the helpers for the 'Access through link' option where a condition was mistakenly depending on internal access option. Task-5222910 Forward-Port-Of: odoo/enterprise#98450
This fix prevents an error in Belgian POS certification when a pro forma request finishes after the related order has already been deleted. It helps keep the checkout flow stable by confirming the order still exists before updating it.
Original PR description
Before this commit, when trying to send a pro forma for an order that had been deleted while the pro forma call was in the queue, a JS error would occur because the callback of the call would try to access the order which was no longer existing in the frontend. This is now fixed by checking that the order is still present before accessing it in the callback. Forward-Port-Of: odoo/enterprise#99248
This change adds a regression test to ensure employees with fully flexible schedules can have overlapping absences, such as sick leave and a public holiday, without payroll work entry generation failing. It helps protect payroll reliability for attendance-based contracts by preventing a previously reported error from returning.
Original PR description
**Purpose:** Add regression test to verify that overlapping leave scenarios (sick leave + public holiday) do not cause singleton errors for fully flexible employees using attendance-based work entries. **Test Coverage:** - Fully flexible employee with no calendar assignment - Attendance-based work entry source configuration - Overlapping sick leave and public holiday scenario - Work entry generation and validation without singleton errors Related : [PR](https://github.com/odoo/odoo/pull/223448) opw-4979974 Forward-Port-Of: odoo/enterprise#97947 Forward-Port-Of: odoo/enterprise#93902
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
This update removes leftover code from a previous reconciliation model change in the accounting tools. It helps keep the system easier to maintain without changing how users work with reconciliation.
Original PR description
In the PR (odoo/enterprise#80787) the reconciliation model was refactored in order to be easier to use for users. However, some dead code was forgotten and not removed. Forward-Port-Of: odoo/enterprise#98923
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 Ask AI command no longer shows empty quotation marks when the command palette search field is blank. This removes a small visual glitch and makes the command label clearer for users.
Original PR description
Before, the "Ask AI" command in the command palette would always display quotes around the search term, even if the input was empty, showing "". Now, the quotes are conditionally rendered only when a search value is present, preventing empty quotes from appearing. task-[5262111](https://www.odoo.com/web#id=5262111&view_type=form&model=project.task) # Before https://github.com/user-attachments/assets/1bb98920-5ec2-48c3-9c13-1e49b8ab5ed4 # After https://github.com/user-attachments/assets/3c985951-a64c-4426-97de-1cdcdd572f0b
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
Code cleanup and technical improvements
The IoT Box now includes its device handlers by default instead of downloading them from the database during startup. This should make startup faster and reduce setup or connectivity issues for point of sale, payment terminal, scale, camera, and quality control hardware.
Original PR description
To speed up the IoT Box startup process and reduce the amount of potential issues, we now avoid downloading handlers from the database by providing them all by default on the IoT Box. Community PR: https://github.com/odoo/odoo/pull/221948
This update cleans and standardizes the VoIP app's code using Odoo's quality rules for Python and JavaScript. It also corrects small typos, helping keep the module easier to maintain without changing business functionality.
Original PR description
Use both the Odoo Python Ruff config and JavaScript ESLint/Prettier configs on all relevant voip files. Also fix the few existing typos.