diff --git a/backend/elena_app.py b/backend/elena_app.py index bc665f5..70eadb4 100644 --- a/backend/elena_app.py +++ b/backend/elena_app.py @@ -616,6 +616,26 @@ def update_crm(): save_artifact(proj["id"], "crm", crm) return jsonify({"ok": True, "crm": crm}) +@app.route("/api/project/delete", methods=["POST"]) +def delete_project(): + data = request.get_json(force=True) or {} + proj = get_project(data.get("token")) + if not proj: + return jsonify({"error": "project not found"}), 404 + pid = proj["id"] + con = db() + con.execute("DELETE FROM messages WHERE project_id=?", (pid,)) + con.execute("DELETE FROM models WHERE project_id=?", (pid,)) + con.execute("DELETE FROM artifacts WHERE project_id=?", (pid,)) + con.execute("DELETE FROM projects WHERE id=?", (pid,)) + con.commit() + # удалить загруженные документы + import shutil + pdir = os.path.join(UPLOAD_DIR, proj["token"]) + if os.path.isdir(pdir): + shutil.rmtree(pdir, ignore_errors=True) + return jsonify({"ok": True}) + @app.route("/api/project/tasks", methods=["POST"]) def update_tasks(): data = request.get_json(force=True) or {} diff --git a/docs/crm.html b/docs/crm.html index 5667ec3..d9a4957 100644 --- a/docs/crm.html +++ b/docs/crm.html @@ -211,7 +211,7 @@ function renderClient(){
Оплачено
Источник
-
👁 Открыть кабинет
+
👁 Открыть кабинет
${TABS.map(t=>`
${t.icon} ${t.name}
`).join("")}
`; @@ -240,6 +240,12 @@ async function saveCrm(){ await loadProjects(); } function inviteLink(){const url=`${location.origin}${location.pathname.replace('crm.html','cabinet.html')}?t=${current}`;navigator.clipboard.writeText(url).then(()=>alert("Ссылка скопирована:\n\n"+url)).catch(()=>prompt("Ссылка:",url));} +async function deleteClient(){ + const nm=state.client_name||"клиента"; + if(!confirm(`Удалить «${nm}» со всеми данными (интервью, анализ, ТЗ, документы)?\n\nЭто действие необратимо.`))return; + await fetch(`${API}/api/project/delete`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:current})}); + current=null;await loadProjects();setView("dashboard"); +} function exportSpecPDF(){ const s=state.spec;if(!s){alert("ТЗ ещё не собрано");return}