diff --git a/mockup.html b/mockup.html
index 31ff6b4..0622d7e 100644
--- a/mockup.html
+++ b/mockup.html
@@ -4951,19 +4951,107 @@ function _filterDigits(el) {
el.value = el.value.replace(/[^0-9]/g, '');
}
-function _showPostalForm() {
- var dlName = (_rcLastContext && _rcLastContext.dl) ? _rcLastContext.dl.title : 'Уведомление';
- var caseName = (_rcLastContext && _rcLastContext.caseName) ? _rcLastContext.caseName : '';
- var about = dlName + (caseName ? ' по договору «' + caseName + '»' : '');
+// Извлекает стороны и адреса из текста договора
+function _extractParties(text) {
+ var out = { counterparty: '', counterAddr: '', sender: '', senderAddr: '' };
+ if (!text) return out;
- // Pre-fill recipient from contract context (в проде — из разбора договора)
- var recipient = (_rcLastContext && _rcLastContext.dl && _rcLastContext.dl.party)
- ? _rcLastContext.dl.party : '';
+ // Роли: [контрагент (кому шлём), сторона клиента]
+ var rolePairs = [
+ ['Арендодатель', 'Арендатор'],
+ ['Исполнитель', 'Заказчик'],
+ ['Продавец', 'Покупатель'],
+ ['Поставщик', 'Покупатель'],
+ ['Подрядчик', 'Заказчик'],
+ ['Принципал', 'Агент'],
+ ['Займодавец', 'Заёмщик'],
+ ['Страховщик', 'Страхователь'],
+ ['Сторона 1', 'Сторона 2'],
+ ];
+
+ // Ищем первую встречающуюся пару ролей
+ var r1 = '', r2 = '';
+ for (var i = 0; i < rolePairs.length; i++) {
+ var re1 = new RegExp(rolePairs[i][0], 'i');
+ var re2 = new RegExp(rolePairs[i][1], 'i');
+ if (re1.test(text) && re2.test(text)) { r1 = rolePairs[i][0]; r2 = rolePairs[i][1]; break; }
+ }
+
+ // Извлекаем имя по роли: «Арендодатель: ООО "Ромашка"» или «Арендодатель в лице ООО ...»
+ function extractName(role) {
+ var re = new RegExp(
+ role + '[\\s\\S]{0,20}?' +
+ '((?:ООО|ОАО|ЗАО|ПАО|АО|НКО|ИП|Гр(?:ажданин|ажданка)?|физическое лицо)?' +
+ '\\s*(?:«[^»]{2,60}»|"[^"]{2,60}"|[А-ЯЁ][а-яёА-ЯЁ\\s-]{2,50}(?:ович|евич|овна|евна|ич|вна)?))',
+ 'im'
+ );
+ var m = text.match(re);
+ return m ? m[1].replace(/^[\s,:—–]+/, '').trim() : '';
+ }
+
+ // Извлекаем адрес: берём первые N символов после имени роли, ищем адресный блок
+ function extractAddr(role) {
+ var roleIdx = text.search(new RegExp(role, 'i'));
+ if (roleIdx < 0) return '';
+ var chunk = text.slice(roleIdx, roleIdx + 600);
+ var m = chunk.match(/(?:юр(?:идический)?\.?\s*адрес|адрес(?:\s*места?\s*нахожден(?:ия|ие))?|место\s*нахожден(?:ия|ие)|зарег(?:истрирован)?\s*по адресу|почтовый адрес)[:\s]+([^\n;]{10,120})/i);
+ return m ? m[1].trim() : '';
+ }
+
+ if (r1) {
+ out.counterparty = (r1 ? r1 + ': ' : '') + extractName(r1);
+ out.counterAddr = extractAddr(r1);
+ out.sender = (r2 ? r2 + ': ' : '') + extractName(r2);
+ out.senderAddr = extractAddr(r2);
+ }
+
+ return out;
+}
+
+function _showPostalForm() {
+ var dlName = (_rcLastContext && _rcLastContext.dl) ? _rcLastContext.dl.title : 'Уведомление';
+ var caseName = (_rcLastContext && _rcLastContext.caseName) ? _rcLastContext.caseName : '';
+ var about = dlName + (caseName ? ' по договору «' + caseName + '»' : '');
+
+ // 1. Пытаемся извлечь стороны из текста договора
+ var contractText = (document.getElementById('el-paste') || {}).value || '';
+ var parties = _extractParties(contractText);
+
+ // 2. Данные отправителя из localStorage (B2B-реквизиты)
+ var senderName = '', senderAddr = '';
+ try {
+ var b2b = JSON.parse(localStorage.getItem('zashita_b2b') || 'null');
+ if (b2b && b2b.name) { senderName = b2b.name; senderAddr = b2b.addr || ''; }
+ } catch(e) {}
+
+ // B2B из формы оплаты (если открыта сейчас)
+ if (!senderName) {
+ var nameEl = document.getElementById('b2b-name');
+ var addrEl = document.getElementById('b2b-addr');
+ if (nameEl && nameEl.value) { senderName = nameEl.value; senderAddr = addrEl ? addrEl.value : ''; }
+ }
+
+ // Приоритет: договор > localStorage > пусто
+ var recipientVal = parties.counterparty || '';
+ var recAddrVal = parties.counterAddr || '';
+ var senderVal = senderName || parties.sender || '';
+ var sendAddrVal = senderAddr || parties.senderAddr || '';
var el = document.getElementById('postal-form-overlay');
if (!el) return;
- document.getElementById('pf-about').value = about;
- document.getElementById('pf-recipient').value = recipient;
+
+ document.getElementById('pf-about').value = about;
+ document.getElementById('pf-recipient').value = recipientVal;
+ document.getElementById('pf-rec-addr').value = recAddrVal;
+ document.getElementById('pf-sender').value = senderVal;
+ document.getElementById('pf-send-addr').value = sendAddrVal;
+
+ // Подсветим незаполненные поля
+ ['pf-recipient','pf-rec-addr','pf-sender','pf-send-addr'].forEach(function(id) {
+ var inp = document.getElementById(id);
+ if (inp) inp.style.borderColor = inp.value ? 'var(--line)' : 'rgba(159,18,57,.4)';
+ });
+
el.classList.add('on');
}