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:"📊"}];