PageSourceSearch

https://komplektadr.ru/local/js/kadr_ocb_inn.js?v=1787827509

js komplektadr.ru collected 2026-10-08 15:19:25 UTC 7,285 bytes, 153 lines download raw bytes

1/**
2 * «Купить в 1 клик»: поле ИНН + подсказки DaData (организации, ФИО, e-mail).
3 *
4 * Если указан корректный ИНН (10 или 12 цифр), заказ уходит как «Юридическое
5 * лицо» (PERSON_TYPE_ID=2) со способом оплаты «Счёт на оплату (ИП Краснова
6 * М.О.)» (PAY_SYSTEM_ID=8 — единственная платёжка, доступная юрлицам).
7 * Реквизиты организации сервер дозаполняет по ИНН в обработчике
8 * OnSaleOrderBeforeSaved (см. /local/php_interface/init.php).
9 *
10 * Файл внешний: WAF Битрикса режет крупные инлайн-скрипты у анонимов.
11 * Конфиг передаётся через window.kadrOcbCfg = {token, personType, paySystem}.
12 */
13(function () {
14    var CFG = window.kadrOcbCfg || {};
15    var TOKEN = CFG.token || '';
16    var PT_ORG = CFG.personType || '2';
17    var PS_ORG = CFG.paySystem || '8';
18    var PLUGIN_JS = '/local/js/dadata/16.5.2/js/jquery.suggestions.min.js';
19    var PLUGIN_CSS = '/local/js/dadata/16.5.2/css/suggestions.css';
20    var SERVICE_URL = 'https://suggestions.dadata.ru/suggestions/api/4_1/rs';
21
22    if (!TOKEN) return;
23
24    var pluginPromise = null;
25    function loadPlugin() {
26        if (pluginPromise) return pluginPromise;
27        pluginPromise = new Promise(function (resolve, reject) {
28            if (jQuery.fn && jQuery.fn.suggestions) { resolve(); return; }
29            var css = document.createElement('link');
30            css.rel = 'stylesheet';
31            css.href = PLUGIN_CSS;
32            document.head.appendChild(css);
33            jQuery.getScript(PLUGIN_JS)
34                .done(function () { resolve(); })
35                .fail(function (jqxhr, status, err) {
36                    pluginPromise = null;
37                    console.error('[OCB INN] suggestions plugin load failed:', status, err);
38                    reject(err);
39                });
40        });
41        return pluginPromise;
42    }
43
44    function isInn(v) {
45        v = String(v || '').trim();
46        return /^\d{10}$/.test(v) || /^\d{12}$/.test(v);
47    }
48
49    function setHidden(form, code, value) {
50        var el = form.querySelector('input[name="ONE_CLICK_BUY[' + code + ']"][type="hidden"]');
51        if (el) el.value = value || '';
52    }
53
54    function applySwitch(form) {
55        var inn = form.querySelector('#one_click_buy_id_INN');
56        var pt = form.querySelector('input[name="PERSON_TYPE_ID"]');
57        var ps = form.querySelector('input[name="PAY_SYSTEM_ID"]');
58        if (!inn || !pt || !ps) return;
59        if (isInn(inn.value)) {
60            pt.value = PT_ORG;
61            ps.value = PS_ORG;
62        } else {
63            pt.value = pt.dataset.kadrOrig || pt.value;
64            ps.value = ps.dataset.kadrOrig || ps.value;
65            setHidden(form, 'COMPANY', '');
66            setHidden(form, 'KPP', '');
67            setHidden(form, 'COMPANY_ADR', '');
68            var org = form.querySelector('.kadr-inn-org');
69            if (org) org.style.display = 'none';
70        }
71    }
72
73    function injectField(form) {
74        if (form.querySelector('#one_click_buy_id_INN')) return;
75        // Поле ИНН — первым, перед Ф.И.О. (или первым видимым полем формы)
76        var anchorInput = form.querySelector('#one_click_buy_id_FIO')
77            || form.querySelector('#one_click_buy_id_PHONE')
78            || form.querySelector('#one_click_buy_id_EMAIL');
79        if (!anchorInput) return;
80        var anchor = anchorInput.closest('.form-control');
81        if (!anchor) return;
82
83        var wrap = document.createElement('div');
84        wrap.className = 'form-control bg kadr-inn-control';
85        wrap.innerHTML =
86            '<label class="description" for="one_click_buy_id_INN">ИНН</label>' +
87            '<input type="text" name="ONE_CLICK_BUY[INN]" value="" class="inputtext" id="one_click_buy_id_INN" autocomplete="off" maxlength="80">' +
88            '<div class="kadr-inn-hint">Если нужен счёт на организацию — укажите её ИНН или начните вводить название и выберите из списка.</div>' +
89            '<div class="kadr-inn-org" style="display:none;"></div>' +
90            '<input type="hidden" name="ONE_CLICK_BUY[COMPANY]" value="">' +
91            '<input type="hidden" name="ONE_CLICK_BUY[KPP]" value="">' +
92            '<input type="hidden" name="ONE_CLICK_BUY[COMPANY_ADR]" value="">';
93        anchor.parentNode.insertBefore(wrap, anchor);
94
95        var pt = form.querySelector('input[name="PERSON_TYPE_ID"]');
96        var ps = form.querySelector('input[name="PAY_SYSTEM_ID"]');
97        if (pt && !pt.dataset.kadrOrig) pt.dataset.kadrOrig = pt.value;
98        if (ps && !ps.dataset.kadrOrig) ps.dataset.kadrOrig = ps.value;
99
100        var inn = wrap.querySelector('#one_click_buy_id_INN');
101        inn.addEventListener('input', function () { applySwitch(form); });
102        inn.addEventListener('change', function () { applySwitch(form); });
103    }
104
105    function bindSuggest(el, opts) {
106        if (!el || el.dataset.kadrSuggest) return;
107        jQuery(el).suggestions(jQuery.extend({
108            token: TOKEN,
109            count: 5,
110            serviceUrl: SERVICE_URL
111        }, opts));
112        el.dataset.kadrSuggest = '1';
113    }
114
115    function bindAll() {
116        var form = document.getElementById('one_click_buy_form');
117        if (!form) return;
118        injectField(form);
119        if (form.dataset.kadrInnBound) return;
120        form.dataset.kadrInnBound = '1';
121        loadPlugin().then(function () {
122            bindSuggest(form.querySelector('#one_click_buy_id_FIO'), {
123                type: 'NAME',
124                onSelect: function (s) { jQuery('#one_click_buy_id_FIO').val(s.value); }
125            });
126            bindSuggest(form.querySelector('#one_click_buy_id_EMAIL'), { type: 'EMAIL' });
127            var inn = form.querySelector('#one_click_buy_id_INN');
128            bindSuggest(inn, {
129                type: 'PARTY',
130                onSelect: function (s) {
131                    var d = s.data || {};
132                    if (d.inn) inn.value = d.inn;
133                    setHidden(form, 'COMPANY', s.value || '');
134                    setHidden(form, 'KPP', d.kpp || '');
135                    setHidden(form, 'COMPANY_ADR', d.address && (d.address.unrestricted_value || d.address.value) || '');
136                    var org = form.querySelector('.kadr-inn-org');
137                    if (org) {
138                        org.textContent = 'Счёт будет выставлен на: ' + (s.value || '');
139                        org.style.display = '';
140                    }
141                    applySwitch(form);
142                }
143            });
144        }).catch(function () {});
145    }
146
147    (function boot() {
148        if (typeof jQuery === 'undefined' || !document.body) { setTimeout(boot, 200); return; }
149        new MutationObserver(function () { bindAll(); }).observe(document.body, { childList: true, subtree: true });
150        jQuery(document).ajaxComplete(function () { setTimeout(bindAll, 200); });
151        bindAll();
152    })();
153})();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.