Dashboard Ringkasan
Statistik operasional CCTV, Access Control, dan Sistem POS
Total Klien
0
Total Teknisi
0
Riwayat Servis
0
Jadwal Aktif
0
Garansi Habis
0
Jadwal Kunjungan Terdekat
Riwayat Servis Terkini
| Nama Klien & Lokasi | Kategori Unit | Spesifikasi Unit Terpasang | Garansi & Pasang | Kontak / Maps | Aksi |
|---|
Tidak ada data klien yang cocok dengan pencarian.
Pengajuan & Pelacakan Tiket Servis
Klien dapat mengisi formulir keluhan kunjungan servis, memantau tahapan penanganan secara langsung (*real-time*), dan menerima pemberitahuan otomatis via WhatsApp saat servis selesai.
Total Pendapatan Servis
Rp 0
Servis Berbayar
0 Transaksi
Klaim Garansi (Rp 0)
0 Klaim
Rata-rata Biaya Servis
Rp 0
Kontribusi & Rekap Finansial per Teknisi
| Nama Teknisi | Total Servis | Pendapatan Servis |
|---|
Rekapitulasi per Kategori Sistem
| Kategori Sistem | Jumlah Klien | Total Pengerjaan Servis |
|---|
Rincian Seluruh Transaksi Servis & Pemeliharaan
0 Data Ditampilkan| Tanggal / Kode | Nama Klien | Teknisi | Kendala & Perbaikan | Garansi / Berbayar | Biaya (Rp) |
|---|
Petunjuk Menghubungkan ke Google Sheets via Apps Script
Gunakan Google Sheets sebagai database online terpusat tanpa biaya server
Buat Google Spreadsheet
Buka Google Drive Anda, buat spreadsheet baru bernama HDSCreative_DB dengan 4 lembar tab: Klien, Teknisi, Servis, dan Jadwal.
Buka Script Editor
Klik menu Extensions (Ekstensi) > Apps Script. Hapus isi file Code.gs lalu salin kode di bawah ini ke dalamnya.
Deploy Sebagai Web App
Klik Deploy > New Deployment, pilih tipe Web App, set akses Anyone (Siapa saja), lalu salin URL Web App yang dihasilkan.
function doGet(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var clientsSheet = ss.getSheetByName("Klien") || ss.insertSheet("Klien");
var techSheet = ss.getSheetByName("Teknisi") || ss.insertSheet("Teknisi");
var servicesSheet = ss.getSheetByName("Servis") || ss.insertSheet("Servis");
var schedulesSheet = ss.getSheetByName("Jadwal") || ss.insertSheet("Jadwal");
var result = {
clients: clientsSheet.getDataRange().getValues(),
technicians: techSheet.getDataRange().getValues(),
services: servicesSheet.getDataRange().getValues(),
schedules: schedulesSheet.getDataRange().getValues()
};
return ContentService.createTextOutput(JSON.stringify(result)).setMimeType(ContentService.MimeType.JSON);
}
function doPost(e) {
var params = JSON.parse(e.postData.contents);
var action = params.action;
var ss = SpreadsheetApp.getActiveSpreadsheet();
if (action === "save_client") {
var s = ss.getSheetByName("Klien") || ss.insertSheet("Klien");
s.appendRow([params.id, params.name, params.category, params.phone, params.address, params.mapsUrl, params.deviceSpecs, params.installDate, params.warrantyEnd]);
} else if (action === "save_technician") {
var s = ss.getSheetByName("Teknisi") || ss.insertSheet("Teknisi");
s.appendRow([params.id, params.name, params.phone, params.skills, params.status]);
} else if (action === "save_service") {
var s = ss.getSheetByName("Servis") || ss.insertSheet("Servis");
s.appendRow([params.id, params.clientId, params.date, params.technician, params.issue, params.action, params.cost, params.warrantyStatus]);
} else if (action === "save_schedule") {
var s = ss.getSheetByName("Jadwal") || ss.insertSheet("Jadwal");
s.appendRow([params.id, params.clientId, params.date, params.technician, params.notes, params.status]);
}
return ContentService.createTextOutput(JSON.stringify({status: "success"})).setMimeType(ContentService.MimeType.JSON);
}