← Website
🌐
🌙
🔔
0
Swift Deliveries
Enterprise Console
متصل
أحدث النشاط
ملخص سريع
`; const w = window.open('', '_blank', 'width=420,height=620'); w.document.write(html); w.document.close(); w.focus(); setTimeout(()=>w.print(), 300); } /* ============================= PAYMENTS ============================== */ function paymentsHTML(){ const list = filteredByRole(payments_data,'payments'); return `
سجل المدفوعات
${list.map(p=>` `).join('')}
الرقمرقم الطلبطريقة الدفعالحالةالمبلغ الصافيالتاريخالإجراء
${p.id} ${p.order} ${p.method||'—'} ${p.status==='مدفوع' ? `مدفوع` : `معلق`} ${toMoney(p.amount)} ${p.date||'—'} ${canAdmin() ? (p.status!=='مدفوع' ? `` : ``) : `` }
`; } function markPaymentPaid(paymentId){ if(!canAdmin()) return showToast('غير مسموح'); const p = payments_data.find(x=>x.id===paymentId); if(!p) return showToast('غير موجود'); p.status='مدفوع'; persist(); showToast('تم اعتماد الدفع كمدفوع'); renderPage(); setTimeout(cleanupCustomerPortalLanguage, 0); } /* ============================= RETURNS ============================== */ function returnsHTML(){ const list = filteredByRole(returns_data,'returns'); return `
سجل المرتجعات
${list.map(r=>` `).join('')}
رقمطلبسببحالةإثباتمبلغ (صافي)تاريخ
${r.id} ${r.order} ${r.reason||'—'} ${r.status||'—'} ${r.proofImage ? `عرض` : '—'} ${toMoney(r.amount)} ${r.date||'—'}
`; } /* ============================= INVOICES (multi-orders supported) ============================== */ function invoicesHTML(){ recomputeCustomerDues(); persist(); const list = filteredByRole(invoices_data,'invoices'); const due = list.filter(i=>i.status==='مستحق').reduce((a,b)=>a+(Number(b.amount)||0),0); const paid = list.filter(i=>i.status==='مدفوع').reduce((a,b)=>a+(Number(b.amount)||0),0); return `
مستحق
${due.toLocaleString()} DH
مدفوع
${paid.toLocaleString()} DH
عدد الفواتير
${list.length}
المستحقات
${due.toLocaleString()} DH
${canAdmin()? `` : ``} ${canAdmin()? `` : ``}
`; } function renderInvoicesFiltered(){ const base = filteredByRole(invoices_data,'invoices'); const q = document.getElementById('if_q')?.value?.trim() || ''; const s = document.getElementById('if_s')?.value || 'all'; let list = [...base]; if(q){ list = list.filter(i => textIncludes(i.id,q) || textIncludes((i.orderIds||[]).join(','),q) || textIncludes(getCustomerName(i.customerId), q) || textIncludes(i.customerId,q) ); } if(s!=='all') list = list.filter(i=>i.status===s); const wrap=document.getElementById('invoicesTableWrap'); if(!wrap) return; const badgeMap = { 'مستحق':'prep', 'مدفوع':'done', 'ملغى':'ret' }; wrap.innerHTML = `
قائمة الفواتير ${list.length} فاتورة
${canAdmin()? ``:``} ${list.map(i=>` ${canAdmin()? ``:``} `).join('')}
رقمالحسابالطلبات عدد الإجمالي (صافي) التاريخ الحالة الإيصال إجراء
${i.id}${getCustomerName(i.customerId)}${(i.orderIds||[]).join(' , ')} ${(i.orderIds||[]).length} ${toMoney(i.amount)} ${i.date||'—'} ${i.status} ${i.receiptImage ? '✅' : '—'} ${canAdmin()? ``:``}
`; } function openInvoiceByOrder(orderId){ const o = orders.find(x=>x.id===orderId); if(!o) return showToast('الطلب غير موجود'); if(!canAdmin() && !rowBelongsToSession(o)) return showToast('غير مسموح'); if(o.status!=='مكتمل') return showToast('الفاتورة تظهر بعد تسليم الطلب (مكتمل)'); const inv = invoices_data.find(i => Array.isArray(i.orderIds) && i.orderIds.includes(orderId) && i.status!=='مل ى'); if(!inv){ ensureInvoiceForDeliveredOrder(o); const inv2 = invoices_data.find(i => (i.orderIds||[]).includes(orderId) && i.status!=='ملغى'); if(!inv2) return showToast('تعذر إنشاء الفاتورة'); return openInvoice(inv2.id, canAdmin()); } openInvoice(inv.id, canAdmin()); } function closeInvoiceModal(){ document.getElementById('invoiceModal').classList.remove('open'); } function openInvoice(invoiceId, editable=false){ const inv = invoices_data.find(x=>x.id===invoiceId); if(!inv) return showToast('الفاتورة غير موجودة'); if(!canAdmin() && inv.customerId !== session.customerId){ showToast('غير مسموح'); return; } document.getElementById('invoiceModal').classList.add('open'); document.getElementById('invoiceModalTitle').textContent = editable && canAdmin() ? '✏️ تعديل فاتورة' : '🧾 تفاصيل الفاتورة'; document.getElementById('invoiceModalSub').textContent = `فاتورة: ${inv.id} • حساب: ${getCustomerName(inv.customerId)} • عدد الطلبات: ${(inv.orderIds||[]).length}`; document.getElementById('i_id').value = inv.id; document.getElementById('i_customerName').value = `${getCustomerName(inv.customerId)} — ${inv.customerId}`; document.getElementById('i_date').value = inv.date || nowISODate(); document.getElementById('i_amount').value = Number(inv.amount||0); document.getElementById('i_status').value = inv.status || 'مستحق'; document.getElementById('i_notes').value = inv.notes || ''; document.getElementById('i_count').value = (inv.orderIds||[]).length; const list = (inv.orderIds||[]).map(oid=>{ const o = orders.find(x=>x.id===oid); const net = Number(o?.net ?? ((o?.amount||0)-(o?.fee||0))); const fee = Number(o?.fee || 0); return `${oid} — تعريفة: ${fee.toLocaleString()} DH — صافي: ${net.toLocaleString()} DH`; }).join('
'); document.getElementById('i_ordersList').innerHTML = list || '—'; const preview = document.getElementById('i_receiptPreview'); const img = document.getElementById('i_receiptImg'); if(inv.receiptImage){ preview.style.display = 'block'; img.src = inv.receiptImage; } else { preview.style.display = 'none'; img.src = ''; } document.getElementById('i_receiptFile').value = ''; const readOnly = !(editable && canAdmin()); ['i_date','i_status','i_notes','i_receiptFile'].forEach(id=>{ const el=document.getElementById(id); if(!el) return; el.disabled = readOnly; if(el.tagName==='TEXTAREA') el.readOnly = readOnly; }); const footer = document.getElementById('invoiceModalFooter'); footer.innerHTML = ` ${canAdmin() && editable ? `` : ``} `; } function printInvoice(invoiceId){ const inv = invoices_data.find(x=>x.id===invoiceId); if(!inv) return showToast('الفاتورة غير موجودة'); if(!canAdmin() && inv.customerId !== session.customerId) return showToast('غير مسموح'); const rows = (inv.orderIds||[]).map(oid=>{ const o = orders.find(x=>x.id===oid); const fee = Number(o?.fee||0); const amount = Number(o?.amount||0); const net = Number(o?.net ?? Math.max(0, amount-fee)); return `${oid}${o?.client||'—'}${o?.city||'—'}${amount.toLocaleString()} DH${fee.toLocaleString()} DH${net.toLocaleString()} DH`; }).join(''); const w = window.open('', '_blank', 'width=900,height=700'); const html = ` فاتورة ${inv.id}
فاتورة
${inv.id}
الحساب: ${getCustomerName(inv.customerId)}
${inv.customerId}
التاريخ: ${inv.date||'—'}
الحالة: ${inv.status||'—'}
${rows}
الطلبالمستلمالمدينةالإجماليالتعريفةالصافي
المجموع الصافي: ${Number(inv.amount||0).toLocaleString()} DH
`; w.document.write(html); w.document.close(); w.focus(); w.print(); } function readFileAsDataURL(file){ return new Promise((resolve, reject)=>{ const r = new FileReader(); r.onload = ()=>resolve(String(r.result||'')); r.onerror = reject; r.readAsDataURL(file); }); } async function saveInvoice(invoiceId){ if(!canAdmin()) return showToast('غير مسموح'); const inv = invoices_data.find(x=>x.id===invoiceId); if(!inv) return showToast('الفاتورة غير موجودة'); const newDate = document.getElementById('i_date').value || nowISODate(); const newStatus = document.getElementById('i_status').value; const newNotes = document.getElementById('i_notes').value.trim(); const file = document.getElementById('i_receiptFile').files?.[0] || null; if(newStatus==='مدفوع'){ if(!inv.receiptImage && !file){ showToast('يجب رفع صورة الإيصال قبل اعتماد الفاتورة كـ "مدفوع"'); return; } } if(file){ const dataUrl = await readFileAsDataURL(file); inv.receiptImage = dataUrl; } inv.date = newDate; inv.status = newStatus; inv.notes = newNotes; recomputeCustomerDues(); persist(); closeInvoiceModal(); renderPage(); showToast('تم حفظ الفاتورة'); } /* ============================= MULTI INVOICE ============================== */ function openMultiInvoiceModal(){ if(!canAdmin()) return showToast('غير مسموح'); document.getElementById('multiInvoiceModal').classList.add('open'); const sel = document.getElementById('mi_customer'); sel.innerHTML = customers .filter(c=>c.active!==false) .map(c=>``) .join(''); document.getElementById('mi_date').value = nowISODate(); renderMultiInvoiceOrders(); } function closeMultiInvoiceModal(){ document.getElementById('multiInvoiceModal').classList.remove('open'); } function eligibleOrdersForMultiInvoice(customerId){ return orders.filter(o => o.customerId===customerId && o.status==='مكتمل' && !isOrderInAnyInvoice(o.id)); } function renderMultiInvoiceOrders(){ const customerId = document.getElementById('mi_customer').value; const wrap = document.getElementById('mi_orders'); const list = eligibleOrdersForMultiInvoice(customerId); if(list.length===0){ wrap.innerHTML = `
لا توجد طلبات مكتملة غير مفوترة لهذا الحساب.
`; document.getElementById('mi_total').value = '0 DH'; document.getElementById('mi_count').value = '0'; return; } wrap.innerHTML = list.map(o=>{ const net = Number(o.net ?? ((o.amount||0)-(o.fee||0))); return ` `; }).join(''); recalcMultiInvoiceTotals(); } function selectAllMultiInvoiceOrders(){ document.querySelectorAll('.mi_chk').forEach(ch=>ch.checked=true); recalcMultiInvoiceTotals(); } function recalcMultiInvoiceTotals(){ const customerId = document.getElementById('mi_customer').value; const checked = Array.from(document.querySelectorAll('.mi_chk:checked')).map(x=>x.value); const total = checked.reduce((sum, oid)=>{ const o = orders.find(x=>x.id===oid && x.customerId===customerId); const net = Number(o?.net ?? ((o?.amount||0)-(o?.fee||0))); return sum + (Number.isFinite(net)?net:0); },0); document.getElementById('mi_total').value = total.toLocaleString()+' DH'; document.getElementById('mi_count').value = String(checked.length); } function createMultiInvoice(){ if(!canAdmin()) return showToast('غير مسموح'); const customerId = document.getElementById('mi_customer').value; const date = document.getElementById('mi_date').value || nowISODate(); const orderIds = Array.from(document.querySelectorAll('.mi_chk:checked')).map(x=>x.value); if(orderIds.length < 2){ showToast('اختر طلبين على الأقل لإنشاء فاتورة متعددة'); return; } const eligible = new Set(eligibleOrdersForMultiInvoice(customerId).map(o=>o.id)); const bad = orderIds.find(id=>!eligible.has(id)); if(bad){ showToast('بعض الطلبات غير صالحة للفوترة المتعددة'); return; } const amount = orderIds.reduce((sum, oid)=>{ const o = orders.find(x=>x.id===oid); return sum + (Number(o?.net ?? ((o?.amount||0)-(o?.fee||0))) || 0); },0); const inv = { id: computeNextInvoiceId(), orderIds, customerId, amount, date, status:'مستحق', receiptImage:null, notes:'فاتورة مجمعة', issuedAt:new Date().toISOString() }; invoices_data.unshift(inv); recomputeCustomerDues(); persist(); closeMultiInvoiceModal(); showToast('تم إنشاء فاتورة متعددة'); setPage('invoices'); } /* ============================= CUSTOMERS (Admin activate/stop) ============================== */ function customersHTML(){ recomputeCustomerDues(); persist(); if(!canAdmin()){ return `${profileHTML()}`; } return `
`; } function renderCustomersFiltered(){ if(!canAdmin()) return; recomputeCustomerDues(); persist(); const q = document.getElementById('cf_q')?.value?.trim() || ''; let list = [...customers]; if(q){ list = list.filter(c => textIncludes(c.id,q) || textIncludes(c.name,q) || textIncludes(c.city,q) || textIncludes(c.phone,q)); } const wrap=document.getElementById('customersTableWrap'); if(!wrap) return; wrap.innerHTML = `
قائمة العملاء ${list.length} عميل
${list.map(c=>{ const dues = Number(c.dues||0); const net = customerNetBalance(c.id); return ` `; }).join('')}
IDالاسماسم المتجرهاتف صاحب المتجرالمدينةنشط الرصيد الكليالمستحقاتالرصيد الصافيإجراء
${c.id} ${c.name||'—'} ${c.storeName||c.name||'—'} ${c.ownerPhone||c.phone||'—'} ${c.city||'—'} ${c.active===false ? `موقوف` : `نشط`} ${toMoney(c.balanceTotal||0)} ${toMoney(dues)} ${toMoney(net)} ${c.active===false ? `` : `` }
`; } function setCustomerActive(customerId, active){ if(!canAdmin()) return showToast('غير مسموح'); const c = getCustomer(customerId); if(!c) return showToast('العميل غير موجود'); c.active = !!active; persist(); showToast(active ? 'تم تفعيل الحساب' : 'تم إيقاف الحساب'); renderPage(); setTimeout(cleanupCustomerPortalLanguage, 0); } function resetCustomersFilters(){ const el=document.getElementById('cf_q'); if(el) el.value=''; renderCustomersFiltered(); } function addCustomerPrompt(){ if(!canAdmin()) return; const name=prompt('اسم العميل:'); if(!name) return; const storeName=prompt('اسم المتجر:', name)||name; const ownerPhone=prompt('هاتف صاحب المتجر:', '+212 6')||''; const city=prompt('المدينة:','طنجة')||'طنجة'; const phone=prompt('هاتف (عام):', ownerPhone)||ownerPhone; const id='CUST-'+String(1000+customers.length+1); const balanceTotal = parseFloat(prompt('الرصيد الكلي (DH):','0')||'0')||0; customers.push({id,name,storeName,ownerPhone,city,phone,ownerUid:'',joined:nowISODate(), balanceTotal, dues:0, active:true}); persist(); showToast('تم إضافة العميل'); renderPage(); setTimeout(cleanupCustomerPortalLanguage, 0); } /* ============================= REPORTS (Admin) + filters + profits = fees ============================== */ function reportsHTML(){ if(!canAdmin()){ return `
لا تملك صلاحية عرض تقارير عامة.
`; } const uniqueCities = Array.from(new Set(orders.map(o=>o.city))).filter(Boolean); const customerOpts = customers.map(c=>``).join(''); return `
`; } function applyReportsFiltersFromUI(){ reportsFilters.customerId = document.getElementById('rf_customer')?.value || 'all'; reportsFilters.city = document.getElementById('rf_city')?.value || 'all'; reportsFilters.status = document.getElementById('rf_status')?.value || 'all'; reportsFilters.from = document.getElementById('rf_from')?.value || ''; reportsFilters.to = document.getElementById('rf_to')?.value || ''; renderReportsStats(); } function resetReportsFilters(){ reportsFilters = { customerId:'all', city:'all', status:'all', from:'', to:'' }; const set = (id,val)=>{ const el=document.getElementById(id); if(el) el.value = val; }; set('rf_customer','all'); set('rf_city','all'); set('rf_status','all'); set('rf_from',''); set('rf_to',''); renderReportsStats(); } function applyReportsFiltersToOrders(list){ let out = [...list]; if(reportsFilters.customerId !== 'all') out = out.filter(o=>o.customerId===reportsFilters.customerId); if(reportsFilters.city !== 'all') out = out.filter(o=>o.city===reportsFilters.city); if(reportsFilters.status !== 'all') out = out.filter(o=>o.status===reportsFilters.status); if(reportsFilters.from) out = out.filter(o => (o.date||'') >= reportsFilters.from); if(reportsFilters.to) out = out.filter(o => (o.date||'') <= reportsFilters.to); return out; } function renderReportsStats(){ const wrap = document.getElementById('reportsWrap'); if(!wrap) return; const filteredOrders = applyReportsFiltersToOrders(orders); const totalOrders = filteredOrders.length; const deliveredOrders = filteredOrders.filter(o=>o.status==='مكتمل').length; const cancelledOrders = filteredOrders.filter(o=>o.status==='ملغى').length; const totalAmount = filteredOrders .filter(o=>o.status==='مكتمل') .reduce((a,b)=>a+(Number(b.amount)||0),0); // الرباح = مجموع مصاريف التوصيل (fees) للطلبات غير الملغاة const profitFees = filteredOrders .filter(o=>o.status==='مكتمل') .reduce((a,b)=>a+(Number(b.fee)||0),0); // invoices related (by matching orderIds with filteredOrders) const relatedInvoices = invoices_data.filter(inv=>{ if(inv.status==='ملغى') return false; const ids = inv.orderIds||[]; return ids.some(oid => filteredOrders.some(o=>o.id===oid)); }); const dueAmount = relatedInvoices.filter(i=>i.status==='مستحق').reduce((a,b)=>a+(Number(b.amount)||0),0); const paidAmount = relatedInvoices.filter(i=>i.status==='مدفوع').reduce((a,b)=>a+(Number(b.amount)||0),0); wrap.innerHTML = `
عدد الطلبات الإجمالي
${totalOrders}
إجمالي الطلبات المسلمة
${deliveredOrders}
إجمالي الطلبات الملغية
${cancelledOrders}
المبلغ الإجمالي (Orders)
${toMoney(totalAmount)}
المبالغ المستحقة (Invoices)
${toMoney(dueAmount)}
المبالغ المدفوعة (Invoices)
${toMoney(paidAmount)}
الرباح (مصاريف التوصيل)
${toMoney(profitFees)}
الرباح = مجموع مصروف التوصيل للطلبات ضمن الفلاتر (باستثناء الملغاة).
`; } /* ============================= PROFILE / HELP / COMPANY / USERS / SETTINGS / NOTIFICATIONS (minimal) ============================== */ function profileHTML(){ const c = customers.find(x=>x.id===session.customerId); if(!c) return `
لا توجد بيانات حساب.
`; recomputeCustomerDues(); persist(); const net = customerNetBalance(c.id); const myOrders = filteredByRole(orders,'orders'); const done = myOrders.filter(o=>o.status==='مكتمل').length; return `
بيانات الحساب
الحالة
${c.active===false ? '⛔ حسابك موقوف' : '✅ حساب نشط'}
الرصيد والمستحقات
الرصيد الكلي
${toMoney(c.balanceTotal||0)}
المستحقات
${toMoney(c.dues||0)}
الرصيد الصافي
${toMoney(net)}
إحصائيات
الطلبات
${myOrders.length}
مكتملة
${done}
الحساب
${c.id}
`; } function helpHTML(){ return `
- الصافي = الإجمالي - التعريفة المختارة من الإدارة (20 / 25 / 30 / 35 / 40 DH).
- الفواتير والمدفوعات مبنية على الصافي.
- المرجع الداخلي REF يتم توليده تلقائياً.
- عند الضغط على (👁️ رؤية) تظهر معلومات مرتبة مثل الطباعة.
- إذا كان مبلغ الشحنة 0 يتم خصم مصروف التوصيل من الرصيد الكلي للعميل.
`; } function settingsHTML(){ return `
تعريف التعريفات (City Fees)
طنجة: ${feeForCity('طنجة')} — تطوان: ${feeForCity('تطوان')} — الدار البيضاء: ${feeForCity('الدار البيضاء')}
`; } function usersHTML(){ if(!canAdmin()) return ``; const users = [ {name:'Staff Admin', role:'Admin', email:'admin@swift.local', status:'نشط'}, {name:'Operator 1', role:'Operator', email:'op1@swift.local', status:'نشط'}, {name:'Accountant', role:'Finance', email:'acc@swift.local', status:'معلّق'} ]; const sc={نشط:'done','معلّق':'prep','محظور':'ret'}; return `
قائمة المستخدمين
${users.map(u=>` `).join('')}
الاسمالدورالبريدالحالة
${u.name} ${u.role} ${u.email} ${u.status}
`; } function companyHTML(){ if(!canAdmin()) return ``; const kpis = [ {k:'المدن المغطاة', v: Array.from(new Set(orders.map(o=>o.city))).length}, {k:'معدل التسليم', v: (orders.filter(o=>o.status==='مكتمل').length/(orders.length||1)*100).toFixed(0)+'%'}, {k:'العملاء', v: customers.length}, {k:'الفواتير', v: invoices_data.length}, ]; return `
${kpis.map(x=>`
${x.k}
${x.v}
`).join('')}
`; } function notificationsHTML(){ if(!canAdmin()){ return `
الإشعارات للإدارة فقط في هذا الإصدار.
`; } const list = notifications.filter(n=>n.scope==='admin'); const unread = list.filter(n=>!n.read).length; return `
قائمة الإشعارات
${list.map(n=>` `).join('')}
النوعالعنوانالتفاصيلالوقتالحالة
${n.type} ${n.title} ${n.body} ${n.time} ${n.read ? `مقروء` : `جديد`}
`; } /* ============================= SEARCH + THEME ============================== */ function handleGlobalSearch(val){ const v = (val||'').trim(); if(!v){ renderPage(); return; } setPage('orders'); setTimeout(()=>{ const qEl=document.getElementById('of_q'); if(qEl) qEl.value = v; renderOrdersFiltered(); }, 50); } function toggleTheme(){ darkMode=!darkMode; if(!darkMode){ document.documentElement.style.setProperty('--bg','#f6f8fa'); document.documentElement.style.setProperty('--sidebar','#ffffff'); document.documentElement.style.setProperty('--card','#ffffff'); document.documentElement.style.setProperty('--card2','#f6f8fa'); document.documentElement.style.setProperty('--border','#d0d7de'); document.documentElement.style.setProperty('--text','#1f2328'); document.documentElement.style.setProperty('--muted','#57606a'); } else { document.documentElement.style.setProperty('--bg','#0d1117'); document.documentElement.style.setProperty('--sidebar','#0d1117'); document.documentElement.style.setProperty('--card','#161b22'); document.documentElement.style.setProperty('--card2','#1c2333'); document.documentElement.style.setProperty('--border','#30363d'); document.documentElement.style.setProperty('--text','#e6edf3'); document.documentElement.style.setProperty('--muted','#8b949e'); } renderPage(); setTimeout(cleanupCustomerPortalLanguage, 0); } /* ============================= RIGHT PANEL ============================== */ function renderRightPanel(){ const rl=document.getElementById('recentList'); const list = filteredByRole(orders,'orders').slice(0,6); if(rl){ rl.innerHTML = list.map(o=>`
${o.id}
${o.client||'—'}
${o.status||'—'}
${o.date||'—'}
`).join(''); } const qs=document.getElementById('quickStats'); if(qs){ const o = filteredByRole(orders,'orders'); const inv = filteredByRole(invoices_data,'invoices'); const netSum = o.filter(x=>x.status!=='ملغى').reduce((a,b)=>a+(Number(b.net)||0),0); const due = inv.filter(i=>i.status==='مستحق').reduce((a,b)=>a+(Number(b.amount)||0),0); qs.innerHTML = `
صافي الطلبات
${toMoney(netSum)}
مستحق فواتير
${toMoney(due)}
`; } } /* ============================= RENDER ============================== */ function renderPage(){ if(!session.isLoggedIn){ document.getElementById('mainContent').innerHTML = ''; return; } // الفواتير تُنشأ يدوياً: فردية من الطلب أو مجمعة من صفحة الفواتير. const el=document.getElementById('mainContent'); if(salesChart){salesChart.destroy();salesChart=null} if(donutChart){donutChart.destroy();donutChart=null} switch(currentPage){ case 'dashboard': el.innerHTML = dashboardHTML(); renderCharts(); break; case 'orders': el.innerHTML = ordersHTML(); renderOrdersFiltered(); break; case 'customers': el.innerHTML = customersHTML(); renderCustomersFiltered(); break; case 'returns': el.innerHTML = returnsHTML(); break; case 'payments': el.innerHTML = paymentsHTML(); break; case 'invoices': el.innerHTML = invoicesHTML(); renderInvoicesFiltered(); break; case 'reports': el.innerHTML = reportsHTML(); setTimeout(()=>{ const set = (id,val)=>{ const el=document.getElementById(id); if(el) el.value = val; }; set('rf_customer', reportsFilters.customerId); set('rf_city', reportsFilters.city); set('rf_status', reportsFilters.status); set('rf_from', reportsFilters.from); set('rf_to', reportsFilters.to); renderReportsStats(); },0); break; case 'notifications': el.innerHTML = notificationsHTML(); break; case 'settings': el.innerHTML = settingsHTML(); break; case 'users': el.innerHTML = usersHTML(); break; case 'company': el.innerHTML = companyHTML(); break; case 'profile': el.innerHTML = `${profileHTML()}`; break; case 'help': el.innerHTML = helpHTML(); break; default: el.innerHTML = ``; } renderRightPanel(); updateNotificationUI(); updateOrdersBadge(); buildQuickButtons(); } // init renderLoginFields(); bootFirebaseAuth(); window.addEventListener('resize', ()=>{ if(window.innerWidth > 700){ document.getElementById('sidebar').classList.remove('open'); const ov=document.getElementById('sidebarOverlay'); if(ov) ov.style.display='none'; } });