diff --git a/models/account_payment.py b/models/account_payment.py index 420fa9a..eecd0ca 100644 --- a/models/account_payment.py +++ b/models/account_payment.py @@ -13,7 +13,7 @@ class AccountPayment(models.Model): """ Confirmation bypass. Calls standard post with skip flag. """ - # We use a context flag that our surgical jumper will check + # Propagate the flag to all internal calls return super(AccountPayment, self.with_context(skip_expense_lock=True)).action_post() def _synchronize_to_moves(self, changed_fields): @@ -22,34 +22,29 @@ class AccountPayment(models.Model): if 'amount' not in changed_fields: changed_fields = set(changed_fields) | {'amount'} - # SURGICAL JUMPER: If we have the bypass flag, we skip the hr_expense method specifically. + # SURGICAL JUMPER: If we have the bypass flag, we jump over the hr_expense method. if self._context.get('skip_expense_lock'): - # Find the hr_expense class in the MRO mro = type(self).mro() - try: - # Find the index of the middle-man we want to skip - hr_index = next(i for i, c in enumerate(mro) if c.__module__.startswith('odoo.addons.hr_expense')) - # Jump to the next class AFTER hr_expense - return mro[hr_index + 1]._synchronize_to_moves(self, changed_fields) - except (StopIteration, IndexError): - pass + # Find the class that belongs to the hr_expense module + hr_expense_class = next((c for c in mro if c.__module__.startswith('odoo.addons.hr_expense')), None) + if hr_expense_class: + # Standard Python jumping syntax: calls the method of the parent of hr_expense_class + return super(hr_expense_class, self)._synchronize_to_moves(changed_fields) return super()._synchronize_to_moves(changed_fields) def _synchronize_from_moves(self, changed_fields): if self._context.get('skip_expense_lock'): mro = type(self).mro() - try: - hr_index = next(i for i, c in enumerate(mro) if c.__module__.startswith('odoo.addons.hr_expense')) - return mro[hr_index + 1]._synchronize_from_moves(self, changed_fields) - except (StopIteration, IndexError): - pass + hr_expense_class = next((c for c in mro if c.__module__.startswith('odoo.addons.hr_expense')), None) + if hr_expense_class: + return super(hr_expense_class, self)._synchronize_from_moves(changed_fields) return super()._synchronize_from_moves(changed_fields) def write(self, vals): - if ('deduction_line_ids' in vals or 'amount_substract' in vals or 'amount' in vals) and self.expense_sheet_id: - # For draft payments linked to expenses, use the jumper to allow edits + # Propagate bypass flag during writes to avoid checks on draft payments + if self.expense_sheet_id and self.state == 'draft': return super(AccountPayment, self.with_context(skip_expense_lock=True)).write(vals) return super().write(vals)