diff --git a/mockup.html b/mockup.html index 62bd3f1..7cc57e9 100644 --- a/mockup.html +++ b/mockup.html @@ -2686,6 +2686,246 @@ function showResults(ctypeKey) { document.getElementById('el-step2').style.display = 'block'; document.getElementById('el-actbar').style.display = 'flex'; document.getElementById('el-step2').scrollIntoView({ behavior: 'smooth' }); + + // Проверяем есть ли связанный договор для сравнения + _checkForContractLink(text, ctypeKey); +} + +// ── СВЯЗКА ДОКУМЕНТОВ + ПОИСК ПРОТИВОРЕЧИЙ ───────────────────────────────── + +function _checkForContractLink(newDocText, newDocType) { + /* Если это акт/доп.соглашение — проверяем есть ли договор в хранилище */ + var actTypes = ['акт', 'act', 'дополнительное соглашение', 'допсоглашение']; + var isAct = actTypes.some(function(t){ return (newDocType||'').toLowerCase().includes(t); }); + if (!isAct) return; + + var contracts = _getContracts(); + if (!contracts || !contracts.length) return; + + var wrap = document.querySelector('.chatwrap'); + if (!wrap) return; + + // Показываем предложение сравнить с договором + var old = document.getElementById('compare-offer'); if (old) return; + var div = document.createElement('div'); + div.id = 'compare-offer'; + div.className = 'msg'; + div.innerHTML = + '
' + + '
Елена
' + + 'Вижу что это акт. В вашем кабинете есть ' + contracts.length + ' договор(а). ' + + 'Сравнить с ним — могу найти противоречия до подписания.' + + '
' + + contracts.slice(0,3).map(function(c, i){ + return ''; + }).join('') + + '' + + '
'; + wrap.appendChild(div); + div.scrollIntoView({behavior:'smooth'}); +} + +function _compareWithContract(contractIdx) { + var contracts = _getContracts(); + var contract = contracts[contractIdx]; + if (!contract) return; + + var actText = (document.getElementById('el-paste') || {}).value || ''; + var contractText = contract.preview || ''; + + if (!contractText || contractText.length < 50) { + toast('⚠️ Текст договора не сохранён — загрузите договор заново для полного сравнения'); + return; + } + + var offer = document.getElementById('compare-offer'); if (offer) offer.remove(); + var wrap = document.querySelector('.chatwrap'); + + // Progress bubble + var prog = document.createElement('div'); + prog.id = 'compare-progress'; + prog.className = 'msg'; + prog.innerHTML = '
' + + '
Елена
' + + '🔍 Сравниваю документы… .
'; + if (wrap) wrap.appendChild(prog); + prog.scrollIntoView({behavior:'smooth'}); + + var dots = 0; + var dotsInterval = setInterval(function(){ + var el = document.getElementById('cmp-dots'); + if (el) el.textContent = ['.','..','.'][dots++ % 3]; + }, 500); + + fetch(API_BASE + '/api/compare', { + method: 'POST', + headers: {'Content-Type':'application/json'}, + body: JSON.stringify({ + contract_text: contractText, + document_text: actText, + doc_type: 'Акт приёмки-передачи' + }) + }) + .then(function(r){ return r.json(); }) + .then(function(data){ + clearInterval(dotsInterval); + var p = document.getElementById('compare-progress'); if (p) p.remove(); + _showCompareResults(data, contract); + }) + .catch(function(e){ + clearInterval(dotsInterval); + var p = document.getElementById('compare-progress'); if (p) p.remove(); + toast('Ошибка сравнения: ' + e.message); + }); +} + +function _showCompareResults(data, contract) { + var wrap = document.querySelector('.chatwrap'); + if (!wrap) return; + + var contradictions = data.contradictions || []; + var verdict = data.verdict || 'safe'; + var verdictColors = {safe:'#16a34a', review:'#d97706', danger:'#dc2626'}; + var verdictLabels = {safe:'✅ Противоречий нет', review:'⚠️ Есть расхождения', danger:'🚨 Критические противоречия'}; + var verdictColor = verdictColors[verdict] || '#374151'; + + var html = '
' + + '
Елена
' + + '
' + + verdictLabels[verdict] + '
'; + + if (data.summary) { + html += '
' + data.summary + '
'; + } + + if (contradictions.length) { + html += '
'; + contradictions.forEach(function(c) { + var riskColor = {critical:'#dc2626', high:'#d97706', medium:'#2563eb'}[c.risk] || '#374151'; + html += '
' + + '
' + + ({critical:'🔴', high:'🟠', medium:'🟡'}[c.risk] || '⚪') + ' ' + (c.field || '') + '
' + + '
' + + 'Договор: ' + (c.in_contract || '') + '
' + + 'Акт: ' + (c.in_document || '') + + '
' + + '
' + + '⚠️ ' + (c.consequence || '') + + '
' + + '
✅ ' + (c.recommendation || '') + '
' + + '
'; + }); + html += '
'; + } + + // Кнопки действий + html += '
'; + if (verdict === 'danger' || verdict === 'review') { + html += ''; + } + html += ''; + html += '
'; + html += '
'; + + var div = document.createElement('div'); + div.innerHTML = html; + wrap.appendChild(div.firstChild || div); + wrap.lastChild.scrollIntoView({behavior:'smooth'}); + + // Обновляем досье + if (contradictions.length) { + _updateDossier({ + facts: ['Найдены противоречия в акте с договором: ' + contradictions.map(function(c){return c.field;}).join(', ')], + open: ['Решить противоречия перед подписанием акта'] + }); + } +} + +// ── МОДЕЛЬ ПАРТНЁРОВ ───────────────────────────────────────────────────────── + +function _offerPartner(reason) { + var wrap = document.querySelector('.chatwrap') || document.getElementById('rchat-msgs'); + if (!wrap) return; + + var old = document.getElementById('partner-offer'); if (old) { old.scrollIntoView({behavior:'smooth'}); return; } + var div = document.createElement('div'); + div.id = 'partner-offer'; + div.className = 'msg'; + + var ctx = _buildElenaContext(); + div.innerHTML = + '
' + + '
Елена
' + + '
👨‍⚖️ Подключить юриста-партнёра
' + + '
' + + 'Я подготовила досье по вашему делу. Юрист-партнёр получит полный контекст ' + + 'и свяжется с вами в течение нескольких часов — уже подготовленным.' + + '
' + + '
' + + 'Повод обращения: ' + (reason || 'сложный кейс') + '' + + '
' + + '
' + + '' + + '
' + + '' + + '' + + '
' + + '
'; + + wrap.appendChild(div); + div.scrollIntoView({behavior:'smooth'}); + setTimeout(function(){ var i = document.getElementById('partner-phone'); if (i) i.focus(); }, 300); +} + +function _submitPartnerRequest(reason) { + var phone = (document.getElementById('partner-phone') || {}).value || ''; + var ctx = _buildElenaContext(); + var dossier = _getDossier() || {}; + var history = _chatHistory.slice(-10); + + // Собираем краткое описание кейса + var caseSummary = reason || 'Клиент запросил помощь юриста'; + if (ctx.case_context) caseSummary += '\n\nКонтекст: ' + ctx.case_context.slice(0, 500); + if (history.length) { + caseSummary += '\n\nПоследнее из диалога: ' + + history.slice(-4).map(function(m){ return m.role + ': ' + m.content; }).join('\n'); + } + + var offer = document.getElementById('partner-offer'); if (offer) offer.remove(); + toast('⏳ Отправляю заявку…'); + + fetch(API_BASE + '/api/partner', { + method: 'POST', + headers: {'Content-Type':'application/json'}, + body: JSON.stringify({ + client_name: ctx.client_name || 'Клиент', + phone: phone, + case_summary: caseSummary, + dossier: dossier, + complexity_score: 3 + }) + }) + .then(function(r){ return r.json(); }) + .then(function(data){ + var wrap = document.querySelector('.chatwrap') || document.getElementById('rchat-msgs'); + if (!wrap) return; + var div = document.createElement('div'); + div.className = 'msg'; + div.innerHTML = + '
' + + '
Елена
' + + '
✅ Заявка принята
' + + '
' + (data.message || '') + '
' + + '
Номер заявки: ' + (data.ticket_id || '') + '
' + + '
'; + wrap.appendChild(div); + div.scrollIntoView({behavior:'smooth'}); + _updateDossier({ decisions: ['Передано юристу-партнёру: ' + (data.ticket_id || '')] }); + }) + .catch(function(e){ toast('Ошибка: ' + e.message); }); } /* ── СКАНИРОВАНИЕ ── */ @@ -2873,9 +3113,10 @@ function _offerCouncil(data) { 'каждый даёт позицию по вашему делу. Opus синтезирует вердикт с шансами в суде.' + '' + '
от 2 990 ₽ · ~20 сек
' + - '
' + + '
' + '' + - '' + + '' + + '' + '
' + '
'; wrap.appendChild(div);