AttendEase
Smart Attendance Management
New here? Register on our website →
Forgot password?
AttendEase
Synced
0 Classes
0 Students
0 Sessions
-
{ const baseAmount = fd.amount || 0; // Check per-student discount const discount = ((fd.discounts || {})[s.id] || {}).amount || 0; const payable = Math.max(0, baseAmount - discount); // Get payment record for latest period const rec = ((fd.periods[latestPeriod] || {})[s.id] || { paid:0, status:'unpaid' }); const paid = rec.paid || 0; const pending = Math.max(0, payable - paid); const balance = pending; if (pending > 0) { classPending += pending; unpaidCount++; } // Status let status = 'unpaid'; if (paid >= payable && payable > 0) status = 'paid'; else if (paid > 0) status = 'partial'; const sc = feeStatusColor(status); // Discount badge const discBadge = discount > 0 ? '-\u20b9'+discount+' disc ' : ''; // Action buttons const payBtn = status !== 'paid' ? '' : ''; const editBtn = ''; const waBtn = (status !== 'paid' && s.phone) ? '' : ''; return '
' + '
' + '
' + '
'+esc(s.name)+'
' + '
' + ''+sc.label+'' + discBadge + '
' + '
' + '
' + payBtn + editBtn + waBtn + '
' + '
' + '
' + '
' + '
Payable
' + '
\u20b9'+payable.toLocaleString('en-IN')+'
' + '
' + '
' + '
Paid
' + '
\u20b9'+paid.toLocaleString('en-IN')+'
' + '
' + '
' + '
Pending
' + '
\u20b9'+balance.toLocaleString('en-IN')+'
' + '
' + '
' + '
'; }).join(''); if (totalPendEl) totalPendEl.textContent = '\u20b9' + classPending.toLocaleString('en-IN'); if (unpaidStudEl) unpaidStudEl.textContent = unpaidCount; } from "https://www.gstatic.com/firebasejs/10.12.0/firebase-app.js"; import { getFirestore, doc, setDoc, getDoc, onSnapshot } from "https://www.gstatic.com/firebasejs/10.12.0/firebase-firestore.js"; const firebaseConfig = { apiKey: "AIzaSyAFBMNLCmaJ5nAncAES4TgFD8AElz9v_Do", authDomain: "studio-7145327424-a9cea.firebaseapp.com", projectId: "studio-7145327424-a9cea", storageBucket: "studio-7145327424-a9cea.firebasestorage.app", messagingSenderId: "231784492072", appId: "1:231784492072:web:9898868110eae150fd991d" }; const app = initializeApp(firebaseConfig); const db = getFirestore(app); // ── FIRESTORE SYNC ──────────────────────────────────────────────────────────── // All data stored in a single Firestore document: attendease/data const DATA_REF = () => doc(db, 'attendease', 'data'); window.fsLoad = async function() { try { const snap = await getDoc(DATA_REF()); if (snap.exists()) return snap.data().payload ? JSON.parse(snap.data().payload) : null; return null; } catch(e) { console.error('Firestore load error:', e); return null; } }; window.fsSave = async function(data) { const payload = JSON.stringify(data); console.log('[AttendEase] Saving', payload.length, 'bytes...'); // Try up to 3 times for(let attempt = 1; attempt <= 3; attempt++){ try { await setDoc(DATA_REF(), { payload, updatedAt: Date.now() }); console.log('[AttendEase] Save OK on attempt', attempt); return true; } catch(e) { console.error('[AttendEase] Save attempt', attempt, 'failed:', e.code, e.message); if(attempt < 3) await new Promise(r => setTimeout(r, 1000 * attempt)); } } return false; }; // Real-time listener — syncs across devices automatically window.fsListen = function(callback) { return onSnapshot(DATA_REF(), (snap) => { if (snap.exists() && snap.data().payload) { try { callback(JSON.parse(snap.data().payload)); } catch(e) {} } }, (err) => console.warn('Listener error:', err)); }; // Signal app that Firebase is ready window._firebaseReady = true; document.dispatchEvent(new Event('firebase-ready'));
AttendEase
Smart Attendance Management
New here? Register on our website →
Forgot password?
AttendEase
Synced
0 Classes
0 Students
0 Sessions
-