From a44a98555b9283c846f5a67d8536c29bbfc09a09 Mon Sep 17 00:00:00 2001 From: WASRUSGEN Date: Sat, 30 May 2026 11:53:39 +0300 Subject: [PATCH] feat: missing doc options UI - 5 variants with Elena responses --- mockup.html | 130 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 128 insertions(+), 2 deletions(-) diff --git a/mockup.html b/mockup.html index 1921dea..203a110 100644 --- a/mockup.html +++ b/mockup.html @@ -7777,17 +7777,143 @@ function _showDocAuditInChat(contractType, intent) { } function _auditCheck(contractType, docId, checked, intent) { - // Обновляем состояние чеклиста try { var saved = JSON.parse(localStorage.getItem('zashita_doccheck_' + contractType) || '{}'); saved[docId] = checked; localStorage.setItem('zashita_doccheck_' + contractType, JSON.stringify(saved)); } catch(e){} - // Пересчитываем пропуски и показываем актуальные риски + if (!checked) { + // Документ сняли с галочки → показываем варианты + var cl = DOC_CHECKLISTS[contractType] || {docs:[]}; + var doc = cl.docs.find(function(d){ return d.id === docId; }); + if (doc) { + setTimeout(function(){ _showMissingDocOptions(contractType, doc, intent); }, 200); + return; + } + } + setTimeout(function(){ _showAuditGaps(contractType, intent); }, 300); } +// Показывает варианты поведения когда документа нет +function _showMissingDocOptions(contractType, doc, intent) { + var msgs = document.getElementById('rchat-msgs'); + if (!msgs) return; + + // Удаляем старый блок вариантов + var old = document.getElementById('missing-doc-options'); + if (old) old.remove(); + + var riskColor = {critical:'#dc2626', high:'#d97706', medium:'#2563eb'}[doc.risk] || '#6b7280'; + + var div = document.createElement('div'); + div.id = 'missing-doc-options'; + div.className = 'hc-msg hc-elena'; + + var html = + '' + + '
' + + '
' + + '' + doc.label + ' — ' + doc.tip + + '
' + + '
Что сейчас с этим документом?
' + + '
' + + + // Вариант 1: Нет, никогда не было + '' + + + // Вариант 2: Есть, но не под рукой + '' + + + // Вариант 3: Не уверен + '' + + + // Вариант 4: Утеряно + '' + + + // Вариант 5: Вторая сторона не даёт + '' + + + '
'; + + div.innerHTML = html; + msgs.appendChild(div); + msgs.scrollTop = msgs.scrollHeight; +} + +// Реагирует на выбранный вариант +function _handleMissingDoc(contractType, docId, variant, intent) { + // Убираем блок вариантов + var opt = document.getElementById('missing-doc-options'); + if (opt) opt.remove(); + + var msgs = document.getElementById('rchat-msgs'); + if (!msgs) return; + + // Пузырь клиента + var labels = { + never: '❌ Нет — не было и нет', + later: '📁 Есть — найду позже', + unknown: '🤔 Не уверен', + lost: '🗑 Утеряно', + refused: '🚫 Контрагент не даёт' + }; + var uDiv = document.createElement('div'); + uDiv.className = 'hc-msg hc-user'; + uDiv.innerHTML = '
' + (labels[variant] || variant) + '
'; + msgs.appendChild(uDiv); + + // Сохраняем статус + try { + var statKey = 'zashita_docstatus_' + contractType; + var statuses = JSON.parse(localStorage.getItem(statKey) || '{}'); + statuses[docId] = variant; + localStorage.setItem(statKey, JSON.stringify(statuses)); + } catch(e){} + + // Ответ Елены через API + var cl = DOC_CHECKLISTS[contractType] || {docs:[]}; + var doc = cl.docs.find(function(d){ return d.id === docId; }) || {}; + + var promptMap = { + never: 'Клиент сказал что документа "' + doc.label + '" никогда не было. Объясни риск и предложи два варианта выхода из ситуации (составить/компенсировать другими доказательствами).', + later: 'Клиент сказал что документ "' + doc.label + '" есть, но не под рукой — найдёт позже. Зафикисруй это, скажи когда он понадобится и продолжи работу.', + unknown: 'Клиент не знает есть ли документ "' + doc.label + '". Объясни как он должен выглядеть и где его искать. Дай альтернативу если не найдёт.', + lost: 'Клиент потерял документ "' + doc.label + '". Объясни как получить копию (у контрагента / нотариуса) и какие альтернативные доказательства подойдут.', + refused: 'Контрагент отказывается дать документ "' + doc.label + '" клиенту. Объясни права клиента и предложи официальный запрос + судебное истребование.' + }; + + setTimeout(function(){ + _rcAddTyping(); + _elenaApi(promptMap[variant] || promptMap.never, intent, function(apiReply, apiActions){ + _rcRemoveTyping(); + var reply = apiReply || 'Понятно. Давайте разберём что можно сделать в этой ситуации.'; + _chatHistory.push({role:'user', content: labels[variant]}); + _chatHistory.push({role:'assistant', content: reply}); + _saveHistory(); + _rcAddBubble(reply, false); + if (apiActions && apiActions.length) _renderElenaActions(apiActions, msgs); + _rcShowControls(); + }); + }, 300); +} + function _showAuditGaps(contractType, intent) { var msgs = document.getElementById('rchat-msgs'); if (!msgs) return;