أداة تصنيف المنتجات

Okazia — أداة تصنيف المنتجاتOkazia Martأداة تصنيف المنتجات

حط بيانات المنتج — والأداة هتقولك يدخل في أنهي خانة وهيظهر لمين

اسم المنتج

المواصفات / الوصف (انسخه من أمازون)

سعر البيع (جنيه)

تكلفتك من أمازون (اختياري)

حلّل المنتج ✦بيستخدم الذكاء الاصطناعي لقراءة المنتج واقتراح التصنيف

الفئة السعرية (tier)

مناسب لـ (gender)

النوع (style)

يصلح لأي علاقة (relationship)

سطر الوصف العاطفي المقترح (تقدر تعدّله)

جاهز للصق في قائمة المنتجات (PRODUCTS) في مرشد الهدايا

نسخ الكود ⧉

/* ---- current slate, for the coverage verdict (gender x tier) ---- */ const SLATE = [ {gender:'any', tier:'mid'}, // galaxy projector {gender:'her', tier:'eco'}, // jewelry box {gender:'her', tier:'mid'}, // accessory set {gender:'her', tier:'premium'}, // eternal rose {gender:'him', tier:'premium'}, // watch (placeholder) ]; const REL_AR = {partner:'شريك/ة',parent:'أب/أم',friend:'صاحب/ة',colleague:'زميل شغل',anyone:'أي حد'}; const GEN_AR = {her:'ست',him:'راجل',any:'الاتنين'}; const STY_AR = {practical:'عملي بيتستخدم',decorative:'شيك للزينة',either:'الاتنين'}; function tierFromPrice(p){ return p<550?'eco' : p<=850?'mid' : 'premium'; } function coverage(gender,tier){ // count existing products that already serve this gender+tier cell ('any' matches both) let n=0; SLATE.forEach(s=>{ const gMatch = s.gender===gender || s.gender==='any' || gender==='any'; if(gMatch && s.tier===tier) n++; }); if(n===0) return {cls:'ok', txt:'✅ يسدّ فجوة في الكتالوج — ضيفه'}; if(n===1) return {cls:'warn',txt:'👍 الخانة دي فيها منتج واحد بس — كويس يقوّيها'}; return {cls:'bad', txt:'⚠️ الخانة دي مغطّاة كفاية — مش محتاجه (إلا كبديل)'}; } let last=null; document.getElementById('go').addEventListener('click', async ()=>{ const name=document.getElementById('name').value.trim(); const desc=document.getElementById('desc').value.trim(); const price=parseFloat(document.getElementById('price').value); const cost=parseFloat(document.getElementById('cost').value); const out=document.getElementById('out'); if(!name||!price){ out.className='panel out show'; document.getElementById('verdict').className='verdict bad'; document.getElementById('verdict').textContent='اكتب اسم المنتج والسعر على الأقل'; return; } const btn=document.getElementById('go'); btn.disabled=true; btn.textContent='بحلّل... ✦'; const prompt = `You are a gift-product classifier for "Okazia Mart", an Egyptian gift store. Classify this product against our schema. Product name: ${name} Description/specs: ${desc||'(none provided)'} Selling price: ${price} EGP Return ONLY a valid JSON object (no markdown, no backticks, no preamble) with EXACTLY these keys: - "gender": one of "her","him","any" (who the gift suits) - "relationship": array, any subset of ["partner","parent","friend","colleague","anyone"] — which relationships this gift is APPROPRIATE for. Be honest: pricey/romantic items are NOT for colleagues; safe neutral items fit colleagues. - "style": one of "practical","decorative","either" - "why_ar": ONE short sentence in EGYPTIAN ARABIC dialect, emotional and customer-facing, max 12 words, explaining why it's a great gift. Output JSON only.`; try{ const res = await fetch("https://api.anthropic.com/v1/messages",{ method:"POST", headers:{"Content-Type":"application/json"}, body:JSON.stringify({ model:"claude-sonnet-4-20250514", max_tokens:1000, messages:[{role:"user",content:prompt}] }) }); const data = await res.json(); const text = data.content.filter(b=>b.type==="text").map(b=>b.text).join(""); const parsed = JSON.parse(text.replace(/```json|```/g,"").trim()); const tier = tierFromPrice(price); const cov = coverage(parsed.gender, tier); document.getElementById('verdict').className='verdict '+cov.cls; document.getElementById('verdict').textContent=cov.txt; document.getElementById('t-tier').textContent = tier+' ('+(tier==='eco'?'<550':tier==='mid'?'550–850':'>850')+')'; document.getElementById('t-gender').textContent = GEN_AR[parsed.gender]||parsed.gender; document.getElementById('t-style').textContent = STY_AR[parsed.style]||parsed.style; document.getElementById('t-rel').innerHTML = (parsed.relationship||[]).map(r=>'<span class="chip">'+(REL_AR[r]||r)+'</span>').join(''); document.getElementById('t-why').textContent = parsed.why_ar||''; const mEl=document.getElementById('t-margin'); if(!isNaN(cost) && cost>0){ const gross=price-cost; const pct=Math.round(gross/price*100); mEl.style.display='block'; mEl.className='margin'+(pct<35?' thin':''); mEl.textContent = `هامش الربح قبل الإعلانات: ${gross} جنيه (${pct}%)` + (pct<35?' — قليل، الإعلانات هتاكله':' — كويس'); } else { mEl.style.display='none'; } const snip = `{ name:'${name}', price:${price}, icon:'box', gender:['${parsed.gender}'], style:'${parsed.style}', relationship:${JSON.stringify(parsed.relationship||[])}, tier:'${tier}', why:'${(parsed.why_ar||'').replace(/'/g,"\\'")}', url:'PUT_REAL_EASYORDER_URL_HERE' },`; document.getElementById('t-snip').textContent = snip; last=snip; out.className='panel out show'; }catch(e){ out.className='panel out show'; document.getElementById('verdict').className='verdict bad'; document.getElementById('verdict').textContent='حصل خطأ في التحليل — جرّب تاني'; }finally{ btn.disabled=false; btn.textContent='حلّل المنتج ✦'; } }); document.getElementById('copy').addEventListener('click',()=>{ if(last){ navigator.clipboard.writeText(last); const b=document.getElementById('copy'); b.textContent='اتنسخ ✓'; setTimeout(()=>b.textContent='نسخ الكود ⧉',1500); } });