Daily updates from Odoo
Friday, May 15, 2026
192 changes
19 changes
Resolved issues and error corrections
This update fixes an issue where packaging unit information disappeared from delivery slips after a transfer was validated. Now, the delivery slip accurately displays the packaging unit and quantity, regardless of whether the transfer is validated, ensuring accurate reporting for products tracked by lot and serial numbers. This improves inventory visibility and reporting accuracy.
Original PR description
Issue before this commit: ========================= For products tracked by serial/lot with packaging units, the delivery slip correctly shows the packaging unit and quantity before validating the…
Issue before this commit: ========================= For products tracked by serial/lot with packaging units, the delivery slip correctly shows the packaging unit and quantity before validating the transfer. However, after validating the transfer, the packaging unit and its corresponding quantity are no longer displayed in the delivery slip report. Steps to Reproduce: ========================= 1. Install stock and sale_management modules. 2. Enable Units of Measure & Packagings and Display Lots & Serial Numbers on Delivery Slips from settings. 3. Create a product with tracking by lot/serial number and configure a packaging unit. 4. Create a SO using this product with a packaging unit and confirm it. 5. Open the related transfer and print the delivery slip before and after validation. Cause of the Issue: ========================= The delivery slip report template (stock_report_delivery_has_serial_move_line) does not display packaging unit information after validation for move lines when the packaging unit differs from the product unit of measure. With This Commit: ========================= This commit ensures that packaging units and their corresponding quantities are displayed on the delivery slip after validation when the packaging unit differs from the product unit of measure. Steps To Reporduce: [Video Link](https://drive.google.com/file/d/10DmFKW1Y_Tm-AyKzPrqtFMY8orBkKbIm/view?usp=sharing) opw-6142052 Forward-Port-Of: odoo/odoo#264235 Forward-Port-Of: odoo/odoo#262722
A bug was preventing the 'Two-factor authentication Disabled' filter from working correctly in the user list. This update corrects a technical issue within Odoo's database search functionality, ensuring the filter accurately displays users without two-factor authentication. Tests have been added to verify the fix.
Original PR description
Issue: In the user view list, the "Two-factor authentication Disabled" filter doesn't work (return the same result than the "Two-factor authentication Enabled").
Explanation: The ORM normalises `=`/`!=` to `in`/`not in` with list values (commit odoo/odoo#191549 - 92301a5b300d). `_totp_enable_search` only handled the legacy scalar form: `value` is now always a list of boolean then always truthy then `[('totp_enabled', '=', False)]` returned users *with* a totp secret, the opposite of what was asked.
Fix it and add tests for it.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#264412
Forward-Port-Of: odoo/odoo#264027This update optimizes PDF report generation by compressing files after merging, reducing file sizes and memory usage. It addresses a previous memory leak and leverages newer PDF library versions for better performance, particularly with large reports. The result is faster report creation and smaller file sizes.
Original PR description
When merging pages with pypdf, the resulting content is uncompressed. A compression pass should be done right after to reduce the resulting file size. Additionally, this helps alleviate a memory leak in PyPDF2 where resources in the merged page are not properly released. Newer versions of pypdf (>=3.15.4) do not have this leak but still see benefits in the output file size. In practice the CPU overhead is negligible, and we actually see a speed increase in cases with high memory usage. Benchmark Printing 400 page annual report | |Print Time|Peak Memory|Output File| |------|----------|-----------|-----------| |Before|142s |3.6GB |103MB | |After |127s |0.4GB |5MB | opw-6148786 Forward-Port-Of: odoo/odoo#264550 Forward-Port-Of: odoo/odoo#261879
This update optimizes PDF document generation by compressing files after merging, resulting in significantly smaller file sizes. It also addresses a memory issue in the PDF processing, leading to improved performance, particularly with large documents. The change reduces storage needs and speeds up document creation.
Original PR description
When merging pages with pypdf, the resulting content is uncompressed. A compression pass should be done right after to reduce the resulting file size. Additionally, this helps alleviate a memory leak in PyPDF2 where resources in the merged page are not properly released. Newer versions of pypdf (>=3.15.4) do not have this leak but still see benefits in the output file size. In practice the CPU overhead is negligible, and we actually see a speed increase in cases with high memory usage. Benchmark Printing 400 page annual report | |Print Time|Peak Memory|Output File| |------|----------|-----------|-----------| |Before|142s |3.6GB |103MB | |After |127s |0.4GB |5MB | opw-6148786 Forward-Port-Of: odoo/enterprise#117372 Forward-Port-Of: odoo/enterprise#115550
This update fixes a bug preventing users from selecting custom date ranges in accounting reports. The recent date filter refactor caused a discrepancy in how options were displayed, leading to missing comparison choices. This change ensures users can accurately filter reports by custom date ranges.
Original PR description
**Problem:** The "Custom Dates" and "Specific Date" comparison options are missing from the Comparison dropdown in accounting reports. **Steps to reproduce:** 1. Go to Accounting > Reporting > Profit…
**Problem:** The "Custom Dates" and "Specific Date" comparison options are missing from the Comparison dropdown in accounting reports. **Steps to reproduce:** 1. Go to Accounting > Reporting > Profit & Loss 2. Click the Comparison dropdown 3. Only "No Comparison", "Previous Period", and "Same Period Last Year" are visible — "Custom Dates" is missing **Current behavior:** Custom date comparison options are not rendered. **Expected behavior:** "Custom Dates" (for range reports) and "Specific Date" (for single date reports) should appear in the Comparison dropdown. **Cause of the issue:** The date filter refactor (40484f985f5) restructured how the date mode is stored in options. Previously, `options.date.mode` held 'range' or 'single'. After the refactor, this key no longer exists — the mode is now stored as a boolean in `options.filter_date.range_mode`. The comparison filter template still checks `controller.cachedFilterOptions.date.mode`, which is now undefined, so both the range and single conditions always evaluate to false and the custom comparison options are never rendered. **Fix:** The comparison template was the only consumer not updated during the refactor. Aligning it to the new data path restores the options without any behavioral change. opw-6070402 Forward-Port-Of: odoo/enterprise#113391
This update prevents Odoo servers from crashing when the registry fails to load, specifically during worker startup. Previously, timeout errors would cause disruptions. Now, the system handles these errors gracefully, ensuring smoother operation and preventing unnecessary downtime.
Original PR description
When the registry fails to load, don't log the error when the query timeouts. The error is already raised and will be handled or logged appropriately. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
**[FIX] base: avoid evaluating true domains when validating domain** During validating, the domain validation may trigger a search on the comodel to ensure the domain is valid. After [1], the validation still performs the search with Domain True [here] because it ``search_domain`` is override because of [comodel_domain] is False with ``Domain.True`` to handle this checking if already ``search_domain`` is False or not ```py Traceback (most recent call last): File "/home/odoo/src/odoo/
Original PR description
**[FIX] base: avoid evaluating true domains when validating domain** During validating, the domain validation may trigger a search on the comodel to ensure the domain is valid. After [1], the…
**[FIX] base: avoid evaluating true domains when validating domain**
During validating, the domain validation may trigger a search on the comodel to ensure the domain is valid.
After [1], the validation still performs the search with Domain True [here] because it ``search_domain`` is override because of
[comodel_domain] is False with ``Domain.True`` to handle this checking if already ``search_domain`` is False or not
```py
Traceback (most recent call last):
File "/home/odoo/src/odoo/saas-19.3/odoo/service/server.py", line 1643, in preload_registries
registry = Registry.new(dbname, update_module=update_module, install_modules=config['init'], upgrade_modules=config['update'], reinit_modules=config['reinit'])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/saas-19.3/odoo/tools/func.py", line 67, in locked
return func(inst, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/saas-19.3/odoo/orm/registry.py", line 224, in new
load_modules(
File "/home/odoo/src/odoo/saas-19.3/odoo/modules/loading.py", line 467, in load_modules
load_module_graph(
File "/home/odoo/src/odoo/saas-19.3/odoo/modules/loading.py", line 222, in load_module_graph
load_data(env, idref, mode, kind='data', package=package)
File "/home/odoo/src/odoo/saas-19.3/odoo/modules/loading.py", line 61, in load_data
convert_file(env, package.name, filename, idref, mode, noupdate=kind == 'demo')
File "/home/odoo/src/odoo/saas-19.3/odoo/tools/convert.py", line 716, in convert_file
convert_xml_import(env, module, fp, idref, mode, noupdate)
File "/home/odoo/src/odoo/saas-19.3/odoo/tools/convert.py", line 815, in convert_xml_import
obj.parse(doc.getroot())
File "/home/odoo/src/odoo/saas-19.3/odoo/tools/convert.py", line 686, in parse
self._tag_root(de)
File "/home/odoo/src/odoo/saas-19.3/odoo/tools/convert.py", line 639, in _tag_root
raise ParseError(msg) from None # Restart with "--log-handler odoo.tools.convert:DEBUG" for complete traceback
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
odoo.tools.convert.ParseError: while parsing /home/odoo/src/enterprise/saas-19.3/ai/security/security.xml:4
Invalid domain ['|', ('attachment_id.public', '=', True), ('attachment_id.res_access_read', '=', True)]: Cannot search, too many attachments
View error context:
'-no context-'
```
[here]: https://github.com/odoo/odoo/blob/4561e703128963d566a16ab1356c7ef12e44256a/odoo/addons/base/models/ir_attachment.py#L643
[1]: https://github.com/odoo/odoo/pull/260753
[comodel_domain]: https://github.com/odoo/odoo/blame/afca863b750ec58f5414a5d47e2e2a64e3eba598/odoo/orm/domains.py#L1440-L1442
**[FIX] base, mail: Fix UserError checking field desciption**
during opening menu if field is comodel with ``ir.attachment`` it do fail on checking description field is groupable while
``res_access_read`` search do call because big database can have more attachment. So it will equal with search limit which is used.
To fix,
Value error is raised to prevent blocking
```py
41239- File "/tmp/tmpci4qg_2w/migrations/base/tests/test_mock_crawl.py", line 344, in crawl_menu
41240- self.mock_action(action_vals)
41241- File "/tmp/tmpci4qg_2w/migrations/base/tests/test_mock_crawl.py", line 357, in mock_action
41242- return self.mock_act_window(action)
41243- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
41244- File "/tmp/tmpci4qg_2w/migrations/base/tests/test_mock_crawl.py", line 441, in mock_act_window
41245- views = get_views(
41246- ^^^^^^^^^^
41247- File "/home/odoo/src/odoo/saas-19.3/addons/mail/models/mail_thread.py", line 489, in get_views
41248- res = super().get_views(views, options)
41249- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
41255- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
41256- File "/home/odoo/src/odoo/saas-19.3/odoo/addons/base/models/ir_ui_view.py", line 2947, in get_views
41257- result['models'][model] = {"fields": self.env[model].fields_get(
41258- ^^^^^^^^^^^^^^^^^^^^^^^^^^^
41259- File "/home/odoo/src/enterprise/saas-19.3/web_studio/models/ir_model.py", line 77, in fields_get
41260- return super().fields_get(allfields, attributes=attributes)
41261- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
41262- File "/home/odoo/src/odoo/saas-19.3/odoo/orm/models.py", line 2637, in fields_get
41263: description = field.get_description(self.env, attributes=attributes)
41264- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
41265: File "/home/odoo/src/odoo/saas-19.3/odoo/orm/fields.py", line 933, in get_description
41266- value = value(env)
41267- ^^^^^^^^^^
41268- File "/home/odoo/src/odoo/saas-19.3/odoo/orm/fields.py", line 989, in _description_groupable
41269- model._read_group_groupby(Query(model).table, groupby)
41270- File "/home/odoo/src/odoo/saas-19.3/addons/analytic/models/analytic_mixin.py", line 145, in _read_group_groupby
41271- return super()._read_group_groupby(table, groupby_spec)
41272- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
41273- File "/home/odoo/src/odoo/saas-19.3/odoo/orm/models.py", line 2080, in _read_group_groupby
41274- sql_expr = field.join(table, only_ids=True).id
41275- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
41276- File "/home/odoo/src/odoo/saas-19.3/odoo/orm/fields_relational.py", line 1773, in join
41277- coquery = comodel._search(codomain, bypass_access=self.bypass_search_access)
41278- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
41279- File "/home/odoo/src/odoo/saas-19.3/odoo/orm/models.py", line 4778, in _search
41280- sec_domain = sec_domain.optimize_full(self_sudo)
41281- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
41305- File "/home/odoo/src/odoo/saas-19.3/odoo/orm/domains.py", line 484, in _optimize
41306- previous, domain = domain, domain._optimize_step(model, next_level)
41332- ^^^^^^^^^^^^^^^^^^^^^^
41333- File "/home/odoo/src/odoo/saas-19.3/odoo/addons/base/models/ir_attachment.py", line 478, in <lambda>
41334- search=lambda self, operator, value: self._search_res_access('read', operator),
41335- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
41336- File "/home/odoo/src/odoo/saas-19.3/odoo/addons/base/models/ir_attachment.py", line 645, in _search_res_access
41337- raise UserError(self.env._("Cannot search, too many attachments"))
41338- odoo.exceptions.UserError: Cannot search, too many attachments
```
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update resolves an error that occurred when users attempted to provide feedback within live chats managed by chatbots. The issue stemmed from a configuration mismatch within the livechat system, which was corrected to ensure proper feedback processing. This prevents a technical error from appearing in the terminal.
Original PR description
Currently an error occurs when user tries to give feedback on livechat that has a chatbot. Steps to replicate: - Install `im_livechat` with demo. - Open Livechat > On Support Bot, Click `Configure…
Currently an error occurs when user tries to give feedback on livechat that has a chatbot.
Steps to replicate:
- Install `im_livechat` with demo.
- Open Livechat > On Support Bot, Click `Configure Channel` from Kebab menu (3 dots menu).
- Go to Widget page > Copy the support link (bottom one) > and open it in an incognito tab.
- Open the chat > chat atleast once > Close the chat.
- Click on any of the smileys (i.e. give feedback) and click send.
- The error will occur on the terminal.
Error:
```
File '/home/odoo/src/odoo/saas-19.3/addons/mail/tools/discuss.py', line 228, in __init__
assert bus_channel or not (notification_payload or notification_type), (
AssertionError: Notification parameters only make sense when a bus channel is passed.
```
Cause:
- As the livechat was managed by chatbot, it has no `livechat_agent_partner_ids` linked. This causes `rated_partner` [1] to be an empty recordset.
- So when initializing the Store [2] `rated_partner.sudo().user_ids` becomes an empty recordset. This causes the error to occur as the assertion fails [3] as the `bus_channel` is an empty recordset.
Solution:
- Updated the assertion to keep the behavior similar to the `bus_send()` method.
[1]: https://github.com/odoo/odoo/blob/2b486f35235974584b3434c2ca93297db802ae81/addons/im_livechat/models/discuss_channel.py#L740
[2]: https://github.com/odoo/odoo/blob/2b486f35235974584b3434c2ca93297db802ae81/addons/im_livechat/models/discuss_channel.py#L760-L770
[3]: https://github.com/odoo/odoo/blob/2b486f35235974584b3434c2ca93297db802ae81/addons/mail/tools/discuss.py#L228-L230
sentry-7477572896
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prA previous error prevented users from selecting a website theme after setting their company logo. This fix resolves the issue by correctly handling the logo data, ensuring a smooth website configuration process. The change was necessary due to a recent update in how logos are processed.
Original PR description
Currently an error is generated when the user tries to choose theme during configure the website after set the logo of the company. Steps to produce an error - Initilalize DB and set Logo (e.g. [1])…
Currently an error is generated when the user tries to choose theme during configure the website after set the logo of the company. Steps to produce an error - Initilalize DB and set Logo (e.g. [1]) - Install a website and build a website with click `Let's do it` and all input your choice - The error occurs when finally choosing the theme Error:`UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte'` This issue occurs because assigning the existing company logo using `company.logo` returns a `LocalBinaryFile` object instead of raw bytes after the recent refactor changes with [2]. Attempting to decode this `LocalBinaryFile` object causes the error. This commit fix the above issue by using `BinaryBytes(company.logo.content)`, which returns the expected raw bytes required to set the website logo from the company logo. [1]: https://odoocdn.com/openerp_website/static/src/img/assets/png/odoo_logo.png [2]: https://github.com/odoo/odoo/commit/41fe2ebdb9cc37341362d7af829c087a5f72f9f1 Sentry- 7475955377
This update resolves a bug that prevented the Account Asset module from successfully updating, leading to database instability. The fix avoids unnecessary data loading and ensures updates proceed smoothly, maintaining database accessibility. This improves module reliability and prevents disruptions to business operations.
Original PR description
This commit fixes the account asset error when updating the module. The problem was the `account.depreciation.model.csv` was being loaded again and if there was a `running` asset, it causes an error that we can't update a depreciation model that has running asset. As a result gets the module stuck in the to upgrade state which means that on every request to the Odoo db it will attempt the module upgrade again, which will keep failing, rendering the database inaccessible. Bug introduced in https://github.com/odoo/enterprise/pull/110143. A new condition in the write is added to make sure that the module is not in `install_mode` to bypass the update condition. opw-6216476
This update fixes an issue where event tickets with 'Fixed Price' rules were incorrectly showing a struck-through original price, making them appear as discounts. The change ensures that fixed prices are displayed accurately, aligning with how discounts are shown in the eCommerce shop. This improves the user experience and prevents confusion regarding pricing.
Original PR description
Event tickets show a struck-through original price even when a "Fixed Price" pricelist rule is applied, making it incorrectly appear as a discount. This is inconsistent with eCommerce shop behavior.…
Event tickets show a struck-through original price even when a "Fixed Price" pricelist rule is applied, making it incorrectly appear as a discount. This is inconsistent with eCommerce shop behavior. ### Steps to reproduce 1. Create an event with a paid ticket (e.g., 100 EUR). 2. Create a pricelist with a "Fixed Price" rule for that ticket (e.g., 80 EUR). 3. Open the event registration page. 4. The 100 EUR appears struck-through next to 80 EUR. ### Cause Odoo's website only shows a struck-through original price for discount rules, not fixed price rules. By design, a fixed price replaces the original rather than reducing it. However, the event registration page used a simplified check: it compared the final price to the original and assumed any difference was a discount. This ignored the rule type, incorrectly flagging fixed price rules as discounts. ### Fix Rationale A new helper method on the event ticket model now queries the applied pricelist rule to determine if it qualifies as a discount. opw-5993477 Forward-Port-Of: odoo/odoo#264470 Forward-Port-Of: odoo/odoo#263586
This update now allows users to cancel Stripe payments directly from the payment terminal, both on the standard POS system and self-order kiosks. Previously, cancellations could only be processed through the POS interface, creating a frustrating experience for customers. This change improves customer satisfaction and streamlines the payment process.
Original PR description
Before this commit, when making a payment on a Stripe terminal, the only way to cancel the payment was from the POS interface. In the self order kiosk, it was impossible to cancel the payment. After this commit, a cancel button will appear on the payment terminal for both POS and kiosk Stripe payments. task-6166789 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#264665 Forward-Port-Of: odoo/odoo#264270
This update resolves an issue where surveys would freeze after a network loss during submission. The fix ensures the submission lock is released, allowing users to retry submitting their answers after reconnecting. This improves the survey experience and prevents data loss.
Original PR description
Issue: When a user takes a survey and loses their internet connection just as the form attempts to submit (e.g., during a timed survey's auto-submit), the survey becomes completely unresponsive. Even…
Issue: When a user takes a survey and loses their internet connection just as the form attempts to submit (e.g., during a timed survey's auto-submit), the survey becomes completely unresponsive. Even if the user reconnects, they are unable to submit their answers. Steps to reproduce: 1. Start a survey that includes a time limit. 2. Disconnect your device from the internet just before the timer runs out. 3. Wait for the timer to reach zero, triggering the auto-submit. 4. Reconnect to the internet and attempt to click "Submit" manually. 5. The action is ignored and the form remains stuck. Cause: To prevent duplicate submissions, the form applies a "submitting" lock the moment a submission begins. If a network failure interrupts the process, the code execution halts abruptly. Because the process crashes before reaching the end of its routine, the lock is never removed, leaving the form permanently frozen. Solution: Guarantee that the submission lock is released regardless of the network request's outcome. By safely wrapping the submission sequence, the form will now always unlock itself even if an error interrupts the process. This allows the user to simply try submitting again once their connection is restored, while still letting the system report the initial network failure. Task-5787410 Forward-Port-Of: odoo/odoo#249514
This update fixes a reporting issue in the Profit & Loss report for Peruvian companies. Previously, depreciation entries were incorrectly categorized as 'Other Income'. The change ensures that depreciation entries (expenses) are now correctly classified in the 'Other Operating Expenses' section, improving report accuracy.
Original PR description
**Steps to reproduce:** - Install Accounting and l10n_pe_reports - Switch to a Peruvian company (e.g. PE Company) - Create a MISC journal entry with a line using a depreciation account (e.g. 6841000) and a debit value (e.g. 1000) - Post the entry - Check "Profit and Loss" report" **Issue:** The "Other operation income" section has an amount of 1000, even though a depreciation account (i.e. expense) was used. The amount should be in "Other operating expenses" section. **Cause:** A unique formula including accounts starting with 61, 66, 68, 71, 73, 74, 75, 76, 78, 79 and 99900 is used for "Other operation income" and "Other operating expenses" and depending on the sign of the sum, the result is reported in one of the section. **Solution:** Only report entries on "Income" accounts in "Other operation income" section and those on "Expense" accounts in "Other operating expenses". opw-6073666 Forward-Port-Of: odoo/enterprise#114362
This update ensures that completion and refusal emails sent to signers now use the correct email address calculated during the sign request process. Previously, emails were sent using the signer's partner email, which could lead to misdirected notifications. This change improves communication accuracy and ensures signers receive important updates.
Original PR description
Previously, completion and refusal emails were sent using the partner email directly, ignoring the computed email defined on the sign request item. The computed email includes validation rules and should be the main email for signer communication. This commit ensures that completion and refusal emails are sent using the computed signer email instead of the partner email. task-6148765 Forward-Port-Of: odoo/enterprise#114606
This update corrects a problem that was causing invoices with many items to fail SAT validation checks (CFDI40111 & CFDI40108). The issue stemmed from currency precision when applying discounts across multiple lines, leading to discounts being hidden. This ensures invoices comply with Mexican tax regulations and avoids potential payment issues.
Original PR description
…any lines Fix SAT validation errors CFDI40111 and CFDI40108 that occur when invoices with many lines contain a small negative line, causing per-line discounts to be hidden due to currency precision. opw-6187014 Forward-Port-Of: odoo/enterprise#117375 Forward-Port-Of: odoo/enterprise#117297
This update streamlines the reconciliation process in Odoo by eliminating unnecessary checks when no changes are needed. Previously, the system performed redundant queries even when no reconciliation actions were required, leading to slower performance. This change improves the overall responsiveness of the accounting module.
Original PR description
Since `write` is often done record by record because the values written are different on all lines, the call to `action_undo_reconciliation` is actually not batched. Even if there is nothing to do, some queries are still done to make sure that there is nothing to do... Forward-Port-Of: odoo/odoo#264476
This update resolves an error that prevented users from being created correctly when Studio and Livechat were installed and the user form layout was modified. The fix ensures that the 'Color Scheme' field is always populated with a valid value, preventing the creation process from failing. This improves user onboarding and data integrity.
Original PR description
Steps to reproduce: 1. Install Studio and Livechat 2. In user's form view change the location of Theme field after the livechat fields. 3. Now, try to create a user from name and email only Issue: - It throws an error: The operation cannot be completed: Missing required value for the field 'Color Scheme' (color_scheme). Cause: - During user creation after studio modification, im_livechat inverse methods access res.users.settings before it is fully initialized. then later write a falsy `color_scheme` value to that settings record, violating the required constraint on res.users.settings.color_scheme. Solution: - Ensure that when creating or updating `res.users.settings`, if `color_scheme` is empty or false, It is automatically set to the default value "system" opw-5918538 Forward-Port-Of: odoo/enterprise#109062
This update resolves a technical issue that could cause sorting processes to become stuck. The fix ensures that channel comparisons are consistently handled, regardless of whether a channel name is available, preventing potential infinite loops and improving overall system stability. This enhances the reliability of channel organization within the platform.
Original PR description
In order to work properly, a comparison function must be anti-symmetric, that is, if `compareFn(a, b)` gives `-1`, then `compareFn(b, a)` should give `1`. In the case of `sortChannels`, whenever `c1.displayName` is undefined, it falls back to comparing ids, but no such behavior is implemented when `c2.displayName` is missing, breaking the antisymmetry property. This flaw in the comparison function can potentially lead to infinite loops. This commit solves the issue, explicitly handling both `c1.displayName` and `c2.displayName`, in an antisymmetric fashion. Forward-Port-Of: odoo/odoo#264398
26 changes
Resolved issues and error corrections
This update allows all Point of Sale users to record cash inflows and outflows, regardless of their invoicing access rights. Previously, this functionality was restricted, which created a bottleneck. This change simplifies the cash management process within Point of Sale and aligns with existing security protocols.
Original PR description
Cash In/Out was gating on `account.group_account_invoice` even though the backend operation (`account.bank.statement.line` creation) is no different from what session closing already does under sudo(). Lower `_has_cash_move_perm` to `point_of_sale.group_pos_manager`, add `sudo()` to the create call. opw-6192176 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#263580
This update fixes an issue where the average sale price was incorrectly calculated due to tax inclusion/exclusion. The change ensures the sale average price always uses the net amount (excluding tax) from the invoice line, leading to more accurate reporting and pricing. This improves the reliability of sales data.
Original PR description
The price_unit of a account.move.line can be with or without tax. The sale_avg_price should be either incl. or excl. tax. To ensure the avg price is always excl. tax the price_subtotal can be used. Forward-Port-Of: odoo/odoo#263671 Forward-Port-Of: odoo/odoo#199209
This pull request updates the core spreadsheet component to the latest version (19.2.13). It includes fixes for a color picker issue and updates to Odoo dependencies, ensuring the spreadsheet functionality continues to operate smoothly and reliably. This is a routine maintenance update.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/fece642d7c [REL] 19.2.13 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/fece642d7c [REL] 19.2.13 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/5117146ce2 [FIX] color_picker: prevent gradient from opening when picking a custom color [Task: 6186050](https://www.odoo.com/odoo/2328/tasks/6186050) https://github.com/odoo/o-spreadsheet/commit/0f6ba0d72e [IMP] packages: rolldown is released in 1.0.0 [](https://www.odoo.com/odoo/2328/tasks/) https://github.com/odoo/o-spreadsheet/commit/5282e3c377 [REL] 19.2.12 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/dfb655d7b9 [FIX] packages: update odoo dependencies [](https://www.odoo.com/odoo/2328/tasks/) https://github.com/odoo/o-spreadsheet/commit/5231677171 [FIX] package: package install is broken [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya (rmbh) <rmbh@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com> Co-authored-by: Marceline Thomas (matho) <matho@odoo.com>
This update resolves a recurring issue in the meeting tour test that caused it to fail intermittently. The change ensures a key action is completed before the next, preventing a timing conflict that previously led to unpredictable test results. This improves the reliability of our testing process.
Original PR description
The `test_04_meeting_view_tour` test sometimes fails. A race condition occurs between the initial mark as unread action, which may or may not be triggered depending on whether the thread composer has time to gain focus before the meeting view is opened, and the later mark as unread action triggered during the test. This commit ensures the initial mark as read action is completed before proceeding to the mark as unread steps, thus resolving the issue. runbot-239936 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
This update resolves an issue where changes made to timesheet data in one Odoo tab weren't consistently reflected in other tabs. The fix ensures that all modifications are saved and synchronized across different windows, improving data accuracy and reliability for users.
Original PR description
Steps to reproduce: - Open Odoo in two tabs - Open the systray in tab 1 - Change some fields - Close the systray to save - Open the systray in tab 2 All fields are not in line in both tabs. This commit, hence, ensures that all data changed in the inline form is saved and consistent across different windows. When switching window, the systray is closed and the data is saved to the local storage. When opening the systray in another tab, the local storage will be accessed to read the latests changes (i.e., the modifications done in the other tab). task-6180394
This update fixes an issue where demo data didn't correctly populate the 'Device Installation and Maintenance' worksheet in Field Service products. By loading a demo data file, the system now ensures the appropriate worksheet is used, improving the accuracy of demo data setup.
Original PR description
Load product_product_demo.xml in the 'planning_field_service_sale_worksheet' module so that the `Device Installation and Maintenance` worksheet is correctly set in Field Service product when demo data is loaded, instead of using the default worksheet.
This update fixes a potential error in the HR holidays module that could occur when using the demo user. The fix ensures that the demo user always references the correct existing employee, preventing a database constraint violation. This improves stability and reliability of the holiday reporting feature.
Original PR description
Issue: The test was creating a new employee linked to the demo user, but if the demo user already had an employee, it would violate the (user_id, company_id) uniqueness constraint. Fix: Before creating a new employee, we check if the demo user already has one. If not, we create it, otherwise we use the existing one. task-6050719
This update fixes a visual issue in the Treehouse theme where the payment confirmation message was incorrectly displayed, appearing compressed. The fix ensures the message is properly aligned and visible, providing a consistent and professional user experience for customers using this theme. This resolves a specific problem impacting only the Treehouse theme.
Original PR description
Steps to reproduce: 1) Select the Treehouse theme from the website editor 2) Add a product to the cart and proceed to payment 3) Complete the payment and reach the confirmation page Issue: - The payment success alert message is not displayed properly and appears slightly below the alignment. - Also this particular issue is coming in this Treehouse theme only in rest of the themes the alert message is coming correctly. opw-5976602 Forward-Port-Of: odoo/odoo#257768
This update fixes an issue where Colorado state income tax calculations resulted in a positive value on payslips. This ensures accurate withholding of taxes, aligning with standard tax regulations. The fix was inspired by a previous change for Alabama state taxes and validated by payroll experts.
Original PR description
## Issue When generating a payslip for an employee of a company located in Colorado, the *CO State Income Tax* could end up positive. ## Steps to reproduce 1. Install *United States - Payroll*…
## Issue
When generating a payslip for an employee of a company located in Colorado, the *CO State Income Tax* could end up positive.
## Steps to reproduce
1. Install *United States - Payroll* (`l10n_us_hr_payroll`)
2. Set the current company's State to Colorado
3. Create an employee and a contract
- Wage: $0
- (Set the contract's status to *Running*)
- (In the payroll tab) State Withholding Allowance: $1000
4. Create a Payslip for the employee
- Structure: *"United States: Regular Pay"*
5. Compute Sheet
6. **In the _Salary Computation_ tab, the _CO State Income Tax_ line has a positive value**
## Justification
This fix is similar to the one applied for the AL(abama) state income tax by https://github.com/odoo/enterprise/commit/f0eeb55f1e3cf965c6a409675813d4a699e5fca6. That modification was justified by CAS (PO of US localizations for Payroll) in opw-5137280:
> *"Payroll taxes are always funds withheld from employee's paychecks, if there is a positive value it means the tax is a refund, not a withholding. Refunds happen when individuals file their income."*
## Note to reviewer
The test [`test_069_al_state_tax_0_income`](https://github.com/odoo/enterprise/blob/219d2a797ee2099c9d77c2defc9c9c5e1d504ffe/test_l10n_us_hr_payroll_account/tests/test_salary_rules.py#L957-L989) (added by the aforementioned commit https://github.com/odoo/enterprise/commit/f0eeb55f1e3cf965c6a409675813d4a699e5fca6) is wrongly indented and thus never executed. The test passes with the dedicated fix, and fails without it, as expected. Let me know if you want me to indent it correctly (in this commit or in an additional one).
opw-5999856
Forward-Port-Of: odoo/enterprise#116831
Forward-Port-Of: odoo/enterprise#112724This update resolves a problem where users couldn't link invoices to the chatter feature in Odoo. The fix prevents a security check from failing when copying attachments, ensuring users with appropriate permissions can successfully link documents. This improves the usability of the chatter feature for sales and accounting workflows.
Original PR description
**Steps to reproduce:** 1. Create user with role: User. Sales: Administrator, Accounting: Administrator and Documents: System Administrator. 2. Create a SO, create invoice, confirm, and send. 3. Now…
**Steps to reproduce:** 1. Create user with role: User. Sales: Administrator, Accounting: Administrator and Documents: System Administrator. 2. Create a SO, create invoice, confirm, and send. 3. Now go back to the SO, and try to link the INV document to the chatter. **Cause:** When linking an existing document to the composer, the underlying attachment is copied. If the source attachment is bound to a specific field (e.g., `res_field = 'invoice_pdf_report_file'`), the `copy()` operation duplicates this field reference. Odoo's native security checks then attempt to verify access to that specific field on the target model (`mail.compose.message`). Because the composer does not have this field, the check fails and throws an AccessError, even if the user has full rights to the source document. **Solution:** Explicitly set `"res_field": False` during the copy operation. This strips the original field binding, cleanly converting the file into a standard, generic chatter attachment for the composer without bypassing the standard security framework. opw-5916364 Forward-Port-Of: odoo/enterprise#107723
This update resolves an issue where creating two overtime shifts on a Saturday (set to end at midnight) would trigger an error. The fix addresses a timing discrepancy in how overtime start and end times are calculated, preventing overlapping shifts and ensuring accurate overtime recording.
Original PR description
__ ## Short functional explanation of the error When we create 2 shifts for the same day for an employee, on a non-working day for their schedule. When trying to create the second one after setting…
__ ## Short functional explanation of the error When we create 2 shifts for the same day for an employee, on a non-working day for their schedule. When trying to create the second one after setting the end date to midnight, we get the error: `ValueError: Expected singleton: hr.attendance.overtime.line(2, 3)` ## Reproduction Steps 1. Create an Employee. In the Payroll tab, Make sure they have an active contract. Set their Working Hours to a fixed schedule, where they have saturdays as non-working days. In the Settings tab, set an Overtime Ruleset. 2. Click on the overtime ruleset. Then, for each rule, under Action, set the Work Entry Type To Use as Overtime Hours. 3. Go to Attendances. In Configuration > Settings, under Extra Hours, set the Extra Hours Validation as Approved By Manager. 4. Create an attendance for your Employee on a Saturday, from 12h to 18h. 5. Create a second attendance for your Employee on that same Saturday, from 18h to 00h00. Try to Save. Note: the timezone of your computer, the working schedule and the employee should be set at Brussels time. ### Expected behavior The Overtime is registered. ### Unexpected behavior An error occurs: `ValueError: Expected singleton: hr.attendance.overtime.line(2, 3)` ## Origin of the issue The end time of the overtime is defined as follows: https://github.com/odoo/enterprise/blob/47faff7d6c9da5572e3bad3ff5a55b40c2ba81ac/hr_work_entry_attendance/models/hr_version.py#L54-L56 However, in the case where our shift ends after the computed end of the day (in our case, the end time of the shift is 00:00:00 and the end of the day is set at 23:59:59), it creates some problems. The end time of the overtime is set 1 second too early. Later we compute the start time of the overtime as follows: https://github.com/odoo/enterprise/blob/47faff7d6c9da5572e3bad3ff5a55b40c2ba81ac/hr_work_entry_attendance/models/hr_version.py#L57 Thus, the time start of the overtime is also set one second too early. As our second shift starts right after the first one, after the execution of this code, we will get a second shift that starts before the end of the first one. Then, we add these values in a list: https://github.com/odoo/enterprise/blob/47faff7d6c9da5572e3bad3ff5a55b40c2ba81ac/hr_work_entry_attendance/models/hr_version.py#L59 which will contain overlapping timeframes, and with which we create an Interval: https://github.com/odoo/enterprise/blob/47faff7d6c9da5572e3bad3ff5a55b40c2ba81ac/hr_work_entry_attendance/models/hr_version.py#L60 But when we create an Interval with overlapping timeframes, we obtain only one interval as the timeframes are merged. https://github.com/odoo/enterprise/blob/47faff7d6c9da5572e3bad3ff5a55b40c2ba81ac/hr_work_entry_attendance/models/hr_version.py#L173 As a result, `overtime_intervals` will contain only one time frame with 2 different corresponding overtimes, which causes a singleton error when reaching: https://github.com/odoo/enterprise/blob/47faff7d6c9da5572e3bad3ff5a55b40c2ba81ac/hr_work_entry_attendance/models/hr_version.py#L179 __ opw-6096454 Forward-Port-Of: odoo/enterprise#117094 Forward-Port-Of: odoo/enterprise#114147
A bug was preventing the 'Two-factor authentication Disabled' filter from working correctly in the user list. This update corrects a technical issue within Odoo's database search functionality, ensuring the filter accurately displays users without two-factor authentication. This ensures users can properly see and manage their two-factor authentication settings.
Original PR description
Issue: In the user view list, the "Two-factor authentication Disabled" filter doesn't work (return the same result than the "Two-factor authentication Enabled").
Explanation: The ORM normalises `=`/`!=` to `in`/`not in` with list values (commit odoo/odoo#191549 - 92301a5b300d). `_totp_enable_search` only handled the legacy scalar form: `value` is now always a list of boolean then always truthy then `[('totp_enabled', '=', False)]` returned users *with* a totp secret, the opposite of what was asked.
Fix it and add tests for it.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#264412
Forward-Port-Of: odoo/odoo#264027This update resolves an issue where test emails sent through the Email Marketing app would leave a related attachment visible in the chatter of contact records. The fix ensures that test emails are properly cleaned up after sending, preventing these attachments from appearing in the Chatter. This improves the clarity and usability of the Email Marketing interface.
Original PR description
**Steps to reproduce:** - Go to Email Marketing app - Create a mailing campaign - Set its recipients to Contact - Upload a file in Settings > Attach a file - Click on the test button to send a test mail to any mail - Go to the first contact record - Related attachment appears in the chatter **Issue:** Before 18.2, messages created for testing were ignored by the Chatter as they were empty (and not unlinked). But if an attachment was provided, it was linked to the test message and not deleted afterwards (which means it shows up in the record chatter). **Fix:** Ensure the related messages are unlinked at the same time as the test mail in `send_mail_test` by setting `is_notification` to False to trigger the `unlink` logic and remove the related attachments at the same time. backport of: https://github.com/odoo/odoo/commit/526b3d73886558315f2435714b2ed82fec313e78 opw-6168632 Forward-Port-Of: odoo/odoo#262152
This update fixes an issue where dependent taxes weren't correctly recalculated after a base tax was removed from a sales order or invoice. The fix ensures that tax amounts are accurately computed, particularly when 'Affect Base of Subsequent Taxes' is enabled, preventing financial discrepancies. This improves the reliability of tax calculations.
Original PR description
**Steps to reproduce:** * Install the *Accounting* module with French localization (*l10n_fr_account*). * Create a *Sales Tax* with: * A new tax group (e.g., 'Codifab'). * Enable *Affect Base of…
**Steps to reproduce:** * Install the *Accounting* module with French localization (*l10n_fr_account*). * Create a *Sales Tax* with: * A new tax group (e.g., 'Codifab'). * Enable *Affect Base of Subsequent Taxes*. * Create a *Sales Order*: * Add the first tax (with *Affect Base of Subsequent Taxes*). * Then add the second tax (eg VAT tax). * Confirm the *Sales Order*. * Create a *Down Payment Invoice* (percentage-based). * Open the generated invoice and: * Remove the first tax (the one affecting the base). **Observed behavior:** * The amount of the second tax group does not update after removing the first tax, leading to incorrect tax computation. **Cause:** * In `_import_base_line_extra_tax_data`, the condition: `all(str(tax.id) in extra_tax_data['manual_tax_amounts'] for tax in sorted_taxes)` only ensured partial matching of taxes. * This allowed reuse of stale `manual_tax_amounts` when taxes were removed or modified, causing incorrect base values for dependent taxes (e.g., *Affect Base of Subsequent Taxes*). **Fix:** * Update the condition to enforce an exact match between current taxes and cached `manual_tax_amounts` by checking both size and membership. * Prevent reuse of outdated tax data when taxes change, ensuring proper recomputation of dependent taxes. * Align Python logic with the JS implementation for consistency between `account_tax.py` and `account_tax.js`. opw-6063970 Forward-Port-Of: odoo/odoo#264434 Forward-Port-Of: odoo/odoo#259566
This update fixes an issue where pasting content into the composer created excessive nested divs, preventing users from correctly deleting pasted text. The fix also adds necessary plugins to properly handle links within the composer, improving the overall editing experience.
Original PR description
Currently, when pasting content into the composer, we sanitize it by stripping all tags except a few allowed ones, and this creates a lot of nested divs in the pasted content. This prevents the content from being deleted correctly when the user is in the nested divs and presses backspace. For links, we currently missing the plugin that correctly handles them in the composer, this commit adds it and also adds the missing plugin LinkSelectionPlugin and OdooLinkSelectionPlugin for the composer. task-6214020 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a technical error that prevented users from paying multiple expense bills simultaneously. The issue stemmed from incorrect data being passed during payment creation, triggering a database error. This fix ensures that users can now correctly process payments for multiple expenses without encountering this problem.
Original PR description
**Steps to reproduce:** - Install Accounting and Expenses - Create an expense: * Category: [any] * Total: [any] * Employee: [create or select one without a bank account] * Paid by: Employee (to reimburse) - Submit - Post Journal Entries (in Purchases journal) - Create another expense, submit it and post its journal entries - Go to the bills list - Select both bills created from the expenses - Click on "Pay" and then on "Create Payments" **Issue:** A traceback is raised while creating a payment. **Cause:** In the values used to create the payment, "partner_bank_id" is an empty "res.partner.bank" recordset instead of False, which leads to a SQL error because the type of the value is invalid. opw-6206315 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix ensures that the departure date is correctly associated with employee versions, addressing an issue where the dismissal date was being used instead. This accurately reflects scenarios like employee notices and prevents incorrect version tracking, improving payroll and HR data accuracy.
Original PR description
__ ## Short functional explanation of the error When we set the departure of an employee. The version is retrieved using the dismissal date. However, employees can work after their dismissal date,…
__ ## Short functional explanation of the error When we set the departure of an employee. The version is retrieved using the dismissal date. However, employees can work after their dismissal date, until their departure (in the case of a notice, for example). Therefore, the departure date should be chosen instead. ## Reproduction Steps 1. Go to Employees and create a new employee. In the Payroll tab, set a start date for their contract. Hit save. 2. This will create a version. You can see it top right, with the contract date. Click on the '+' next to it and set a date later. 3. Click on the cog in the top left and click End of Collaboration. Set an End Reason. Set the Dismissal Date to occur during the first version and the Departure Date to occur during the second version. Then, click Schedule. ### Expected behavior The Departure tab should appear when clicking on the second version, top right. ### Unexpected behavior The departure tab appears on the first version. ## Origin of the issue To select the version on which the departure occurs, we use this line of code: https://github.com/odoo/odoo/blob/be8b1bbad757fda27df579ce36cbc97324f58f62/addons/hr/models/hr_employee_departure.py#L117 `departure_date` should be used instead. __ opw-6079675
This update fixes an issue where event tickets with fixed prices were incorrectly showing a struck-through original price, making them appear as discounts. The change ensures that fixed price rules are displayed accurately, aligning with standard eCommerce behavior and providing a clearer price representation to customers. This improves the user experience and avoids confusion regarding pricing.
Original PR description
Event tickets show a struck-through original price even when a "Fixed Price" pricelist rule is applied, making it incorrectly appear as a discount. This is inconsistent with eCommerce shop behavior.…
Event tickets show a struck-through original price even when a "Fixed Price" pricelist rule is applied, making it incorrectly appear as a discount. This is inconsistent with eCommerce shop behavior. ### Steps to reproduce 1. Create an event with a paid ticket (e.g., 100 EUR). 2. Create a pricelist with a "Fixed Price" rule for that ticket (e.g., 80 EUR). 3. Open the event registration page. 4. The 100 EUR appears struck-through next to 80 EUR. ### Cause Odoo's website only shows a struck-through original price for discount rules, not fixed price rules. By design, a fixed price replaces the original rather than reducing it. However, the event registration page used a simplified check: it compared the final price to the original and assumed any difference was a discount. This ignored the rule type, incorrectly flagging fixed price rules as discounts. ### Fix Rationale A new helper method on the event ticket model now queries the applied pricelist rule to determine if it qualifies as a discount. opw-5993477 Forward-Port-Of: odoo/odoo#264470 Forward-Port-Of: odoo/odoo#263586
This update now allows customers to cancel their Stripe payments directly through the payment terminal, both on the POS system and self-order kiosks. Previously, cancellation was only possible through the POS interface, creating a frustrating experience for customers. This change improves customer satisfaction and streamlines the payment process.
Original PR description
Before this commit, when making a payment on a Stripe terminal, the only way to cancel the payment was from the POS interface. In the self order kiosk, it was impossible to cancel the payment. After this commit, a cancel button will appear on the payment terminal for both POS and kiosk Stripe payments. task-6166789 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#264665 Forward-Port-Of: odoo/odoo#264270
This update fixes a reporting issue in the Profit & Loss report for Peruvian companies. Previously, depreciation entries were incorrectly categorized as 'Other Income.' The change ensures that depreciation expenses are now correctly classified within 'Other Operating Expenses,' improving the accuracy of financial reporting.
Original PR description
**Steps to reproduce:** - Install Accounting and l10n_pe_reports - Switch to a Peruvian company (e.g. PE Company) - Create a MISC journal entry with a line using a depreciation account (e.g. 6841000) and a debit value (e.g. 1000) - Post the entry - Check "Profit and Loss" report" **Issue:** The "Other operation income" section has an amount of 1000, even though a depreciation account (i.e. expense) was used. The amount should be in "Other operating expenses" section. **Cause:** A unique formula including accounts starting with 61, 66, 68, 71, 73, 74, 75, 76, 78, 79 and 99900 is used for "Other operation income" and "Other operating expenses" and depending on the sign of the sum, the result is reported in one of the section. **Solution:** Only report entries on "Income" accounts in "Other operation income" section and those on "Expense" accounts in "Other operating expenses". opw-6073666 Forward-Port-Of: odoo/enterprise#114362
This update ensures that livechat conversations are automatically marked as read when they end, resolving a previous issue where agents saw persistent unread indicators. The change adjusts how the chat window focuses, triggering the read state correctly regardless of whether the composer is visible. This improves agent efficiency and provides a cleaner user experience.
Original PR description
**Description of the issue this PR addresses:** Previously, when a livechat conversation ended, it was never automatically marked as read. The existing `mark_as_read` mechanism depends on the…
**Description of the issue this PR addresses:** Previously, when a livechat conversation ended, it was never automatically marked as read. The existing `mark_as_read` mechanism depends on the composer being focused, but ended livechat conversations hides the composer, and the chat window does not focus the thread automatically (focus only happens on explicit click). This made it impossible for the read state to be triggered through the normal path, leaving agents with persistent unread indicators on closed livechat conversations. **Desired behavior after PR is merged:** - Focus the composer when present. - Focus the conversation otherwise. This ensures the read state is correctly triggered when the conversation is effectively in focus. task-[5900038](https://www.odoo.com/odoo/project/1519/tasks/5900038) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#263355 Forward-Port-Of: odoo/odoo#253609
This update resolves an issue where a warning message persisted after canceling a payslip in the HR payroll module. The change ensures that the warning disappears correctly, providing a smoother user experience. This improves the reliability and usability of the payroll system.
Original PR description
. Clear payslip warning after cancelling the payslip . Add corresponding tests task-6199148 Forward-Port-Of: odoo/enterprise#117289 Forward-Port-Of: odoo/enterprise#116859
This update corrects a problem where invoices with many items caused rounding errors during discount calculations, leading to validation failures with Mexican tax authorities (SAT). The fix ensures accurate discount distribution across all invoice lines, resolving previously reported errors and improving compliance.
Original PR description
…any lines Fix SAT validation errors CFDI40111 and CFDI40108 that occur when invoices with many lines contain a small negative line, causing per-line discounts to be hidden due to currency precision. opw-6187014 Forward-Port-Of: odoo/enterprise#117375 Forward-Port-Of: odoo/enterprise#117297
This update streamlines the reconciliation process in Odoo by preventing unnecessary checks when no changes are needed. Previously, the system performed extra queries even when reconciliation wasn't required, leading to slower performance. This change improves the overall responsiveness of the accounting module.
Original PR description
Since `write` is often done record by record because the values written are different on all lines, the call to `action_undo_reconciliation` is actually not batched. Even if there is nothing to do, some queries are still done to make sure that there is nothing to do... Forward-Port-Of: odoo/odoo#264476
This change fixes an error that prevented users from being created correctly when Studio and Livechat were installed and configured. The issue stemmed from a timing problem during user setup, causing a required field to be missing. The fix ensures the 'Color Scheme' field is always populated with a default value, allowing successful user creation.
Original PR description
Steps to reproduce: 1. Install Studio and Livechat 2. In user's form view change the location of Theme field after the livechat fields. 3. Now, try to create a user from name and email only Issue: - It throws an error: The operation cannot be completed: Missing required value for the field 'Color Scheme' (color_scheme). Cause: - During user creation after studio modification, im_livechat inverse methods access res.users.settings before it is fully initialized. then later write a falsy `color_scheme` value to that settings record, violating the required constraint on res.users.settings.color_scheme. Solution: - Ensure that when creating or updating `res.users.settings`, if `color_scheme` is empty or false, It is automatically set to the default value "system" opw-5918538 Forward-Port-Of: odoo/enterprise#109062
This update resolves an issue where the Microsoft SwiftKey keyboard caused incorrect selection tracking within the HTML editor. By caching the selection state, the system now accurately reflects the user's intended selection, preventing unexpected focus shifts and ensuring proper table editing functionality. This improves the overall user experience when using keyboard input.
Original PR description
Problem: When using the Microsoft SwiftKey keyboard, placing the caret at the beginning of a table cell and triggering a `beforeinput` event can result in `getSelection()` returning an incorrect selection. Notably, the selection immediately before the event is correct, but it changes unexpectedly without firing a `selection_change` event. Solution: Cache the selection whenever a `selection_change` event fires, ensuring we keep the last correct selection set by the user or editor. Steps to reproduce: - Edit a table with an empty cell. - Place the caret inside the empty cell. - Press Backspace. - Observe that the focus moves to the previous cell unexpectedly. task-6150731 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#264618 Forward-Port-Of: odoo/odoo#259798
8 changes
Resolved issues and error corrections
This update fixes an issue where the payment confirmation message appeared incorrectly in the Treehouse theme. The message was compressed and misaligned, impacting the user experience. This change ensures consistent and proper display of the confirmation message across all themes, improving the checkout process.
Original PR description
Steps to reproduce: 1) Select the Treehouse theme from the website editor 2) Add a product to the cart and proceed to payment 3) Complete the payment and reach the confirmation page Issue: - The payment success alert message is not displayed properly and appears slightly below the alignment. - Also this particular issue is coming in this Treehouse theme only in rest of the themes the alert message is coming correctly. opw-5976602 Forward-Port-Of: odoo/odoo#257768
This update fixes issues where list markers weren't consistently applying text and font sizes, particularly when list items had trailing empty lines or complex formatting. The changes ensure that font sizes and colors are correctly applied to list items regardless of their content or formatting, improving the overall user experience.
Original PR description
### Steps to reproduce: **Issue 1:** - Create a list with multiple items and leave the last item empty. - Press Ctrl + A to select all content. - Apply a text color from the toolbar. - The list…
### Steps to reproduce: **Issue 1:** - Create a list with multiple items and leave the last item empty. - Press Ctrl + A to select all content. - Apply a text color from the toolbar. - The list marker of the last item does not receive the color. **Issue 2:** - Create a list and type some text. - Press Ctrl+A to select all. - Apply a font size via the font-size input (inline style=`font-size: ...`). - Then apply a font size via the font-size dropdown (class-based). - Font size from the dropdown is not applied. **Issue 3:** - Create a list item and type some text. - Convert the text into a link. - Copy the link. - Press Enter and paste the link. - Select the entire list using the mouse. - Apply font size & observe that font size is not applied to some list items. **Issue 4:** - Go to Todo and create a list. - Select all items (Ctrl + A). - Apply a background color class from the toolbar. - Apply a font color using inline styling. - Observe that the font color is not visible. ### Description of the issue/feature this PR addresses: - Full-selection detection relied on Range.isPointInRange() checks on list item leaf nodes. When a list item ended with a trailing empty line, the selection often stopped on the `<li>` element and did not include the `<br>` placeholder. As a result, such list items were not considered fully selected when applying text color, and their markers remained unstyled. - Applying a font-size class on a fully-selected list item could leave existing inline font-size on list item, so new class didn’t take effect. - Creating links inside list items & repeated copy-paste operations left empty text nodes (feff cleanup). Manual selection doesn't include these nodes, `areNodeContentsFullySelected` reports that list item is not fully selected. As a result, some list items were not considered fully selected, and font size was not applied. - Background color `(bg-*)` classes also define a color property. When a font color is applied, the color is set on the `<li>`, but the nested `font.bg-*` element’s color takes precedence, causing the applied font color to be overridden. ### Desired behavior after PR is merged: - List items with trailing empty line are now treated as fully selected, even when selection ends before the `<br>` placeholder. - Clear any existing font-size styles on the list item before applying the new font-size class, so the dropdown font size applies correctly. - Empty text nodes are removed before applying font size, ensuring full list item selection and consistent font-size application. - When a list item (li) has a text color (inline style or text-* class), and nested font element has only a background color class then font element now inherits the color from the li. task - 5454639 Forward-Port-Of: odoo/odoo#264381 Forward-Port-Of: odoo/odoo#241827
This update resolves a problem where users couldn't link invoices to the chatter feature in Odoo Enterprise. The fix prevents an access error that occurred when copying attachments, ensuring users with appropriate permissions can now successfully link documents to the composer.
Original PR description
**Steps to reproduce:** 1. Create user with role: User. Sales: Administrator, Accounting: Administrator and Documents: System Administrator. 2. Create a SO, create invoice, confirm, and send. 3. Now…
**Steps to reproduce:** 1. Create user with role: User. Sales: Administrator, Accounting: Administrator and Documents: System Administrator. 2. Create a SO, create invoice, confirm, and send. 3. Now go back to the SO, and try to link the INV document to the chatter. **Cause:** When linking an existing document to the composer, the underlying attachment is copied. If the source attachment is bound to a specific field (e.g., `res_field = 'invoice_pdf_report_file'`), the `copy()` operation duplicates this field reference. Odoo's native security checks then attempt to verify access to that specific field on the target model (`mail.compose.message`). Because the composer does not have this field, the check fails and throws an AccessError, even if the user has full rights to the source document. **Solution:** Explicitly set `"res_field": False` during the copy operation. This strips the original field binding, cleanly converting the file into a standard, generic chatter attachment for the composer without bypassing the standard security framework. opw-5916364 Forward-Port-Of: odoo/enterprise#107723
This update corrects a bug where importing a product with a changed subscription type could bypass a necessary warning. Previously, the system processed the import without alerting the user, leading to incorrect subscription settings. Now, a warning is raised to prevent accidental changes to sold subscription products.
Original PR description
__ ## Short functional explanation of the error When we have a subscription product that has already been sold. If we try to import a product with the same ID but where we change the subscription…
__ ## Short functional explanation of the error When we have a subscription product that has already been sold. If we try to import a product with the same ID but where we change the subscription type of the product, the import is executed without issue. However, this leads to undesired behavior: when we go to the product page and try to manually change the subscription type (set it back to subscription), the change is not applied as a warning is raised. ## Reproduction Steps Make sure you have debug mode enabled. 1. Create a product, and check the Subscription box. 2. Click on Orders and create a Quotation with this product, then confirm. 3. Go to Products > Products. Select the list view and search for the product you just created. Select it, and click Actions > Export. 4. Check the import compatible field. Select the fields to export: name, id and recurring_invoice. Upon exporting, a file is downloaded. 5. Access that file and change the recurring_invoice to FAUX or FALSE if your computer is in English. Save the changes. 6. Unselect the product and click on the cog, top right > Import. Click on Upload Data File and select the file that you have downloaded upon exporting, then import. ### Expected behavior A user warning is raised: we shouldn't be able to change the subscription type of the product when it has already been sold. ### Unexpected behavior The import is processed normally. Then, when we access the product page, and try to check the Subscriptions box again, a warning is raised. ## Origin of the issue Nothing prevents the import from occurring in that case. __ opw-6143789 Forward-Port-Of: odoo/enterprise#117111 Forward-Port-Of: odoo/enterprise#115046
This update fixes an issue where cancelled orders placed from the backend weren't immediately visible in the Point of Sale (POS) frontend. The system now automatically updates the POS interface when a backend order is cancelled, ensuring consistent order management across all channels. This improves accuracy and reduces the risk of discrepancies.
Original PR description
Step: --------- - Install point_of_sale. - Open a POS session with presets configured. - Add an order line and select the takeout order preset. - Cancel the order from the backend. Issue: --------- - The cancelled order is not reflected in the frontend. Cause: --------- - The frontend is not notified when the order is cancelled from the backend. Fix: --------- - Notify the frontend when a backend order is cancelled. Task-5406984
This update streamlines the reconciliation process in the accounting module by preventing unnecessary checks. Previously, the system performed redundant queries even when no reconciliation actions were needed. This change improves performance and reduces the time it takes for reconciliation operations to complete.
Original PR description
Since `write` is often done record by record because the values written are different on all lines, the call to `action_undo_reconciliation` is actually not batched. Even if there is nothing to do, some queries are still done to make sure that there is nothing to do... Forward-Port-Of: odoo/odoo#264476
This update fixes an error that prevented users from being created correctly when Studio and Livechat were installed and the user form layout was modified. The issue stemmed from incorrect handling of color scheme settings during user creation, which has now been resolved to ensure consistent user setup.
Original PR description
Steps to reproduce: 1. Install Studio and Livechat 2. In user's form view change the location of Theme field after the livechat fields. 3. Now, try to create a user from name and email only Issue: - It throws an error: The operation cannot be completed: Missing required value for the field 'Color Scheme' (color_scheme). Cause: - During user creation after studio modification, im_livechat inverse methods access res.users.settings before it is fully initialized. then later write a falsy `color_scheme` value to that settings record, violating the required constraint on res.users.settings.color_scheme. Solution: - Ensure that when creating or updating `res.users.settings`, if `color_scheme` is empty or false, It is automatically set to the default value "system" opw-5918538 Forward-Port-Of: odoo/enterprise#109062
This update resolves an issue where the Microsoft SwiftKey keyboard caused incorrect table cell selections and unexpected focus movement. By caching the selection state, the HTML editor now accurately reflects user input, ensuring a smoother and more reliable editing experience.
Original PR description
Problem: When using the Microsoft SwiftKey keyboard, placing the caret at the beginning of a table cell and triggering a `beforeinput` event can result in `getSelection()` returning an incorrect selection. Notably, the selection immediately before the event is correct, but it changes unexpectedly without firing a `selection_change` event. Solution: Cache the selection whenever a `selection_change` event fires, ensuring we keep the last correct selection set by the user or editor. Steps to reproduce: - Edit a table with an empty cell. - Place the caret inside the empty cell. - Press Backspace. - Observe that the focus moves to the previous cell unexpectedly. task-6150731 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#264618 Forward-Port-Of: odoo/odoo#259798
1 change
Resolved issues and error corrections
This update fixes a reporting issue in the Profit & Loss report for Peruvian companies. Previously, depreciation entries were incorrectly categorized as 'Other Income.' The change ensures that depreciation entries (expenses) are now correctly classified in the 'Other Operating Expenses' section, improving report accuracy.
Original PR description
**Steps to reproduce:** - Install Accounting and l10n_pe_reports - Switch to a Peruvian company (e.g. PE Company) - Create a MISC journal entry with a line using a depreciation account (e.g. 6841000) and a debit value (e.g. 1000) - Post the entry - Check "Profit and Loss" report" **Issue:** The "Other operation income" section has an amount of 1000, even though a depreciation account (i.e. expense) was used. The amount should be in "Other operating expenses" section. **Cause:** A unique formula including accounts starting with 61, 66, 68, 71, 73, 74, 75, 76, 78, 79 and 99900 is used for "Other operation income" and "Other operating expenses" and depending on the sign of the sum, the result is reported in one of the section. **Solution:** Only report entries on "Income" accounts in "Other operation income" section and those on "Expense" accounts in "Other operating expenses". opw-6073666 Forward-Port-Of: odoo/enterprise#114362
2 changes
Resolved issues and error corrections
This pull request updates the core spreadsheet component within Odoo. It includes several bug fixes and improvements to the underlying infrastructure, ensuring the spreadsheet functionality remains stable and reliable. These changes address issues with color selection, package installation, and workflow processes.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/76bed65119 [REL] 18.3.48 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/76bed65119 [REL] 18.3.48 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/70e2c8e1f7 [FIX] color_picker: prevent gradient from opening when picking a custom color [Task: 6186050](https://www.odoo.com/odoo/2328/tasks/6186050) https://github.com/odoo/o-spreadsheet/commit/e2d2b3493f [IMP] packages: rolldown is released in 1.0.0 [](https://www.odoo.com/odoo/2328/tasks/) https://github.com/odoo/o-spreadsheet/commit/8b8bc44b6a [REL] 18.3.47 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/1a3ac11b2f [FIX] packages: update odoo dependencies [](https://www.odoo.com/odoo/2328/tasks/) https://github.com/odoo/o-spreadsheet/commit/c970c1de54 [FIX] package: update package-lock [](https://www.odoo.com/odoo/2328/tasks/) https://github.com/odoo/o-spreadsheet/commit/d2fa06ba7f [FIX] package: package install is broken [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/c2bb3c8379 [REL] 18.3.46 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/998f03a0d3 [FIX] package: husky should run at post install [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/5b5147ef7f [FIX] workflow: fix the tag definition [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/66808b6063 [FIX] Workflow: fix missing permission to use OpenID Connect [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/af50462f8c [FIX] workflow: Split the workflow in parallel jobs [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya (rmbh) <rmbh@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com> Co-authored-by: Marceline Thomas (matho) <matho@odoo.com>
This update fixes an issue where kit component descriptions were missing from delivery slips. Previously, users only saw the individual components listed, not the kit they originated from. Now, when printing delivery slips, the kit name is correctly displayed, providing clearer information for order fulfillment.
Original PR description
__ ## Short functional explanation of the error When printing delivery slips, the description of kit components isn't shown. Therefore, we only see the components on the slip, and not the kit they…
__ ## Short functional explanation of the error When printing delivery slips, the description of kit components isn't shown. Therefore, we only see the components on the slip, and not the kit they come from. ## Reproduction Steps 1. Go to settings. Under Inventory, in the Operations section, enable Packages. 2. Go to Sales and create a new quotation. Select a customer and add a kit product. Click on confirm. 3. Click on the Delivery smart button. Click on Put in Pack and Validate. 4. Click on the small cog > Print > Delivery Slip. ### Expected behavior The kit from which the components belong should be indicated somewhere on the slip. ### Unexpected behavior The kit isn't indicated. ## Origin of the issue When we print a delivery slip without putting in pack, we can see on the slip that the first line, in bold, corresponds to the kit name. However, after putting in pack, the first line, in bold, indicates the Package id: https://github.com/odoo/odoo/blob/80b602f2fa82366280f9beaa3414c27293bdc4f6/addons/stock/report/report_deliveryslip.xml#L116 Thus, the lines after will correspond to the components, of which we retrieve the details with: https://github.com/odoo/odoo/blob/80b602f2fa82366280f9beaa3414c27293bdc4f6/addons/stock/report/report_deliveryslip.xml#L125 However, in `_get_aggregated_product_quantities`, we set the description of the components to an empty string under that case: https://github.com/odoo/odoo/blob/80b602f2fa82366280f9beaa3414c27293bdc4f6/addons/mrp/models/stock_move.py#L180-L181 leaving us with no description for the components, and therefore not indicating the kit to which they belong. __ opw-6006514 Forward-Port-Of: odoo/odoo#264159 Forward-Port-Of: odoo/odoo#254200
1 change
Resolved issues and error corrections
This update fixes a bug where previously validated manual transactions could incorrectly be matched with new transactions. The change ensures that manual counterpart lines are no longer suggested for matching with subsequent transactions, improving the accuracy of bank reconciliation. This resolves a potential issue with financial reporting.
Original PR description
Currently, after validating a transaction with a manual operation, the aml resulting from the manual operation can still be selected and matched with other transactions. Steps to reproduce: - Create a transaction for 500 dollars - Create a manual counterpart line for the bank statement line with label "test123" and validate - Create another transaction of -1000 dollars and label "test123" Issue: The manual counterpart line matched before is being suggested against the new transaction. The perfect match reconciliation model will reconcile the manual counterpart line with the new bank statement line. Adding test for community branch opw-6045050 Forward-Port-Of: odoo/enterprise#115847
17 changes
New functionality added to Odoo
This update adds support for Hong Kong's payroll reporting requirements, specifically generating an IR56M report for non-employees like freelancers. It also incorporates data related to CAP57 non-employees, ensuring compliance with local regulations. This improves the payroll functionality for businesses operating in Hong Kong.
Original PR description
\* = documents, test To complete support for HK's payroll requirements, we add the IR56M report for those who are not employees (freelancers, contractors, etc etc.). task-[5050335](https://www.odoo.com/odoo/my-tasks/5050335) odoo/odoo#263768 odoo/enterprise#116875 odoo/upgrade#10186 -- Preceeding PR https://github.com/odoo/odoo/pull/261453
This update adds support for three new food delivery services – Smiles, InstaShop, and RADYES – to the pos_urban_piper module. These integrations expand the options available to our restaurant partners for fulfilling online orders and improving customer delivery experiences.
Original PR description
In this commit - ------------------------ Integrated three new food delivery providers in pos_urban_piper: - Smiles (Task-6209729) - InstaShop (Task-6209717) - RADYES (Task-6209712)
Enhancements to existing features
This update enhances the user interface for time type forms, specifically for time off and payroll tracking. The changes include clearer helper text, reorganized sections for better usability, and adjustments to field placement, ultimately streamlining the process for employees and HR staff.
Original PR description
* = hr_holidays, l10n_us_hr_payroll - added helper text for time off tab and payroll tab in time type form - change placeholder of the name - reorder sections to: Time Off, Payroll - change the position of the "Show on Paylsip" field's checkbox of US Payroll Localizaition task-6112824
This update clarifies the message users see when they don't have enough credits available for an IAP purchase. The wording has been refined to be more user-friendly and clearly explain the situation. This improves the overall customer experience and reduces potential confusion.
Original PR description
Task-6128791
This update ensures that tests for the VoIP systray icon are now run on smaller screens, mirroring the tests performed on larger desktop screens. This improves the reliability of our VoIP functionality across different device sizes, ensuring a consistent user experience.
Original PR description
Because the VoIP systray icon is also shown on small screens, the related tests should be executed on small screens as we do on the desktop.
This update simplifies the Frontdesk module's user interface and workflow, making check-in faster and more intuitive. Key changes include streamlining the welcome screen, removing unnecessary features, and improving the organization of settings. This redesign focuses on enhancing usability for both staff and guests.
Original PR description
This PR introduces a comprehensive revamp of the Frontdesk module to improve usability, simplify configuration, and remove redundant features from both frontend and backend. ***Frontend…
This PR introduces a comprehensive revamp of the Frontdesk module to improve usability, simplify configuration, and remove redundant features from both frontend and backend. ***Frontend Improvements*** --------------------- - Merged the visitor form and host selection screens into a single welcome screen to streamline the check-in process and reduce clicks. - Removed filters and the create option from the "Host Search" dialog. - Removed the "Create" button from the company "Search More" dialog. - Removed Install, Statistics, and Kiosk actions from the station kanban card to declutter the UI. ***Model & Field Changes*** --------------------- - Removed the `frontdesk.drink` model along with all related views and JavaScript logic. - Converted `ask_email`, `ask_phone`, and `ask_company` fields from boolean to selection fields to support required/optional behavior. - Simplified visitor state management by removing extra selection values and defaulting the state to `checked_in` upon check-in. - Set the check-in date to use the record creation date. - When creating a visitor from the backend, automatically assign the station if only one station exists; otherwise, leave it empty. ***Configuration & Navigation Cleanup*** ----------------------------------- - Renamed "Options" page to "Settings". - Moved the hosts field to the Settings page for better organization. - Renamed "Authenticate Guest" to "Guest Details" for clarity. - Removed Reporting and Configuration menus. - Removed "Add/Edit Properties" from the cog menu. - Added chatter to the station form view for better tracking. ***Notifications*** ------------- - Set default email and SMS templates under Host Notifications. Overall, these changes modernize the check-in flow, reduce complexity, and provide a cleaner and more intuitive experience for users and administrators. Task-5421138
This update adds a priority field to planning slots, enhancing the ability to filter and sort interventions across various views (form, list, Kanban, and search). This improves organization and allows users to quickly identify and focus on the most critical tasks.
Original PR description
Add priority field in planning slots to improve visibility and filtering of interventions across different views. Changes include: - Form view: add priority field between role and company - List view: add priority as an optional field (hidden by default) - Kanban view: display priority alongside planning information - Search view: add priority in group by options, add priority filter with sub-levels and separators, include priority in quick search suggestions - Demo data: update existing demo records to include priority values for testing and demonstration This ensures a consistent user experience. task-6176314
This update automatically updates partner information for Uruguayan businesses (UY) by fetching data directly from the Dirección General de Impuestos (DGI) through the Uruware integration. A new 'refresh' button allows users to pull the latest validated data, ensuring accurate records. All existing data is overwritten to prevent conflicts with DGI information.
Original PR description
Add a refresh button next to VAT on the partner form for UY partners, which fetches the partner's data from DGI (through Uruware) and writes it to the partner. Every mapped field is always overwritten so a refresh never mixes local values with DGI data. task-5419345
Resolved issues and error corrections
This update corrects a display issue in the Payrun Time Off Gantt view, where employee names were showing inconsistently compared to other time off applications. The change hides employee names from this specific view, ensuring a more uniform and professional appearance across all time off reporting. This improves the user experience and data clarity.
Original PR description
In payrun time off step, we get the full name of the employee in the Gantt view. But it is inconsistent with the rest of the time off application. Hide employee names from the Gantt view of Payrun Time Off. task-6190437 Forward-Port-Of: odoo/enterprise#116365
This update fixes a bug in the Belgium Payroll DMFA report that incorrectly displayed 'Days Per Week' as 5 when employees worked fewer than 5 days a week. The fix accurately calculates the number of working days based on the employee's schedule, ensuring accurate reporting for Belgian payroll compliance.
Original PR description
## Issue When generating a DMFA report with a working schedule with more or less than 5 days a week, the *Days Per Week* value in the report is still appearing as 5. ## Steps to reproduce 1. Install…
## Issue
When generating a DMFA report with a working schedule with more or less than 5 days a week, the *Days Per Week* value in the report is still appearing as 5.
## Steps to reproduce
1. Install *Belgium - Payroll* (`l10n_be_hr_payroll`)
2. In Payroll's Settings:
- set *ONSS Registration Number* to `0830123456`
- set *DMFA Employer Class* to `083`
- create a *Work Address DMFA code* (any name, any numeral code, but set the *Working Address* to the Belgian company used for the rest of the steps)
3. In Employees' Settings, set the *Company Working Hours* to a new Working Schedule, with 9 hours/day, 4 days/week. E.g from Monday to Thursday included:
- Work from 8:00 to 12:00
- Lunch from 12:00 to 13:00
- Work from 13:00 to 18:00
4. Create an Employee E for the Belgian company:
- In the *Payroll* tab, set the start date of the contract to 01/01/2026.
- In the *Personal* tab, set the *NISS Number* to `85073003328`
5. Create the payslip for January 2026 for the Employee E.
6. In Payroll > Reporting > Belgium > DMFA, create a new DMFA for the first quarter of 2026 and generate the PDF report
7. **In the generated PDF report, the _Days per Week_ line is set to 5.**
## Cause
The number of days was calculated by multiplying `5` with the `work_time_rate` of the related calendar. This is inaccurate in the case of a company where employees are only expected to work 4 days a week.
opw-6103934
Forward-Port-Of: odoo/enterprise#117116
Forward-Port-Of: odoo/enterprise#113804This update fixes an issue where the attendance report incorrectly displayed double the hours for employees with flexible schedules and overlapping shifts. The fix ensures that the report accurately reflects the total planned time, addressing a discrepancy in how overlapping shifts were counted.
Original PR description
__ ## Short functional explanation of the error When for an employee with a Flexible schedule, we set a shift overlapping on two days. The attendance report displays twice the worked hours. ##…
__ ## Short functional explanation of the error When for an employee with a Flexible schedule, we set a shift overlapping on two days. The attendance report displays twice the worked hours. ## Reproduction Steps 1. Create an employee with a flexible schedule and with Work Entry Source set at Planning. 2. Go to Planning. Create a Planning Slot for this employee from 9 pm to 5 am, then Send and Publish it. 3. Click on the Reporting tab > Planning / Attendance Analysis. ### Expected behavior The total for this Month for this employee under the Planned Time field should be equal to 8 hours, which is the duration of the planning slot. ### Unexpected behavior The total for this Month for this employee under the Planned Time field is equal to 16 hours. ## Origin of the issue This report is a view, for which the SQL is defined starting this line: https://github.com/odoo/enterprise/blob/7362f1c5be7f496bdab660ed8fad37a6dd283616/planning_attendance/report/planning_attendance_analysis_report.py#L27 the issue stems from here: https://github.com/odoo/enterprise/blob/7362f1c5be7f496bdab660ed8fad37a6dd283616/planning_attendance/report/planning_attendance_analysis_report.py#L56 where we don't select distinct the planning entries based on their ID. As our shift overlaps 2 days, there will be only one entry for this shift in the `planning_slot`, but because of that, it will be duplicated. __ opw-6146052 Forward-Port-Of: odoo/enterprise#117276 Forward-Port-Of: odoo/enterprise#115447
This update addresses a potential issue where incorrect domain warnings could occur when using equality comparisons (=) within Odoo's collection-based filtering. The changes enhance the reliability of domain filtering, preventing unexpected behavior and ensuring data accuracy across several Odoo modules. This improves the overall stability and performance of the system.
Original PR description
https://github.com/odoo/odoo/pull/264706
This update fixes a reporting issue in the Profit & Loss report for Peruvian companies. Previously, depreciation entries were incorrectly categorized as 'Other Income'. The change ensures that depreciation expenses are now correctly classified within 'Other Operating Expenses', improving the accuracy of financial reporting.
Original PR description
**Steps to reproduce:** - Install Accounting and l10n_pe_reports - Switch to a Peruvian company (e.g. PE Company) - Create a MISC journal entry with a line using a depreciation account (e.g. 6841000) and a debit value (e.g. 1000) - Post the entry - Check "Profit and Loss" report" **Issue:** The "Other operation income" section has an amount of 1000, even though a depreciation account (i.e. expense) was used. The amount should be in "Other operating expenses" section. **Cause:** A unique formula including accounts starting with 61, 66, 68, 71, 73, 74, 75, 76, 78, 79 and 99900 is used for "Other operation income" and "Other operating expenses" and depending on the sign of the sum, the result is reported in one of the section. **Solution:** Only report entries on "Income" accounts in "Other operation income" section and those on "Expense" accounts in "Other operating expenses". opw-6073666 Forward-Port-Of: odoo/enterprise#114362
This update corrects a problem that caused invoices with many items to fail SAT validation (CFDI40111 & CFDI40108) due to currency precision issues when applying per-line discounts. The fix ensures accurate discount calculations, preventing invoices from being rejected by tax authorities.
Original PR description
…any lines Fix SAT validation errors CFDI40111 and CFDI40108 that occur when invoices with many lines contain a small negative line, causing per-line discounts to be hidden due to currency precision. opw-6187014 Forward-Port-Of: odoo/enterprise#117375 Forward-Port-Of: odoo/enterprise#117297
This update optimizes PDF generation by compressing files after merging, resulting in significantly smaller output sizes. It also addresses a memory leak in the PDF processing, leading to more efficient resource usage. The changes improve PDF generation speed and reduce storage needs.
Original PR description
When merging pages with pypdf, the resulting content is uncompressed. A compression pass should be done right after to reduce the resulting file size. Additionally, this helps alleviate a memory leak in PyPDF2 where resources in the merged page are not properly released. Newer versions of pypdf (>=3.15.4) do not have this leak but still see benefits in the output file size. In practice the CPU overhead is negligible, and we actually see a speed increase in cases with high memory usage. Benchmark Printing 400 page annual report | |Print Time|Peak Memory|Output File| |------|----------|-----------|-----------| |Before|142s |3.6GB |103MB | |After |127s |0.4GB |5MB | opw-6148786 Forward-Port-Of: odoo/enterprise#117404 Forward-Port-Of: odoo/enterprise#115550
This update fixes an error that prevented users from being created correctly when Studio and Livechat were installed and configured. The issue stemmed from a timing problem during user setup, causing a required field to be missing. The fix ensures the 'Color Scheme' field is always populated with a default value, allowing successful user creation.
Original PR description
Steps to reproduce: 1. Install Studio and Livechat 2. In user's form view change the location of Theme field after the livechat fields. 3. Now, try to create a user from name and email only Issue: - It throws an error: The operation cannot be completed: Missing required value for the field 'Color Scheme' (color_scheme). Cause: - During user creation after studio modification, im_livechat inverse methods access res.users.settings before it is fully initialized. then later write a falsy `color_scheme` value to that settings record, violating the required constraint on res.users.settings.color_scheme. Solution: - Ensure that when creating or updating `res.users.settings`, if `color_scheme` is empty or false, It is automatically set to the default value "system" opw-5918538 Forward-Port-Of: odoo/enterprise#109062
This update fixes a bug that prevented multi-day shift records from appearing on the live map. It now correctly displays shifts with a partner and ensures the Gantt and Calendar views scale appropriately to 'day', improving the map's usability for technicians and managers. This enhancement ensures accurate shift tracking and visualization.
Original PR description
This commit changes the domains for the "My Map" and "Map By Resource" to only include shifts with a partner. Previously, it was including 'today' as part of the domain, which is incorrect as users may still want to view other days' shifts. task-6180159 Forward-Port-Of: odoo/enterprise#115813
8 changes
Enhancements to existing features
This update aligns report subheaders and numeric data within reports to create a more consistent and professional appearance. Previously, the formatting was inconsistent, with subheaders centered and data aligned differently. This change ensures a uniform look across all reports, enhancing readability and user experience.
Original PR description
Before this commit, subheaders of numeric columns were centered, while the figures in the columns were aligned to the end. This commit ensures that both the subheader and the figures are aligned the same way (center or end). task-6197223
Resolved issues and error corrections
This update corrects a bug in the French Intrastat export process. Previously, crucial quantity data related to supplementary units wasn't being included in the XML report, leading to incomplete Intrastat reporting. This fix ensures accurate reporting of product quantities for French companies using Intrastat.
Original PR description
Steps to reproduce 1. In a French company with Intrastat enabled, set up a product whose commodity code has a CN supplementary unit (e.g. 8802 30 00, "p/st") and set…
Steps to reproduce
1. In a French company with Intrastat enabled, set up a product whose commodity code has a CN supplementary unit (e.g. 8802 30 00, "p/st") and set `intrastat_supplementary_unit_amount` on it.
2. Post EU customer invoices for that product.
3. Export the DEBWEB2 XML from the Intrastat report.
Issue
The FR export collapses engine rows a second time in `_group_items`, because the DEBWEB2 format groups more aggressively than the SQL. The aggregator only declares `value` and `weight`: https://github.com/odoo/enterprise/blob/6ae5d3df6e9305416e4d6f74259cd01753025f42/l10n_fr_intrastat/models/account_intrastat_report.py#L308-L313 Items are then rebuilt as `dict(zip(grouping_key, key_tuple)) | grouped_item_values`. `SU_code` survives (it is in the grouping key), but the numeric `supplementary_units` is in neither side and is silently dropped as soon as two engine rows merge. The template then skips the element because of its `t-if="item.get('supplementary_units')"` guard: https://github.com/odoo/enterprise/blob/6ae5d3df6e9305416e4d6f74259cd01753025f42/l10n_fr_intrastat/data/intrastat_export.xml#L61
opw-6139657
Forward-Port-Of: odoo/enterprise#117033This update resolves an issue preventing Envia deliveries in Chile due to a mismatch between Odoo's state code mapping and Envia's API requirements. The fix adjusts the state code mapping to align with Envia's specifications, ensuring accurate address data transmission. This allows users in Chile to utilize the Envia delivery method successfully.
Original PR description
### Steps to reproduce: - Install delivery_envia - Website > Configuration > eCommerce > Delivery Methods > Envia - Enable the delivery method, sync the carrier and Publish it - With a portal user >…
### Steps to reproduce:
- Install delivery_envia
- Website > Configuration > eCommerce > Delivery Methods > Envia
- Enable the delivery method, sync the carrier and Publish it
- With a portal user > Shop > Add any product to your cart > Checkout
- Register an address a valid 'Chile' address and confirm say:
'street and Number': Avenida Providencia 1432, Depto 402
'city': Santiago 'zip': 8320000
'country': Chile 'state': Metropolitana
#### > Envia Error: Invalid Option - String is too long at #->properties:destination
### Cause of the issue:
The problem is caused by the fact that Envia's api expects a 2-3 digits to represent state codes: https://docs.envia.com/reference/state-by-code
The mapping from Odoo's code state representation to envia's one is expected ot be performed by this mapping:
https://github.com/odoo/enterprise/blob/75cba6d5a88ebc4e0f35040a173ac1c443638daf/delivery_envia/models/envia_request.py#L27-L43 when the address is converted here:
https://github.com/odoo/enterprise/blob/75cba6d5a88ebc4e0f35040a173ac1c443638daf/delivery_envia/models/envia_request.py#L535-L542 That being said, the `Chile`'s code states of have been changed in [6694a3942c58ff1a56c9e4b36edbe126dd1e66f8](https://github.com/odoo/odoo/commit/6694a3942c58ff1a56c9e4b36edbe126dd1e66f8) to match the official Iso but not in the Envia's mapping leading a failling match keeping the 4 charracter long `CL-RM` of the `Metropolitan` state provided in to the Envia's api as address data.
opw-6210007This update corrects a technical error that occurred when loading paid orders. The previous process incorrectly referenced an account move, which was already being handled by another part of the system. This change ensures paid orders load correctly and efficiently.
Original PR description
Before this commit, when loading the paid orders it would load the account move with the "account_move" key, but this key is wrong as the account move model is loaded with the "account.move". Also, the account move is already loaded by the "read_pos_data" method in the point_of_sale module, so we can just remove it from here. opw-6218467
This update fixes a reporting issue in the Peruvian Profit & Loss report. Previously, depreciation entries were incorrectly categorized as 'Other Income'. The change ensures that depreciation entries (expenses) are now correctly classified within the 'Other Operating Expenses' section, providing accurate financial reporting for Peruvian businesses.
Original PR description
**Steps to reproduce:** - Install Accounting and l10n_pe_reports - Switch to a Peruvian company (e.g. PE Company) - Create a MISC journal entry with a line using a depreciation account (e.g. 6841000) and a debit value (e.g. 1000) - Post the entry - Check "Profit and Loss" report" **Issue:** The "Other operation income" section has an amount of 1000, even though a depreciation account (i.e. expense) was used. The amount should be in "Other operating expenses" section. **Cause:** A unique formula including accounts starting with 61, 66, 68, 71, 73, 74, 75, 76, 78, 79 and 99900 is used for "Other operation income" and "Other operating expenses" and depending on the sign of the sum, the result is reported in one of the section. **Solution:** Only report entries on "Income" accounts in "Other operation income" section and those on "Expense" accounts in "Other operating expenses". opw-6073666 Forward-Port-Of: odoo/enterprise#114362
This update resolves an issue where non-administrator users were receiving an error preventing them from confirming invoices and generating electronic documents. The fix ensures that regular users with invoicing permissions can now successfully complete these tasks without needing system administrator assistance.
Original PR description
For non System administration users, if they try to validate an invoice they were getting this error
odoo.http: You do not have enough rights to access the field "l10n_uy_edi_ucfe_password" on Companies (res.company).
Please contact your system administrator.
Operation: read
User: 5
Groups: allowed for groups 'Role / Administrator'
With this fix the regular Users with invoicing permissions are able to confirm the invoices and generate electronic documnts without problemsThis update resolves a test failure related to importing partner and bank account data for Italian reporting. The team restored a necessary data state within the test file, ensuring the tests now run successfully. This prevents disruptions to the Italian reporting functionality.
Original PR description
The related PR brings a data change in a test file that is used here. We bring back the state of that data in the test class, so that the tests don't fail anymore. Community PR: odoo/odoo#254505 Task [link](https://www.odoo.com/odoo/project.task/6046189) task-6046189 Forward-Port-Of: odoo/enterprise#117001 Forward-Port-Of: odoo/enterprise#112794
This update resolves a validation error that occurred when creating intercompany invoices between companies using different tax regions (e.g., Belgium and Luxembourg). The fix ensures accurate tax calculations by correctly applying and recomputing taxes based on the intended fiscal position, preventing incorrect validation messages.
Original PR description
**Steps to reproduce:** * Install the *Accounting* module. * Install localisation modules for two different regions: * *Belgium* (**l10n_be**) * *Luxembourg* (**l10n_lu**) * Configure two companies,…
**Steps to reproduce:** * Install the *Accounting* module. * Install localisation modules for two different regions: * *Belgium* (**l10n_be**) * *Luxembourg* (**l10n_lu**) * Configure two companies, each assigned to one of the above regions. * Create fiscal positions: * In the Belgium company, create a fiscal position for Luxembourg. * In the Luxembourg company, create a fiscal position for Belgium. * Go to *Accounting > Configuration > Settings*. Enable *Inter-Company Transactions*. Enable synchronization of *Vendor Bills and Invoices* for both companies. * Create an invoice in the Luxembourg company. Select a partner belonging to the Belgium company. Add a product with applicable taxes. **Observed behavior:** * A validation error is raised: 'This entry contains taxes that are not compatible with your fiscal position. Please check the country set in the fiscal position and in your tax configuration.' **Cause:** * During intercompany bill creation, a foreign fiscal position is applied before recomputing taxes. * If no mapped foreign taxes exist, the system keeps domestic purchase taxes. * This leads to a mismatch between taxes and fiscal position, triggering the validation error. **Fix:** * Add a safeguard in *_inter_company_create_invoices()*. * After *_inter_company_sync_invoice_line_taxes()* recomputes taxes, *_inter_company_has_incompatible_fiscal_position_taxes()* checks whether the fiscal position is incompatible. * If incompatible, the fiscal position is removed and taxes are recomputed without it. opw-6103671 Forward-Port-Of: odoo/enterprise#116944 Forward-Port-Of: odoo/enterprise#115085
4 changes
Resolved issues and error corrections
This update fixes an issue where the import process for FatturaPA invoices was incorrectly setting the invoice due date. The change ensures that the correct due date from the invoice is now read and used, resolving a problem that prevented accurate payment processing. This improves the reliability of invoice import and payment reconciliation.
Original PR description
The import procedure stopped reading DataScadenzaPagamento (invoice date due) on `out_invoice`s and `in_refund`. As a side effect, invoice_date_due fell back to today() on those documents. This commit restores reading the invoice date due, and keeps the condiitonal logic only for the bank account and payment_reference logic incoming-only as it was before.
This update resolves errors in the Envia delivery method for both Chile and Colombia. Specifically, it corrects a mapping issue where Odoo was incorrectly formatting address data for Envia, leading to delivery failures. By using Envia's geocoding service, the system now accurately transmits address information, ensuring successful deliveries.
Original PR description
## Issue 1: Backport of 7654c558c4d517807884b0a82323dd160feeda2a For Colombia, Envia expects the municipality/DANE-style code in the address payload, not the raw postal code. When `l10n_co_edi` was…
## Issue 1:
Backport of 7654c558c4d517807884b0a82323dd160feeda2a
For Colombia, Envia expects the municipality/DANE-style code in the address payload, not the raw postal code.
When `l10n_co_edi` was not installed, the Envia integration fell back to the partner zip code and padded it locally before sending it as both `postalCode` and `city`. This produced incorrect values such as turning the Ibagué zip code `730001` into `73000100`, while Envia geocodes resolves that zip code to `73001000`.
Use Envia geocodes to resolve the Colombia zip fallback and retrieve the `stat_8digit` code expected by Envia instead of deriving it locally.
## Issue 2:
### Steps to reproduce:
- Install delivery_envia
- Website > Configuration > eCommerce > Delivery Methods > Envia
- Enable the delivery method, sync the carrier and Publish it
- With a portal user > Shop > Add any product to your cart > Checkout
- Register an address a valid 'Chile' address and confirm say:
'street and Number': Avenida Providencia 1432, Depto 402
'city': Santiago 'zip': 8320000
'country': Chile 'state': Metropolitana
> Envia Error: Invalid Option - String is too long at #->properties:destination
### Cause of the issue:
The problem is caused by the fact that Envia's api expects a 2-3 digits to represent state codes: https://docs.envia.com/reference/state-by-code
The mapping from Odoo's code state representation to envia's one is expected ot be performed by this mapping:
https://github.com/odoo/enterprise/blob/75cba6d5a88ebc4e0f35040a173ac1c443638daf/delivery_envia/models/envia_request.py#L27-L43
when the address is converted here:
https://github.com/odoo/enterprise/blob/75cba6d5a88ebc4e0f35040a173ac1c443638daf/delivery_envia/models/envia_request.py#L535-L542
That being said, the `Chile`'s code states of have been changed in 6694a3942c58ff1a56c9e4b36edbe126dd1e66f8 to match the official Iso but not in the Envia's mapping leading a failling match keeping the 4 charracter long `CL-RM` of the `Metropolitan` state provided in to the Envia's api as address data.
opw-6083181
opw-6210007This update fixes a reporting issue in the Peruvian Profit & Loss report. Previously, depreciation entries were incorrectly categorized as 'Other Income.' The change ensures that expense entries (like depreciation) are now correctly classified in the 'Other Operating Expenses' section, providing accurate financial reporting for Peruvian businesses.
Original PR description
**Steps to reproduce:** - Install Accounting and l10n_pe_reports - Switch to a Peruvian company (e.g. PE Company) - Create a MISC journal entry with a line using a depreciation account (e.g. 6841000) and a debit value (e.g. 1000) - Post the entry - Check "Profit and Loss" report" **Issue:** The "Other operation income" section has an amount of 1000, even though a depreciation account (i.e. expense) was used. The amount should be in "Other operating expenses" section. **Cause:** A unique formula including accounts starting with 61, 66, 68, 71, 73, 74, 75, 76, 78, 79 and 99900 is used for "Other operation income" and "Other operating expenses" and depending on the sign of the sum, the result is reported in one of the section. **Solution:** Only report entries on "Income" accounts in "Other operation income" section and those on "Expense" accounts in "Other operating expenses". opw-6073666 Forward-Port-Of: odoo/enterprise#114362
This update fixes an issue where backorders created during POS sales weren't properly linked to the original order. Now, all backorder pickings are correctly associated with the POS order, ensuring accurate inventory tracking and reporting. This improves the reliability of inventory data within the Point of Sale system.
Original PR description
The delivery transfer for a product tracked by serial number is not linked to the POS order when there is no available stock. When validating a POS delivery in real time, stock can split the transfer…
The delivery transfer for a product tracked by serial number is not linked to the POS order when there is no available stock. When validating a POS delivery in real time, stock can split the transfer into a completed picking and a backorder (e.g. one line fully delivered with lots, another serial-tracked line with no stock and no serial number). Steps to reproduce: ------------------- * Setup two products: one tracked by qunatity with some quantity on-hand an other tracked by SN but no quantity on-hand * Open Pos * Sell in one order, both products without providing SN * Validate payment * Open Inventory: two deliveries sould exist under Inventory Overview of PoS Orders > Observation: The first picking shows the POS order as Source Document but the backorder has no source document and is not linked to the POS order. Why the fix: ------------ Pos Origin (Source Document, POS order, session) was only written on the pickings returned by `_create_picking_from_pos_order_lines`, which did not include pickings created during `_action_done()`. Extend the write to the initial pickings and their backorders so every transfer stays tied to the originating `pos.order`. opw-6090606
6 changes
Resolved issues and error corrections
This update resolves an issue where the SD Worx report would fail when generating data for employees without working schedules. The fix ensures the report gracefully handles cases where an employee isn't found, preventing errors and ensuring accurate report generation. This improves the reliability of payroll reporting.
Original PR description
## Steps to reproduce: - Install l10n_be_hr_payroll_sd_worx module - Create a public holiday in one company without a working schedule - Create an employee that doesn't have a working schedule nor a contract - Try to generate the sd worx report - A traceback will pop-up ## Cause: Since we fetch all employees if we have a public holiday with no schedule, this puts us in a scenario where we try to access a key in that doesn't exist and it will trigger a KeyError ## Fix: Make sure we fallback on an empty recordset in case we don't have the employee in the key list of the dict we are checking opw-5500070
This update clarifies how Helpdesk articles are searched, particularly when a non-root article is selected as the main article. The team has addressed an issue where searching didn't include descendant articles and a related problem with dropdown behavior. The solution focuses on improving user guidance rather than a technical fix.
Original PR description
*: website_helpdesk_knowledge Steps to reproduce: --- - Install Helpdesk/Knowledge/Website apps - Go to Knowledge - Set up a Knowledge workspace root article with some child articles to it - Go to…
*: website_helpdesk_knowledge
Steps to reproduce:
---
- Install Helpdesk/Knowledge/Website apps
- Go to Knowledge
- Set up a Knowledge workspace root article with some child articles to it
- Go to Helpdesk > Configuration > Helpdesk Teams
- Open a Helpdesk team, and go to its Help Center config
- Check Knowledge and set a non-root article as main Article
- Go to Website > Help
- First issue (non-root main article):
- Type a word which is present in both the article and one of its child articles
- Only the given article match the word
- If you use the root article it will match in any descendant
- Second issue (in every case):
- Type a word in the search bar
- Wait for the dropdown to appear
- Click elsewhere, dropdown is properly hidden
- Try to change the search > Traceback
Issue:
---
The domain used to find the articles to match the search uses the current id
as the `root_article_id``:
`['|', ('id', '=', team_article.id), ('root_article_id', '=', team_article.id)],`
which was previously working in every case as it was not possible to set
a non-root article in the team setting.
This was later changed to allow any article as the default website page.
As a result, when a non-root article is selected, the search domain only
applies to that specific article and no longer includes its descendants.
The other issue is related to the added boostrap attribute `data-bs-toggle="dropdown"`
which is not properly reset when the dropdown is removed, and triggers the creation
of an empty dropdown.
Fix:
---
Doesn't seem easy to fix to allow the search on all the descendants of
the given article as we can't use the article `root_article_id` and filter out
the unwanted results in a clean way (and it doesn't seem doable with a direct domain).
Instead clarify the situation in the help of the article.
Also manually reset the attribute when there is no results.
Backport of https://github.com/odoo/enterprise/pull/107438
task - 5360265This update optimizes a key calculation within the MRP subcontracting purchase module, reducing unnecessary database queries. By preventing these extra searches, the system now processes lead time calculations significantly faster, especially when dealing with a large number of orderpoints. This improves overall system responsiveness and efficiency.
Original PR description
When computing `qty_to_order` 1-3 extra queries are made by `get_lead_days()`, which can cause performance issues when computing `qty_to_order` for a large number of orderpoints. This commit aims to…
When computing `qty_to_order` 1-3 extra queries are made by `get_lead_days()`, which can cause performance issues when computing `qty_to_order` for a large number of orderpoints. This commit aims to prevent these extra queries by returning early if the current product is not associated with a bom. The amount this commit speeds up the compute depends on how many of products passed into `_get_lead_days()` are associated with a bom. `qty_to_order` is no longer a stored field after this commit: https://github.com/odoo/odoo/pull/159432 This benchmark was done in 18.0 on /stock.warehouse.orderpoint/search_panel_select_range. This call does not trigger the compute on all orderpoints in 17.0 as the field is stored but calling the compute directly on all orderpoints results in the same speed up as seen in 18.0. | Orderpoints | % of products linked to a bom | Time before | Queries before | Time after | Queries After | |-------------|-------------------------------|-------------|----------------|------------|---------------| | 800 | 50% | 2.8s | 1570 | 2.3s | 818 | | 8,000 | 0% | 28.2s | 16,698 | 15.3s | 242 | | 8,000 | 25% | 29.6s | 16,833 | 19.2s | 4497 | | 8,000 | 50% | 29.8s | 16,925 | 23.2s | 8693 | | 8,000 | 75% | 31.6s | 16,949 | 27.6s | 12827 |
This update fixes a problem where cash basis tax settings incorrectly generated journal items without due dates for payable/receivable accounts, causing validation errors. The change restricts users from using these account types as transition accounts, ensuring accurate accounting and preventing errors during invoice processing.
Original PR description
## **Issue** When a cash basis tax is configured with a payable/receivable transition account, tax journal items are generated on that account without a due date. Since payable/receivable accounts…
## **Issue** When a cash basis tax is configured with a payable/receivable transition account, tax journal items are generated on that account without a due date. Since payable/receivable accounts require a due date on journal items, this leads to a validation error during move creation: "Any journal item on a payable account must have a due date and vice versa." ## **Steps to reproduce:** 1. Install the Accounting and Inter-Company modules. 2. Create an additional company so that there are a total of two companies, then switch to Company 1. 3. Create a product with a price and assign a tax to it. 4. Navigate to Accounting → Configuration → Settings and enable Cash Basis accounting. 5. Go to Accounting → Configuration → Taxes and open the purchase tax (or the tax assigned to the product). 6. In the Tax Computation section, ensure that Group of Taxes is not selected. 7. Under the Advanced Options tab, set Tax Exigibility to Based on Payment. 8. Set the Cash Basis Transition Account to a payable account. 9. Open Company Settings, select Company 1, go to the Inter-Company Transactions section, and enable Synchronize invoices/bills. 10. Switch to Company 2 and create an invoice using the same product. Select the contact that is the partner of Company 1. 11. Confirm the invoice. The following error is raised: "Any journal item on a payable account must have a due date and vice versa." ## **With This Commit:** Added a domain on the Cash Basis Transition Account field to prevent users from selecting payable or receivable accounts, avoiding invalid configurations and runtime validation errors. opw-6189615
This update fixes an error in the Italian Annual VAT Report that was incorrectly mixing tax and balance amounts on line VF25. The change ensures the report accurately reflects the total taxable base as required by Italian tax regulations. This improves the accuracy of the VAT report for Italian businesses.
Original PR description
### Issue before this commit: In the Italian Annual VAT Report, the balance (base amount) for line VF25 displays incorrect values. Instead of computing the sum of the taxable bases for the passive…
### Issue before this commit: In the Italian Annual VAT Report, the balance (base amount) for line VF25 displays incorrect values. Instead of computing the sum of the taxable bases for the passive operations, the report erroneously mixes tax amounts into the balance column. ### Steps to reproduce the issue: 1. Download Accounting and l10n_it 2. Go to Tax Report and visualize the Annual Tax Report (IT) 3. Go to VF VAT Report 4. See the VF25 is mixing taxes and balances ### Cause of the issue: The root cause lies in the aggregation_formula definition for the tax_annual_report_line_VF25 record. The formula was incorrectly configured to aggregate the .tax expressions for lines VF1 to VF13 (VF1.tax + VF2.tax + ...) instead of their respective .balance expressions, while correctly using .balance for the remaining lines (VF17 to VF24). https://github.com/odoo/odoo/blob/878c08cf522a3278b4e6ff5f3d18444989e9998d/addons/l10n_it/data/tax_report/annual_report_sections/vf.xml#L286-L299 It's just a typo in this commit: https://github.com/odoo/odoo/pull/164064/changes/f292ba119d6376dbfb3c1fac4960c9c56a74d938 ### Reason to introduce the fix: From documentation https://www.agenziaentrate.gov.it/portale/documents/20143/9602686/IVA_ANNUALE_2026_istr.pdf/2a42fb92-1b76-229a-d0f5-06069d79b514?t=1768504755711 : > Rigo VF25, colonna 1, va indicato il totale degli imponibili determinato sommando gli importi riportati ai righi da VF1 a VF23, colonna 1, diminuito dell’importo di cui al rigo VF24. In colonna 2 va indicato il totale delle imposte determinato sommando gli importi delle colonne 2 dei righi da VF1 a VF13. opw-6172791 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves issues preventing Odoo IoT boxes from successfully upgrading to newer database versions. Specifically, the upgrade process now waits for the system to reboot before updating, and includes necessary packages like 'geoip2' to ensure Odoo services start correctly. This improves the stability and reliability of the upgrade process for our IoT box deployments.
Original PR description
This commit fixes two issues with upgrading from old IoT box images to 19.1+ DBs: - The IoT box would try and start checking out with git at the same time as the upgrade script rebooted the system. This would leave the git branch as the DB version (e.g. 19.2) but with the files still being at 19.1. To fix this, we sleep after the script until we reboot. - On reboot, the IoT box would then git checkout to the new version anyways. However, it would not install apt packages, leaving the Odoo service unable to start because of a missing 'geoip2' package. To fix this, we simply include this package in the upgrade script. task-6217972 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr