Daily updates from Odoo
Friday, June 19, 2026
27 changes · saas-19.3
Resolved issues and error corrections
This update addresses a reported issue where users could join live chat conversations that had already ended. The fix hides the 'join' button when a conversation is marked as finished, improving the user experience and preventing unnecessary attempts to engage. This ensures a cleaner and more accurate representation of available chat channels.
Original PR description
Feedback came from our live chat team. It is possible to join a conversation despite the conversation having ended already. so from now the **join button will be hidden** if the livechat is ended. task-6314128 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects a bug where the duration field in Odoo was incorrectly returning 0 when using formulas. Now, the field accurately calculates duration and displays an error message if the input is invalid, ensuring accurate time tracking. This improves data reliability and prevents miscalculations.
Original PR description
Before this commit, using a formula in the duration field was returning 0. Now, it resolves the formula. TASK-6150460 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#263301
This update resolves an issue where the Saudi Arabia E-invoicing module installation would fail if certain tax settings were missing. The fix filters out missing taxes during installation, eliminating a previous workaround and ensuring smoother module deployment. This improves the reliability of the module for Saudi businesses.
Original PR description
**Issue:** Installing the l10_sa_edi E-invoicing module causes an error in versions 19.1 and above if any of the taxes in the account.tax-sa.csv are missing. This behavior was previously avoided via the post init function _l10n_sa_edi_post_init(), which no longer works due to the change made to ir_module.py fetching the template data during the module installation (made in commit 64f9dcb). **Reproduction Steps:** Install Accounting Configuration > Settings > Change "Fiscal Localization" to Saudi Arabia Configuration > Taxes > Delete 0% "Not Subject to VAT" tax Try to install l10n_sa_edi Saudi Arabia - E-invoicing **Fix:** Updated '_get_sa_edi_account_tax()to filter out taxes that don't already exist on the database. Removed the_l10n_sa_edi_post_init()` function since it should now be obsolete. Related ticket: opw-6293740 Forward-Port-Of: odoo/odoo#270767 Forward-Port-Of: odoo/odoo#270336
This update fixes an issue where an incorrect journal entry was inflating the reported amount of liabilities on the Balance Sheet in the French financial reporting module. The change ensures that a specific account (45) is not incorrectly categorized as a 'borrowing,' improving the accuracy of financial reporting. This resolves a discrepancy identified in the reporting.
Original PR description
1. Create a journal entry with: -> 455100 Partners/Associates - Current Accounts - Principal → Credit -> 512001 Bank → Debit 2. Navigate to Accounting → Reporting → Balance Sheet. -> Observe that the amount of the journal entry appears twice in the Balance Sheet: 1. Under Borrowings and Similar Liabilities 2. Under Partners' Current Accounts 45 accounts should not be included under borrowings and similar liabilities opw-6271305
This update resolves an issue preventing users with Sales access from inserting data into Quotation templates through the spreadsheet management feature. The change adds a setting to ensure the necessary permissions are recognized, now allowing seamless data entry.
Original PR description
Current behavior before PR: - The `can_insert_in_spreadsheet` session flag was not set by the spreadsheet_sale_management module. - Users with proper Sale access rights still could not insert into Quotation templates. Desired behavior after PR is merged: - Added logic to set `can_insert_in_spreadsheet` when the module is installed and the user has the required access rights. Task: [5960761](https://www.odoo.com/odoo/project/2328/tasks/5960761) Forward-Port-Of: odoo/enterprise#120903 Forward-Port-Of: odoo/enterprise#108674
This update resolves an issue that occurred during website theme upgrades. When a custom theme isn't fully supported, the system incorrectly identifies a missing theme manifest, leading to a critical error. This fix ensures the system gracefully handles missing theme manifests, preventing upgrade failures.
Original PR description
After commit 3cbaad4, the theme manifest is now looked up to find addon snippets for the configurator. However, during an upgrade, if a website is configured with a third-party/custom theme whose…
After commit 3cbaad4,
the theme manifest is now looked up to find addon snippets for the configurator. However, during an upgrade, if a website is configured with a third-party/custom theme whose code is not present in the addons path, `Manifest.for_addon()` returns `None` and `_generate_primary_snippet_templates` raises an `AttributeError`:
```py
2026-06-16 03:27:47,155 24126 INFO db_4367932 odoo.modules.loading: loading website/views/new_page_template_templates.xml
2026-06-16 03:27:47,803 24126 WARNING db_4367932 odoo.modules.module: module theme_prime: manifest not found
2026-06-16 03:27:47,845 24126 WARNING db_4367932 odoo.modules.loading: Transient module states were reset
2026-06-16 03:27:47,846 24126 ERROR db_4367932 odoo.registry: Failed to load registry
2026-06-16 03:27:47,846 24126 CRITICAL db_4367932 odoo.service.server: Failed to initialize database `db_4367932`.
Traceback (most recent call last):
File "/home/odoo/src/odoo/19.0/odoo/tools/convert.py", line 605, in _tag_root
f(rec)
File "/home/odoo/src/odoo/19.0/odoo/tools/convert.py", line 273, in _tag_function
_eval_xml(self, rec, env)
File "/home/odoo/src/odoo/19.0/odoo/tools/convert.py", line 197, in _eval_xml
result = method(*args, **kwargs)
File "/home/odoo/src/odoo/19.0/addons/website/models/ir_module_module.py", line 704, in _generate_primary_snippet_templates
theme_addons = theme_manifest.get('configurator_snippets_addons', {})
AttributeError: 'NoneType' object has no attribute 'get'
```
We also get the missing manifest logs right before the error.
TBG-2781
[`_generate_primary_snippet_templates`]: https://github.com/odoo/odoo/blob/19.0/addons/website/models/ir_module_module.py#L700
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#270217This update improves how our connected scales communicate tare status to the Odoo frontend. Previously, the system wasn't reliably indicating when a scale was in tare mode. Now, the frontend receives this information, ensuring accurate weight readings and a better user experience for weighing operations.
Original PR description
See: https://github.com/odoo/enterprise/pull/119960 Before this commit, there was no way for the frontend to know if the tare function on the connected scale was active, despite the driver keeping track in the `tare_mode` variable. After this commit, we optionally send the `tare_mode` alongside the weight when `read_once` is called. By default it still returns just the weight for backwards compatibility. The `tare_mode` is now also updated by the status command, allowing it to be set as soon as tare is pressed, instead of after weight is applied. task-6273412 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#269211
This update adjusts the checksum within the EU IoT Scale Certification module to align with recent changes in the core Odoo system. This ensures compatibility and stability following a related update in Odoo itself, preventing potential issues with data integrity. It's a routine maintenance task.
Original PR description
This commit simply adjusts the checksum to align with the changes in odoo/odoo#269211. task-6273412 Forward-Port-Of: odoo/enterprise#120954
This update fixes an issue preventing users from accessing payslip lists within the employee departure process. The changes include making fields read-only to prevent unintended modifications and relocating currency data for improved performance. This ensures accurate payslip access and data integrity.
Original PR description
Bug 1: In the departure tab of the Employee, you can't open the payslip list Fix: Added a check to get the correct departure id depending on the model we are in Bug 2: You can select payslips for other employees than the departing employee and the payslips list is not affected Fix: made fields `l10n_be_payslip_n_ids` and `l10n_be_payslip_n1_ids` readonly so they can't be modified in the UI without being saved Bug 3: You get an error because you can't read `currency_id` when opening n payslips (happens when the monetary fields are shown in the list) Fix: moved the `currency_id` to be inside the list instead of the parent form task-id: 6265648 Forward-Port-Of: odoo/enterprise#119402
This update resolves an issue where UBL invoices with embedded PDF attachments caused import errors due to unexpected whitespace in the attachment data. The change adjusts how attachments are processed, ensuring compatibility with newer Odoo versions and preventing import failures.
Original PR description
Steps to reproduce: 1. Go to [Accounting -> Vendors - Bills] and click Upload 2. Import a UBL BIS3 XML invoice containing an embedded PDF attachment in `AdditionalDocumentReference/Attachment/EmbeddedDocumentBinaryObject` where the content contains internal line breaks or spaces (file available in ticket attachments). Issue: `Error during import: Only base64 data is allowed` Why this happens: Following changes in v19.3 (7662537c878ffe58ed5c7248e4114062c333312b), the import logic in `_import_attachments` was changed to use the `raw` field instead of the `datas` field when creating the ir.attachment record. The `raw` field takes the raw bytes directly, whereas `datas` previously stored the base64 computed version of `raw`, which handled whitespace characters. Some XML files produce `EmbeddedDocumentBinaryObject` content with internal newlines. These were harmless in older versions but now cause a crash. opw-6271352
This update resolves a problem where order signing with Fiskaly failed after the company's API key was updated. The system now correctly resets and recreates the necessary Fiskaly connection details, ensuring orders can be signed without interruption. This prevents disruptions to sales processes for businesses using the Fiskaly integration.
Original PR description
When the Fiskaly API key/secret is changed, the company is bound to a new Fiskaly organization (owner). The SCU and cash registers stored on the company and POS configs were created under the previous owner and no longer exist for the new one, so signing orders fails with E_CASH_REGISTER_NOT_FOUND. Clear l10n_at_pos_company_scuid and each config's l10n_at_cash_regid together with the access token so they are recreated under the new organization on the next authentication. opw-6297695 Forward-Port-Of: odoo/enterprise#120839
This update corrects a bug in how project task rescheduling respects time buffers, particularly when multiple tasks are dependent. The fix ensures that buffers are applied correctly between tasks, preventing scheduling conflicts and maintaining accurate timelines. This improves the reliability of project scheduling.
Original PR description
Steps to reproduce: ---------------------------------------- - Have the company calendar work from 9 to 17 on weekdays - In project gantt view, create tasks with dependencies like this: ``` - [Task…
Steps to reproduce:
----------------------------------------
- Have the company calendar work from 9 to 17 on weekdays
- In project gantt view, create tasks with dependencies like this:
```
- [Task 1] (June 08, 09:00 AM - 10:00 AM) ──┐
├─> [Task 3] (June 11, 09:00 AM - 10:00 AM)
- [Task 2] (June 10, 09:00 AM - 10:00 AM) ──┘
```
- Make sure the "Auto-Reschedule (Keep Buffer)" is selected
- Then reschedule task 1 to `(June 09, 09:00 AM - 10:00 AM)`
- Task 3 is rescheduled to `(June 15, 09:00 AM - 10:00 AM)`
**Expected behavior:**
To respect the buffers, task 3 should have been rescheduled to `(June 12, 09:00 AM - 10:00 AM)`:
- The buffer from task 1 is 23 working hours after `June 09, 10:00 AM` is `June 12, 09:00 AM`
- The buffer from task 2 doesn't affect the rescheduling.
Cause:
----------------------------------------
From `_web_gantt_update_next_candidates_dates()` we call `_get_new_dates()` with `seconds_between_tasks` being the duration of working hours between the end of task 1 and the start of task 3. We also call it with `first_possible_start_date_per_candidate` being the end of task 3 also depends on task 2.
Then `_get_new_dates()` counts the working hours from `first_possible_start_date_per_candidate` until it reaches `seconds_between_tasks`. Which means the buffer between task 1 and task 3 is actually applied between task 2 and task 3.
Solution:
----------------------------------------
The value contained in `first_possible_start_date_per_candidate` is irrelevant, the correct value to give to `_get_new_dates()` would be `compute_end_date` as we want to keep the buffer to be calculated from this datetime.
So we create a fake dictionary with only the task and `compute_end_date` and give it to `_get_new_dates()`.
The same logic applies when moving tasks backwards.
opw-5973597
Forward-Port-Of: odoo/enterprise#119161This update fixes an issue where stock replenishment wasn't updating existing purchase orders correctly, leading to duplicate order creation. Now, the system intelligently updates quantities in existing purchase orders when replenishing stock automatically, ensuring accurate stock levels and reducing unnecessary order placements. This improves the efficiency of our inventory management.
Original PR description
Replenishing the stock from an orderpoint will look for a purchase order line having the same orderpoint_id in order to update the quantity instead of creating a new one. The issue is manual orderpoint are deleted right after the replenishment. Replenishing two times the same product will always create a new purchase order line. This commit makes the orderpoint_id is pass in the procurement values only in case of `trigger == auto` orderpoint. 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 Forward-Port-Of: odoo/odoo#269937 Forward-Port-Of: odoo/odoo#269725
This update corrects a technical error that prevented the system from correctly calculating virtual leave durations. The fix ensures that the system properly utilizes resource calendars when generating reports, resolving a singleton error and improving the accuracy of leave calculations. This ensures accurate reporting of employee availability for holiday-related tasks.
Original PR description
resource_calendar was not being when calculting virtual leaves, it leads to a singleton error here:…
resource_calendar was not being when calculting virtual leaves, it leads to a singleton error here:
https://github.com/odoo/odoo/blob/11b0195dddad5055fc33fa3e28b2d2ca60f24935/addons/l10n_fr_hr_holidays/models/hr_leave.py#L163
```
File "/home/odoo/src/odoo/saas-19.2/odoo/orm/models.py", line 519, in _table_sql
table_query = self._table_query
^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/saas-19.2/addons/hr_holidays/report/hr_leave_employee_report.py", line 40, in _table_query
self._compute_leave_duration(report_records)
File "/home/odoo/src/odoo/saas-19.2/addons/hr_holidays/report/hr_leave_employee_report.py", line 94, in _compute_leave_duration
leaves_durations = virtual_leaves._get_durations(additional_domain=[('holiday_id', 'not in', leave_ids)])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/saas-19.2/addons/l10n_fr_hr_holidays/models/hr_leave.py", line 160, in _get_durations
while not leave.resource_calendar_id._works_on_date(date_start):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/saas-19.2/addons/resource/models/resource_calendar.py", line 877, in _works_on_date
self.ensure_one()
File "/home/odoo/src/odoo/saas-19.2/odoo/orm/models.py", line 5253, in ensure_one
raise ValueError("Expected singleton: %s" % self)
ValueError: Expected singleton: resource.calendar()
```
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
Forward-Port-Of: odoo/odoo#266084This update resolves a crash that occurred when users were manually correcting bank statement lines within the Odoo Enterprise system. The issue stemmed from a missing context key, preventing the correct journal from being assigned. This fix ensures accurate journal settings, preventing data inconsistencies and crashes during manual line adjustments.
Original PR description
When the manual correction tool was used to fill in the lines, we weren't passing the active context when creating the new records. In the case of bank statements, it could be an issue as the `default_journal_id` key is expected to be present to set the correct journal on the newly created bank statement line. Without this key in the context, it would default to the first journal with a valid type (see function `_search_default_journal`). If the journal found this way didn't match the current journal, a crash would occur when modifying the newly created lines. opw-[6294117](https://www.odoo.com/odoo/unassigned-tasks/6294117) Forward-Port-Of: odoo/enterprise#121032 Forward-Port-Of: odoo/enterprise#120745
This update fixes alignment issues within the Timesheet Assistant, specifically in the 'By Project' and 'Chronological' views. It ensures that long descriptions don't cause text to wrap incorrectly, and adds a consistent margin to the section indicating no billable time was recorded. This improves the overall clarity and usability of the timesheet reporting.
Original PR description
# [FIX] timesheet_grid: alignment issues in assistant This commit resolves the following alignment issues in the Timesheet Assistant: - View "By Project", the time wraps if description too long - View "Chronological", the time wraps if descriptions too long and project / task is not truncated - No timesheet recorded does not have a margin start # [FIX] sale_timesheet_enterprise: alignment issues in assistant This commit adds margin start on the "No (non-)billable time recorded" information. task-6264756 Forward-Port-Of: odoo/enterprise#120608
This update fixes a display issue where overtime details weren't showing correctly in attendance records. The change reverses a condition in the system's settings, ensuring that overtime information is now accurately presented for all employee attendance records, regardless of their overtime ruleset configuration.
Original PR description
Steps: * Create an extra-hours attendance for an employee that has overtime ruleset OR * Create an extra-hours attendance for an employee that has no overtime ruleset Issue: * The overtime details in the attendance view visibility condition was flipped Solution: * Reverse the visibility condition of the XML element Task: 6295710 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 Forward-Port-Of: odoo/odoo#270399 Forward-Port-Of: odoo/odoo#269744
This update fixes an error in the Luxembourg localization settings, ensuring the correct stock valuation account (301 Inventories of raw materials) is used instead of an expense account (60761 Merchandise). This ensures accurate financial reporting for Luxembourg businesses using Odoo.
Original PR description
**Problem:** Valuation account for luxembourg is currently 60761 Merchandise which is incorrect because it's an expense account. We should rather use a current asset account like 301 Inventories of raw materials **Steps to reproduce on a fresh db:** - create a new db with modules stock_account and accountant (without demo data) - On the 'fiscal localization setting' set the package as 'Luxembourg' and save - ativate the automatic accounting setting **Current Behavior:** The 'stock valuation account' appearing below the automatic accounting setting is : 60761 Merchandise **Expected behaviour:** It should be 301 Inventories of raw materials Forward-Port-Of: odoo/odoo#270048 Forward-Port-Of: odoo/odoo#269469
This update fixes an issue where imported Peppol/UBL vendor bills with 100% discounts were incorrectly processed. The fix ensures that a line with a LineExtensionAmount of 0 is correctly interpreted as a fully discounted line, preventing incorrect quantity and discount calculations. This improves the accuracy of imported financial data.
Original PR description
When importing a Peppol/UBL vendor bill containing a line with a 100% discount, the line was created in Odoo with quantity=1 and discount of 100*original_qty, instead of the expected…
When importing a Peppol/UBL vendor bill containing a line with a 100% discount, the line was created in Odoo with quantity=1 and discount of 100*original_qty, instead of the expected quantity=qty_original and discount=100%. This happened because the line-level branching in `_import_ubl_invoice_line_add_price_unit_quantity_discount` relied on the truthiness of `line_extension_amount` to detect whether the `LineExtensionAmount` node was present in the XML. a line with a genuine `<cbc:LineExtensionAmount>0</...>` was indistinguishable from a line where the node was missing, and fell through to the fallback branch intended for incomplete XML. That fallback reconstructs the quantity from `<cbc:BaseQuantity>`, ignoring `<cbc:InvoicedQuantity>`, and then computes the discount percentage against the wrong denominator. a `LineExtensionAmount` of 0 is the only legal way to express a fully discounted line, so this case must be distinguished from the node being absent. the fix is simply checking if the line exist not if its True opw-6176349 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#269322 Forward-Port-Of: odoo/odoo#265261
This update ensures that combo pricing displayed in the configurator dialog accurately reflects the order's currency. Previously, extra prices were not converted, leading to mismatched totals. Now, prices are automatically converted to the order's currency, guaranteeing accurate pricing and order totals.
Original PR description
Description of the issue/feature this PR addresses: In the combo configurator dialog, a combo item's extra_price and the price_extra of no_variant attributes are stored in the company/product…
Description of the issue/feature this PR addresses: In the combo configurator dialog, a combo item's extra_price and the price_extra of no_variant attributes are stored in the company/product currency but were sent to the front-end without conversion. When the order uses a pricelist in a different currency, the popup shows these extras at face value (e.g. an extra of USD 1700 appears as ARS 1700 instead of being converted). The sale order line itself already converts these extras, so the popup price and the actual line price didn't match. Current behavior before PR: _get_combo_item_data and _get_selected_ptavs_data return extra_price / price_extra raw, in the company currency. With a foreign-currency pricelist the combo configurator popup adds them 1-to-1 to the already-converted base price, displaying an incorrect total that doesn't match the resulting sale order line. Desired behavior after PR is merged: The controller converts extra_price and price_extra to the configurator's currency (via currency._convert()) before serializing them, so the popup shows the correct amounts in the pricelist currency and matches the price computed on the sale order line. A test (test_sale_combo_multicurrency.py) covers combo extra-price conversion with a foreign-currency pricelist. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#269905 Forward-Port-Of: odoo/odoo#269386
This update resolves an issue where sending NFC-e invoices would halt the POS synchronization process when IAP credits were exhausted. The fix prevents a system error and ensures that POS transactions continue to sync smoothly, even when IAP credit limits are reached. This improves the reliability of the POS system for businesses using the l10n_br_edi_pos module.
Original PR description
When sending an NFC-e, tax calculation is done by calling Avatax through IAP. If the IAP account has no credits left, iap_jsonrpc() raises an InsufficientCreditError. opw-6290857 Forward-Port-Of: odoo/enterprise#120700
This update resolves an issue where timesheet settings (specifically, whether a project is billable) would reset after the timesheet systray was closed and reopened. Now, changes made to this setting are correctly saved and retained, ensuring accurate timesheet tracking. This improves data consistency and reporting.
Original PR description
## Behavior before PR 1. Open the timesheet systray. 2. Select a billable project. 3. Toggle the is_billable field. 4. Close and reopen the systray. 5. The is_billable value resets to its default instead of keeping the updated value. ## Expected Behavior After this PR The systray now correctly retains the is_billable value after being closed and reopened. ### Technical Notes The issue occurred because the systray view loads a sudo record that triggers compute methods, which overwrite the stored is_billable value. The fix ensures that after compute methods run, the saved is_billable value is preserved. Forward-Port-Of: odoo/enterprise#119681
This update corrects a previous issue where customers who had fully paid their outstanding balances no longer saw the Customer Statement button appear. The fix now checks for any past pay-later payment lines, ensuring that customers with a history of using pay-later options can still generate their statements. This improves the user experience for settled customers.
Original PR description
The override of _compute_has_moves was checking `total_due != 0` to set `has_moves` on for PoS pay_later customers. Once the customer is fully settled however, `total_due` is 0 and the check does not pass anymore, so `has_moves` goes back to `False` and the Customer Statement button hides for them, even though they had past pay_later payment lines. The fix is to check directly for any past pay_later `pos.payment` instead, which covers the cases where partner had used pay_later payment methods before, regardless if they have settled their total due or not. opw-6173760 Forward-Port-Of: odoo/enterprise#120911 Forward-Port-Of: odoo/enterprise#116536
This update resolves an issue where users with restricted accounting rights incorrectly marked invoices as fully paid, leading to inaccurate financial reporting. The fix ensures automatic bank reconciliation works correctly for these users by safely bypassing a group check during the reconciliation process, maintaining data auditability.
Original PR description
### Issue When you have an invoice partially paid via a method using an Outstanding Account, the payment can be kept open, leaving the invoice considered as partially paid If a user with only…
### Issue When you have an invoice partially paid via a method using an Outstanding Account, the payment can be kept open, leaving the invoice considered as partially paid If a user with only "Invoicing & Banks" rights tries to reconcile a Bank Statement with the same partner, amount, and the invoice name as the memo, the automatic reconciliation fails to properly match the payment Instead, the invoice is incorrectly considered as Fully Paid with an unwanted extra Account Receivable line added ### Cause When a new Bank Statement is created, `_try_auto_reconcile_statement_lines()` is called and matches the outstanding credit, which invokes `set_line_bank_statement_line()` This function creates a balancing line and triggers `move._compute_checked()` to update dependencies However, `move.checked` requires `_is_user_able_to_review()` to be True A user with "Invoicing & Banks" rights lacks the `account.group_account_user` group, meaning the move is not marked as checked, preventing dependencies from computing correctly Consequently, the statement line's `amount_residual` is not cleared and the line is not removed from `remaining_st_line_ids` Later in the process, `_try_auto_reconcile_statement_lines()` is called again with `with_user(SUPERUSER_ID)` Because the payment matching was never finalized in the previous step, the engine fallback matches against the full invoice, adding an incorrect Account Receivable line to close it ### Steps to reproduce - Install `accountant` - Go to Accounting / Configuration / Accounting / Journals - Open the Bank, under Incoming Payments tab, set the Manual Payment method's Outstanding Receipts account to 101403 Outstanding Receipts - Update the Demo user's accounting rights to Invoicing & Banks - Log in with the Demo user - Create and confirm an invoice for Acme Corporation (Amount: $1100) - Register a payment on the invoice (Amount: $500, Keep open) - Copy the invoice name - Open the Bank Reconciliation widget from the Accounting Dashboard - Create and add a new Bank Statement Line (Label: Invoice name, Partner: Acme Corporation, Amount: $500) Before the fix, an unexpected Account Receivable line is created and the invoice is marked as Fully Paid ### Notes Instead of processing the entire block under SUPERUSER_ID, which would hide the creator identity in logs and chatter, the context key `skip_account_review_check=True` is injected during the automated statement line reconciliation This safely bypasses the group check inside `_is_user_able_to_review` for this specific automated flow A fallback using `.with_user(SUPERUSER_ID)` is already implemented twice within the same `_try_auto_reconcile_statement_lines` method for this specific use case, but avoiding it here preserves data auditability opw-6077137 Forward-Port-Of: odoo/enterprise#120217 Forward-Port-Of: odoo/enterprise#118023
This update resolves an issue where users with limited accounting permissions incorrectly marked invoices as 'Fully Paid' after reconciling bank statements. The fix ensures accurate reconciliation by correctly handling user permissions and preventing the creation of unwanted Account Receivable lines, maintaining data integrity.
Original PR description
### Issue When you have an invoice partially paid via a method using an Outstanding Account, the payment can be kept open, leaving the invoice considered as partially paid If a user with only…
### Issue When you have an invoice partially paid via a method using an Outstanding Account, the payment can be kept open, leaving the invoice considered as partially paid If a user with only "Invoicing & Banks" rights tries to reconcile a Bank Statement with the same partner, amount, and the invoice name as the memo, the automatic reconciliation fails to properly match the payment Instead, the invoice is incorrectly considered as Fully Paid with an unwanted extra Account Receivable line added ### Cause When a new Bank Statement is created, `_try_auto_reconcile_statement_lines()` is called and matches the outstanding credit, which invokes `set_line_bank_statement_line()` In 19.0, this function creates a balancing line and triggers `move._compute_checked()` to update dependencies Especially `_compute_is_reconciled` But checked as been replaced by `review_state` This FW port will use an update on the `review_state` instead of the `checked` A user with "Invoicing & Banks" rights lacks the `account.group_account_user` group, meaning the move is not marked as `reviewed`, preventing dependencies from computing correctly Consequently, the statement line's `amount_residual` is not cleared and the line is not removed from `remaining_st_line_ids` Later in the process, `_try_auto_reconcile_statement_lines()` is called again with `with_user(SUPERUSER_ID)` Because the payment matching was never finalized in the previous step, the engine fallback matches against the full invoice, adding an incorrect Account Receivable line to close it ### Steps to reproduce - Install `accountant` - Go to Accounting / Configuration / Accounting / Journals - Open the Bank, under Incoming Payments tab, set the Manual Payment method's Outstanding Receipts account to 101403 Outstanding Receipts - Update the Demo user's accounting rights to Invoicing & Banks - Log in with the Demo user - Create and confirm an invoice for Acme Corporation (Amount: $1100) - Register a payment on the invoice (Amount: $500, Keep open) - Copy the invoice name - Open the Bank Reconciliation widget from the Accounting Dashboard - Create and add a new Bank Statement Line (Label: Invoice name, Partner: Acme Corporation, Amount: $500) Before the fix, an unexpected Account Receivable line is created and the invoice is marked as Fully Paid ### Notes Instead of processing the entire block under SUPERUSER_ID, which would hide the creator identity in logs and chatter, the context key `skip_account_review_check=True` is injected during the automated statement line reconciliation This safely bypasses the group check inside `_is_user_able_to_review` for this specific automated flow A fallback using `.with_user(SUPERUSER_ID)` is already implemented twice within the same `_try_auto_reconcile_statement_lines` method for this specific use case, but avoiding it here preserves data auditability opw-6077137 Forward-Port-Of: odoo/odoo#270080
This update resolves a minor issue in the marketing automation dashboard by correcting calculations for key engagement metrics. Specifically, the KPI engagement rate and its n-1 version are now accurately calculated, ensuring more reliable reporting on marketing campaign performance. This improves the accuracy of the data presented to marketing teams.
Original PR description
This commit fixes two issues:
- KPI engagement rate ('Mailing Statistics'!B16) should be =iferror((B7+B9)/B10),0)
- KPI engagement rate n-1 ('Mailing Statistics'!C16) should be =iferror((C7+C9)/C10),0)
Task: 5418449
Forward-Port-Of: odoo/enterprise#120962This update resolves an issue where opening the chat feature in the account module was unintentionally expanding detailed financial data. The change prevents this expansion, improving the user experience and ensuring data is only displayed when needed. This is a minor fix to enhance efficiency.
Original PR description
Before this commit, open_chatter use the selectStatementLine function that will unfold the line. But we don't want the unfold when opening the chatter. task-6306311 Forward-Port-Of: odoo/enterprise#120847