TMC Clinic · Staff Access
🔒 Staff Tools — Access Restricted
Session aktif selama tab terbuka.
Auto-lock setelah 30 menit tidak aktif.
Dashboard
👥
0
Total Pasien
Belum ada data
💉
0
Total Treatment
Semua waktu
💰
0
Revenue (juta Rp)
Total semua
🎁
0
Diskon Aktif
Kelipatan ke-3
Aktivitas Terbaru
Pasien Paket Area Tanggal Total Status
📋
Belum ada treatment tercatat
Perlu Follow-up Segera
🔔
Tidak ada follow-up tertunda
💡 Data tersimpan otomatis di browser. Export CSV untuk backup ke spreadsheet/Excel.
Pasien WA Paket Terakhir Visit Total Spent Status Aksi
👥
Belum ada pasien
Klik "+ Tambah" untuk daftarkan pasien pertama

Daftar pasien yang perlu di-follow up — sudah 7+ hari sejak treatment terakhir dan belum booking lagi. Klik "Kirim WA" untuk membuka pesan yang sudah siap dikirim.

Health card generated otomatis untuk setiap pasien. Bisa di-screenshot atau diprint untuk diberikan ke pasien.

// ═══════════════════════════════════════════════════ // URL IMPORT — ?import=base64data from booking form // ═══════════════════════════════════════════════════ (function() { var params = new URLSearchParams(window.location.search); var importData = params.get('import'); if (!importData) return; document.addEventListener('DOMContentLoaded', function() { // Wait for unlock before importing function tryImport() { try { var decoded = decodeURIComponent(escape(atob(importData))); var p = JSON.parse(decoded); if (!p || !p.name || !p.wa) { showImportResult('error', 'Data tidak valid. Coba lagi dari booking form.'); return; } var patients = loadData(); var today = p.date || new Date().toISOString().slice(0,10); var basePrice = parseInt(p.price, 10) || 0; // Check if patient already exists by WA var cleanWA = (p.wa || '').replace(/\D/g, ''); var existingIdx = patients.findIndex(function(x) { return x.wa && x.wa.replace(/\D/g,'') === cleanWA && cleanWA.length >= 8; }); var patientId, isNew; if (existingIdx !== -1) { // Returning patient — add treatment var ex = patients[existingIdx]; var visitN = ex.treatments.length + 1; var disc = visitN > 0 && visitN % 3 === 0; if (p.package && today) { ex.treatments.push({ id: 't-' + Date.now(), package: p.package, basePrice: basePrice, pricePaid: disc ? Math.round(basePrice * 0.9) : basePrice, discount: disc, date: today, doctor: 'BGC Team', notes: p.notes || '', visitNum: visitN }); } ex.updatedAt = new Date().toISOString(); if (p.hotel) ex.hotel = p.hotel; if (p.area) ex.area = p.area; patients[existingIdx] = ex; patientId = ex.id; isNew = false; } else { // New patient patientId = p.id || ('BGC-' + Date.now().toString(36).toUpperCase()); patients.unshift({ id: patientId, name: p.name, age: parseInt(p.age, 10) || 0, nationality: p.nationality || '', wa: p.wa, hotel: p.hotel || '', area: p.area || '', allergy: p.allergy || '', medical: p.medical || '', notes: p.notes || '', treatments: (p.package && today) ? [{ id: 't-' + Date.now(), package: p.package, basePrice: basePrice, pricePaid: basePrice, discount: false, date: today, doctor: 'BGC Team', notes: p.notes || '', visitNum: 1 }] : [], createdAt: new Date().toISOString(), updatedAt: new Date().toISOString() }); isNew = true; } localStorage.setItem('bgc_patients_v3', JSON.stringify(patients)); // Show success banner showImportResult('success', (isNew ? '✅ Pasien baru ditambahkan: ' : '🔄 Treatment ditambahkan ke: ') + p.name + ' (' + patientId + ')' ); // Remove ?import from URL so refresh doesn't re-import window.history.replaceState({}, document.title, window.location.pathname); // Re-render if cards are visible if (typeof renderCards === 'function') setTimeout(renderCards, 300); } catch(e) { showImportResult('error', '❌ Import gagal: ' + e.message); } } function showImportResult(type, msg) { var banner = document.getElementById('importResultBanner'); if (!banner) { banner = document.createElement('div'); banner.id = 'importResultBanner'; banner.style.cssText = 'position:fixed;top:70px;left:50%;transform:translateX(-50%);z-index:9999;padding:12px 22px;border-radius:12px;font-size:14px;font-weight:600;box-shadow:0 4px 20px rgba(0,0,0,.3);max-width:90vw;text-align:center;'; document.body.appendChild(banner); } if (type === 'success') { banner.style.background = 'linear-gradient(135deg,#0d9488,#22c97a)'; banner.style.color = '#fff'; } else { banner.style.background = 'linear-gradient(135deg,#dc2626,#ef4444)'; banner.style.color = '#fff'; } banner.textContent = msg; banner.style.display = 'block'; setTimeout(function() { banner.style.display = 'none'; }, 5000); } // If already unlocked, import immediately // Otherwise wait for unlock event var checkInterval = setInterval(function() { var unlockBtn = document.querySelector('.lock-screen'); // Check if lock screen is hidden (user is unlocked) if (!unlockBtn || window.getComputedStyle(unlockBtn).display === 'none') { clearInterval(checkInterval); tryImport(); } }, 500); // Fallback: try after 3 seconds anyway setTimeout(function() { clearInterval(checkInterval); tryImport(); }, 3000); }); })();