diff --git a/docs/crm.html b/docs/crm.html index a25fd24..0075c7e 100644 --- a/docs/crm.html +++ b/docs/crm.html @@ -499,6 +499,17 @@ async function confirmStagePay(k){ ]); renderClient(); } +async function unStagePay(k){ + const pays=getStagePays();if(!pays[k])return; + if(!confirm('Отменить оплату этапа «'+CLIENT_STAGES.find(s=>s.key===k).name+'»? Связанный платёж удалится из реестра.'))return; + delete pays[k]; + state.crm.stage_payments=pays; + const arr=state.crm.payments||[]; + for(let i=arr.length-1;i>=0;i--){if(arr[i].stage===k){arr.splice(i,1);break;}} + state.crm.payments=arr; + await fetch(`${API}/api/project/crm`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:current,stage_payments:pays,payments:arr})}); + await loadProjects();renderClient(); +} function renderPaymentPlan(){ const box=document.getElementById("planBox");if(!box)return; const billing=(state.crm&&state.crm.billing_type)||"paid"; @@ -532,7 +543,7 @@ function renderPaymentPlan(){ ${CX_SHORT[cx]} -
Получено ${money(paidTotal)} из ${money(total)} · нажмите цену чтобы изменить
+
Получено ${money(paidTotal)} из ${money(total)} · — изменить цену · — отменить оплату · «↻ Пересчитать» сбрасывает к ставкам
${CLIENT_STAGES.map(s=>{ const done=stageIsDone(s.key); const paid=pays[s.key]; @@ -562,7 +573,7 @@ function renderPaymentPlan(){
${s.name}${badge}
${sub} - ${action} +
${action}${paid?``:''}
`; }).join("")}
@@ -649,7 +660,15 @@ function addPayment(){ } savePayments();renderClient(); } -function delPayment(i){state.crm.payments.splice(i,1);savePayments();renderClient();} +function delPayment(i){ + const removed=state.crm.payments[i]; + state.crm.payments.splice(i,1); + if(removed&&removed.stage&&state.crm.stage_payments){ + const stillPaid=state.crm.payments.some(p=>p.stage===removed.stage); + if(!stillPaid)delete state.crm.stage_payments[removed.stage]; + } + savePayments();renderClient(); +} function remindBalance(left){ const due=new Date(Date.now()+7*864e5).toISOString().slice(0,10); state.tasks=state.tasks||[];state.tasks.push({text:`Получить остаток ${money(left)} от ${state.client_name||'клиента'}`,due,done:false});