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) {