diff --git a/docs/crm.html b/docs/crm.html index a2931f8..ff6771a 100644 --- a/docs/crm.html +++ b/docs/crm.html @@ -66,6 +66,10 @@ body{font-family:'Inter',sans-serif;background:var(--bg);color:var(--text);displ .kcard-n{font-size:13px;font-weight:700;margin-bottom:3px} .kcard-m{font-size:11px;color:var(--muted)} .kcard-amt{font-size:12px;font-weight:700;color:var(--primary);margin-top:6px} +.kcol-sum{font-size:11px;font-weight:700;color:var(--primary);padding:0 8px 4px} +.kcard[draggable=true]{cursor:grab} +.kcard.dragging{opacity:.45;cursor:grabbing} +.kcol.drop-hot{background:#ECFDF5;outline:2px dashed var(--mid);outline-offset:-2px} /* Client card */ .cc-top{display:flex;align-items:center;gap:14px;margin-bottom:18px} .cc-av{width:48px;height:48px;border-radius:12px;background:#6366F1;display:flex;align-items:center;justify-content:center;font-weight:700;color:#fff;font-size:20px} @@ -152,6 +156,7 @@ body{font-family:'Inter',sans-serif;background:var(--bg);color:var(--text);displ .cc-top{flex-wrap:wrap} .cc-name{font-size:17px} .sec-h{font-size:14px} + .kcol{min-width:168px} } @@ -369,10 +374,44 @@ function renderUpcomingTasks(){ return head+`
${top.map(t=>`
${esc(t.text)}${esc(t.client)}${t.due?`${t.due===today?'сегодня':t.due`:''}
`).join("")}
`; } function renderPipeline(){ - document.getElementById("view").innerHTML=`
Воронка продаж
${PIPE.map(([k,name,col])=>{ - const items=projects.filter(p=>((p.crm&&p.crm.pipeline)||"lead")===k); - return `
${name}${items.length}
${items.map(p=>`
${esc(p.client_name)}
${esc(p.niche)}
${(p.crm&&p.crm.deal_amount)?`
${money(p.crm.deal_amount)}
`:''}
`).join("")}
`; - }).join("")}
`; + document.getElementById("view").innerHTML=`
Воронка продаж
+
Перетащите карточку между колонками, чтобы сменить этап сделки
+
${PIPE.map(([k,name,col])=>{ + const items=projects.filter(p=>((p.crm&&p.crm.pipeline)||"lead")===k); + const sum=items.reduce((s,p)=>s+((p.crm&&p.crm.deal_amount)||0),0); + return `
+
${name}${items.length}
+ ${sum>0?`
${money(sum)}
`:''} + ${items.map(p=>kCard(p)).join("")||'
пусто
'} +
`; + }).join("")}
`; +} +function kCard(p){ + const billing=(p.crm&&p.crm.billing_type)||"paid"; + const bch=billing==='free'?'🎁':'💰'; + const st=clientStages(p); + let dots="";STAGE_DEFS.forEach((s,i)=>{const d=st.done[i],c=!st.all&&i===st.cur;dots+=``;}); + return `
+
${esc(p.client_name)}${bch}
+
${esc(p.niche)}
+
${dots}${st.cnt}/5
+ ${(p.crm&&p.crm.deal_amount)?`
${money(p.crm.deal_amount)}
`:''} +
`; +} +let kDragToken=null; +function kDragStart(e,token){kDragToken=token;e.currentTarget.classList.add('dragging');try{e.dataTransfer.effectAllowed='move';e.dataTransfer.setData('text/plain',token);}catch(_){}} +function kDragEnd(e){e.currentTarget.classList.remove('dragging');document.querySelectorAll('.kcol').forEach(c=>c.classList.remove('drop-hot'));} +function kDragOver(e){e.preventDefault();e.currentTarget.classList.add('drop-hot');try{e.dataTransfer.dropEffect='move';}catch(_){}} +function kDragLeave(e){e.currentTarget.classList.remove('drop-hot');} +async function kDrop(e,pipe){ + e.preventDefault();e.currentTarget.classList.remove('drop-hot'); + const tok=kDragToken||(e.dataTransfer&&e.dataTransfer.getData('text/plain'));kDragToken=null; + if(!tok)return; + const p=projects.find(x=>x.token===tok);if(!p)return; + if(((p.crm&&p.crm.pipeline)||'lead')===pipe){renderPipeline();return;} + p.crm=p.crm||{};p.crm.pipeline=pipe; + await fetch(`${API}/api/project/crm`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:tok,pipeline:pipe})}); + await loadProjects();renderPipeline(); } const MAINTABS=[{id:"deal",name:"Сделка",icon:"📇"},{id:"pricing",name:"Ценообразование",icon:"💰"},{id:"payments",name:"Платежи",icon:"💳"},{id:"tasks",name:"Задачи",icon:"📌"},{id:"analysis",name:"Анализ",icon:"📊"}];