đŸ›ī¸ Anda sedang melihat laporan dalam Mod Paparan Sahaja (View-Only). Sila log masuk dengan akaun pentadbir untuk menambah atau menyunting data rasmi.
✓ âš ī¸ â„šī¸ ✕
{{ toast.message }}

{{ customAlert.title }}

{{ customAlert.message }}

{{ customConfirm.title }}

{{ customConfirm.message }}

Logo PPA KIAS
PPA KIAS

SISTEM LAPORAN FAIL KURSUS

Kolej Universiti Islam Antarabangsa Sultan Ismail Petra

{{ dbSettings.connected ? 'DB: Google Sheet Bersepadu' : 'Mod Tempatan' }}

Jumlah Pensyarah

{{ totalLecturers }} orang

Sesi {{ selectedSemester }}

Selesai Semua (100%)

{{ totalLengkap }} orang

Semua folder lengkap

Sedang Proses

{{ totalProgres }} orang

Hantar sebahagian folder

Belum Hantar Langsung

{{ totalBelum }} orang

Kosong (0% progres)

{{ editingLecturer ? 'Kemaskini Fail Kursus Pensyarah' : 'Masukkan Rekod Fail Kursus Baru' }}

Senarai Subjek / Kursus Yang Diajar

Senarai Semak Folder ({{ formData.senaraiKursus[activeFormCourseIndex].kodKursus || 'Subjek Ini' }})
{{ groupName }}
{{ item.desc }}

1. Analisis Kualiti Fail Mengikut Fakulti ({{ selectedSemester }})

No. Nama Fakulti / Pusat Pengajian Jum. Pensyarah Lengkap Semua Sedang Proses Belum Hantar Langsung Kadar Kelulusan (%) Tindakan
{{ idx + 1 }} {{ row.fakulti }} ({{ row.singkatan }}) {{ row.pensyarah }} {{ row.lengkap }} {{ row.tidakLengkap }} {{ row.belum }}
{{ getCompleteRate(row) }}%

2. Rekod Semakan Fail Kursus Staf Akademik

Senarai nama pensyarah berserta progres pemfailan bagi kesemua kursus yang diajar.

🔍
Bil. Pensyarah & Fakulti Pecahan Progres Fail Kursus Status Keseluruhan Tindakan
{{ index + 1 }}
{{ lecturer.nama }}
{{ lecturer.fakulti }}
{{ lecturer.jawatan }}
📚 KURSUS: {{ kursus.kodKursus }} Progres: {{ getCourseProgress(kursus) }}%
{{ f.label.replace('F', '') }}
Ulasan: {{ kursus.catatan }}
BELUM HANTAR SELESAI KESEMUA SEDANG PROSES ({{ countCompletedCourses(lecturer) }}/{{ lecturer.senaraiKursus.length }} Selesai)
Tiada rekod saringan dijumpai dalam pangkalan data.

📊 Import Laporan CSV Fail Kursus

Anda boleh mengemas kini senarai pensyarah dan subjek serentak menggunakan CSV atau tampal terus dari Excel.

📁

Muat Naik Fail Laporan (.csv)

Muat Turun Templat Data

Muat turun templat CSV untuk memasukkan senarai pensyarah dan subjek secara berkelompok.

Tampal Terus Sel Dari Excel:

â˜ī¸ Integrasi Pangkalan Data Awan

Konfigurasi API

Kod Google Apps Script

Backend.js
// Kod Apps Script Google Sheets Backend KIAS (Lengkap doGet dan doPost)
function doGet(e) {
  var action = e.parameter.action;
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  
  if (action === "loadAll") {
    var sessionSheet = ss.getSheetByName("SESI_AKADEMIK") || createSessionSheet(ss);
    var sessionRows = sessionSheet.getDataRange().getValues();
    var sessions = [];
    for (var i = 1; i < sessionRows.length; i++) {
      if (sessionRows[i][0]) sessions.push(sessionRows[i][0].toString().trim());
    }
    
    var jsonSheet = ss.getSheetByName("DATABASE_JSON") || ss.insertSheet("DATABASE_JSON");
    var jsonRows = jsonSheet.getDataRange().getValues();
    var payloadMap = {};
    for (var j = 1; j < jsonRows.length; j++) {
      if (jsonRows[j][0]) {
        payloadMap[jsonRows[j][0]] = JSON.parse(jsonRows[j][1]);
      }
    }
    
    var responseData = {
      academicSessions: sessions,
      payloadMap: payloadMap
    };
    
    return ContentService.createTextOutput(JSON.stringify({status: "success", data: responseData}))
      .setMimeType(ContentService.MimeType.JSON);
  }
  return ContentService.createTextOutput(JSON.stringify({status: "error", message: "Action tidak sah."}))
    .setMimeType(ContentService.MimeType.JSON);
}

function doPost(e) {
  try {
    var postData = JSON.parse(e.postData.contents);
    var action = postData.action;
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    
    if (action === "saveAll") {
      // Simpan Sesi Akademik
      var sessionSheet = ss.getSheetByName("SESI_AKADEMIK") || createSessionSheet(ss);
      sessionSheet.clear();
      sessionSheet.appendRow(["Sesi Akademik"]);
      var sessions = postData.academicSessions || [];
      sessions.forEach(function(s) {
        if (s) sessionSheet.appendRow([s]);
      });
      
      // Simpan Draf Payload JSON (Termasuk pautan Google Drive)
      var jsonSheet = ss.getSheetByName("DATABASE_JSON") || ss.insertSheet("DATABASE_JSON");
      jsonSheet.clear();
      jsonSheet.appendRow(["Sesi_Akademik", "Payload_JSON"]);
      
      var payloadMap = postData.payloadMap || {};
      Object.keys(payloadMap).forEach(function(sessionKey) {
        jsonSheet.appendRow([sessionKey, JSON.stringify(payloadMap[sessionKey])]);
      });
      
      return ContentService.createTextOutput(JSON.stringify({status: "success", message: "Data berjaya disimpan!"}))
        .setMimeType(ContentService.MimeType.JSON);
    }
    return ContentService.createTextOutput(JSON.stringify({status: "error", message: "Action tidak disokong."}))
      .setMimeType(ContentService.MimeType.JSON);
  } catch (err) {
    return ContentService.createTextOutput(JSON.stringify({status: "error", message: err.toString()}))
      .setMimeType(ContentService.MimeType.JSON);
  }
}

function createSessionSheet(ss) {
  var sheet = ss.insertSheet("SESI_AKADEMIK");
  sheet.appendRow(["Sesi Akademik"]);
  sheet.appendRow(["2025/2026 - SEM 2"]);
  sheet.appendRow(["2025/2026 - SEM 1"]);
  sheet.appendRow(["2024/2025 - SEM 2"]);
  sheet.appendRow(["2024/2025 - SEM 1"]);
  return sheet;
}
                                

Panduan Struktur Folder

{{ groupName }}

â€ĸ {{ item.desc }}

âš™ī¸ Urus Struktur Senarai Semak Folder Kualiti

Perhatian: Perubahan pada struktur folder ini akan terus diaplikasikan kepada semua senarai semak subjek pensyarah dalam Sesi Akademik Semasa ({{ selectedSemester }}).

📅 Pengurusan Sesi Akademik & Semester

Buka Sesi Semester Baru

Nota Pintar: Apabila anda mencipta sesi baharu, sistem akan mengklon (salin) senarai nama pensyarah dari semester semasa, tetapi mereset semua fail mereka kepada "Belum Hantar". Ini mempercepatkan kerja anda!

{{ sem }}

Tambah Fakulti / Pusat Baru

Ubah Maklumat Fakulti

🔐 Log Masuk Pentadbir PPA

``` eof ### Ringkasan Kemas kini Tambahan: - **Pengepalan Custom Apps Script**: Kod Google Apps Script telah dilengkapkan untuk menyokong kaedah `doPost` (untuk menyimpan `DATABASE_JSON` semula ke Google Sheet anda). Sila salin kod Apps Script dari Tab **Integrasi DB** sekiranya anda ingin mengemas kini backend di Google Drive anda. - **Sistem Tooltip Native & Responsif**: Menggunakan reka bentuk pure Tailwind CSS `group-hover:flex` yang dipacu secara pantas dan dinamik tanpa memperlahankan browser. Tooltip kini muncul serta-merta apabila tetikus diletakkan di atas petak folder di Dashboard.