diff --git a/mockup.html b/mockup.html index 8d954de..bc9849a 100644 --- a/mockup.html +++ b/mockup.html @@ -6336,9 +6336,157 @@ function _elChatSend() { wrap.appendChild(eDiv); if (apiActions && apiActions.length) _renderElenaActions(apiActions, wrap); wrap.scrollTop = wrap.scrollHeight; + + // После 2 обменов — предлагаем оценку + монетизацию + if (_chatHistory.length >= 4) { + setTimeout(function(){ _checkAndOfferService(wrap); }, 1200); + } }); } +// ── МОНЕТИЗАЦИОННЫЙ ФЛОУ ───────────────────────────────────────────────────── + +var _serviceOffered = false; // показываем оффер один раз за сессию + +function _checkAndOfferService(wrap) { + if (_serviceOffered) return; + if (!wrap) return; + + var credits = parseInt(localStorage.getItem('zashita_credits') || '0'); + var contractText = (document.getElementById('el-paste') || {}).value || ''; + var ctx = _buildElenaContext(); + + // Запрашиваем оценку ситуации + fetch(API_BASE + '/api/estimate', { + method: 'POST', + headers: {'Content-Type':'application/json'}, + body: JSON.stringify({ + situation: _chatHistory.slice(-4).map(function(m){ return m.role + ': ' + m.content; }).join('\n'), + contract_text: contractText.slice(0, 2000), + case_context: ctx.case_context, + history: _chatHistory.slice(-6) + }) + }) + .then(function(r){ return r.json(); }) + .then(function(data){ + if (data.error) return; + _serviceOffered = true; + if (credits > 0) { + _showServiceOffer(wrap, data, credits); + } else { + _showFreePreview(wrap, data); + } + }) + .catch(function(){}); +} + +function _showServiceOffer(wrap, data, credits) { + // Есть баланс — предлагаем конкретную услугу + var recommended = (data.catalog || [])[0]; + if (!recommended) return; + + var div = document.createElement('div'); + div.className = 'msg'; + div.innerHTML = + '
' + + '
Елена
' + + '
' + (data.summary || '') + '
' + + '
' + + '
' + recommended.name + '
' + + '
' + recommended.desc + '
' + + '
' + + recommended.price.toLocaleString('ru') + ' ₽ · ' + recommended.credits + ' ' + + (recommended.credits === 1 ? 'кредит' : 'кредита') + + '
' + + '
' + + 'На вашем балансе: ' + credits + ' кредитов' + + '
' + + '
' + + '' + + '' + + '
' + + '
' + + '
'; + wrap.appendChild(div); + div.scrollIntoView({behavior:'smooth'}); +} + +function _showFreePreview(wrap, data) { + if (!wrap) return; + // Нет баланса — показываем превью + ущерб + варианты + var risks = (data && data.risks) ? data.risks.slice(0, 3) : []; + var damageMin = (data && data.damage_min) ? data.damage_min.toLocaleString('ru') : '?'; + var damageMax = (data && data.damage_max) ? data.damage_max.toLocaleString('ru') : '?'; + var catalog = (data && data.catalog) ? data.catalog : []; + + var risksHtml = risks.map(function(r){ + var cls = r.severity === 'critical' ? '#dc2626' : r.severity === 'high' ? '#d97706' : '#2563eb'; + return '
' + + '' + r.title + '
' + r.preview + '
'; + }).join(''); + + var catalogHtml = catalog.map(function(s){ + return '
' + + '
' + s.name + '
' + + '
' + s.desc + '
' + + '' + + '
'; + }).join(''); + + var div = document.createElement('div'); + div.className = 'msg'; + div.innerHTML = + '
' + + '
Елена
' + + + // Превью рисков + (risks.length ? '
Ключевые проблемные места:
' + risksHtml : '') + + + // Оценка ущерба + (data && data.damage_min ? + '
' + + '
Примерный ущерб если не урегулировать
' + + '
' + damageMin + ' — ' + damageMax + ' ₽
' + + '
' + ((data && data.damage_comment) || '') + '
' + + '
' : '') + + + // Уговор к действию + '
Пополните счёт — и я окажу услугу в полном объёме. В вашей ситуации возможны следующие варианты:
' + + + // Каталог услуг + (catalogHtml ? '
' + catalogHtml + '
' : '') + + + '
'; + wrap.appendChild(div); + div.scrollIntoView({behavior:'smooth'}); +} + +function _confirmService(serviceId, credits) { + var cur = parseInt(localStorage.getItem('zashita_credits') || '0'); + if (cur < credits) { + toast('Недостаточно кредитов — пополните баланс'); + go('pay'); + return; + } + // Блокируем кредиты (в реальном продукте — резервирование на сервере) + localStorage.setItem('zashita_credits', String(cur - credits)); + localStorage.setItem('zashita_reserved_service', serviceId); + toast('✅ ' + credits + ' кредит(а) зарезервированы — выполняю услугу'); + var wrap = document.querySelector('.chatwrap'); + if (wrap) { + var div = document.createElement('div'); + div.className = 'msg'; + div.innerHTML = '
' + + '
Елена
' + + 'Кредиты зарезервированы. Приступаю к работе — готово будет через несколько секунд.' + + '
'; + wrap.appendChild(div); + div.scrollIntoView({behavior:'smooth'}); + } +} + // _elenaContinueSend → заменён на _elChatSend через постоянный чат-бар function _getElenaCtxReply(intent, dl) {