❄️ Sistem Servis AC

Portal Pelanggan

Scan QR Code pada unit AC Anda untuk melihat riwayat perawatan dan jadwal servis berikutnya.

ATAU MASUKKAN ID MANUAL

Status Unit:

Estimasi Servis Berikutnya:

Riwayat Servis Terakhir

TanggalStatus / Keterangan

Otorisasi Akses

Silakan masuk menggunakan akun Staff atau Teknisi Anda.

Dashboard Admin

Selamat datang,

Daftarkan Pelanggan Baru

QR Code Berhasil Dibuat

Silakan simpan atau cetak QR Code ini.

Total Omzet:

Rp 0

Laporan Pengerjaan

AC & TanggalTeknisiPengerjaan & PartBiayaAksi

Daftar Akun Teknisi

Nama LengkapUsernameStatus

Panel Teknisi

Operator:

Pilih Target Unit

ATAU INPUT ID MANUAL

ID:

Pelanggan:

()

Form Laporan Pengerjaan

⚠️ Maksimal pilih 5 foto saja!

Riwayat Sebelumnya

TanggalPengerjaan & Biaya
Notifikasi
Scroll to Top
`); printWindow.document.close(); } function loadAllHistoriAdmin(){ showToast("Memuat laporan terbaru..."); callAPI("getAllHistori", {}).then(res=> { if(res.status==="success"){ const tbody=document.getElementById("table-all-histori"); tbody.innerHTML=""; let totalOmzet=0; res.data.forEach(item=> { totalOmzet +=parseInt(item.biaya)||0; const acData=res.ac ? res.ac.find(a=> a.id_ac===item.id_ac):dummyDB.ac.find(a=> a.id_ac===item.id_ac); const waNumber=acData ? acData.wa:""; const waText=encodeURIComponent(`Halo, ini pengingat dari Jasa Servis AC. Berdasarkan data kami, AC Anda (ID: ${item.id_ac}) sudah masuk jadwal servis pada ${item.next_service}. Apakah ingin dijadwalkan teknisi?`); const waLink=waNumber ? `💬 Ingatkan WA`:"-"; tbody.innerHTML +=` ${item.id_ac}
${item.tanggal} ${item.teknisi} ${item.laporan}
Part: ${item.sparepart} ${item.foto&&item.foto!=="-" ? `
✓ Ada Foto (Cek Sheet)`:''} Rp ${item.biaya.toLocaleString('id-ID')} ${waLink} `; }); document.getElementById("lbl-total-omzet").innerText=totalOmzet.toLocaleString('id-ID'); }}); } function renderTeknisiAdmin(){ showToast("Memuat daftar teknisi..."); callAPI("getAllUsers", {}).then(res=> { if(res.status==="success"){ const tbody=document.getElementById("table-teknisi-admin"); tbody.innerHTML=""; const teknisiList=res.data.filter(u=> u.role==='teknisi'); teknisiList.forEach(t=> { tbody.innerHTML +=`${t.nama}${t.username}Aktif`; }); }}); } function startScanner(context){ const targetDiv=context==='public' ? 'reader-public':'reader-teknisi'; if(html5QrcodeScanner){ html5QrcodeScanner.clear(); } html5QrcodeScanner=new Html5QrcodeScanner( targetDiv, { fps: 10, qrbox: {width: 250, height: 250}, videoConstraints: { facingMode: "environment" }}, false ); html5QrcodeScanner.render((decodedText)=> { if(context==='public'){ document.getElementById("manual-ac-id-public").value=decodedText; cekHistoriPublic(decodedText); }else{ document.getElementById("manual-ac-id-teknisi").value=decodedText; cekDetailACTeknisi(decodedText); }}, (errorMessage)=> { }); } function stopScanner(){ if(html5QrcodeScanner){ html5QrcodeScanner.clear(); html5QrcodeScanner=null; }} function scanImage(input, context){ if(input.files&&input.files.length > 0){ stopScanner(); showToast("Sedang membaca QR Code dari gambar..."); const file=input.files[0]; const readerId="reader-" + context; const html5QrCode=new Html5Qrcode(readerId); html5QrCode.scanFile(file, true) .then(decodedText=> { showToast("QR Berhasil terbaca!"); if(context==='public'){ document.getElementById("manual-ac-id-public").value=decodedText; cekHistoriPublic(decodedText); }else{ document.getElementById("manual-ac-id-teknisi").value=decodedText; cekDetailACTeknisi(decodedText); } input.value=""; }) .catch(err=> { showToast("Gagal membaca QR Code dari gambar. Pastikan gambar jelas."); input.value=""; }); }}