diff --git a/mockup.html b/mockup.html index 0622d7e..c257612 100644 --- a/mockup.html +++ b/mockup.html @@ -4840,7 +4840,7 @@ var _DL_ACTIONS = { steps: [ 'Составьте письменное уведомление (могу помочь — нажмите «Составить»)', 'Отправьте заказным письмом с уведомлением о вручении — это фиксирует дату ', - 'Продублируйте на email контрагента с запросом подтверждения получения', + 'Продублируйте на email контрагента — адрес из договора у нас есть ', 'Введите трек-номер после отправки:
' ], warn: 'Устное уведомление не имеет юридической силы — только письменное с подтверждением доставки.' @@ -4951,9 +4951,12 @@ function _filterDigits(el) { el.value = el.value.replace(/[^0-9]/g, ''); } -// Извлекает стороны и адреса из текста договора +// Глобальный кэш данных сторон (заполняется при анализе и при открытии бланка) +var _postalData = null; + +// Извлекает стороны, адреса и email из текста договора function _extractParties(text) { - var out = { counterparty: '', counterAddr: '', sender: '', senderAddr: '' }; + var out = { counterparty: '', counterAddr: '', counterEmail: '', sender: '', senderAddr: '', senderEmail: '' }; if (!text) return out; // Роли: [контрагент (кому шлём), сторона клиента] @@ -4989,7 +4992,7 @@ function _extractParties(text) { return m ? m[1].replace(/^[\s,:—–]+/, '').trim() : ''; } - // Извлекаем адрес: берём первые N символов после имени роли, ищем адресный блок + // Извлекаем адрес из блока роли function extractAddr(role) { var roleIdx = text.search(new RegExp(role, 'i')); if (roleIdx < 0) return ''; @@ -4998,11 +5001,22 @@ function _extractParties(text) { return m ? m[1].trim() : ''; } + // Извлекаем email из блока роли (500 символов вокруг упоминания) + function extractEmail(role) { + var roleIdx = text.search(new RegExp(role, 'i')); + if (roleIdx < 0) return ''; + var chunk = text.slice(roleIdx, roleIdx + 500); + var m = chunk.match(/[\w.+-]+@[\w.-]+\.[a-zа-яё]{2,}/i); + return m ? m[0] : ''; + } + if (r1) { - out.counterparty = (r1 ? r1 + ': ' : '') + extractName(r1); - out.counterAddr = extractAddr(r1); - out.sender = (r2 ? r2 + ': ' : '') + extractName(r2); - out.senderAddr = extractAddr(r2); + out.counterparty = (r1 ? r1 + ': ' : '') + extractName(r1); + out.counterAddr = extractAddr(r1); + out.counterEmail = extractEmail(r1); + out.sender = (r2 ? r2 + ': ' : '') + extractName(r2); + out.senderAddr = extractAddr(r2); + out.senderEmail = extractEmail(r2); } return out; @@ -5031,11 +5045,22 @@ function _showPostalForm() { if (nameEl && nameEl.value) { senderName = nameEl.value; senderAddr = addrEl ? addrEl.value : ''; } } + // Сохраняем глобально для email-черновика + _postalData = { + counterparty: parties.counterparty || '', + counterAddr: parties.counterAddr || '', + counterEmail: parties.counterEmail || '', + sender: senderName || parties.sender || '', + senderAddr: senderAddr || parties.senderAddr || '', + senderEmail: parties.senderEmail || '', + about: about + }; + // Приоритет: договор > localStorage > пусто - var recipientVal = parties.counterparty || ''; - var recAddrVal = parties.counterAddr || ''; - var senderVal = senderName || parties.sender || ''; - var sendAddrVal = senderAddr || parties.senderAddr || ''; + var recipientVal = _postalData.counterparty; + var recAddrVal = _postalData.counterAddr; + var senderVal = _postalData.sender; + var sendAddrVal = _postalData.senderAddr; var el = document.getElementById('postal-form-overlay'); if (!el) return; @@ -5104,6 +5129,76 @@ function _postalPrint() { w.document.close(); } +function _prepareEmailDraft() { + var pd = _postalData || {}; + var dlTitle = (_rcLastContext && _rcLastContext.dl) ? _rcLastContext.dl.title : 'уведомление'; + var caseName = (_rcLastContext && _rcLastContext.caseName) ? _rcLastContext.caseName : ''; + var toEmail = pd.counterEmail || ''; + var toName = pd.counterparty || 'контрагент'; + var fromName = pd.sender || 'клиент'; + var about = pd.about || dlTitle; + + // Если _postalData не заполнен — попробуем распарсить сейчас + if (!pd.counterparty) { + var contractText = (document.getElementById('el-paste') || {}).value || ''; + var parties = _extractParties(contractText); + toEmail = parties.counterEmail || ''; + toName = parties.counterparty || 'контрагент'; + fromName = parties.sender || fromName; + _postalData = Object.assign({}, parties, { about: about }); + } + + var subject = 'Уведомление: ' + dlTitle + (caseName ? ' · ' + caseName : ''); + var body = + 'Уважаемый(ая) ' + toName.replace(/^[^:]+:\s*/, '') + ',\n\n' + + 'Настоящим письмом уведомляю Вас о следующем:\n' + + about + '.\n\n' + + 'Одновременно направляю настоящее уведомление заказным письмом ' + + 'с уведомлением о вручении (Почта России).\n\n' + + 'Прошу подтвердить получение данного письма ответным сообщением ' + + 'на адрес электронной почты отправителя.\n\n' + + 'С уважением,\n' + fromName.replace(/^[^:]+:\s*/, '') + '\n' + + 'Дата: ' + new Date().toLocaleDateString('ru-RU'); + + var ov = document.getElementById('email-draft-overlay'); + if (!ov) return; + document.getElementById('ed-to').value = toEmail; + document.getElementById('ed-subject').value = subject; + document.getElementById('ed-body').value = body; + + // Если email найден — подсветим зелёным, иначе — рамка предупреждения + var toInp = document.getElementById('ed-to'); + toInp.style.borderColor = toEmail ? 'var(--ok)' : 'rgba(159,18,57,.4)'; + if (!toEmail) toInp.placeholder = 'Email не найден в договоре — введите вручную'; + + ov.classList.add('on'); +} + +function _emailDraftClose() { + var ov = document.getElementById('email-draft-overlay'); + if (ov) ov.classList.remove('on'); +} + +function _emailCopy() { + var to = (document.getElementById('ed-to') || {}).value || ''; + var subject = (document.getElementById('ed-subject') || {}).value || ''; + var body = (document.getElementById('ed-body') || {}).value || ''; + var full = 'Кому: ' + to + '\nТема: ' + subject + '\n\n' + body; + navigator.clipboard.writeText(full).then(function(){ + toast('📋 Письмо скопировано — вставьте в почтовый клиент'); + _emailDraftClose(); + }).catch(function(){ + toast('Скопируйте текст вручную'); + }); +} + +function _emailOpenClient() { + var to = encodeURIComponent((document.getElementById('ed-to') || {}).value || ''); + var subject = encodeURIComponent((document.getElementById('ed-subject') || {}).value || ''); + var body = encodeURIComponent((document.getElementById('ed-body') || {}).value || ''); + window.open('mailto:' + to + '?subject=' + subject + '&body=' + body, '_blank'); +} + function _saveTrackNumber() { var input = document.getElementById('postal-track-input'); var num = input ? input.value.replace(/\D/g,'') : ''; @@ -6021,6 +6116,62 @@ function tab(name){ + + +