NIM_E31222534/app/Services/StuntingCalculator.php

205 lines
6.7 KiB
PHP

<?php
namespace App\Services;
class StuntingCalculator
{
// Status constants
const STATUS_STUNTING = 'Stunting';
const STATUS_RESIKO_STUNTING = 'Resiko Stunting';
const STATUS_TIDAK_STUNTING = 'Tidak Stunting';
// Tinggi badan standar sesuai usia (min stunting, min resiko stunting, min tidak stunting)
protected $standardHeightByAge = [
'24' => [0, 81.1, 84.1], // ≤ 81.0: Stunting, 81.1-84.0: Resiko, ≥ 84.1: Tidak Stunting
'25' => [0, 81.8, 84.9],
'26' => [0, 82.6, 85.6],
'27' => [0, 83.2, 86.4],
'28' => [0, 83.9, 87.1],
'29' => [0, 84.6, 87.8],
'30' => [0, 85.2, 88.5],
'31' => [0, 85.8, 89.2],
'32' => [0, 86.5, 89.9],
'33' => [0, 87.0, 90.5],
'34' => [0, 87.6, 91.1],
'35' => [0, 88.2, 91.8],
'36' => [0, 88.8, 92.4],
'37' => [0, 89.3, 93.0],
'38' => [0, 89.9, 93.6],
'39' => [0, 90.4, 94.2],
'40' => [0, 91.0, 94.7],
'41' => [0, 91.5, 95.3],
'42' => [0, 92.0, 95.9],
'43' => [0, 92.5, 96.4],
'44' => [0, 93.1, 97.0],
'45' => [0, 93.6, 97.5],
'46' => [0, 94.1, 98.1],
'47' => [0, 94.5, 98.6],
'48' => [0, 95.0, 99.1],
'49' => [0, 95.5, 99.7],
'50' => [0, 96.0, 100.2],
'51' => [0, 96.5, 100.7],
'52' => [0, 97.0, 101.2],
'53' => [0, 97.5, 101.7],
'54' => [0, 97.9, 102.3],
'55' => [0, 98.4, 102.8],
'56' => [0, 98.9, 103.3],
'57' => [0, 99.4, 103.8],
'58' => [0, 99.8, 104.3],
'59' => [0, 100.3, 104.8],
'60' => [0, 100.8, 105.3]
];
// Berat badan standar sesuai usia (min stunting, min resiko stunting, min tidak stunting)
protected $standardWeightByAge = [
'24' => [0, 9.1, 10.2], // ≤ 9.0: Stunting, 9.1-10.1: Resiko, ≥ 10.2: Tidak Stunting
'25' => [0, 9.3, 10.3],
'26' => [0, 9.5, 10.5],
'27' => [0, 9.6, 10.7],
'28' => [0, 9.8, 10.9],
'29' => [0, 9.9, 11.1],
'30' => [0, 10.1, 11.2],
'31' => [0, 10.2, 11.4],
'32' => [0, 10.4, 11.6],
'33' => [0, 10.5, 11.7],
'34' => [0, 10.6, 11.9],
'35' => [0, 10.8, 12.0],
'36' => [0, 10.9, 12.2],
'37' => [0, 11.0, 12.4],
'38' => [0, 11.2, 12.5],
'39' => [0, 11.3, 12.7],
'40' => [0, 11.4, 12.8],
'41' => [0, 11.6, 13.0],
'42' => [0, 11.7, 13.1],
'43' => [0, 11.8, 13.3],
'44' => [0, 11.9, 13.4],
'45' => [0, 12.1, 13.6],
'46' => [0, 12.2, 13.7],
'47' => [0, 12.3, 13.9],
'48' => [0, 12.4, 14.0],
'49' => [0, 12.5, 14.2],
'50' => [0, 12.7, 14.3],
'51' => [0, 12.8, 14.5],
'52' => [0, 12.9, 14.6],
'53' => [0, 13.0, 14.8],
'54' => [0, 13.1, 14.9],
'55' => [0, 13.3, 15.1],
'56' => [0, 13.4, 15.2],
'57' => [0, 13.5, 15.3],
'58' => [0, 13.6, 15.5],
'59' => [0, 13.7, 15.6],
'60' => [0, 13.8, 15.8]
];
/**
* Menentukan status stunting berdasarkan tinggi badan
*
* @param int $age Usia dalam bulan (24-60)
* @param float $height Tinggi badan dalam cm
* @return string Status stunting
*/
public function determineStatusByHeight($age, $height)
{
// Konversi ke string untuk lookup dalam array
$age = (string) $age;
// Jika usia tidak dalam range yang ditentukan
if (!isset($this->standardHeightByAge[$age])) {
return self::STATUS_TIDAK_STUNTING; // Default
}
$standards = $this->standardHeightByAge[$age];
// Bandingkan tinggi badan dengan standar
if ($height <= $standards[0]) {
return self::STATUS_STUNTING;
} elseif ($height >= $standards[0] && $height < $standards[1]) {
return self::STATUS_STUNTING;
} elseif ($height >= $standards[1] && $height < $standards[2]) {
return self::STATUS_RESIKO_STUNTING;
} else {
return self::STATUS_TIDAK_STUNTING;
}
}
/**
* Menentukan status stunting berdasarkan berat badan
*
* @param int $age Usia dalam bulan (24-60)
* @param float $weight Berat badan dalam kg
* @return string Status stunting
*/
public function determineStatusByWeight($age, $weight)
{
// Konversi ke string untuk lookup dalam array
$age = (string) $age;
// Jika usia tidak dalam range yang ditentukan
if (!isset($this->standardWeightByAge[$age])) {
return self::STATUS_TIDAK_STUNTING; // Default
}
$standards = $this->standardWeightByAge[$age];
// Bandingkan berat badan dengan standar
if ($weight <= $standards[0]) {
return self::STATUS_STUNTING;
} elseif ($weight >= $standards[0] && $weight < $standards[1]) {
return self::STATUS_STUNTING;
} elseif ($weight >= $standards[1] && $weight < $standards[2]) {
return self::STATUS_RESIKO_STUNTING;
} else {
return self::STATUS_TIDAK_STUNTING;
}
}
/**
* Menentukan status stunting berdasarkan tinggi dan berat badan
* Hanya melihat tinggi badan untuk keputusan akhir sesuai pedoman WHO
*
* @param int $age Usia dalam bulan (24-60)
* @param float $height Tinggi badan dalam cm
* @param float $weight Berat badan dalam kg (opsional)
* @return string Status stunting
*/
public function determineStatus($age, $height, $weight = null)
{
// Stunting lebih diutamakan berdasarkan tinggi badan
return $this->determineStatusByHeight($age, $height);
}
/**
* Extract usia dalam bulan dari string usia
* Contoh input: "24 bulan" atau "2 tahun"
*
* @param string $usiaString
* @return int
*/
public function extractAgeInMonths($usiaString)
{
$usiaString = strtolower($usiaString);
// Cek apakah mengandung "bulan"
if (strpos($usiaString, 'bulan') !== false) {
// Ambil angka dari string
preg_match('/(\d+)/', $usiaString, $matches);
return (int) $matches[1];
}
// Cek apakah mengandung "tahun"
if (strpos($usiaString, 'tahun') !== false) {
// Ambil angka dari string
preg_match('/(\d+)/', $usiaString, $matches);
// Konversi tahun ke bulan
return (int) $matches[1] * 12;
}
// Jika hanya angka, asumsikan dalam bulan
if (is_numeric($usiaString)) {
return (int) $usiaString;
}
// Default
return 0;
}
}