payments() ->with('recorder.profile') ->latest('paid_at') ->get(); } public function create(TuitionInvoice $invoice, array $data, ?UploadedFile $file): TuitionPayment { $payment = $invoice->payments()->create([ 'amount_paid' => $data['amount_paid'], 'paid_at' => $data['paid_at'], 'payment_method' => $data['payment_method'] ?? null, 'status' => $data['status'], 'recorded_by' => auth()->id(), 'notes' => $data['notes'] ?? null, ]); if ($file) { $payment->addMedia($file)->toMediaCollection('payment_proof'); } return $payment; } public function update(TuitionPayment $payment, array $data, ?UploadedFile $file): TuitionPayment { $payment->amount_paid = $data['amount_paid']; $payment->paid_at = $data['paid_at']; $payment->payment_method = $data['payment_method'] ?? null; $payment->status = $data['status']; $payment->notes = $data['notes'] ?? null; $payment->update(); if ($file) { $payment->addMedia($file)->toMediaCollection('payment_proof'); } return $payment; } public function delete(TuitionPayment $payment): bool { return $payment->delete(); } }