where('status', 'completed') ->whereBetween('appointment_date', [$periodStart, $periodEnd . ' 23:59:59']) ->get(); $sessionsCount = $completedAppointments->count(); $hoursWorked = $completedAppointments->sum('duration_minutes') / 60; $baseAmount = 0; if ($therapist->session_rate) { $baseAmount = $sessionsCount * $therapist->session_rate; } elseif ($therapist->hourly_rate) { $baseAmount = $hoursWorked * $therapist->hourly_rate; } return [ 'therapist_id' => $therapistId, 'period_start' => $periodStart, 'period_end' => $periodEnd, 'sessions_count' => $sessionsCount, 'hours_worked' => round($hoursWorked, 2), 'base_amount' => round($baseAmount, 2), 'bonus' => 0, 'deductions' => 0, 'total_amount' => round($baseAmount, 2), ]; } /** * Create wage record */ public function createWage(array $data, int $createdBy): Wage { $wage = Wage::create(array_merge($data, [ 'created_by' => $createdBy, ])); // Auto-create ledger entry $ledgerService = new LedgerService(); $ledgerService->recordWage($wage); return $wage; } /** * Get therapist performance metrics */ public function getPerformanceMetrics(int $therapistId, string $periodStart, string $periodEnd): array { $wage = $this->calculateWage($therapistId, $periodStart, $periodEnd); $therapist = User::find($therapistId); $targetSessions = $therapist->target_sessions_per_month ?? 0; $sessionsAchieved = $targetSessions > 0 ? ($wage['sessions_count'] / $targetSessions) * 100 : 0; return [ 'sessions_count' => $wage['sessions_count'], 'hours_worked' => $wage['hours_worked'], 'target_sessions' => $targetSessions, 'sessions_achieved_percentage' => round($sessionsAchieved, 2), 'base_amount' => $wage['base_amount'], ]; } }