قوافل الحرمين
قوافل الحرمينإدارة ملفات المعتمرين
لوحة الشركة

دخول الإدارة


المعتمرون0
الحجوزات0
المدفوع
المتبقي0

إضافة معتمر

💰 سعر البيع الفعلي للمعتمر
اختر البرنامج
المبلغ الذي سيُسجّل على المعتمر
إذا لم يوجد خصم، اتركه صفرًا. السعر النهائي هو الذي تعتمد عليه المالية والربح.
تفاصيل التقسيط
يتحدث المبلغ المتبقي والقسط الشهري تلقائيًا عند تغيير الدفعة الأولى أو عدد الأقساط.
يجب أن يكون الجواز صالحًا لمدة 7 أشهر على الأقل من تاريخ تثبيت المعتمر.
اختر التصوير بالكاميرا أو تحميل صورة من الهاتف.معاينة الصورة
اختر تصوير الجواز بالكاميرا أو تحميل صورة الجواز من الهاتف.
إذا كان ولي الأمر مرافقًا فلا نطلب وكالة.
مطلوبة لأن ولي الأمر غير مرافق.

جدول الأقساط

بعد تحديد تاريخ أول قسط، يحسب النظام تلقائيًا موعد كل قسط بعده كل 30 يومًا.

♻️ العملاء السابقون

عند إدخال اسم معتمر مسجل سابقًا، سيكتشفه النظام تلقائيًا ويعرض خيار إضافته إلى الرحلة الحالية مع استرجاع بيانات ملفه من الأرشيف.

قائمة المعتمرين

الاسمالهاتفالجوازالفيزاالبرنامجالسدادالملف
'); w.document.close(); const cards=[]; for(const x of list){const b=B.find(z=>z.id===x.booking_id),pr=PR.find(z=>z.id===b?.program_id);cards.push(badgeHtml(await badgeData(x,b,pr)))} const area=w.document.getElementById('printArea'); if(area) area.innerHTML=cards.join(''); // Wait for remote QR/images before opening the print dialog. const imgs=Array.from(w.document.images); await Promise.all(imgs.map(img=>new Promise(resolve=>{if(img.complete)return resolve();img.onload=img.onerror=resolve;}))); setTimeout(()=>{w.focus();w.print();},250); } function badgePrintCSS(){return ` *{box-sizing:border-box}body{margin:0;background:#fff;font-family:Tahoma,Arial}.badge-grid{display:grid;grid-template-columns:repeat(2,60mm);gap:8mm;padding:10mm;justify-content:center}.print-badge{width:60mm;height:90mm;border:0;border-radius:4mm;background:#fff;position:relative;overflow:hidden;box-shadow:none;page-break-inside:avoid;color:#17364e;border:0.45mm solid #c9d5dd}.print-badge:before{content:"";position:absolute;inset:0;border-radius:3.6mm;background:linear-gradient(135deg,#fdfcf8 0%,#fff 52%,#f7f5ef 100%)}.print-badge .side{position:absolute;top:0;bottom:0;width:4.5mm;background:#072b49}.print-badge .side.r{right:0}.print-badge .side.l{left:0}.print-badge .gold-line{position:absolute;right:4.5mm;left:4.5mm;top:24mm;height:.45mm;background:#c79a3b}.print-badge .badge-content{position:relative;z-index:2;height:100%;padding:5mm 6mm 4mm;display:flex;flex-direction:column}.print-badge .brand{display:flex;justify-content:center;align-items:center;height:16mm}.print-badge .brand-logo{width:39mm;height:16mm;object-fit:contain}.print-badge .tagline{text-align:center;color:#8b6b25;font-weight:800;font-size:2.25mm;margin-top:-1mm}.print-badge .person{display:grid;grid-template-columns:1fr 25mm;gap:3mm;align-items:center;margin-top:3.5mm;direction:rtl}.print-badge .name{font-weight:900;font-size:4.25mm;color:#072b49;line-height:1.25}.print-badge .role{font-size:2.25mm;color:#8b6b25;font-weight:800;margin-top:1mm}.print-badge .photo{width:25mm;height:29mm;border-radius:2.6mm;object-fit:cover;border:0.6mm solid #c79a3b;background:#eef2f4;display:block}.print-badge .info-list{display:flex;flex-direction:column;gap:1.7mm;margin-top:3.5mm;direction:rtl}.print-badge .info{min-height:7.7mm;background:#f5f7f8;border:0.3mm solid #d9e2e7;border-radius:1.8mm;padding:1.3mm 2mm;display:grid;grid-template-columns:27mm 1fr;gap:1mm;align-items:center;font-size:2.25mm;line-height:1.15}.print-badge .info b{color:#0c3b63;font-size:2.05mm}.print-badge .info span{font-weight:800;color:#17364e;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.print-badge .footer{margin-top:auto;background:#072b49;color:#fff;border-radius:2.5mm;padding:2.2mm 2mm 2.5mm;text-align:center}.print-badge .contacts{display:flex;justify-content:center;gap:3mm;direction:ltr;font-size:2.05mm;white-space:nowrap}.print-badge .contacts strong{color:#e2bd67}.print-badge .address{font-size:1.9mm;margin-top:1.1mm;color:#f2f4f5}.print-badge .bottom-mark{font-size:2mm;color:#c79a3b;font-weight:900;margin-top:1.1mm}@page{size:A4;margin:0}@media print{body{-webkit-print-color-adjust:exact;print-color-adjust:exact}.badge-grid{padding:10mm}} `}; $('printTripBadges').onclick=async()=>{const id=$('badgeProgram').value;if(!id)return alert('اختر الرحلة أولًا.');const list=P.filter(x=>{const b=B.find(z=>z.id===x.booking_id);return b?.program_id===id});const pr=PR.find(x=>x.id===id);await printBadges(list,pr?.title)}; async function openProfile(id){ const p=P.find(x=>x.id===id);if(!p)return; const b=B.find(x=>x.id===p.booking_id),pr=PR.find(x=>x.id===b?.program_id),ins=I.filter(x=>x.booking_id===b?.id); $('profile').classList.remove('hide'); $('profile').innerHTML='

ملف المعتمر: '+esc(p.full_name)+'

'+ '
رمز الملف
'+esc(p.profile_code||'—')+'
الهاتف
'+esc(p.phone||'—')+'
الجنسية
'+esc(p.nationality||'—')+'
الجواز
'+esc(p.passport_number||'—')+'
انتهاء الجواز
'+esc(p.passport_expiry||'—')+'
الفيزا
'+badge(p.visa_status)+' '+esc(p.visa_number||'')+'
'+ '

الرحلة والحساب

البرنامج
'+esc(pr?.title||'—')+'
نوع البرنامج
'+(b?.payment_type==='installment'?'قسط':'نقد')+'
الإجمالي
'+money(b?.total_amount)+'
المدفوع
'+money(b?.paid_amount)+'
المتبقي
'+money(b?.remaining_amount)+'
الحالة
'+badge(b?.status)+'
'+ (b?.payment_type==='installment'?'

الأقساط

'+((ins.length?ins.map(x=>'').join(''):''))+'
القسطالاستحقاقالمبلغالمدفوعالحالة
'+esc(x.installment_number)+''+esc(x.due_date||'—')+''+money(x.amount)+''+money(x.paid_amount)+''+badge(x.status)+'
لا توجد أقساط.
':'
برنامج نقدي — لا توجد أقساط
')+ '
'; if(b?.payment_type==='installment')$('manageBtn').onclick=()=>managePayments(b); $('printOneBadge').onclick=()=>printBadges([p],pr?.title); $('deleteTripBtn').onclick=()=>deletePilgrimFromTrip(p.id); $('profile').scrollIntoView({behavior:'smooth'}); } async function deletePilgrimFromTrip(pilgrimId){ const p=P.find(x=>x.id===pilgrimId); if(!p)return alert('لم يتم العثور على المعتمر.'); const b=B.find(x=>x.id===p.booking_id); const pr=PR.find(x=>x.id===b?.program_id); const trip=pr?.title||'الرحلة الحالية'; const ok=confirm('⚠️ حذف المعتمر من الرحلة\n\n'+(p.full_name||'المعتمر')+'\n'+trip+'\n\nسيُحذف الحجز والدفعات والأقساط الخاصة بهذه الرحلة، بينما يبقى ملفه في الأرشيف الدائم.\n\nهل تريد المتابعة؟'); if(!ok)return; try{ const r=await db.rpc('delete_pilgrim_record',{p_pilgrim_id:pilgrimId,p_permanent:false}); if(r.error)throw r.error; $('profile')?.classList.add('hide'); msg('listMsg','تم حذف المعتمر من الرحلة مع الإبقاء على ملفه في الأرشيف.'); await load(); }catch(e){alert(e.message||'تعذر حذف المعتمر من الرحلة.');} } async function managePayments(b){ const box=$('manager');box.classList.remove('hide');box.innerHTML='

إدارة الدفعات والأقساط

عند حضور المعتمر، اختر القسط المستحق نفسه ثم اضغط «تسديد هذا القسط». هكذا تُحفظ الدفعة مرتبطة بالقسط في السجل المالي، ويمكن أيضًا تسجيل دفعة جزئية.
'; const r=await db.from('installment_plans').select('*').eq('booking_id',b.id).order('installment_number'); if(r.error){$('pm').innerHTML='
'+esc(r.error.message)+'
';return;} $('pm').innerHTML=r.data?.length?'
'+r.data.map(x=>{const rem=Math.max(Number(x.amount||0)-Number(x.paid_amount||0),0);const today=new Date().toISOString().slice(0,10);const overdue=rem>0&&x.due_date&&x.due_date';}).join('')+'
القسطالاستحقاقالمبلغالمدفوعالمتبقيالحالةالإجراء
'+x.installment_number+''+esc(x.due_date||'—')+(overdue?' متأخر':'')+''+money(x.amount)+''+money(x.paid_amount)+''+money(rem)+''+badge(rem<=0?'paid':overdue?'overdue':x.status)+''+(rem>0?'':'مسدد')+'
':'لا توجد أقساط.'; document.querySelectorAll('[data-pay-inst]').forEach(btn=>btn.onclick=()=>paySpecificInstallment(b,btn.dataset.payInst,Number(btn.dataset.due||0))); } async function paySpecificInstallment(b,installmentId,due){ const amountRaw=prompt('مبلغ السداد لهذا القسط (المتبقي '+money(due)+')',String(due)); if(amountRaw===null)return; const amount=Number(amountRaw); if(!amount||amount<=0)return alert('أدخل مبلغًا صحيحًا.'); if(amount>due)return alert('المبلغ أكبر من المتبقي لهذا القسط: '+money(due)); const method=prompt('طريقة الدفع','نقد'); if(method===null)return; const notes=prompt('ملاحظات (اختياري)',''); const {data,error}=await db.rpc('record_installment_payment',{p_booking_id:b.id,p_installment_id:installmentId,p_amount:amount,p_payment_date:new Date().toISOString(),p_payment_method:method||'نقد',p_notes:notes||null}); if(error)return alert(error.message||'تعذر تسجيل الدفعة.'); alert(data?.installment_remaining>0?'تم تسجيل الدفعة الجزئية للقسط.':'تم تسديد القسط بالكامل ✅'); await load();const np=P.find(x=>x.booking_id===b.id);if(np)openProfile(np.id); } async function savePayment(b){ const amount=Number($('payAmount')?.value||0);if(amount<=0)return msg('pm','أدخل مبلغًا صحيحًا.',true); const r=await db.from('installment_plans').select('*').eq('booking_id',b.id).neq('status','paid').order('installment_number'); if(r.error)return msg('pm',r.error.message,true); let left=amount; for(const x of r.data||[]){ if(left<=0)break; const due=Math.max(Number(x.amount||0)-Number(x.paid_amount||0),0); if(due<=0)continue; const add=Math.min(left,due); const {error}=await db.rpc('record_installment_payment',{p_booking_id:b.id,p_installment_id:x.id,p_amount:add,p_payment_date:$('payDate')?.value||new Date().toISOString(),p_payment_method:$('payMethod')?.value||'نقد',p_notes:$('payNotes')?.value||null}); if(error)return msg('pm',error.message,true); left-=add; } if(left>0)return msg('pm','مبلغ الدفعة أكبر من إجمالي الأقساط المتبقية.',true); await load();const np=P.find(x=>x.booking_id===b.id);if(np)openProfile(np.id); } function bindFilePair(cameraId,uploadId,hintId,previewId){ const cam=$(cameraId), up=$(uploadId), hint=$(hintId), prev=previewId?$(previewId):null; const handle=(src)=>{const f=src.files?.[0];if(!f)return; if(hint)hint.textContent='تم اختيار الملف: '+f.name; if(prev){prev.src=URL.createObjectURL(f);prev.classList.remove('hide');}}; cam.addEventListener('change',()=>handle(cam)); up.addEventListener('change',()=>handle(up)); } bindFilePair('photoCamera','photoUpload','photoHint','photoPreview'); bindFilePair('passportCamera','passportUpload','passportHint',null); bindFilePair('guardianCamera','guardianUpload','guardianHint',null); function calcAge(birth){ if(!birth)return null; const b=new Date(birth+'T00:00:00'); const t=new Date(); let age=t.getFullYear()-b.getFullYear(); const m=t.getMonth()-b.getMonth(); if(m<0 || (m===0 && t.getDate()x.addEventListener('change',updateGuardianRequirement)); updateMinor(); function todayLocal(){ const t=new Date(); return {y:t.getFullYear(),m:t.getMonth()+1,d:t.getDate()}; } function passportMinDate(){ const t=todayLocal(); // 7 calendar months from the date the pilgrim is registered (today), not from the trip date. let y=t.y, m=t.m+7, d=t.d; if(m>12){ y+=Math.floor((m-1)/12); m=((m-1)%12)+1; } // Clamp to last valid day of target month (handles month-end dates safely). const lastDay=new Date(y,m,0).getDate(); d=Math.min(d,lastDay); return `${y}-${String(m).padStart(2,'0')}-${String(d).padStart(2,'0')}`; } function validatePassportExpiry(show=true){ const input=$('pex'); const d=input.value; const min=passportMinDate(); const saveBtn=$('form').querySelector('button[type=submit]'); input.min=min; if(!d){ input.setCustomValidity(''); input.style.borderColor=''; $('pexHint').style.color='#6b7b88'; $('pexHint').textContent='الحد الأدنى لانتهاء الجواز: '+min+' — يجب أن تكون الصلاحية 7 أشهر كاملة على الأقل من تاريخ تثبيت المعتمر.'; const st=$('pexStatus'); if(st){st.style.display='none';st.textContent='';} if(saveBtn) saveBtn.disabled=false; return false; } const ok=d>=min; input.setCustomValidity(ok?'':'❌ تاريخ انتهاء الجواز غير مقبول. يجب أن يكون بعد 7 أشهر على الأقل من تاريخ تثبيت المعتمر.'); input.style.borderColor=ok?'#176644':'#c62828'; input.style.backgroundColor=ok?'':'#fff2f2'; $('pexHint').style.color=ok?'#176644':'#c62828'; $('pexHint').textContent=ok?'✅ صلاحية الجواز مناسبة لمدة 7 أشهر من تاريخ التثبيت.':'❌ مرفوض فورًا: تاريخ انتهاء الجواز أقل من 7 أشهر. الحد الأدنى هو '+min+'.'; const st=$('pexStatus'); if(st){st.style.display='block';st.style.background=ok?'#e7f6ef':'#fff0f0';st.style.color=ok?'#176644':'#c62828';st.textContent=ok?'✅ الجواز مقبول':'❌ الجواز مرفوض — الحد الأدنى '+min;} if(saveBtn) saveBtn.disabled=!ok; return ok; } validatePassportExpiry(false); ['change','input','blur'].forEach(ev=>$('pex').addEventListener(ev,()=>validatePassportExpiry(true))); $('program').addEventListener('change',()=>validatePassportExpiry(true)); document.getElementById('form').addEventListener('submit',function(e){ if(!validatePassportExpiry(true)){ e.preventDefault(); e.stopImmediatePropagation(); return false; } }, true); $('form').onsubmit=async e=>{ e.preventDefault();await checkDuplicateName();if(archiveMatch && !archiveConfirmed){return msg('formMsg','⚠️ هذا الاسم مسجل كعميل سابق. اختر: نعم، أضفه للرحلة الحالية، أو لا، إلغاء.',true);}if(nameDuplicate)return msg('formMsg','❌ لا يمكن المتابعة بهذا الاسم.',true);msg('formMsg','جاري التحقق من البيانات...'); const pr=PR.find(x=>x.id===$('program').value);if(!pr)return msg('formMsg','اختر البرنامج أولًا.',true);if(archiveConfirmed&&archiveMatch&&archiveAlreadyInProgram(archiveMatch.id,pr.id))return msg('formMsg','❌ هذا العميل مضاف بالفعل إلى الرحلة الحالية.',true); const paymentType=$('paymentType').value, basePrice=Number((paymentType==='installment'?pr.installment_price:pr.price)||0), discountAmount=Math.max(Number($('discountAmount').value||0),0), total=Math.max(basePrice-discountAmount,0), discountReason=$('discountReason').value.trim()||null, passportExpiry=$('pex').value,tripDate=pr.departure_date||pr.departure||pr.start_date,paid=Math.min(Math.max(Number($('initial').value||0),0),total); if(discountAmount>basePrice)return msg('formMsg','❌ قيمة الخصم أكبر من سعر البرنامج.',true); const remaining=total-paid; if(!passportExpiry)return msg('formMsg','أدخل تاريخ انتهاء الجواز.',true); const minExpiry=passportMinDate(); if(!validatePassportExpiry(true) || passportExpiry < minExpiry){ $('pex').focus(); return msg('formMsg','❌ لا يمكن إضافة المعتمر: صلاحية الجواز أقل من 7 أشهر. الحد الأدنى لانتهاء الجواز هو '+minExpiry+'.',true);} const age=calcAge($('birthDate').value); if(age===null)return msg('formMsg','أدخل تاريخ ميلاد المعتمر.',true); const accompanied=age<18 && guardianAccompanied(); const guardianFile=$('guardianCamera').files?.[0] || $('guardianUpload').files?.[0]; if(age<18 && !accompanied && !guardianFile)return msg('formMsg','المعتمر دون 18 سنة وولي الأمر غير مرافق: يجب إرفاق الوكالة.',true); const passportFile=$('passportCamera').files?.[0] || $('passportUpload').files?.[0]; if(!passportFile)return msg('formMsg','أرفق صورة الجواز: صوّر بالكاميرا أو حمّل ملفًا من الهاتف.',true); const photoFile=$('photoCamera').files?.[0] || $('photoUpload').files?.[0]; if(!photoFile)return msg('formMsg','أرفق الصورة الشخصية: صوّر بالكاميرا أو حمّل ملفًا من الهاتف.',true); try{ const booking={program_id:pr.id,full_name:$('name').value.trim(),phone:$('phone').value.trim()||'',passengers_count:1,base_price:basePrice,discount_amount:discountAmount,discount_reason:discountReason,total_amount:total,paid_amount:paid,status:remaining?'pending':'paid',notes:'حجز من إدارة المعتمرين',payment_type:paymentType}; let photoPath=archiveConfirmed?(archiveMatch?.photo_path||null):null; if(photoFile){const ext=(photoFile.name.split('.').pop()||'jpg').toLowerCase().replace(/[^a-z0-9]/g,'')||'jpg'; photoPath='pilgrim-'+Date.now()+'-'+Math.random().toString(36).slice(2)+'.'+ext; const upPhoto=await db.storage.from('pilgrim-photos').upload(photoPath,photoFile,{upsert:false,contentType:photoFile.type||'image/jpeg'}); if(upPhoto.error)throw upPhoto.error;} let passportImagePath=archiveConfirmed?(archiveMatch?.passport_image_path||null):null; if(passportFile){const pext=(passportFile.name.split('.').pop()||'jpg').toLowerCase().replace(/[^a-z0-9]/g,'')||'jpg'; passportImagePath='passport-'+Date.now()+'-'+Math.random().toString(36).slice(2)+'.'+pext; const upPassport=await db.storage.from('pilgrim-photos').upload(passportImagePath,passportFile,{upsert:false,contentType:passportFile.type||'image/jpeg'}); if(upPassport.error)throw upPassport.error;} let guardianPath=archiveConfirmed?(archiveMatch?.guardian_authorization_path||null):null; if(guardianFile){const gext=(guardianFile.name.split('.').pop()||'jpg').toLowerCase().replace(/[^a-z0-9]/g,'')||'jpg'; guardianPath='guardian-'+Date.now()+'-'+Math.random().toString(36).slice(2)+'.'+gext; const ug=await db.storage.from('pilgrim-photos').upload(guardianPath,guardianFile,{upsert:false,contentType:guardianFile.type||'application/octet-stream'}); if(ug.error)throw ug.error;} const br=await db.from('bookings').insert(booking).select('id').single();if(br.error)throw br.error; const payload={booking_id:br.data.id,full_name:$('name').value.trim(),phone:$('phone').value.trim()||null,nationality:$('nat').value.trim()||'عراقي',gender:$('gender').value||null,passport_number:$('pass').value.trim()||null,passport_expiry:$('pex').value||null,passport_image_path:passportImagePath,guardian_authorization_path:guardianPath,guardian_accompanied:accompanied,birth_date:$('birthDate').value,visa_status:$('visa').value,visa_number:$('vnum').value.trim()||null,visa_issued_at:$('vdate').value||null,document_url:null,photo_path:photoPath,notes:$('notes').value.trim()||null,archive_id:archiveConfirmed?(archiveMatch?.id||null):null,profile_code:'QH-'+Date.now().toString().slice(-8)}; const pp=await db.from('pilgrims').insert(payload).select('id,archive_id').single();if(pp.error){await db.from('bookings').delete().eq('id',br.data.id);throw pp.error} if(pp.data?.archive_id){const au={phone:$('phone').value.trim()||null,passport_number:$('pass').value.trim()||null,passport_expiry:$('pex').value||null,nationality:$('nat').value.trim()||'عراقي',gender:$('gender').value||null,birth_date:$('birthDate').value,guardian_accompanied:accompanied};if(photoPath)au.photo_path=photoPath;if(passportImagePath)au.passport_image_path=passportImagePath;if(guardianPath)au.guardian_authorization_path=guardianPath;await db.from('pilgrim_archive').update(au).eq('id',pp.data.archive_id);} if(paid>0)await db.from('payments').insert({booking_id:br.data.id,amount:paid,payment_date:new Date().toISOString().slice(0,10),method:'دفعة أولى',notes:'دفعة أولى'}); if(paymentType==='installment'&&remaining>0){ const amounts=[...document.querySelectorAll('.instAmount')].map(x=>Number(x.value||0)); const dates=[...document.querySelectorAll('.instDate')].map(x=>x.value||null); if(amounts.length===0)throw Error('حدد جدول الأقساط أولًا.'); const sum=amounts.reduce((a,b)=>a+b,0); if(Math.abs(sum-remaining)>0.01)throw Error('مجموع الأقساط يجب أن يساوي المتبقي: '+money(remaining)); if(dates.some(x=>!x))throw Error('حدد تاريخ أول قسط، وسيحسب النظام بقية المواعيد تلقائيًا كل 30 يومًا.'); const rows=amounts.map((amount,i)=>({booking_id:br.data.id,installment_number:i+1,due_date:dates[i],amount,paid_amount:0,status:'pending'})); const ir=await db.from('installment_plans').insert(rows); if(ir.error)throw ir.error; } msg('formMsg','تم إنشاء ملف المعتمر والحجز بنجاح ✅');e.target.reset();clearNameDuplicate();clearArchiveMatch();archiveMatch=null;archiveConfirmed=false;$('nat').value='عراقي';$('gender').value='';$('initial').value=0;$('discountAmount').value=0;$('discountReason').value='';$('basePriceBox').textContent='اختر البرنامج';$('finalPrice').textContent='—';$('paymentType').value='cash';$('paymentType').onchange();$('schedule').innerHTML='';$('firstInstallmentDate').value='';$('photoPreview').classList.add('hide');$('photoPreview').removeAttribute('src');$('passportCamera').value='';$('passportUpload').value='';$('guardianCamera').value='';$('guardianUpload').value='';$('birthDate').value='';updateMinor();$('photoCamera').value='';$('photoUpload').value='';$('photoPreview').classList.add('hide');$('photoPreview').removeAttribute('src');validatePassportExpiry(false);await load(); }catch(err){msg('formMsg',err.message||'تعذر الحفظ.',true)} }; (async()=>{try{const{data:{session}}=await db.auth.getSession();if(session&&await isAdmin()){$('login').classList.add('hide');$('app').classList.remove('hide');document.body.classList.remove('auth-pending');await load()}else{document.body.classList.remove('auth-pending')}}catch(e){document.body.classList.remove('auth-pending');msg('loginMsg',e.message||'تعذر فحص الجلسة.',true)}})();