mirror of
https://github.com/wasrusgen/zashita-brandbook.git
synced 2026-06-03 17:44:47 +00:00
feat: auto-extract contract parties into postal form f.119
This commit is contained in:
parent
97a7448fa2
commit
0382e97093
96
mockup.html
96
mockup.html
@ -4951,19 +4951,107 @@ function _filterDigits(el) {
|
|||||||
el.value = el.value.replace(/[^0-9]/g, '');
|
el.value = el.value.replace(/[^0-9]/g, '');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Извлекает стороны и адреса из текста договора
|
||||||
|
function _extractParties(text) {
|
||||||
|
var out = { counterparty: '', counterAddr: '', sender: '', senderAddr: '' };
|
||||||
|
if (!text) return out;
|
||||||
|
|
||||||
|
// Роли: [контрагент (кому шлём), сторона клиента]
|
||||||
|
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() {
|
function _showPostalForm() {
|
||||||
var dlName = (_rcLastContext && _rcLastContext.dl) ? _rcLastContext.dl.title : 'Уведомление';
|
var dlName = (_rcLastContext && _rcLastContext.dl) ? _rcLastContext.dl.title : 'Уведомление';
|
||||||
var caseName = (_rcLastContext && _rcLastContext.caseName) ? _rcLastContext.caseName : '';
|
var caseName = (_rcLastContext && _rcLastContext.caseName) ? _rcLastContext.caseName : '';
|
||||||
var about = dlName + (caseName ? ' по договору «' + caseName + '»' : '');
|
var about = dlName + (caseName ? ' по договору «' + caseName + '»' : '');
|
||||||
|
|
||||||
// Pre-fill recipient from contract context (в проде — из разбора договора)
|
// 1. Пытаемся извлечь стороны из текста договора
|
||||||
var recipient = (_rcLastContext && _rcLastContext.dl && _rcLastContext.dl.party)
|
var contractText = (document.getElementById('el-paste') || {}).value || '';
|
||||||
? _rcLastContext.dl.party : '';
|
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');
|
var el = document.getElementById('postal-form-overlay');
|
||||||
if (!el) return;
|
if (!el) return;
|
||||||
|
|
||||||
document.getElementById('pf-about').value = about;
|
document.getElementById('pf-about').value = about;
|
||||||
document.getElementById('pf-recipient').value = recipient;
|
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');
|
el.classList.add('on');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user