PageSourceSearch

https://www.rba.ru/netcat_template/template/rba/assets/js/form.js?v5

js rba.ru collected 2026-10-02 08:42:34 UTC 17,381 bytes, 315 lines download raw bytes

1    if (typeof $ == 'undefined') $ = jQuery;
2
3    var validateConstructor = (function ($) {
4        var form = $("#ConstructorForm, #editConstructorForm"), submit = null,
5            method = {},
6            regex = /^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/;
7
8        method.init = function () {
9            if (form.length) {
10                submit = form.find(":submit");
11                $(":input", form)
12                    .not(":hidden")
13                    .not(":button")
14                    .not(":submit")
15                    .not(":checkbox")
16                    .not(":radio")
17                    .addClass("form-control");
18                submit.after('<em class="errorConstructor"></em>');
19
20                $('input[data-type="date"]').each(function () {
21                    var date = $(this).val().split(" ");
22                    $(this).val(date[0]).datepicker({
23                        startDate: '01-01-1700',
24                        format: "dd.mm.yyyy",
25                        autoclose: true,
26                        language: "ru"
27                    });
28                });
29                $('input[data-type="date-readonly"]').each(function () {
30                    var date = $(this).val().split(" ");
31                    $(this).val(date[0]);
32                });
33
34                form.on("submit", function (e) {
35                    method.checkForm();
36                });
37                // подсчет суммы членского взноса
38                return method.summFee();
39            }
40            return false;
41        };
42        method.checkEmailChange = function (input) {
43            input.change(function () {
44                var email = input.val();
45                if (!regex.test(email)) {
46                    input.css('background-color', '#FFCCCC');
47                    if (input.prop('required')) {
48                        submit.attr("disabled", "disabled");
49                        submit.next("em.errorConstructor").text("   Поправьте адрес(а) эл. почты!  ");
50                    }
51                } else {
52                    input.css('background-color', '');
53                    submit.removeAttr("disabled");
54                    submit.next("em.errorConstructor").remove();
55                }
56            });
57        };
58        method.checkEmail = function (input) {
59            var email = input.val();
60            if (!regex.test(email)) {
61                input.css('background-color', '#FFCCCC');
62                submit.attr("disabled", "disabled");
63                submit.next("em.errorConstructor").text("   Поправьте адрес(а) эл. почты!  ");
64            } else {
65                input.css('background-color', '');
66                submit.removeAttr("disabled");
67                submit.next("em.errorConstructor").remove();
68            }
69        };
70        method.checkForm = function () {
71            form.find('input[type="text"],input[type="email"]').each(function () {
72                var input = $(this), str = input.attr("name") || "";
73                if (str.toLowerCase().indexOf("email") >= 0) {
74                    method.checkEmail(input);
75                }
76            });
77        };
78        /**
79         * 2026 расчет членского взноса
80         */
81        method.summFee = function () {
82            /*
83                Данные на 2026 год
84                15000:Минимальная сумма для всех организаций:0                                  - не льготник
85                3000:Библиотеки в регионах РФ, 0-5 сотрудников:4:0-5                            - льготник "4" = "ID" классификатора rbaClassification и т.п.
86                7000:Библиотеки в регионах РФ, 6-15 сотрудников:4:6-15                          - льготник
87                15000:Библиотеки в регионах РФ, больше 15 сотрудников:4:>15                     - не льготник
88                3000:Профессиональные высшие учебные заведения, 0-5 сотрудников:5:0-5           - льготник
89                7000:Профессиональные высшие учебные заведения, 6-15 сотрудников:5:6-15         - льготник
90                15000:Профессиональные высшие учебные заведения, больше 15 сотрудников:5:>15    - не льготник
91                3000:Профессиональные общественные объединения:1                                - льготник
92                3000:Библиотеки специальных ведомств:17                                         - льготник
93            */
94            var lgotnik = false;
95            var rba_org_classification_selector = $("[name=f_rba_org_classification]:not([readonly])");
96            var rba_org_classification = rba_org_classification_selector.val();
97            var rba_org_fin_year_fee = $("input[name='f_rba_org_fin_year_fee']");
98            var rba_org_fin_oppo = $("input[name='f_rba_org_fin_oppo']");
99            var rba_org_info_empl_number = $("input[name='f_rba_org_info_empl_number']"),
100                summ = $("input[name='f_rba_org_fin_summ']"),
101                rba_org_sections_rings = $("select[name='f_rba_org_sections_rings[]']"),
102                // Добавляем поле для дополнительных голосов
103                f_poll_voices_add = $("input[name='f_poll_voices_add']"),
104                addSR = 0, data;
105            var ul = $('<ul class="dropdown relative" style="padding: 10px 10px 10px 20px; display: none; float: left; top: 0; z-index: 1; background: #fff; box-shadow: 0 2px 6px rgba(0, 0, 0, 0.17);"></ul>');
106            var numSR = rba_org_sections_rings.val() || [];
107            var defaultFees = {};
108            $.get("/services/membershipFee.html", function (d) {
109                data = d.split("\n");
110                defaultFees = getDefaultFees(data); // получим значения по категориям
111                rba_org_fin_year_fee.trigger("feeChange");
112            });
113
114            // Функция для проверки попадания числа в диапазон
115            function isInRange(num, range) {
116                if (!range) return false;
117
118                if (range.startsWith('>')) {
119                    var min = parseInt(range.substring(1));
120                    return num > min;
121                } else if (range.includes('-')) {
122                    var parts = range.split('-');
123                    var min = parseInt(parts[0]);
124                    var max = parseInt(parts[1]);
125                    return num >= min && num <= max;
126                } else if (range.includes('+')) {
127                    var min = parseInt(range.replace('+', ''));
128                    return num >= min;
129                }
130                return 0;
131            }
132
133            // Функция для получения значения по умолчанию (0-5 сотрудников)
134            function getDefaultFees(data) {
135                var fees = {};
136                if (data) {
137                    data.forEach(line => {
138                        const parts = line.split(':');
139
140                        const value = parseInt(parts[0], 10);
141                        const category = parts[2]; // например "5"
142                        const range = parts[3] || 'default'; // если нет диапазона
143
144                        if (!category) return;
145
146                        if (!fees[category]) {
147                            fees[category] = {};
148                        }
149
150                        fees[category][range] = value;
151                    });
152                }
153                return fees;
154            }
155
156            // Функция для расчета стоимости дополнительных голосов
157            function calculateAdditionalVoicesCost() {
158                var voicesCount = parseInt(f_poll_voices_add.val()) || 0;
159                return voicesCount * 15000; // Каждый голос стоит 15 000 рублей
160            }
161
162            // Функция для обновления видимости поля дополнительных голосов
163            function updateAdditionalVoicesVisibility() {
164                var currentFee = parseInt(rba_org_fin_year_fee.val()) || 0;
165
166                // Показываем поле только если взнос >= 15000
167                if (currentFee >= 15000) {
168                    $('#poll_voices_add_row').show();
169                } else {
170                    $('#poll_voices_add_row').hide();
171                    // Сбрасываем значение при скрытии
172                    f_poll_voices_add.val(0);
173                }
174            }
175
176            rba_org_classification_selector.on("change", function () {
177                rba_org_classification_selector.trigger("chosen:updated");
178                return rba_org_fin_year_fee.trigger("feeChange");
179            });
180
181            ul.on("click", "a", function (e) {
182                e.preventDefault();
183                return rba_org_fin_year_fee.val($(this).data("val")).trigger("feeChange");
184            });
185
186
187            /*
188                Оплата секций:
189                - для всех, кроме льготников: "за каждое участие организации в более 3-х секциях взимается плата 1000 руб. за каждую последующую"
190                - для льготников: "за каждое участие организации в более 1-ой секции взимается плата 1000 руб. за каждую последующую"
191            */
192            rba_org_sections_rings.on("change", function () {
193                numSR = $(this).val() || [];
194                if (numSR.length > 3) {
195                    addSR = (numSR.length - 3) * 1000;
196                    console.info('Для всех, кроме льготников: за каждое участие организации в более 3-х секциях взимается плата 1000 руб. за каждую последующую: ',addSR);
197                }
198                if (lgotnik) {
199                    if (numSR.length > 1) {
200                        addSR = (numSR.length - 1) * 1000;
201                    }
202                    console.info('Для льготников за каждое участие организации в более 1-ой секции взимается плата 1000 руб. за каждую последующую: ',addSR);
203                }
204                $(this).trigger("chosen:updated");
205
206                return summ.val(parseInt(rba_org_fin_year_fee.val()) + addSR + calculateAdditionalVoicesCost());
207            });
208
209            rba_org_info_empl_number.on('change', function () {
210                rba_org_fin_year_fee.trigger("feeChange");
211            });
212
213            rba_org_fin_year_fee.on('change', function () {
214                rba_org_fin_year_fee.trigger("feeChange");
215            });
216
217            // Обработчик изменения количества дополнительных голосов
218            f_poll_voices_add.on('change', function () {
219                var numberPattern = /^\d*$/;
220                if (!$(this).val() || $(this).val() === '') {
221                    $(this).val(0);
222                } else {
223                    $(this).val($(this).val().match(numberPattern));
224                }
225                // Пересчитываем итоговую сумму
226                summ.val(parseInt(rba_org_fin_year_fee.val()) + addSR + calculateAdditionalVoicesCost());
227            });
228
229            rba_org_fin_year_fee.on("feeChange", function (e) {
230
231                var actualFee = parseInt(rba_org_fin_year_fee.val()) || 0; // Сохраненная в БД плата
232                var defaultFee = 15000; // 2026
233                rba_org_classification = rba_org_classification_selector.val();
234
235                var member_num = parseInt(rba_org_info_empl_number.val()) || 0;
236                var foundFee = null;
237
238                // Ищем подходящую сумму в данных
239                if (defaultFees[rba_org_classification] !== 'undefined') {
240                    for (let range in defaultFees[rba_org_classification]) {
241                        if (isInRange(member_num, range)) {
242                            foundFee = defaultFees[rba_org_classification][range];
243                            console.info("Среди настроек найдена сумма " + foundFee + " для " + member_num + " сотрудников, диапазон: " + range);
244                        } else if (range === 'default') {
245                            foundFee = defaultFees[rba_org_classification]['default'];
246                            console.info("Среди настроек найдена сумма по умолчанию " + foundFee + " для " + member_num + " сотрудников, диапазон: " + range);
247                        }
248                        if (range === '>15') {
249                            lgotnik = false;
250                            console.info("Рассчитан Не льготник");
251                        }
252
253                        // Все у кого сумма меньше 15 т.р. - льготники
254                        if (foundFee < 15000) {
255                            console.info("Рассчитан Льготник");
256                            lgotnik = true;
257                        }
258                    }
259                }
260
261                if (actualFee !== defaultFee) {
262                    console.info(`Обновление старых данных: сохраненная в БД сумма не одинакова с суммой по-умолчанию: ${actualFee} !== ${defaultFee}, установим сначала ${defaultFee}`);
263                    rba_org_fin_year_fee.val(defaultFee);
264                }
265                // Если нашли подходящую сумму, используем её
266                if (foundFee !== null) {
267                    console.info(`Сохраненная в БД сумма: ${actualFee}, сумма по-умолчанию: ${defaultFee}. Если нашли подходящую сумму, используем её`);
268                    if (foundFee) {
269                        rba_org_fin_year_fee.val(foundFee);
270                        console.info("Используется найденная в настройках сумма " + foundFee + " для " + member_num + " сотрудников, а не сумма по-умолчанию " + defaultFee);
271                    } else {
272                        console.info(`Используется сумма по-умолчанию ${defaultFee}; сохраненная в БД сумма не используется: ${actualFee}`);
273                    }
274                }
275
276                // Обновляем видимость поля дополнительных голосов
277                updateAdditionalVoicesVisibility();
278
279                ul.hide();
280
281                rba_org_sections_rings.change(); // пересчитаем оплату за секции
282                console.info(`Итоговая сумма ${parseInt(rba_org_fin_year_fee.val())} + ${parseInt(rba_org_fin_oppo.val())} + ${addSR} + ${calculateAdditionalVoicesCost()}`);
283                return summ.val(parseInt(rba_org_fin_year_fee.val()) + parseInt(rba_org_fin_oppo.val()) + addSR + calculateAdditionalVoicesCost());
284            });
285
286            rba_org_fin_oppo.off("change").on("keyup change", function () {
287                return summ.val((parseInt(rba_org_fin_oppo.val
287()) + parseInt(rba_org_fin_year_fee.val()) + addSR + calculateAdditionalVoicesCost()));
288            });
289
290            $("#f_rba_org_fin_oppo, #f_rba_org_info_empl_number, #f_rba_org_fin_summ, #f_rba_org_fin_year_fee").on("keyup change", function () {
291                var numberPattern = /^\d*$/;
292                if (!$(this).val() || $(this).val() === '' || !parseInt($(this).val()))
293                    return $(this).val(0);
294                else
295                    return $(this).val($(this).val().match(numberPattern));
296            });
297
298            // Инициализация видимости поля при загрузке
299            updateAdditionalVoicesVisibility();
300            return summ.val(parseInt(rba_org_fin_year_fee.val()) + addSR + calculateAdditionalVoicesCost());
301        };
302
303        return method;
304    }(jQuery));
305
306    /**
307     * валидация и пр.
308     */
309    jQuery(function ($) {
310        validateConstructor.init();
311    });
312
313
314
315

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.