feat: add search method override to include asset cash accounts in reconciliation candidates

This commit is contained in:
Suherdy Yacob 2026-06-10 09:18:42 +07:00
parent 964e180fea
commit afbcb4d052
2 changed files with 38 additions and 0 deletions

View File

@ -32,6 +32,11 @@ Solves Odoo's restrictive `Access to unauthorized or invalid companies` error/wa
- **Environment & Session Sanitization**: Overrides `ir.http._pre_dispatch` and `_dispatch` to safely query the cashier's authorized companies using `sudo()`, and dynamically filters out unauthorized or parent company IDs (such as parent company `2`) from `allowed_company_ids` in request parameters (`request.params`), HTTP sessions (`request.session.context`), and environment context (`request.env.context`).
- **Sudo Order Post-Processing**: Inherits `pos.order` to run post-processing (`_process_saved_order`, including picking generation, cost/method computation, and payment posting) under `sudo()`. This allows Odoo to safely read company-dependent properties (like `cost_method` or `property_cost_method`) and generate inventory pickings without triggering security warnings in `environments.py`.
### 5. Centralized Cash Bank Reconciliation Patch
Enables matching of cash journal entries (e.g. from the centralized cash journal) in Odoo's standard bank reconciliation widget:
- **Reconciliation Candidate Expansion**: Patches the standard `account.move.line` search method (`_search_account_id`) to automatically include `asset_cash` accounts when filtering candidate line searches. This allows users to reconcile bank statement lines in the parent company directly against mirror/clearing cash entries.
## Configuration
### 1. POS Inter-Company Clearing

View File

@ -139,6 +139,39 @@ class AccountMove(models.Model):
class AccountMoveLine(models.Model):
_inherit = 'account.move.line'
@api.model
def _search_account_id(self, operator, value):
res = super()._search_account_id(operator, value)
if res and isinstance(res, list) and len(res) == 1:
term = res[0]
if len(term) == 3 and term[0] == 'account_id' and term[1] in ('in', 'not in') and isinstance(term[2], (list, tuple, set)):
resolved_ids = list(term[2])
reconcile_accounts = self.env['account.account'].sudo().browse(resolved_ids).filtered('reconcile')
if reconcile_accounts:
cash_accounts = self.env['account.account'].sudo().search([('account_type', '=', 'asset_cash')])
if cash_accounts:
if term[1] == 'in':
res = [
'|',
('account_id', 'in', tuple(reconcile_accounts.ids)),
'&',
'&',
('account_id', 'in', tuple(cash_accounts.ids)),
('journal_id.type', '=', 'cash'),
('journal_id.company_id', '=', self.env.company.id)
]
elif term[1] == 'not in':
res = [
'&',
('account_id', 'not in', tuple(reconcile_accounts.ids)),
'|',
'|',
('account_id', 'not in', tuple(cash_accounts.ids)),
('journal_id.type', '!=', 'cash'),
('journal_id.company_id', '!=', self.env.company.id)
]
return res
def _related_analytic_distribution(self):
res = super()._related_analytic_distribution()
if res: