Save
NH

NepalHub

Complete all-in-one shop management

Powered by NepalHub System

`; } function renderPOSHTML() { const t = translations[currentLang]; return `

${t.salesPOS}

NepalHub - Complete all-in-one shop management

Active
`; } function renderInventoryHTML() { const t = translations[currentLang]; return `
${t.stockTitle}
${inventory.length === 0 ? '

कुनै सामान थपिएको छैन।

' : inventory.map(i => `
${i.name}
रू ${i.price} | स्टक: ${i.stock}
${i.status || 'Available'}
`).join('')}
`; } function renderUdharoHTML() { const t = translations[currentLang]; return `
${t.udharoTitle} (${customers.length})
${customers.length === 0 ? '

कुनै उधारो खाता छैन।

' : customers.map(c => `
${c.name}
${c.phone || ''}
रू ${c.amount}
`).join('')}
`; } function renderSuppliersHTML() { return `
बिक्रेता सूची
${suppliers.map(s => `
${s.name}
${s.company_name} - ${s.phone}
`).join('')}
`; } function renderTaxAuditHTML() { const totalSales = sales.reduce((s, x) => s + x.total, 0); const totalExp = expenses.reduce((s, e) => s + e.amount, 0); return `

कर प्रणाली (VAT / PAN Mode)

कारोबार रिपोर्ट

रू ${totalSales}

${currentTaxMode==='PAN'?'अनुमानित आय कर':'अन्दाजी भ्याट (१३%)'}

रू ${currentTaxMode==='PAN'?((totalSales - totalExp)*0.25).toFixed(0):(totalSales*0.13).toFixed(0)}

`; } function renderFinanceHTML() { const t = translations[currentLang]; const totalIncome = personalTransactions.filter(i => i.type === 'income').reduce((sum, i) => sum + i.amount, 0); const totalExpense = personalTransactions.filter(i => i.type === 'expense').reduce((sum, i) => sum + i.amount, 0); const totalSavings = personalTransactions.filter(i => i.type === 'savings').reduce((sum, i) => sum + i.amount, 0); const netBalance = totalIncome - totalExpense; return `

${t.finance}

${t.income}

रू${totalIncome}

${t.expense}

रू${totalExpense}

${t.savings}

रू${totalSavings}

${t.netBalance}

रू${netBalance}

`; } function renderCalendarHTML() { const t = translations[currentLang]; return `

क्यालेन्डर

आइड सोम मंगल बुध बिही शुक्र शनि
`; } function renderMediaHTML() { return `

मिडिया र फोटो ग्यालरी

यहाँ पसलका सामान तथा बिलका फोटोहरू राखिन्छन्।

`; } function renderSettingsHTML() { return `

सेटिङ्ग (Settings & Preferences)

Font Settings

Font Style

पसल विवरण

`; } function toggleLanguage() { currentLang = currentLang === 'np' ? 'en' : 'np'; localStorage.setItem('nepalhub_lang', currentLang); updateLanguageUI(); renderApp(); } function updateLanguageUI() { const btn = document.getElementById('lang-toggle-btn'); if(btn) btn.innerText = currentLang === 'np' ? 'English' : 'नेपाली'; } function toggleTheme() { currentTheme = currentTheme === 'dark' ? 'light' : 'dark'; localStorage.setItem('nepalhub_theme', currentTheme); applyTheme(); } function applyTheme() { const body = document.body; const container = document.getElementById('dashboard-container'); const themeBtn = document.getElementById('theme-toggle-btn'); if (currentTheme === 'light') { body.className = "bg-slate-200 text-slate-900 min-h-screen flex flex-col items-center justify-start selection:bg-teal-500 selection:text-slate-900 font-sans-nepali transition-colors duration-300"; if(container) container.className = "w-full max-w-md min-h-screen bg-slate-100 border-x border-slate-300 shadow-2xl flex flex-col relative pb-24 transition-colors duration-300 text-slate-900"; if(themeBtn) themeBtn.innerHTML = ``; } else { body.className = "bg-[#0b0f19] text-slate-100 min-h-screen flex flex-col items-center justify-start selection:bg-teal-500 selection:text-slate-900 font-sans-nepali transition-colors duration-300"; if(container) container.className = "w-full max-w-md min-h-screen bg-[#0d1322] border-x border-slate-800/60 shadow-2xl flex flex-col relative pb-24 transition-colors duration-300 text-slate-100"; if(themeBtn) themeBtn.innerHTML = ``; } lucide.createIcons(); } function saveShopProfile(event) { event.preventDefault(); const profileData = { shopName: document.getElementById('shopName').value, ownerName: document.getElementById('ownerName').value }; localStorage.setItem('shopProfile', JSON.stringify(profileData)); storeData = profileData; updateStoreInfoUI(); showToast('सफलतापूर्वक सेभ भयो!'); } function loadShopProfile() { const savedData = localStorage.getItem('shopProfile'); if (savedData) { const profile = JSON.parse(savedData); storeData = profile; if(document.getElementById('shopName')) { document.getElementById('shopName').value = profile.shopName || ''; document.getElementById('ownerName').value = profile.ownerName || ''; } } } function updateStoreInfoUI() { const shopNameEl = document.getElementById('header-shop-name'); const ownerNameEl = document.getElementById('header-owner-name'); const t = translations[currentLang]; if(shopNameEl) shopNameEl.innerText = storeData.shopName || "NepalHub"; if(ownerNameEl) ownerNameEl.innerText = `${t.ownerLabel}${storeData.ownerName || 'Kamal'}`; } function setRole(role) { userRole = role; const ownerBtn = document.getElementById('role-owner'); const staffBtn = document.getElementById('role-staff'); if (ownerBtn && staffBtn) { if (role === 'मालिक') { ownerBtn.className = "px-3 py-1 rounded-lg bg-slate-800 text-cyan-300 border border-slate-700 font-bold shadow"; staffBtn.className = "px-3 py-1 rounded-lg text-slate-400 transition"; } else { staffBtn.className = "px-3 py-1 rounded-lg bg-slate-800 text-cyan-300 border border-slate-700 font-bold shadow"; ownerBtn.className = "px-3 py-1 rounded-lg text-slate-400 transition"; } } } function changeFontStyle(fontClass) { currentFontClass = fontClass; document.body.className = document.body.className.replace(/font-\S+/g, '') + ' ' + fontClass; showToast('Font Style Updated!'); } function setTaxMode(mode) { currentTaxMode = mode; renderApp(); } function setPayment(method) { selectedPaymentMethod = method; ['cash', 'qr', 'udharo'].forEach(m => { const btn = document.getElementById(`btn-${m}`); if (btn) { btn.className = m === method ? "py-2.5 rounded-xl bg-cyan-500 text-slate-950 font-bold text-xs shadow-md" : "py-2.5 rounded-xl bg-[#131b2e] text-slate-300 border border-slate-800 font-bold text-xs"; } }); } function completeSale() { const item = document.getElementById('pos-item').value; const total = parseFloat(document.getElementById('pos-amount').value); if(!item || isNaN(total)) return showToast('विवरण सही भर्नुहोस्!'); sales.push({ item, total, payment_method: selectedPaymentMethod, created_at: new Date().toISOString() }); localStorage.setItem('nepalhub_sales', JSON.stringify(sales)); showToast('बिक्री सफल भयो!'); switchPage('home'); } function addItem() { const name = prompt('सामानको नाम लेख्नुहोस्:'); if(!name) return; const price = parseFloat(prompt('मूल्य (रू):')) || 0; const stock = prompt('मात्रा (उदा: १० पिस / बोरा):') || '१'; inventory.unshift({ id: String(Date.now()), name, price, stock, status: 'Available', statusClass: 'bg-emerald-500/20 text-emerald-400 border-emerald-500/30' }); localStorage.setItem('nepalhub_inventory', JSON.stringify(inventory)); renderApp(); } function addCustomer() { const name = prompt('ग्राहकको नाम:'); if(!name) return; const phone = prompt('फोन नम्बर:') || '9800000000'; const amount = parseFloat(prompt('उधारो रकम (रू):')) || 0; customers.unshift({ id: String(Date.now()), name, phone, amount }); localStorage.setItem('nepalhub_customers', JSON.stringify(customers)); renderApp(); } function addSupplier() { const name = prompt('बिक्रेताको नाम:'); if(!name) return; suppliers.unshift({ id: String(Date.now()), name, company_name: 'होलसेल', phone: '9800000000' }); localStorage.setItem('nepalhub_suppliers', JSON.stringify(suppliers)); renderApp(); } function savePersonalTransaction() { const title = document.getElementById('fin-title').value; const amount = parseFloat(document.getElementById('fin-amount').value); const note = document.getElementById('fin-note').value; if (!title || isNaN(amount)) { showToast('कृपया शीर्षक र रकम सही भर्नुहोस्!'); return; } personalTransactions.unshift({ id: String(Date.now()), type: personalFinanceType, title, amount, note, date: new Date().toLocaleDateString() }); localStorage.setItem('nepalhub_personal_finance', JSON.stringify(personalTransactions)); showToast('सफलतापूर्वक सेभ भयो!'); renderApp(); } let calcDisplay = '0', calcPrev = '', calcOpSign = '', resetNext = false; function toggleCalculator(show) { const modal = document.getElementById('calculator-modal'); if (modal) modal.classList.toggle('hidden', !show); } function calcDigit(d) { if (resetNext) { calcDisplay = d === '.' ? '0.' : d; resetNext = false; } else { if (d === '.' && calcDisplay.includes('.')) return; calcDisplay = calcDisplay === '0' && d !== '.' ? d : calcDisplay + d; } updateCalcUI(); } function calcOp(op) { calcPrev = calcDisplay; calcOpSign = op; resetNext = true; updateCalcUI(); } function calcEquals() { if (!calcOpSign || !calcPrev) return; let a = parseFloat(calcPrev), b = parseFloat(calcDisplay), res = 0; if (calcOpSign === '+') res = a + b; if (calcOpSign === '-') res = a - b; if (calcOpSign === '×') res = a * b; if (calcOpSign === '÷') res = b !== 0 ? a / b : 0; if (calcOpSign === '%') res = (a * b) / 100; calcDisplay = parseFloat(res.toFixed(8)).toString(); calcPrev = ''; calcOpSign = ''; resetNext = true; updateCalcUI(); } function calcClear() { calcDisplay = '0'; calcPrev = ''; calcOpSign = ''; resetNext = false; updateCalcUI(); } function calcBack() { if (resetNext) return; calcDisplay = calcDisplay.length > 1 ? calcDisplay.slice(0, -1) : '0'; updateCalcUI(); } function calcSign() { if (calcDisplay === '0') return; calcDisplay = String(-parseFloat(calcDisplay)); updateCalcUI(); } function updateCalcUI() { const displayEl = document.getElementById('calc-display'); const prevEl = document.getElementById('calc-prev'); if (displayEl) displayEl.innerText = calcDisplay; if (prevEl) prevEl.innerText = calcPrev && calcOpSign ? `${calcPrev} ${calcOpSign}` : ''; } function toggleNotifications() { document.getElementById('notificationPanel').classList.toggle('hidden'); } function makeCall() { alert("सम्पर्क नम्बर डायल गरिँदैछ..."); } function initLiveDateTime() { function update() { const now = new Date(); let h = now.getHours(), m = now.getMinutes().toString().padStart(2, '0'); let ampm = h >= 12 ? 'PM' : 'AM'; h = h % 12 || 12; const timeEl = document.getElementById('live-time'); if (timeEl) timeEl.innerText = `🕒 ${h}:${m} ${ampm}`; try { const nepaliDate = new NepaliDate(now); const monthsNepali = ["बैशाख", "जेठ", "आषाढ", "श्रावण", "भाद्र", "आश्विन", "कार्तिक", "मंसिर", "पौष", "माघ", "फाल्गुन", "चैत्र"]; const y = nepaliDate.getYear(); const mName = monthsNepali[nepaliDate.getMonth()]; const d = nepaliDate.getDate(); const dateEl = document.getElementById('live-nepali-date'); if (dateEl) dateEl.innerText = `📅 ${y} ${mName} ${d}`; } catch (err) {} } update(); setInterval(update, 1000); } function initGeolocationAndWeather() { const locEl = document.getElementById('geo-location'); const weatherEl = document.getElementById('geo-weather'); if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(async (position) => { const lat = position.coords.latitude; const lon = position.coords.longitude; try { const res = await fetch(`https://nominatim.openstreetmap.org/reverse?format=json&lat=${lat}&lon=${lon}`); const data = await res.json(); const city = data.address.city || data.address.town || data.address.state || "नेपाल"; if (locEl) locEl.innerHTML = ` ${city}`; } catch (e) {} try { const res = await fetch(`https://api.open-meteo.com/v1/forecast?latitude=${lat}&longitude=${lon}¤t_weather=true`); const weatherData = await res.json(); const temp = weatherData.current_weather.temperature; if (weatherEl) weatherEl.innerHTML = ` ${temp}°C`; } catch (e) {} lucide.createIcons(); }, () => {}); } }