منصة مشتريات مواد البناء

كل ما يحتاجه مشروعك
في مكان واحد

مواد بناء، سباكة، كهرباء، تهوية وكيماويات بناء. اطلبها ونوصلها لموقعك داخل السودان.

عَمِّر

مشتريات مشروعك بشكل أسهل

متجر + عروض أسعار + قوائم مواد + تتبع.

20+منتج إطلاق
RFQطلب عروض سعر
BOQقوائم مواد

كيف تريد استخدام عَمِّر؟

ماذا تريد أن تنفذ؟

منتجات مختارة

المتجر

طلب عرض سعر

للحديد والأسمنت والكميات الكبيرة: السعر النهائي يُؤكَّد قبل الدفع.

كيف تعمل؟

1) ترسل الكمية والموقع.

2) نراجع السعر والتوفر.

3) يصلك السعر النهائي.

4) بعد موافقتك يتم تأكيد الدفع والتجهيز.

رفع قائمة مواد المشروع

هذا الخيار جزء من خدمة توريد التجار والمشاريع. ارفع قائمتك وسنراجع المواد والكميات ونجهز طلب التسعير.

توريد للتجار والمشاريع

خدمة مستقلة للتجار والمشاريع

خدمة التوريد وطلبات المشاريع في مكان واحد

ارفع قائمة مواد مشروعك أو أرسل طلب توريد تجاري للكميات والمنتجات الخاصة وغير المتوفرة محليًا.

اختر نوع الطلب

📋

رفع قائمة مواد المشروع

PDF أو Excel أو صورة أو إدخال يدوي. نراجع القائمة ونجهز لك طلب التسعير.

🚚

طلب توريد تجاري

للكميات التجارية والمنتجات الخاصة أو غير المتوفرة داخل السودان أو مخزون عَمِّر.

1نستلم تفاصيل الطلب التجاري.
2نبحث عن مصدر التوريد والسعر ومدة الوصول.
3نرسل عرض سعر تجاري مستقل للموافقة.
4بعد الاعتماد تبدأ إجراءات الشراء والشحن والتسليم.

تتبع طلبك

تأكيد الطلب

تكلفة الشحن غير محسوبة الآن، وتُحدد بعد مراجعة الطلب وموقع التسليم والتواصل مع العميل.
لن يتم تحصيل أي مبلغ الآن. سيتم تأكيد السعر والتوصيل مع العميل قبل الدفع.

ملخص الطلب

لوحة الإدارة

دخول الإدارة

سجّل الدخول للوصول إلى بيانات الإدارة.

سلة عَمِّر

الإجمالي: 0 ج.س

💬واتساب
`);w.document.close();w.focus();setTimeout(()=>w.print(),250)}; document.addEventListener('click',e=>{const btn=e.target.closest('[data-action]');if(btn){e.stopPropagation();const p=products.find(x=>x.id==btn.dataset.id);if(!p)return;if(btn.dataset.action==='details'){openProductDetails(p);return}if(btn.dataset.action==='rfq'){go('rfq');return}const found=cart.find(x=>x.id===p.id);if(found)found.qty++;else cart.push({id:p.id,qty:1});save();renderCart();toast(tr('added'));return}const card=e.target.closest('[data-product-id]');if(card){const p=products.find(x=>x.id==card.dataset.productId);if(p)openProductDetails(p)}}); function cartTotal(){return cart.reduce((a,x)=>{const p=products.find(p=>p.id===x.id);return a+(p?p.price*x.qty:0)},0)} function renderCart(){document.getElementById('cartCount').textContent=cart.reduce((a,x)=>a+x.qty,0);document.getElementById('cartItems').innerHTML=cart.length?cart.map(x=>{const p=products.find(p=>p.id===x.id);return `
${pname(p)}
${x.qty}
${money(p.price*x.qty)} ${tr('sdg')}
`}).join(''):`

${tr('emptyCart')}

`;document.getElementById('cartTotal').textContent=money(cartTotal())} document.addEventListener('click',e=>{const q=e.target.closest('[data-qty]');if(q){const item=cart.find(x=>x.id==q.dataset.id);if(item){item.qty+=q.dataset.qty==='plus'?1:-1;if(item.qty<=0)cart=cart.filter(x=>x.id!=q.dataset.id);save();renderCart()}return}const r=e.target.closest('[data-remove]');if(r){cart=cart.filter(x=>x.id!=r.dataset.remove);save();renderCart();toast(tr('removed'))}}); document.getElementById('cartBtn').onclick=()=>document.getElementById('cartPanel').classList.add('open');document.getElementById('closeCart').onclick=()=>document.getElementById('cartPanel').classList.remove('open');document.getElementById('checkoutBtn').onclick=()=>{if(!cart.length)return toast(tr('emptyCart'));document.getElementById('cartPanel').classList.remove('open');go('checkout')}; function renderCheckout(){document.getElementById('checkoutSummary').innerHTML=cart.length?cart.map(x=>{const p=products.find(p=>p.id===x.id);return `
${pname(p)} × ${x.qty}${money(p.price*x.qty)} ${tr('sdg')}
`}).join('')+`
${tr('shippingPending')}

${tr('total')}: ${money(cartTotal())} ${tr('sdg')}

`:`

${tr('emptyCart')}

`} function ref(prefix){return prefix+'-'+String(Date.now()).slice(-6)} document.getElementById('checkoutForm').onsubmit=async e=>{e.preventDefault();if(!cart.length)return toast(tr('emptyCart'));const form=e.target,btn=form.querySelector('button[type=submit]'),fd=new FormData(form);btn.disabled=true;const oldText=btn.textContent;btn.textContent=lang==='ar'?'جارٍ إنشاء الطلب...':'Creating order...';try{const payload={customer_name:fd.get('name'),phone:fd.get('phone'),delivery_area:fd.get('area'),city:fd.get('city'),address:fd.get('address'),customer_type:fd.get('customerType'),items:cart.map(x=>({sku:'AMR-'+String(x.id).padStart(3,'0'),qty:x.qty}))};const res=await fetch('https://svddusrisxafsxdnymtc.supabase.co/functions/v1/create-order',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(payload)});const data=await res.json();if(!res.ok||!data.ok){const msg=data.error==='insufficient_stock'?(lang==='ar'?'الكمية المطلوبة غير متوفرة حاليًا.':'Requested quantity is not currently available.'):(lang==='ar'?'تعذر إنشاء الطلب. تحقق من البيانات وحاول مرة أخرى.':'Could not create the order. Please check your details and try again.');throw new Error(msg)}const id=data.order.order_no;orders.unshift({id,client:fd.get('name'),phone:fd.get('phone'),area:fd.get('area'),city:fd.get('city'),address:fd.get('address'),shipping:'pending',customerType:fd.get('customerType'),value:Number(data.order.subtotal||0),status:'newStatus',items:[...cart],createdAt:data.order.created_at});cart=[];save();renderCart();form.reset();document.getElementById('checkoutSummary').innerHTML=`
${tr('orderCreated')}
${tr('orderNumber')}: ${id}
${tr('shippingPending')}
`+brandedDocument({type:tr('proformaInvoice'),no:id,customer:fd.get('name'),phone:fd.get('phone'),details:`${orders[0].items.map(x=>{const p=products.find(pp=>pp.id===x.id);return ``}).join('')}
${tr('product')}${tr('quantity')}${tr('value')}
${pname(p)}${x.qty}${money(p.price*x.qty)} ${tr('sdg')}
`,total:Number(data.order.subtotal||0),note:tr('paymentNote')});toast(tr('orderCreated'))}catch(err){toast(err.message||'Error')}finally{btn.disabled=false;btn.textContent=oldText}}; document.getElementById('rfqForm').onsubmit=async e=>{e.preventDefault();const f=e.target,fd=new FormData(f),btn=f.querySelector('button[type=submit]'),result=document.getElementById('rfqResult');btn.disabled=true;const old=btn.textContent;btn.textContent=lang==='ar'?'جارٍ الإرسال...':'Sending...';try{const requestText=`${fd.get('type')} — ${fd.get('qty')} — ${fd.get('notes')||''}`;const payload={customer_name:fd.get('customer_name'),phone:fd.get('phone'),customer_type:'individual',delivery_area:fd.get('area'),request_text:requestText};const r=await fetch(`${SUPABASE_URL}/functions/v1/create-rfq`,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(payload)});const d=await r.json();if(!r.ok||!d.ok)throw new Error(lang==='ar'?'تعذر إرسال الطلب':'Could not send request');const id=d.rfq.rfq_no;result.innerHTML=brandedDocument({type:tr('quoteRequestDoc'),no:id,customer:fd.get('customer_name'),phone:fd.get('phone'),details:`
${tr('requestType')}${fd.get('type')}
${tr('quantity')}${fd.get('qty')}
${tr('area')}${fd.get('area')}
`,note:lang==='ar'?'هذا مستند استلام طلب عرض سعر وليس السعر النهائي. سيتم تأكيد السعر قبل الدفع.':'This confirms receipt of a quote request; final pricing will be confirmed before payment.'});toast(tr('rfqReceived')+id);f.reset()}catch(err){toast(err.message)}finally{btn.disabled=false;btn.textContent=old}}; document.getElementById('merchantSupplyForm').onsubmit=async e=>{e.preventDefault();const f=e.target,fd=new FormData(f),btn=f.querySelector('button[type=submit]'),msg=document.getElementById('merchantSupplyMsg'),result=document.getElementById('merchantSupplyResult');btn.disabled=true;const old=btn.textContent;btn.textContent=lang==='ar'?'جارٍ إرسال طلب التوريد...':'Sending supply request...';try{const payload=Object.fromEntries(fd.entries());const r=await fetch(`${SUPABASE_URL}/functions/v1/create-merchant-supply`,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(payload)});const d=await r.json();if(!r.ok||!d.ok)throw new Error(lang==='ar'?'تعذر إرسال طلب التوريد':'Could not send supply request');msg.className='success';msg.textContent=(lang==='ar'?'تم استلام طلب التوريد التجاري. المرجع: ':'Supply request received. Reference: ')+d.request.request_no;result.innerHTML=brandedDocument({type:lang==='ar'?'طلب توريد تجاري':'Commercial Supply Request',no:d.request.request_no,customer:fd.get('business_name'),phone:fd.get('phone'),details:`
${tr('supplyProduct')}${fd.get('product_name')}
${tr('quantity')}${fd.get('quantity')}
${tr('originPreference')}${fd.get('origin_preference')||'-'}
${tr('deliveryLocation')}${fd.get('delivery_location')}
`,note:lang==='ar'?'سيتم دراسة مصدر التوريد والسعر ومدة الوصول ثم إرسال عرض سعر تجاري مستقل.':'We will review sourcing, price and lead time before sending a separate commercial quotation.'});f.reset()}catch(err){msg.className='notice';msg.textContent=err.message}finally{btn.disabled=false;btn.textContent=old}}; document.getElementById('uploadForm').onsubmit=e=>{e.preventDefault();const id=ref('BOQ');const list=JSON.parse(localStorage.getItem('ammarBOQs')||'[]');list.unshift({id,...Object.fromEntries(new FormData(e.target)),createdAt:new Date().toISOString()});localStorage.setItem('ammarBOQs',JSON.stringify(list));toast(tr('listReceived')+id);e.target.reset()}; document.getElementById('trackForm').onsubmit=async e=>{e.preventDefault();const id=document.getElementById('trackId').value.trim().toUpperCase(),phone=document.getElementById('trackPhone').value.trim(),el=document.getElementById('trackResult');el.innerHTML=`
${lang==='ar'?'جارٍ التحقق من الطلب...':'Checking order...'}
`;try{const res=await fetch('https://svddusrisxafsxdnymtc.supabase.co/functions/v1/track-order',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({order_no:id,phone})});const data=await res.json();if(!res.ok||!data.ok){el.innerHTML=`
${tr('notFound')}
`;return}const map={received:'newStatus',price_confirmation:'newStatus',awaiting_payment:'newStatus',paid:'preparing',preparing:'preparing',out_for_delivery:'delivery',delivered:'delivered',cancelled:'newStatus'},key=map[data.order.status]||'newStatus',steps=['newStatus','preparing','delivery','delivered'],idx=Math.max(0,steps.indexOf(key));el.innerHTML=`
${tr('order')} ${data.order.order_no} — ${tr('orderStatus')}: ${tr(key)}
${tr('shippingPending')}
${steps.map((s,i)=>`${tr(s)}`).join('')}
`}catch(err){el.innerHTML=`
${lang==='ar'?'تعذر الاتصال بخدمة التتبع الآن.':'Could not reach tracking service.'}
`}}; function statusCls(s){return s==='newStatus'?'bnew':s==='preparing'?'bprep':'bdel'} async function adminRest(path,opts={}){ const s=getAdminSession(); if(!s||!s.access_token) throw new Error('انتهت جلسة الإدارة. سجّل الدخول مرة أخرى.'); const headers={'apikey':SUPABASE_KEY,'Authorization':`Bearer ${s.access_token}`,'Content-Type':'application/json',...(opts.headers||{})}; const r=await fetch(`${SUPABASE_URL}/rest/v1/${path}`,{...opts,headers}); const raw=await r.text();let d=null;try{d=raw?JSON.parse(raw):null}catch{d=raw} if(r.status===401||r.status===403){if(r.status===401){setAdminSession(null);refreshAdminGate()}throw new Error((d&&d.message)||'غير مصرح بهذه العملية')} if(!r.ok)throw new Error((d&&d.message)||String(d||'Database error')); return d; } let adminProducts=[],adminOrders=[],adminMovements=[],adminSupply=[]; async function loadAdminData(){ const [ps,os,ms,ss]=await Promise.all([ adminRest('products?select=id,sku,name_ar,name_en,category,brand,origin,description_ar,description_en,specifications_ar,specifications_en,model,unit,warranty,price,currency,stock_qty,reserved_qty,reorder_level,is_rfq,is_active&order=name_ar.asc'), adminRest('orders?select=id,order_no,customer_name,phone,subtotal,shipping_cost,total,currency,status,created_at&order=created_at.desc&limit=100'), adminRest('inventory_movements?select=id,product_id,movement_type,qty,note,created_at&order=created_at.desc&limit=100'), adminRest('merchant_supply_requests?select=id,request_no,business_name,product_name,quantity,status,created_at&order=created_at.desc&limit=100') ]); adminProducts=ps||[];adminOrders=os||[];adminMovements=ms||[];adminSupply=ss||[]; renderAdmin(); } function renderAdmin(){ const totalStock=adminProducts.reduce((a,p)=>a+Number(p.stock_qty||0),0); const totalReserved=adminProducts.reduce((a,p)=>a+Number(p.reserved_qty||0),0); const sales=adminOrders.reduce((a,o)=>a+Number(o.total??o.subtotal??0),0); document.getElementById('kpis').innerHTML=[ ['المنتجات',adminProducts.length],['المخزون',totalStock],['المحجوز',totalReserved],['الطلبات',adminOrders.length],['قيمة الطلبات',money(sales)+' ج.س'] ].map(x=>`
${x[0]}${x[1]}
`).join(''); document.getElementById('inventoryRows').innerHTML=adminProducts.map(p=>{ const a=Math.max(0,Number(p.stock_qty||0)-Number(p.reserved_qty||0)); return `${p.name_ar||p.name_en||p.sku}${p.sku}${p.stock_qty}${p.reserved_qty}${a}${p.reorder_level}${money(Number(p.price||0))} ج.س` }).join(''); const names=Object.fromEntries(adminProducts.map(p=>[p.id,p.name_ar||p.name_en||p.sku])); document.getElementById('movementRows').innerHTML=adminMovements.map(m=>`${new Date(m.created_at).toLocaleString('ar-SA')}${names[m.product_id]||'-'}${m.movement_type}${m.qty>0?'+':''}${m.qty}${m.note||'-'}`).join(''); const sr=document.getElementById('merchantSupplyRows');if(sr)sr.innerHTML=adminSupply.map(x=>`${x.request_no}${x.business_name}${x.product_name}${x.quantity}${x.status}${new Date(x.created_at).toLocaleDateString('ar-SA')}`).join(''); document.getElementById('ordersRows').innerHTML=adminOrders.map(o=>`${o.order_no}${o.customer_name||'-'}${o.phone||'-'}${money(Number(o.total??o.subtotal??0))} ${o.currency||'SDG'}${o.status}`).join(''); const sel=document.getElementById('inventoryProductSelect'); if(sel)sel.innerHTML=adminProducts.map(p=>``).join(''); const msg=document.getElementById('adminLiveMsg');if(msg)msg.textContent='تم تحديث البيانات من Supabase مباشرة.'; } window.beginEditProduct=function(id){ const p=adminProducts.find(x=>x.id===id);if(!p)return; const f=document.getElementById('editProductForm');f.style.display='block'; f.elements.id.value=p.id;f.elements.name_ar.value=p.name_ar||'';f.elements.name_en.value=p.name_en||'';f.elements.brand.value=p.brand||'';f.elements.origin.value=p.origin||'';f.elements.description_ar.value=p.description_ar||'';f.elements.specifications_ar.value=p.specifications_ar||'';f.elements.model.value=p.model||'';f.elements.unit.value=p.unit||'';f.elements.warranty.value=p.warranty||''; f.elements.price.value=p.price??0;f.elements.reorder_level.value=p.reorder_level??0;f.elements.is_active.value=String(!!p.is_active); f.scrollIntoView({behavior:'smooth',block:'center'}); }; document.getElementById('cancelEditProduct').onclick=()=>{document.getElementById('editProductForm').style.display='none'}; document.getElementById('adminRefreshBtn').onclick=()=>loadAdminData().catch(e=>toast(e.message)); document.getElementById('adminLogoutBtn').onclick=()=>{setAdminSession(null);refreshAdminGate();toast('تم تسجيل الخروج')}; document.getElementById('newProductForm').onsubmit=async e=>{ e.preventDefault();const f=e.target,m=document.getElementById('newProductMsg'),fd=new FormData(f); const row={sku:String(fd.get('sku')).trim(),name_ar:String(fd.get('name_ar')).trim(),name_en:String(fd.get('name_en')||'').trim()||null,category:String(fd.get('category')),brand:String(fd.get('brand')||'').trim()||null,origin:String(fd.get('origin')||'').trim()||null,description_ar:String(fd.get('description_ar')||'').trim()||null,specifications_ar:String(fd.get('specifications_ar')||'').trim()||null,model:String(fd.get('model')||'').trim()||null,unit:String(fd.get('unit')||'').trim()||null,warranty:String(fd.get('warranty')||'').trim()||null,price:Number(fd.get('price')||0),stock_qty:Number(fd.get('stock_qty')||0),reserved_qty:0,reorder_level:Number(fd.get('reorder_level')||0),is_rfq:fd.get('is_rfq')==='on',is_active:true,currency:'SDG'}; try{m.textContent='جارٍ الإضافة...';await adminRest('products',{method:'POST',headers:{'Prefer':'return=minimal'},body:JSON.stringify(row)});m.textContent='تمت إضافة المنتج.';f.reset();await loadAdminData()}catch(err){m.textContent=err.message} }; document.getElementById('adjustInventoryForm').onsubmit=async e=>{ e.preventDefault();const f=e.target,m=document.getElementById('adjustInventoryMsg'),fd=new FormData(f),delta=Number(fd.get('delta')); if(!Number.isInteger(delta)||delta===0){m.textContent='أدخل كمية صحيحة غير صفرية.';return} try{m.textContent='جارٍ تحديث المخزون...';await adminRest('rpc/adjust_inventory',{method:'POST',body:JSON.stringify({p_product_id:fd.get('product_id'),p_delta:delta,p_movement_type:fd.get('movement_type'),p_note:String(fd.get('note')||'').trim()||null})});m.textContent='تم تحديث المخزون وتسجيل الحركة.';f.elements.delta.value='';f.elements.note.value='';await loadAdminData()}catch(err){m.textContent=err.message} }; document.getElementById('editProductForm').onsubmit=async e=>{ e.preventDefault();const f=e.target,m=document.getElementById('editProductMsg'),fd=new FormData(f),id=fd.get('id'); const row={name_ar:String(fd.get('name_ar')).trim(),name_en:String(fd.get('name_en')||'').trim()||null,brand:String(fd.get('brand')||'').trim()||null,origin:String(fd.get('origin')||'').trim()||null,description_ar:String(fd.get('description_ar')||'').trim()||null,specifications_ar:String(fd.get('specifications_ar')||'').trim()||null,model:String(fd.get('model')||'').trim()||null,unit:String(fd.get('unit')||'').trim()||null,warranty:String(fd.get('warranty')||'').trim()||null,price:Number(fd.get('price')||0),reorder_level:Number(fd.get('reorder_level')||0),is_active:fd.get('is_active')==='true',updated_at:new Date().toISOString()}; try{m.textContent='جارٍ الحفظ...';await adminRest(`products?id=eq.${id}`,{method:'PATCH',headers:{'Prefer':'return=minimal'},body:JSON.stringify(row)});m.textContent='تم حفظ التعديلات.';await loadAdminData()}catch(err){m.textContent=err.message} }; applyLang();syncCatalogProducts(); if(new URLSearchParams(location.search).get('admin')==='1'){ const s=getAdminSession(); if(s&&s.access_token)go('admin'); else location.replace('/admin.html'); }