217 lines
7.4 KiB
PHP
217 lines
7.4 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use App\Http\Controllers\StravaController;
|
|
use App\Http\Controllers\ConsultationController;
|
|
use App\Models\PhysicalActivity;
|
|
use App\Models\HealthData;
|
|
use App\Models\Result;
|
|
use App\Models\Notification;
|
|
use App\Models\Consultation;
|
|
use Carbon\Carbon;
|
|
use Illuminate\Support\Facades\Http;
|
|
|
|
class DashboardController extends Controller
|
|
{
|
|
|
|
public function dashboardClient()
|
|
{
|
|
$user = auth()->user();
|
|
|
|
$activities = PhysicalActivity::where('users_id', $user->id)->get();
|
|
$healthData = HealthData::where('users_id', $user->id)->get()->last();
|
|
|
|
$activities->transform(function ($activity) {
|
|
$activity->date = Carbon::parse($activity->date)->format('d M Y');
|
|
$activity->calories_burned = $activity->calculateCaloriesBurned();
|
|
return $activity;
|
|
});
|
|
|
|
// Loop through activities and print out the values
|
|
|
|
$totalDistance = $activities->sum('distance');
|
|
|
|
if ($healthData) {
|
|
// Check if obesity_status is null
|
|
if (!$healthData->obesity_status) {
|
|
// Call prediction method only if obesity_status is null
|
|
$obesityPrediction = $this->predictObesity($healthData, $user);
|
|
$healthData->obesity_status = $obesityPrediction;
|
|
$healthData->save();
|
|
}
|
|
|
|
// Check if calorie_recommendation is null
|
|
if (!$healthData->calorie_recommendation) {
|
|
// Call calorie prediction method only if calorie_recommendation is null
|
|
$calorieRecommendation = $this->predictCalories($healthData, $user);
|
|
$healthData->calorie_recommendation = $calorieRecommendation;
|
|
$healthData->save();
|
|
}
|
|
}
|
|
|
|
return view('dashboardClient', compact('activities', 'healthData', 'totalDistance'));
|
|
}
|
|
|
|
private function predictObesity($healthData, $user)
|
|
{
|
|
$data = [
|
|
'height' => $healthData->height ?? 0,
|
|
'weight' => $healthData->weight ?? 0,
|
|
'age' => now()->diffInYears($healthData->birthdate ?? '2000-03-25'),
|
|
'gender' => ($user->gender === 'male') ? 'M' : 'F',
|
|
'activity_level' => 1,
|
|
];
|
|
|
|
$obesityPrediction = Http::post('https://aigoo.humicprototypingapi.online/api/predict/obesity', $data)->json();
|
|
$predictedCategory = $obesityPrediction['predicted_category'] ?? null;
|
|
return $predictedCategory;
|
|
}
|
|
|
|
private function predictCalories($healthData, $user)
|
|
{
|
|
$data = [
|
|
'height' => $healthData->height ?? 0,
|
|
'weight' => $healthData->weight ?? 0,
|
|
'age' => now()->diffInYears($healthData->birthdate ?? '2000-03-25'),
|
|
'gender' => ($user->gender === 'male') ? 'M' : 'F',
|
|
];
|
|
|
|
$response = Http::post('https://aigoo.humicprototypingapi.online/api/predict/calorie', $data);
|
|
$predictedCalories = ceil($response->json()['predicted_calories']);
|
|
|
|
return $predictedCalories;
|
|
}
|
|
|
|
public function activityReport()
|
|
{
|
|
$currentMonth = now()->format('m');
|
|
$currentYear = now()->format('Y');
|
|
|
|
$user = auth()->user();
|
|
$healthData = HealthData::where('users_id', $user->id)
|
|
->orderBy('updated_at', 'desc')
|
|
->get();
|
|
|
|
$healthData->transform(function ($item) {
|
|
$item->formatted_created_at = Carbon::parse($item->created_at)->format('d F Y');
|
|
$item->time = Carbon::parse($item->created_at)->format('h:i A');
|
|
return $item;
|
|
});
|
|
|
|
$activities = PhysicalActivity::whereYear('date', $currentYear)
|
|
->whereMonth('date', $currentMonth)
|
|
->where('users_id', $user->id)
|
|
->get();
|
|
|
|
$totalSteps = $activities->sum('avg_steps');
|
|
$totalDistance = $activities->sum('distance');
|
|
$totalDuration = $activities->sum('duration');
|
|
|
|
if ($totalDuration < 60) {
|
|
$durationValue = $totalDuration;
|
|
$durationUnit = 'seconds';
|
|
} elseif ($totalDuration < 3600) {
|
|
$durationValue = floor($totalDuration / 60);
|
|
$durationUnit = 'minutes';
|
|
} else {
|
|
$durationValue = floor($totalDuration / 3600);
|
|
$durationUnit = 'hours';
|
|
}
|
|
|
|
$filteredHealthData = collect();
|
|
foreach ($healthData as $index => $data) {
|
|
if ($index < $healthData->count() - 1) {
|
|
$nextWeight = $healthData[$index + 1]->weight;
|
|
$data->weight_difference = $data->weight - $nextWeight;
|
|
if ($data->weight_difference != 0) {
|
|
$filteredHealthData->push($data);
|
|
}
|
|
} else {
|
|
$data->weight_difference = 0;
|
|
$filteredHealthData->push($data);
|
|
}
|
|
}
|
|
|
|
$totalSleepTime = $healthData->sum('sleeptime');
|
|
if ($healthData->count() > 0) {
|
|
$averageSleepTime = number_format($totalSleepTime / $healthData->count(), 2);
|
|
} else {
|
|
$averageSleepTime = 0;
|
|
}
|
|
|
|
$latestHealthData = $healthData->last();
|
|
if ($latestHealthData) {
|
|
$predictedCalories = $this->predictCalories($latestHealthData, $user);
|
|
} else {
|
|
$predictedCalories = 0;
|
|
}
|
|
|
|
$recommended_distance = Result::where('patient_id', $user->id)->get()->last()->jarak_lari ?? 0;
|
|
|
|
|
|
$chartData = PhysicalActivity::whereYear('date', $currentYear)
|
|
->whereMonth('date', $currentMonth)
|
|
->where('users_id', $user->id)
|
|
->orderBy('date')
|
|
->get();
|
|
|
|
$labels = $chartData->map(function ($activity) {
|
|
return Carbon::parse($activity->date)->format('d F');
|
|
});
|
|
|
|
$distances = $chartData->map(function ($activity) {
|
|
return intval($activity->distance);
|
|
});
|
|
|
|
$durations = $chartData->map(function ($activity) {
|
|
return intval($activity->duration);
|
|
});
|
|
|
|
return view('activity-report', compact(
|
|
'totalSteps', 'totalDistance', 'durationValue', 'durationUnit',
|
|
'averageSleepTime', 'filteredHealthData', 'activities', 'predictedCalories',
|
|
'recommended_distance', 'labels', 'distances', 'durations'
|
|
));
|
|
}
|
|
|
|
public function schedule()
|
|
{
|
|
$user = auth()->user();
|
|
|
|
$approvedConsultations = Consultation::where('patient_id', $user->id)
|
|
->where('consultation_status', 'approved')
|
|
->with('doctor')
|
|
->get();
|
|
|
|
return view('customer-schedule', compact('approvedConsultations'));
|
|
}
|
|
|
|
public function notifications()
|
|
{
|
|
$patient = auth()->user();
|
|
$notifications = Notification::where('user_id', $patient->id)->orderBy('created_at', 'desc')->get();
|
|
|
|
return view('patient-notifications', compact('notifications'));
|
|
}
|
|
|
|
public function consultation()
|
|
{
|
|
return view('health-data');
|
|
}
|
|
|
|
|
|
public function consultationResults()
|
|
{
|
|
$patient = auth()->user();
|
|
$consultations = Consultation::where('patient_id', $patient->id)
|
|
->where('consultation_status', 'finished')
|
|
->with('doctor', 'result')
|
|
->orderBy('consultation_date', 'desc')
|
|
->get();
|
|
|
|
return view('customer-result', compact('consultations'));
|
|
}
|
|
|
|
} |