`;
}
/**
* دالة إظهار نموذج تسجيل حساب جديد
*/
window.showRegisterForm = function() {
const authContainer = document.getElementById('auth-forms-layer');
if (!authContainer) return;
authContainer.innerHTML = `
📝 طلب انضمام مندوب
لديك حساب بالفعل؟
سجل دخول من هنا 🔑
`;
}
// تأكد من استدعاء هذه الدالة في مراقب الحالة عند عدم وجود مستخدم
/**
* دالة إظهار نموذج تسجيل حساب جديد
* تقوم بإرسال البيانات بوضعية "Pending" لانتظار موافقة الأدمن
*/
function showRegisterForm() {
const authContainer = document.getElementById('auth-forms');
if (!authContainer) return;
authContainer.innerHTML = `
📝 طلب انضمام مندوب
لديك حساب بالفعل؟
سجل دخول من هنا 🔑
`;
}
/**
* دالة التبديل بين الوضع الليلي والنهاري
* تحفظ التفضيلات في المتصفح لاستعادتها لاحقاً
*/
function toggleTheme() {
document.body.classList.toggle('dark-mode');
const isDark = document.body.classList.contains('dark-mode');
localStorage.setItem('mandob_theme', isDark ? 'dark' : 'light');
// إشعار بسيط للمستخدم (اختياري)
if(typeof showToast === "function") {
showToast(isDark ? "🌙 تم تفعيل الوضع الليلي" : "☀️ تم تفعيل الوضع النهاري");
}
}
function setWeight(type, name, val) {
if(type === 'market') marketWeights[name] = val;
else productWeights[name] = val;
saveToLocal();
if(type === 'market') renderMarkets(); else renderAdminProducts();
}
function renderMarkets() {
const sel = document.getElementById('market_select');
if(!sel) return;
sel.innerHTML = `` + markets.map(m => ``).join('');
document.getElementById('admin-m-list').innerHTML = markets.map((m, i) => {
let w = marketWeights[m] || 1;
return `
${m}
`; }).join('');
}
function addMarket() {
const val = document.getElementById('new_m_name').value;
if(val) { markets.push(val); saveToLocal(); renderMarkets(); document.getElementById('new_m_name').value = ''; updateHubButtons(); }
}
function deleteMarket(i) { markets.splice(i, 1); saveToLocal(); renderMarkets(); updateHubButtons(); }
function addCategory() {
const val = document.getElementById('new_cat_name').value;
if(val) { categories.push(val); saveToLocal(); renderTabs(); renderAdminCategories(); document.getElementById('new_cat_name').value = ''; }
}
function deleteCategory(i) {
if(categories.length > 1) {
categories.splice(i, 1); saveToLocal(); renderTabs(); renderAdminCategories();
} else { alert("يجب وجود قسم واحد على الأقل"); }
}
function renderAdminCategories() {
document.getElementById('admin-cat-list').innerHTML = categories.map((c, i) => `
`; }).join('');
}
function renderTabs() {
const cats = ["الكل", ...categories, ...targetGroups];
const uniqueCats = [...new Set(cats)];
document.getElementById('cat-tabs').innerHTML = uniqueCats.map(c => ``).join('');
document.getElementById('new_p_cat').innerHTML = categories.map(c=>``).join('');
}
function renderProducts() {
const sGrid = document.getElementById('sales-grid');
const rGrid = document.getElementById('returns-grid');
const mGrid = document.getElementById('missing-grid');
const iGrid = document.getElementById('inventory-grid');
// التحقق من الصفحة النشطة حالياً لتوفير الموارد
const activePage = document.querySelector('.page-content[style*="display: block"]')?.id;
// تفريغ المحتوى القديم مرة واحدة
if(sGrid) sGrid.innerHTML = '';
if(rGrid) rGrid.innerHTML = '';
if(mGrid) mGrid.innerHTML = '';
if(iGrid) iGrid.innerHTML = '';
if(products.length === 0) {
if(document.getElementById('no-products-msg')) document.getElementById('no-products-msg').style.display = 'block';
return;
}
if(document.getElementById('no-products-msg')) document.getElementById('no-products-msg').style.display = 'none';
const inventoriedNames = Object.keys(cart.inventory);
const hasActiveInventory = inventoriedNames.length > 0;
const market = document.getElementById('market_select').value;
const today = new Date().toISOString().split('T')[0];
// استخدام متغيرات لتجميع الكود (أسرع بـ 10 أضعاف من التحديث المباشر للـ innerHTML)
let sHTML = '', rHTML = '', mHTML = '', iHTML = '';
products.forEach(p => {
const matchesFilter = (currentCat === "الكل" || p.cat === currentCat || p.targetGroup === currentCat);
if(!matchesFilter) return;
const isMissingAutomatically = hasActiveInventory && !inventoriedNames.includes(p.name);
const isMissingGlobal = cart.missing.includes(p.name) || isMissingAutomatically;
// قسم المبيعات
if(activePage === 'page-sales') {
const v = cart.sales[p.name] || 0;
let w = productWeights[p.name] || 1;
let color = w === 2 ? 'var(--success)' : (w === 1.5 ? 'var(--warning)' : 'var(--danger)');
let missingBadge = isMissingGlobal ? `
ناقص
` : '';
let invVal = cart.inventory[p.name] || 0;
let inventoryBadge = invVal > 0 ? `
${invVal} جرد
` : '';
let promoBadge = '';
if(promos[market] && promos[market][p.name]) {
const pData = promos[market][p.name];
if(today >= pData.start && today <= pData.end) {
// تم تغيير right إلى left وتغيير الخلفية إلى لون أصفر فاتح #fef08a
promoBadge = `
عرض 🔥
`;
}
}
// سطر واحد فقط للإضافة (تم حذف التكرار)
sHTML += `
`).join('');
initSalesChart(filtered);
}
function initSalesChart(data) {
const canvas = document.getElementById('salesChart');
if(!canvas) return;
const ctx = canvas.getContext('2d');
if (salesChart) salesChart.destroy();
salesChart = new Chart(ctx, { type: 'bar', data: { labels: data.map(v => v.market), datasets: [{ label: 'مبيعات (كرتون)', data: data.map(v => Object.values(v.sales).reduce((a,b)=>a+b, 0)), backgroundColor: '#3b82f6' }] } });
}
function shareDailyWA() {
const filterDate = document.getElementById('history_date_filter').value;
const filtered = history.filter(h => h.date === filterDate);
let msg = `*📊 ملخص اليوم (${filterDate})*\n`;
filtered.forEach(v => { msg += `• ${v.market}: ${Object.values(v.sales).reduce((a,b)=>a+b,0)} ك (مدة: ${v.duration || '--'})\n`; });
window.open(`https://wa.me/?text=${encodeURIComponent(msg)}`);
}
async function deleteVisit(id) {
if(confirm("حذف الزيارة نهائياً من الجهاز?")) {
await deleteHistoryDB(id);
history = await getAllHistoryDB();
renderHistory();
}
}
function showPage(id, el) {
document.querySelectorAll('.page-content').forEach(p => p.style.display = 'none');
document.getElementById(id).style.display = 'block';
const filterablePages = ['page-sales', 'page-inventory', 'page-returns', 'page-missing'];
if (filterablePages.includes(id)) {
document.getElementById('filter-wrapper').style.display = 'block';
} else {
document.getElementById('filter-wrapper').style.display = 'none';
}
document.querySelectorAll('.nav-item').forEach(n => n.classList.remove('active'));
if(el) el.classList.add('active');
if(id === 'page-cart') setTimeout(initSigs, 100);
if(id === 'page-history') renderHistory();
if(id === 'page-admin') {
renderAdminProducts();
renderAdminCategories();
renderMarkets();
renderAdminTargetGroups();
updatePromoSelectors(); // التحديث الجديد
renderAdminPromos(); // التحديث الجديد
}
if(id === 'page-reports-hub') updateHubButtons();
if(id === 'page-sales') updateTargetUI();
renderProducts();
}
function getLocation() {
if (navigator.geolocation) {
const options = {
enableHighAccuracy: true, // تفعيل أعلى دقة ممكنة باستخدام GPS
timeout: 10000, // انتظار 10 ثوانٍ كحد أقصى
maximumAge: 0 // عدم استخدام موقع قديم مخزن
};
document.getElementById('loc-display').innerText = "⌛ جاري تحديد الموقع بدقة...";
navigator.geolocation.getCurrentPosition(pos => {
const lat = pos.coords.latitude;
const lng = pos.coords.longitude;
// حفظ الإحداثيات بدقة 6 أرقام عشرية (دقة تصل لـ 10 سم)
locationData = `${lat.toFixed(6)},${lng.toFixed(6)}`;
document.getElementById('loc-display').innerText = "✅ الموقع مسجل بدقة عالية";
}, err => {
document.getElementById('loc-display').innerText = "❌ فشل تحديد الموقع، تأكد من الـ GPS";
}, options);
}
}
function saveProfile() { localStorage.setItem('fixed_rep_id', document.getElementById('rep_id').value); alert("✅ تم حفظ البيانات"); }
function loadProfile() { document.getElementById('rep_name').value = localStorage.getItem('rep_name_fixed') || ''; document.getElementById('rep_id').value = localStorage.getItem('fixed_rep_id') || ''; }
function saveToLocal() {
localStorage.setItem('mandob_p_26', JSON.stringify(products));
localStorage.setItem('mandob_m_26', JSON.stringify(markets));
localStorage.setItem('mandob_cats', JSON.stringify(categories));
localStorage.setItem('mandob_cat_targets', JSON.stringify(categoryTargets));
localStorage.setItem('m_weights', JSON.stringify(marketWeights));
localStorage.setItem('p_weights', JSON.stringify(productWeights));
localStorage.setItem('target_groups_26', JSON.stringify(targetGroups));
localStorage.setItem('group_targets_26', JSON.stringify(groupTargets));
}
function masterDelete() { if(confirm("حذف شامل؟")) { localStorage.clear(); indexedDB.deleteDatabase(dbName); location.reload(); } }
function updateUserPassword() {
const newPass = document.getElementById('change_pass_input').value;
if(newPass.length < 4) return alert("كلمة المرور ضعيفة جداً");
localStorage.setItem('rep_pass_secure', simpleHash(newPass));
document.getElementById('change_pass_input').value = "";
alert("✅ تم تشفير وتحديث كلمة المرور بنجاح");
}
window.onload = init;
// تسجيل Service Worker لـ PWA
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('sw.js')
.then(reg => console.log('PWA Service Worker Registered'))
.catch(err => console.log('PWA Service Worker Failed', err));
});
}
// وظيفة إضافة عرض جديد
function addPromo() {
const m = document.getElementById('promo_market_sel').value;
const p = document.getElementById('promo_prod_sel').value;
const start = document.getElementById('promo_start').value;
const end = document.getElementById('promo_end').value;
if(!m || !p || !start || !end) return alert("برجاء إكمال بيانات العرض (السوق، الصنف، التواريخ)");
if(!promos[m]) promos[m] = {};
promos[m][p] = { start, end };
localStorage.setItem('mandob_promos', JSON.stringify(promos));
renderAdminPromos();
alert("✅ تم إضافة العرض بنجاح");
}
// وظيفة حذف عرض
function deletePromo(market, prod) {
if(confirm("هل تريد حذف هذا العرض؟")) {
delete promos[market][prod];
localStorage.setItem('mandob_promos', JSON.stringify(promos));
renderAdminPromos();
}
}
// وظيفة عرض العروض في صفحة الضبط
function renderAdminPromos() {
const m = document.getElementById('promo_market_sel').value;
const list = document.getElementById('admin-promo-list');
if(!m) { list.innerHTML = ""; return; }
let html = "";
if(promos[m]) {
for(let pName in promos[m]) {
const d = promos[m][pName];
html += `
${pName} من ${d.start} إلى ${d.end}
`;
}
}
list.innerHTML = html || "
لا توجد عروض مسجلة لهذا السوق
";
}
// تحديث القوائم عند فتح صفحة الضبط
// ابحث عن وظيفة showPage وفي حالة id === 'page-admin' أضف هؤلاء:
function updatePromoSelectors() {
document.getElementById('promo_market_sel').innerHTML = `` + markets.map(m => ``).join('');
document.getElementById('promo_prod_sel').innerHTML = `` + products.map(p => ``).join('');
}