diff --git a/models/__init__.py b/models/__init__.py index 02264fd..86b1ea3 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -1 +1 @@ -from . import hr_expense_sheet +from . import hr_expense diff --git a/models/hr_expense.py b/models/hr_expense.py new file mode 100644 index 0000000..bf5de29 --- /dev/null +++ b/models/hr_expense.py @@ -0,0 +1,24 @@ +from odoo import api, models + +class HrExpense(models.Model): + _inherit = 'hr.expense' + + @api.depends('account_move_id.payment_state', 'account_move_id.payment_id.is_matched') + def _compute_state(self): + super()._compute_state() + for expense in self: + if expense.payment_mode == 'company_account' and expense.account_move_id: + move = expense.account_move_id + if move.state == 'posted': + payment = move.payment_id + if payment: + if not payment.is_matched: + expense.state = 'in_payment' + else: + expense.state = 'paid' + else: + # If it's a journal entry without a payment object (e.g. manual entry) + # we keep it as 'paid' as per standard Odoo 19 shortcut or + # we could check if the move is reconciled. + # For now, keeping it simple to match the intent of the original module. + expense.state = 'paid' diff --git a/models/hr_expense_sheet.py b/models/hr_expense_sheet.py deleted file mode 100644 index d716c91..0000000 --- a/models/hr_expense_sheet.py +++ /dev/null @@ -1,27 +0,0 @@ -from odoo import api, models - -class HrExpenseSheet(models.Model): - _inherit = 'hr.expense.sheet' - - @api.depends('account_move_ids.payment_state', 'account_move_ids.payment_id.is_matched') - def _compute_from_account_move_ids(self): - # Call the original method to compute default values first - super()._compute_from_account_move_ids() - - # Override specific logic to prevent company-paid expenses from immediately jumping to 'Paid' - for sheet in self: - if sheet.payment_mode == 'company_account': - if sheet.account_move_ids: - moves = sheet.account_move_ids - sheet.account_move_ids.filtered('reversal_move_id') - if moves: - payments = moves.mapped('payment_id') - - # Find if any linked payment is not yet matched to a bank statement - unmatched_payments = payments.filtered(lambda p: not p.is_matched) - - if unmatched_payments: - # If there are unmatched payments, it should stay 'In Payment' - sheet.payment_state = 'in_payment' - else: - # If all payments are matched (or we have manual entries), it is Paid - sheet.payment_state = 'paid'