Real-time calculation engines eliminating manual computation errors.
1. DMF-T & def-t (Real-Time JavaScript Calculation)
function updateCounts() {
let jumlah_tetap_d = 0, jumlah_tetap_m = 0, jumlah_tetap_f = 0;
let jumlah_susu_d = 0, jumlah_susu_e = 0, jumlah_susu_f = 0;
let gigi_karies = [];
['18','17','16','15','14','13','12','11','21','22','23','24','25','26','27','28',
'48','47','46','45','44','43','42','41','31','32','33','34','35','36','37','38'
].forEach(function(kode) {
let val = document.getElementById('kode_' + kode).value;
if (val === '1' || val === '2') jumlah_tetap_d++;
else if (val === '4') jumlah_tetap_m++;
else if (val === '3') jumlah_tetap_f++;
if (val === '1' || val === '2') gigi_karies.push(kode);
});
['55','54','53','52','51','61','62','63','64','65',
'85','84','83','82','81','71','72','73','74','75'
].forEach(function(kode) {
let val = document.getElementById('kode_' + kode).value;
if (val === 'B' || val === 'C') jumlah_susu_d++;
else if (val === 'E') jumlah_susu_e++;
else if (val === 'D') jumlah_susu_f++;
if (val === 'B' || val === 'C') gigi_karies.push(kode);
});
let dmf_t = jumlah_tetap_d + jumlah_tetap_m + jumlah_tetap_f;
let def_t = jumlah_susu_d + jumlah_susu_e + jumlah_susu_f;
document.getElementById('dmf_t').value = dmf_t;
document.getElementById('def_t').value = def_t;
document.getElementById('gigi_karies').value = gigi_karies.join(',');
}
document.querySelectorAll('select').forEach(function(dropdown) {
dropdown.addEventListener('change', updateCounts);
});
2. OHI-S (Debris Index + Calculus Index)
function calculateDI() {
let jumlahNilaiDI = 0, jumlahGigiDI = 0;
for (let i = 1; i <= 6; i++) {
let diValue = document.getElementById('di_' + i).value;
if (diValue !== "") {
jumlahNilaiDI += parseInt(diValue);
jumlahGigiDI++;
}
}
let scoreDI = (jumlahGigiDI !== 0) ? (jumlahNilaiDI / jumlahGigiDI) : 0;
document.getElementById('score_di').value = scoreDI.toFixed(2);
calculateOHIS();
}
function calculateCI() {
let jumlahNilaiCI = 0, jumlahGigiCI = 0;
for (let i = 1; i <= 6; i++) {
let ciValue = document.getElementById('ci_' + i).value;
if (ciValue !== "") {
jumlahNilaiCI += parseInt(ciValue);
jumlahGigiCI++;
}
}
let scoreCI = (jumlahGigiCI !== 0) ? (jumlahNilaiCI / jumlahGigiCI) : 0;
document.getElementById('score_ci').value = scoreCI.toFixed(2);
calculateOHIS();
}
function calculateOHIS() {
let scoreDI = parseFloat(document.getElementById('score_di').value);
let scoreCI = parseFloat(document.getElementById('score_ci').value);
let kriteriaOHIS = scoreDI + scoreCI;
document.getElementById('nilai_kriteria_ohis').value = kriteriaOHIS.toFixed(2);
let elem = document.getElementById('kriteria_ohis');
if (kriteriaOHIS >= 0 && kriteriaOHIS <= 1.2) {
elem.value = 'Baik';
elem.style.backgroundColor = 'green';
} else if (kriteriaOHIS > 1.2 && kriteriaOHIS <= 3.0) {
elem.value = 'Sedang';
elem.style.backgroundColor = 'yellow';
} else if (kriteriaOHIS > 3.0) {
elem.value = 'Buruk';
elem.style.backgroundColor = 'red';
}
}
3. Plaque Score (Eksplakkal)
function hitungPlak() {
var jumlahPlak = $("#plak").val().length;
var jumlahPermukaan = parseInt($("#jumlah_permukaan").val()) || 0;
var jumlahTidakPlak = jumlahPermukaan - jumlahPlak;
var plaqueScore = (jumlahTidakPlak / jumlahPermukaan) * 100 || 0;
$("#jumlah_plak").val(jumlahPlak);
$("#jumlah_tidak_plak").val(jumlahTidakPlak);
$("#plaque_score").val(plaqueScore.toFixed(2));
if (plaqueScore >= 85) {
$("#kriteria").val('Baik')
.removeClass('bg-danger').addClass('bg-success');
} else {
$("#kriteria").val('Buruk')
.removeClass('bg-success').addClass('bg-danger');
}
}
$("#plak").on('change', hitungPlak);
$("#jumlah_permukaan").on('input', hitungPlak);
š” Implementation:
Client-side (JS) for instant feedback, validated server-side (Laravel) before persistence. Results stored as computed columns for efficient reporting.