`); printWindow.document.close(); }; const setupExpenseListener = (appId) => { const q = query(getRequestCollectionRef(appId), where('requesterEmail', '==', loggedInUser.email), where('type', '==', REQUEST_TYPE_KEY) ); onSnapshot(q, (snapshot) => { const listEl = safeGet('expense-list'); if (!listEl) return; listEl.innerHTML = ''; let pendingSum = 0; let completedSum = 0; let rejectedSum = 0; requestsCache = []; snapshot.forEach(doc => requestsCache.push({ id: doc.id, ...doc.data() })); requestsCache.sort((a,b) => (b.createdAt?.toMillis() || 0) - (a.createdAt?.toMillis() || 0)); if (requestsCache.length === 0) { listEl.innerHTML = `No expense history found.`; } else { requestsCache.forEach(r => { if (r.status === 'New' || r.status === 'In Progress' || r.status === 'Delegated') pendingSum += (r.totalAmount || 0); else if (r.status === 'Completed') completedSum += (r.totalAmount || 0); else if (r.status === 'Rejected') rejectedSum += (r.totalAmount || 0); let dateStr = '-'; if(r.lineItems && r.lineItems.length > 0) dateStr = r.lineItems[0].date; else if(r.reimburseDetails) dateStr = r.reimburseDetails.expenseDate; const statusClass = `status-${r.status.replace(/\s/g, '-')}`; let actionHtml = ` `; if (r.status === 'New' || r.status === 'In Progress') { actionHtml = `
${actionHtml}
`; } listEl.insertAdjacentHTML('beforeend', ` ${dateStr}

${r.title}

${r.lineItems ? r.lineItems.length + ' items' : '1 item'}

${r.lineItems ? r.lineItems.length : 1} ฿${(r.totalAmount || 0).toLocaleString()} ${r.status} ${actionHtml} `); }); } const statPending = safeGet('stat-pending'); if(statPending) statPending.textContent = `฿${pendingSum.toLocaleString()}`; const statCompleted = safeGet('stat-completed'); if(statCompleted) statCompleted.textContent = `฿${completedSum.toLocaleString()}`; const statRejected = safeGet('stat-rejected'); if(statRejected) statRejected.textContent = `฿${rejectedSum.toLocaleString()}`; }); }; const initFirebase = async () => { const firebaseConfig = { apiKey: "AIzaSyBnj6K5l36wcrZkXnOq1xNFyFeQO1tGitM", authDomain: "requests-triads.firebaseapp.com", projectId: "requests-triads", storageBucket: "requests-triads.firebasestorage.app", messagingSenderId: "549233593261", appId: "1:549233593261:web:d957f77823bbcaea00ef24", measurementId: "G-HEXKCZE5N2" }; app = initializeApp(firebaseConfig); db = getFirestore(app); auth = getAuth(app); document.getElementById('google-sign-in-btn')?.addEventListener('click', async () => { try { await signInWithPopup(auth, new GoogleAuthProvider()); } catch (e) { alert(e.message); } }); document.getElementById('logout-btn')?.addEventListener('click', () => signOut(auth)); onAuthStateChanged(auth, async (user) => { // BYPASS LOGIN DEV CONFIG const isLocalhost = window.location.hostname === "localhost" || window.location.hostname === "127.0.0.1"; if (localStorage.getItem("bypassLogin") === "true" && isLocalhost) { user = { email: "[email protected]", displayName: "Developer Bypass", uid: "bypass-123", photoURL: "https://placehold.co/40x40/FF6633/FFFFFF?text=Dev" }; } if (user && user.email.endsWith(ALLOWED_DOMAIN)) { const lastActive = localStorage.getItem("sessionLastActive"); const now = Date.now(); if (lastActive && (now - parseInt(lastActive)) > 24 * 60 * 60 * 1000) { localStorage.removeItem("sessionLastActive"); if(auth.currentUser) await signOut(auth); window.location.reload(); return; } localStorage.setItem("sessionLastActive", now); safeClassAdd('login-screen', 'hidden'); const header = safeGet('floating-header'); if(header) header.style.display = 'flex'; safeClassRemove('main-ui', 'hidden'); safeClassRemove('mobile-bottom-nav', 'hidden'); const p = (await getDoc(doc(db, `artifacts/${GLOBAL_APP_ID}/public/data/users_profile/${user.email}`))).data() || {}; loggedInUser = { ...user, ...p, uid: user.uid, email: user.email }; isManagementUser = loggedInUser.team === 'Management'; if(isManagementUser) safeClassRemove('management-dropdown-wrapper', 'hidden'); const btn = safeGet('nav-management'); const menu = safeGet('management-dropdown-menu'); if(btn && menu) { btn.addEventListener('mouseenter', () => menu.classList.remove('hidden')); btn.parentElement.addEventListener('mouseleave', () => setTimeout(() => menu.classList.add('hidden'), 300)); } const nameDisplay = safeGet('header-name-display'); if(nameDisplay) nameDisplay.textContent = loggedInUser.fullname || user.displayName; const roleDisplay = safeGet('header-role-display'); if(roleDisplay) roleDisplay.textContent = p.team || ''; const avatar = safeGet('user-avatar'); if(avatar) avatar.src = user.photoURL; await loadAllUsers(GLOBAL_APP_ID); setupExpenseListener(GLOBAL_APP_ID); } else { if(user) await signOut(auth); safeClassRemove('login-screen', 'hidden'); } }); }; window.onload = initFirebase;