from odoo import api, fields, models from datetime import timedelta class HrExpenseSheet(models.Model): _inherit = 'hr.expense.sheet' @api.depends('account_move_ids.payment_state', 'account_move_ids.amount_residual') def _compute_state(self): # Store original states to detect transition to 'done' original_states = {sheet.id: sheet.state for sheet in self} super()._compute_state() for sheet in self: if original_states.get(sheet.id) != 'done' and sheet.state == 'done': # Transitioned to 'Paid' today = fields.Date.today() for expense in sheet.expense_line_ids: if not expense.receipt_due_date: due_days = expense.product_id.receipt_due_days or 0 expense.receipt_due_date = today + timedelta(days=due_days) receipt_status = fields.Selection([ ('pending', 'Pending Receipts'), ('received', 'Receipts Received'), ('none', 'No Receipt Required') ], string='Receipt Status', compute='_compute_receipt_status', store=True, tracking=True) @api.depends('expense_line_ids.receipt_received', 'expense_line_ids.payment_mode') def _compute_receipt_status(self): for sheet in self: company_paid_expenses = sheet.expense_line_ids.filtered(lambda e: e.payment_mode == 'company_account') if not company_paid_expenses: sheet.receipt_status = 'none' elif all(e.receipt_received for e in company_paid_expenses): sheet.receipt_status = 'received' else: sheet.receipt_status = 'pending'