Files
erv-ticket-dev/js/common.js
Fedor ed4270312e feat: SMS verification через n8n webhook
- Перенесена проверка SMS кода в n8n webhook (N8N_SMS_VERIFY_WEBHOOK)
- Упрощен формат ответа: убран токен, только success/message
- sms-verify.php теперь проксирует запросы на n8n
- Обновлен JS код: убрано использование токена
- Обновлена документация с упрощенным форматом ответа
- Протестировано: верный и неверный коды работают корректно
2026-01-15 18:11:18 +03:00

1721 lines
65 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Функция инициализации автодополнения адресов через DaData
function initAddressSuggestions() {
if (typeof $.fn.suggestions !== 'undefined') {
// Инициализируем автодополнение адресов для поля с классом .js-adres
$('.js-adres').each(function() {
// Проверяем, не инициализировано ли уже
if (!$(this).data('suggestions-initialized')) {
$(this).suggestions({
token: "d2fa8613e186d54c6c62fc321414552353ffdfa8",
type: "ADDRESS",
onSelect: function(suggestion) {
// При выборе адреса заполняем поле
$(this).val(suggestion.value);
}
});
$(this).data('suggestions-initialized', true);
}
});
}
}
$(function() {
$(document).ready(function(){
// Блокируем кнопку "Отправить смс" по умолчанию, пока полис не проверен
$('.js-send-sms').addClass('disabled');
$('.js-send-sms').prop('disabled', true);
// Поля телефона и банка скрыты по умолчанию (через класс d-none в HTML)
// Блокируем поле "ФИО Получателя" по умолчанию (доступно только для несовершеннолетних)
$("input[data-enableby=birthday]").addClass('disabled');
$("input[data-enableby=birthday]").prop('disabled', true);
$("input[data-enableby=birthday]").prop('readonly', true);
$(".js-progress-mask").inputmask("99");
$(".js-inn-mask").inputmask("999999999999");
$(".js-inn-mask2").inputmask("9{10,12}");
$(".js-bank-mask").inputmask({ mask: ["9999 9999 9999 9999", "9999 9999 9999 9999", "9999 9999 9999 9999", "9999 999999 99999"], greedy: false, "placeholder": "*", "clearIncomplete": true });
$(".js-code-mask").inputmask("999999");
$(".js-date-mask").inputmask("99-99-9999",{ "placeholder": "дд-мм-гггг" });
$(".js-doccode-mask").inputmask("99");
$(".js-countrycode-mask").inputmask("999");
// $("#country").countrySelect();
Inputmask.extendDefinitions({
'*': { //masksymbol
"validator": "[0-9\(\)\.\+/ ]"
},
});
$(".js-inndb-mask").inputmask("A9{3,5}-*{6,10}");
$(".js-inndb-mask").keyup(function(){
//if($this)
});
document.querySelector('input').addEventListener('keydown', function (e) {
if (e.which == 9) {
e.preventDefault();
}
});
let month =['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'];
let days = ['Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вс'];
if($('input[name="birthday"]').length) {
var birthday = datepicker('input[name="birthday"]',
{
customOverlayMonths: month,
customMonths: month,
customDays: days,
maxDate: new Date(),
formatter: (input, date, instance) => {
const value = date.toLocaleDateString()
input.value = value // => '1/1/2099'
},
onSelect: function(dateText, inst) {
let birthday=$('input[name="birthday"]').val();
if(getAge(birthday)<18) {
// Если возраст меньше 18 - разблокируем поле
$("input[data-enableby=birthday]").removeClass('disabled');
$("input[data-disabledby=birthday]").removeClass('disabled');
$("input[data-enableby=birthday]").prop('disabled', false);
$("input[data-enableby=birthday]").prop('readonly', false);
} else {
// Если возраст 18 и больше - блокируем поле
$("input[data-enableby=birthday]").addClass('disabled');
$("input[data-disabledby=birthday]").addClass('disabled');
$("input[data-enableby=birthday]").prop('disabled', true);
$("input[data-enableby=birthday]").prop('readonly', true);
$("input[data-enableby=birthday]").val(''); // Очищаем значение при блокировке
}
}
});
}
// Инициализация datepicker для поля даты рейса отправления
if($('input[name="departure_date"]').length) {
var departure_date = datepicker('input[name="departure_date"]',{
customOverlayMonths: month,
customMonths: month,
customDays: days,
maxDate: new Date(),
formatter: (input, date, instance) => {
const value = date.toLocaleDateString()
input.value = value // => '1/1/2099'
}
});
}
// Инициализация datepicker для поля даты наступления страхового случая
if($('input[name="insurence_date"]').length) {
var insurence_date = datepicker('input[name="insurence_date"]',{
customOverlayMonths: month,
customMonths: month,
customDays: days,
maxDate: new Date(),
formatter: (input, date, instance) => {
const value = date.toLocaleDateString()
input.value = value // => '1/1/2099'
}
});
}
var phone = document.querySelectorAll('.js-phone-mask');
$('.js-phone-mask').inputmask('999 999-99-99');
phone.forEach(el => {
const iti = window.intlTelInput(el, {
initialCountry: 'ru',
onlyCountries : ['ru'],
separateDialCode: true,
customContainer: ".form-item",
autoPlaceholder: 'off', // Отключаем автоматический placeholder
allowDropdown: false, // Убираем выпадающий список
utilsScript: "libs/intl-tel-input-master/build/js/utils.js",
});
// Устанавливаем кастомный placeholder без "8", соответствует маске 999 999-99-99
el.setAttribute('placeholder', '912 345-67-89');
});
// Защита от изменения подтвержденного номера телефона (в т.ч. через автозаполнение)
$('.js-phone-mask').on('input change', function() {
var $this = $(this);
var confirmedPhone = $this.attr('data-confirmed-phone');
if (confirmedPhone && $this.prop('readonly')) {
var currentValue = $this.val();
if (currentValue !== confirmedPhone) {
$this.val(confirmedPhone);
}
}
});
// Обработчик смены страны отключен, так как выпадающий список убран
// $('.js-phone-mask').on('countrychange', e => {
// let $this = $(e.currentTarget),
// placeholder = $this.attr('placeholder'),
// mask = placeholder.replace(/[0-9]/g, 9);
// $this.val('').inputmask(mask);
// let inputCode = $(".code"),
// flag = document.querySelector(".iti__selected-flag"),
// codeTitle = flag.getAttribute("title");
// inputCode.val(codeTitle);
// });
let index=1;
$('.js-btn-next').on("click",function(e){
e.preventDefault();
// Проверяем, не заблокирована ли кнопка из-за невалидного полиса
if($(this).hasClass('disabled') || $(this).prop('disabled')) {
return false;
}
let isvalid=validate_step(index);
if(isvalid) {
index++;
$('.span-progress .current').text(index);
if(index==3) {
$(this).hide();
$('.btn--submit').show();
} else {
$(this).show();
$('.js-btn-prev').show();
}
$('.form-step').removeClass('active');
$('.form-step[data-step='+index+']').addClass('active');
}
});
$('.js-btn-prev').on("click",function(e){
e.preventDefault();
index--;
if(index==1) {$(this).hide();} else $(this).show();
if(index<1) index=1;
if(index<4) {
$('.btn--submit').hide();
$('.js-btn-next').show();
}
$('.span-progress .current').text(index);
$('.form-step').removeClass('active');
$('.form-step[data-step='+index+']').addClass('active');
});
$('select[name=claim]').on("change",function(e){
if($(this).val()==0) {
$(this).closest('.form-step').find('input[type=text]').addClass('disabled');
$(this).closest('.form-step').find('input[type=file]').addClass('disabled');
$(this).closest('.form-step').find('input[type=file]').parent().addClass('disabled');
} else {
$(this).closest('.form-step').find('input[type=text]').removeClass('disabled');
$(this).closest('.form-step').find('input[type=file]').removeClass('disabled');
$(this).closest('.form-step').find('input[type=file]').parent().removeClass('disabled');
}
});
$('select[name=countryevent]').on("change",function(e){
$('.countryevent').val($(this).find(":selected").text());
});
// Обработка изменения типа события
$('select[name="event_type"]').on('change', function() {
const selectedValue = $(this).val();
// Скрываем все дополнительные поля
$('.connection-fields, .connection-date-fields, .cancel-flight-docs').hide();
// Меняем лейблы в зависимости от выбора
if (selectedValue === 'miss_connection') {
$('#transport_number_label').text('Укажите номер рейса прибытия');
$('#insurence_date_label').text('Дата рейса прибытия');
$('.connection-fields, .connection-date-fields').show();
} else if (selectedValue === 'cancel_flight') {
$('#transport_number_label').text('Номер рейса/поезда/парома');
$('#insurence_date_label').text('Дата наступления страхового случая');
$('.cancel-flight-docs').show();
} else {
$('#transport_number_label').text('Номер рейса/поезда/парома');
$('#insurence_date_label').text('Дата наступления страхового случая');
}
});
function validate_step(step_index){
let inputs=$('.form-step.active').find('input[type="text"], input[type="file"],input[type="email"], textarea.form-input, input[type="checkbox"]');
let all_filled=false;
let res_array=[];
inputs.each(function(e){
let field_fill=false;
let $this = $(this);
// Пропускаем поля, которые помечены как не требующие валидации
if($this.hasClass('notvalidate')) {
field_fill=true; // Считаем невалидируемые поля валидными
res_array.push(field_fill);
return;
}
// Пропускаем поля, которые заблокированы (disabled или readonly)
if($this.prop('disabled') || $this.prop('readonly') || $this.hasClass('disabled')) {
field_fill=true; // Считаем заблокированные поля валидными
res_array.push(field_fill); // Добавляем в массив результатов
return; // Пропускаем дальнейшую проверку
}
// Пропускаем поля, которые находятся в скрытых блоках (d-none или display: none)
if($this.closest('.d-none').length > 0) {
field_fill=true; // Считаем скрытые поля валидными
res_array.push(field_fill);
return;
}
// Проверяем, скрыт ли родительский блок через inline стиль display: none
let $parentContainer = $this.closest('.form-item');
if($parentContainer.length > 0 && $parentContainer.is(':hidden')) {
field_fill=true; // Считаем скрытые поля валидными
res_array.push(field_fill);
return;
}
if(($this.val()=='' && !$this.hasClass('disabled') && !$this.hasClass('notvalidate') && !$this.hasClass('error') )) {
$this.closest('.form-item').find('.form-item__warning').text('Пожалуйста, заполните все обязательные поля');
field_fill=false;
} else {
$this.closest('.form-item').find('.form-item__warning').text('');
if($this.attr('type')=='email'){
if(validateEmail($this.val())) {
field_fill=true;
} else {
field_fill=false;
$this.closest('.form-item').find('.form-item__warning').text($this.data('warmes'));
}
} else if($this.attr('type')=='file') {
// Специальная валидация для файлов
var fileInput = this;
var filesCount = fileInput.files ? fileInput.files.length : 0;
// Проверяем также через fileList, если файлы уже обработаны
var fileListItems = $this.closest('.form-item').find('.fileList li').length;
// Если поле находится в скрытом блоке, но есть другое видимое поле с таким же name - пропускаем
var fieldName = $this.attr('name');
var isHidden = $this.closest('.d-none').length > 0;
if(isHidden && fieldName) {
// Проверяем, есть ли видимое поле с таким же name
var visibleField = $('.form-step.active').find('input[name="' + fieldName + '"]').not($this).filter(function() {
return $(this).closest('.d-none').length === 0;
});
if(visibleField.length > 0) {
// Есть видимое поле с таким же name - пропускаем скрытое
field_fill=true;
res_array.push(field_fill);
return;
}
}
// Для видимых полей проверяем наличие файлов
if(!isHidden) {
if(filesCount > 0 || fileListItems > 0) {
field_fill=true;
} else {
field_fill=false;
$this.closest('.form-item').find('.form-item__warning').text('Пожалуйста, загрузите файлы');
}
} else {
// Скрытое поле без видимого дубликата - считаем валидным
field_fill=true;
}
} else {
// Специальная валидация для поля банка
if($this.hasClass('js-bank-autocomplete')) {
var bankId = $this.closest('.form-item').find('input[name="bank_id"]').val();
if(bankId && bankId !== '') {
field_fill=true;
} else {
field_fill=false;
$this.closest('.form-item').find('.form-item__warning').text('Пожалуйста, выберите банк из списка');
}
} else {
field_fill=true;
}
}
if($this.attr('type')=='checkbox'){
if($this.is(':checked')){
field_fill=true;
$this.parent().parent().find('.form-item__warning').text();
} else {
field_fill=false;
$this.parent().parent().find('.form-item__warning').text('Пожалуйста, заполните все обязательные поля');
}
if(($this.parent().hasClass('js-enable-inputs'))){
field_fill=true;
}
}
}
res_array.push(field_fill);
// Отладочный вывод для незаполненных полей отключен
});
// Проверка валидности полиса теперь выполняется перед отправкой SMS, а не здесь
if((step_index==3) && $('.form-step[data-step='+step_index+']').find('input[type="checkbox"]:checked').length<1) {
$('.form__warning').show();
$('.form__warning').text('Необходимо согласие с политикой обработки персональных данных');
return false;
} else {
$('.form__warning').text('Пожалуйста, заполните все обязательные поля');
}
if(!res_array.includes(false)){
$('.form__warning').hide();
return true;
} else {
$('.form__warning').show();
return false;
}
}
const validateEmail = (email) => {
return email.match(
/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
);
};
$('.js-enable-inputs input[type=checkbox]').on("change",function(e){
e.preventDefault();
$(this).closest('.form-item').find('input[type=file]').toggleClass('disabled');
$(this).closest('.form-item').find('input[type=file]+label').toggleClass('disabled');
});
// start sms
// Глобальная переменная для хранения токена верификации
var sms_verify_token = null;
function send_sms(){
var $phoneInput = $('input[name="phonenumber"]');
var phone = $phoneInput.val();
// Получаем номер через intlTelInput API (если доступен)
if ($phoneInput.length > 0 && window.intlTelInput) {
var iti = window.intlTelInputGlobals.getInstance($phoneInput[0]);
if (iti) {
// Получаем полный номер с кодом страны (например, +79991234567)
var fullNumber = iti.getNumber();
if (fullNumber) {
phone = fullNumber;
} else {
// Если getNumber не работает, очищаем от маски вручную
phone = phone.replace(/[() -]/g, '');
// Добавляем +7 если номер начинается с 8 или 9
if (phone.match(/^[89]/)) {
phone = '+7' + phone.replace(/^[89]/, '');
} else if (!phone.match(/^\+/)) {
phone = '+7' + phone;
}
}
} else {
// Если intlTelInput не инициализирован, очищаем от маски
phone = phone.replace(/[() -]/g, '');
if (phone.match(/^[89]/)) {
phone = '+7' + phone.replace(/^[89]/, '');
} else if (!phone.match(/^\+/)) {
phone = '+7' + phone;
}
}
}
console.log('Отправка SMS на номер:', phone);
if (!phone) {
$('.form-item__warning').text('Пожалуйста, укажите номер телефона');
return false;
}
// Показываем загрузку
$('.js-send-sms').prop('disabled', true).text('Отправка...');
$.ajax({
url: 'sms-verify.php?action=send',
method: 'post',
data: {
phonenumber: phone
},
dataType: 'json',
success: function(data) {
if (data.success) {
$('.js-code-warning').text('Код отправлен на ваш номер телефона');
$('.js-send-sms').prop('disabled', false).text('Отправить смс');
$.fancybox.open({
src: '#confirm_sms',
type: 'inline'
});
} else {
$('.form-item__warning').text(data.message || 'Ошибка отправки SMS');
$('.js-send-sms').prop('disabled', false).text('Отправить смс');
}
},
error: function (jqXHR, exception) {
var errorMsg = 'Ошибка отправки SMS';
if (jqXHR.responseJSON && jqXHR.responseJSON.message) {
errorMsg = jqXHR.responseJSON.message;
}
$('.form-item__warning').text(errorMsg);
$('.js-send-sms').prop('disabled', false).text('Отправить смс');
}
});
return null; // Код больше не генерируется на клиенте
}
function countDown(elm, duration, fn){
var countDownDate = new Date().getTime() + (1000 * duration);
var x = setInterval(function() {
var now = new Date().getTime();
var distance = countDownDate - now;
var days = Math.floor(distance / (1000 * 60 * 60 * 24));
var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
var seconds = Math.floor((distance % (1000 * 60)) / 1000);
elm.innerHTML = minutes + "м " + seconds + "с ";
if (distance < 0) {
clearInterval(x);
fn();
elm.innerHTML = "";
$('.sms-countdown').hide();
}
}, 1000);
}
$('.js-send-sms').on('click', function(e) {
e.preventDefault();
// Проверка валидности полиса перед отправкой SMS
var indatabase = $('.js-indatabase').val();
// Проверяем, был ли полис загружен вручную (через policy-upload-section)
var polisInput = $('#polis_upload')[0];
var polisUploaded = polisInput && polisInput.files && polisInput.files.length > 0;
// Если полис невалидный И не загружен вручную - блокируем отправку
if((indatabase == '0' || indatabase == '' || indatabase == undefined) && !polisUploaded) {
$('.form__warning').show();
$('.form__warning').text('Пожалуйста, проверьте полис. Ваш полис не покрывает данный вид обращения.');
return false;
}
// Валидация поля банка перед отправкой SMS
var bankInput = $('.js-bank-autocomplete');
var bankId = $('input[name="bank_id"]').val();
if (!bankInput.val() || !bankId || bankId === '') {
bankInput.closest('.form-item').find('.form-item__warning').text('Пожалуйста, выберите банк из списка');
bankInput.focus();
return false;
} else {
bankInput.closest('.form-item').find('.form-item__warning').text('');
}
// Отправляем SMS через новый безопасный API
send_sms();
$('.sms-countdown').show();
$('.modal .js-accept-sms').show();
$('.modal .js-send-sms').hide();
$('.modal .form-item__warning').text("");
countDown(document.querySelector('.sms-countdown .time'), 30, function(){
$('.modal .js-send-sms').show();
$('.sms-checking button.js-accept-sms').hide();
$('.js-code-warning').hide();
})
});
// Обработчик для повторной отправки SMS из модального окна
$(document).on('click', '.modal .js-send-sms', function(e) {
e.preventDefault();
var $phoneInput = $('input[name="phonenumber"]');
var phone = $phoneInput.val();
// Получаем номер через intlTelInput API (если доступен) - ТОЧНО ТАК ЖЕ как при первой отправке
if ($phoneInput.length > 0 && window.intlTelInput) {
var iti = window.intlTelInputGlobals.getInstance($phoneInput[0]);
if (iti) {
var fullNumber = iti.getNumber();
if (fullNumber) {
phone = fullNumber;
} else {
phone = phone.replace(/[() -]/g, '');
if (phone.match(/^[89]/)) {
phone = '+7' + phone.replace(/^[89]/, '');
} else if (!phone.match(/^\+/)) {
phone = '+7' + phone;
}
}
} else {
phone = phone.replace(/[() -]/g, '');
if (phone.match(/^[89]/)) {
phone = '+7' + phone.replace(/^[89]/, '');
} else if (!phone.match(/^\+/)) {
phone = '+7' + phone;
}
}
}
console.log('Повторная отправка SMS на номер:', phone);
if (!phone) {
$('.modal .form-item__warning').text('Номер телефона не указан');
return false;
}
// Отправляем SMS
$('.modal .js-send-sms').prop('disabled', true).text('Отправка...');
$('.modal .form-item__warning').text('');
$.ajax({
url: 'sms-verify.php?action=send',
method: 'post',
data: {
phonenumber: phone
},
dataType: 'json',
success: function(data) {
if (data.success) {
$('.modal .form-item__warning').text('').removeClass('form-item__warning--error');
$('.js-code-warning').text('Код отправлен на ваш номер телефона').show();
$('.modal .js-send-sms').hide();
$('.modal .js-accept-sms').show();
$('.sms-countdown').show();
// Запускаем таймер снова
countDown(document.querySelector('.sms-countdown .time'), 30, function(){
$('.modal .js-send-sms').show();
$('.sms-checking button.js-accept-sms').hide();
$('.js-code-warning').hide();
});
} else {
$('.modal .form-item__warning').text(data.message || 'Ошибка отправки SMS');
$('.modal .js-send-sms').prop('disabled', false).text('Отправить повторно');
}
},
error: function (jqXHR, exception) {
var errorMsg = 'Ошибка отправки SMS';
if (jqXHR.responseJSON && jqXHR.responseJSON.message) {
errorMsg = jqXHR.responseJSON.message;
}
$('.modal .form-item__warning').text(errorMsg);
$('.modal .js-send-sms').prop('disabled', false).text('Отправить повторно');
}
});
});
$('.sms-checking .js-accept-sms').on('click', function(e) {
e.preventDefault();
var code = $('.sms-checking input[type="text"]').val();
var $phoneInput = $('input[name="phonenumber"]');
var phone = $phoneInput.val();
// Получаем номер через intlTelInput API (если доступен) - ТОЧНО ТАК ЖЕ как при отправке
if ($phoneInput.length > 0 && window.intlTelInput) {
var iti = window.intlTelInputGlobals.getInstance($phoneInput[0]);
if (iti) {
var fullNumber = iti.getNumber();
if (fullNumber) {
phone = fullNumber;
} else {
phone = phone.replace(/[() -]/g, '');
if (phone.match(/^[89]/)) {
phone = '+7' + phone.replace(/^[89]/, '');
} else if (!phone.match(/^\+/)) {
phone = '+7' + phone;
}
}
} else {
phone = phone.replace(/[() -]/g, '');
if (phone.match(/^[89]/)) {
phone = '+7' + phone.replace(/^[89]/, '');
} else if (!phone.match(/^\+/)) {
phone = '+7' + phone;
}
}
}
console.log('Проверка кода для номера:', phone);
if (!code || !phone) {
$('.modal .form-item__warning').text("Введите код подтверждения");
return false;
}
// Показываем загрузку
$('.js-accept-sms').prop('disabled', true).text('Проверка...');
$('.modal .form-item__warning').text('');
// Проверяем код на сервере
$.ajax({
url: 'sms-verify.php?action=verify',
method: 'post',
data: {
phonenumber: phone,
code: code
},
dataType: 'json',
success: function(data) {
if (data.success) {
// Код подтвержден (токен больше не используется)
// sms_verify_token = data.token; // Убрано - токен больше не нужен
$('.sms-success').removeClass('d-none');
// Проверяем, был ли полис уже проверен
var indatabase = $('.js-indatabase').val();
if(indatabase == '1') {
// Если полис валидный, сразу показываем форму для заполнения
$('.db-success').removeClass('d-none');
$('.form-step[data-step=1]').removeClass('disabled');
// Инициализируем автодополнение адресов после показа формы
setTimeout(function() {
initAddressSuggestions();
}, 500);
} else {
// Если полис невалидный, но был загружен через policy-upload-section, показываем форму
var polisInput = $('#polis_upload')[0];
var polisUploaded = polisInput && polisInput.files && polisInput.files.length > 0;
if(polisUploaded) {
$('.db-success').removeClass('d-none');
$('.form-step[data-step=1]').removeClass('disabled');
// Инициализируем автодополнение адресов
setTimeout(function() {
initAddressSuggestions();
}, 500);
}
}
$('.modal .js-send-sms').show();
$('.sms-check .form-item > .js-send-sms').hide();
$.fancybox.close();
$.fancybox.close();
$('.sms-check').addClass("disabled");
$('.sms-check .form-item__warning')
.addClass('form-item__warning--success')
.text("Вы успешно подтвердили номер");
// Блокируем поле телефона после подтверждения
var $phoneField = $('.js-phone-mask');
var confirmedPhone = $phoneField.val();
$phoneField.attr('data-confirmed-phone', confirmedPhone)
// .attr('data-verify-token', sms_verify_token) // Убрано - токен больше не нужен
.prop('readonly', true)
.attr('autocomplete', 'off');
$('.js-accept-sms').prop('disabled', false).text('Подтвердить');
} else {
$('.modal .form-item__warning').text(data.message || "Неверный код");
$('.sms-success').addClass('d-none');
$('.js-accept-sms').prop('disabled', false).text('Подтвердить');
}
},
error: function (jqXHR, exception) {
var errorMsg = "Ошибка проверки кода";
if (jqXHR.responseJSON && jqXHR.responseJSON.message) {
errorMsg = jqXHR.responseJSON.message;
}
$('.modal .form-item__warning').text(errorMsg);
$('.sms-success').addClass('d-none');
$('.js-accept-sms').prop('disabled', false).text('Подтвердить');
}
});
});
$('.form.active form').submit(function(e){
if(!validate_step(index)){ e.preventDefault(); } else {
e.preventDefault();
$('button[type="submit"]').attr("disabled", true);
if(1) {
$('.js-code-warning').text('');
$('.js-code-warning').hide();
$('.js-send-sms').hide();
$.fancybox.open({
src: '#confirm_sms',
type: 'inline'
});
$('.loader-wrap').removeClass('d-none');
$('button[type="submit"]').attr("disabled", false);
$('button[type="submit"]').text("Данные отправляются...");
var formData = new FormData();
let fileIndex = 0; // Счетчик для правильной индексации файлов
// Отправляем файлы напрямую как бинарные данные (без предварительной загрузки через fileupload_v2.php)
jQuery.each(jQuery('input[type=file].js-attach').not('.disabled'), function(i, file) {
if(!$(this).hasClass('disabled')) {
// Используем field-type или name для группировки файлов
let field_name=jQuery(this).data('field-type') || jQuery(this).attr('name');
let docname=jQuery(this).data('docname');
// Отправляем файлы напрямую как бинарные данные в submit.php
jQuery.each(jQuery(this)[0].files, function(i, file) {
formData.append(field_name+'-'+i, file);
});
// УБРАНО: старая система загрузки через fileupload_v2.php
// Теперь файлы отправляются напрямую в submit.php как бинарные данные
// n8n будет обрабатывать файлы сам
}
});
jQuery.each(jQuery('.js-append'), function(i, file) {
let ws_name=jQuery(this).data('ws_name');
let ws_type=jQuery(this).data('ws_type');
let val="";
if(jQuery(this).attr('type') == 'checkbox'){
if(jQuery(this).is(':checked')){
val=jQuery(this).val();
}
} else {
val=jQuery(this).val();
}
let array={
ws_name : ws_name,
ws_type: ws_type,
field_val : val
};
formData.append('appends[]',JSON.stringify(array));
});
formData.append('lastname',jQuery('[name="lastname"]').val());
formData.append('getservice',jQuery('[name="getservice"]').val()); //Если есть агент посредник
let sub_dir=jQuery('input[name=sub_dir]').val();
formData.append('sub_dir',sub_dir);
// Отладочный вывод отключен
// for (var pair of formData.entries()) {
// console.log(pair[0]+ ', ' + pair[1]);
// }
$.ajax({
url: 'submit.php',
method: 'post',
cache: false,
contentType: false,
processData: false,
data: formData,
dataType: 'json',
success: function(data) {
// Отладочный вывод отключен
// console.log(data);
$('.loader-wrap').addClass('d-none');
$.fancybox.close();
$.fancybox.open({
src: '#success_modal',
type: 'inline'
});
setTimeout(function(){
$.fancybox.close();
},30)
setTimeout(function(){
window.location.href = "https://lexpriority.ru/ok";
},30)
$('button[type="submit"]').text("Отправить");
},
error: function (jqXHR, exception) {
// Отладочный вывод отключен
// console.log(jqXHR);
if (jqXHR.status === 0) {
alert('Not connect. Verify Network.');
} else if (jqXHR.status == 404) {
alert('Requested page not found (404).');
} else if (jqXHR.status == 500) {
alert('Internal Server Error (500).');
} else if (exception === 'parsererror') {
} else if (exception === 'timeout') {
alert('Time out error.');
} else if (exception === 'abort') {
alert('Ajax request aborted.');
} else {
alert('Uncaught Error. ' + jqXHR.responseText);
}
}
});
return false;
} else {
$('.js-code-warning').text('Неверный код');
return false;
}
}
});
});
$('input[name=place],input[name=place_adres],input[name=place_inn]').keyup(function(e){
var sourceInput = $(this);
var query = $(this).val();
var settings = {
"url": "https://suggestions.dadata.ru/suggestions/api/4_1/rs/suggest/party",
"method": "POST",
"timeout": 0,
"headers": {
"Authorization": "Token d2fa8613e186d54c6c62fc321414552353ffdfa8",
"Content-Type": "application/json",
"Cookie": "__ddg1_=BoLd7l5yOCjL9tr6qUth"
},
"data": JSON.stringify({
"query": query
}),
};
$('.autocomplete__item').remove();
var address_array = [];
$.ajax(settings).done(function (response) {
for(let i=0; i<response.suggestions.length; i++) {
$('<div class="autocomplete__item" data-address="'+response.suggestions[i].data.address.value+'" data-inn="'+response.suggestions[i].data.inn+'">'+response.suggestions[i].value+'</div>').appendTo(sourceInput.closest('.form-item').find('.form-item__dropdown'));
}
});
});
$(document).on('click', '.autocomplete__item', function() {
let currentAutocompleteItem=$(this);
let prefix = $(this).closest('.autocomplete').data('groupename');
$('.'+prefix+'_name').val(currentAutocompleteItem.text());
$('.'+prefix+'_adres').val(currentAutocompleteItem.attr('data-address'));
$('.'+prefix+'_inn').val(currentAutocompleteItem.attr('data-inn'));
currentAutocompleteItem.closest('.form-item').find('.form-item__dropdown').empty();
});
// Автоподстановка банков из API
let banksList = []; // Кэш списка банков
let banksLoading = false; // Флаг загрузки
// Загрузка списка банков через прокси на сервере (обход CORS)
function loadBanksList() {
if (banksLoading) return; // Предотвращаем множественные запросы
banksLoading = true;
$.ajax({
url: 'load_banks.php', // PHP скрипт на сервере для обхода CORS
method: 'GET',
dataType: 'json',
timeout: 15000, // 15 секунд таймаут
success: function(data) {
banksLoading = false;
if (Array.isArray(data)) {
banksList = data;
// Отладочный вывод отключен
// console.log('Загружено банков:', banksList.length);
// Убираем предупреждение об ошибке, если оно было
$('.js-bank-autocomplete').closest('.form-item').find('.form-item__warning').text('');
} else if (data && data.error) {
// Отладочный вывод отключен
// console.error('Ошибка от сервера:', data.error);
showBanksLoadError('Ошибка сервера: ' + data.error);
} else {
// Отладочный вывод отключен
// console.error('Неверный формат данных:', data);
showBanksLoadError('Неверный формат данных от сервера');
}
},
error: function(jqXHR, exception) {
banksLoading = false;
// Отладочный вывод отключен
// console.error('Ошибка загрузки списка банков:', exception, jqXHR);
var errorMsg = 'Не удалось загрузить список банков';
if (jqXHR.status === 0) {
errorMsg += ' (нет соединения)';
} else if (jqXHR.status === 404) {
errorMsg += ' (файл прокси не найден)';
} else if (jqXHR.status === 500) {
errorMsg += ' (ошибка сервера)';
} else if (exception === 'timeout') {
errorMsg += ' (превышено время ожидания)';
}
showBanksLoadError(errorMsg);
}
});
}
// Показать ошибку загрузки банков
function showBanksLoadError(message) {
var bankInput = $('.js-bank-autocomplete');
if (bankInput.length) {
var warningText = message || 'Не удалось загрузить список банков. Пожалуйста, обновите страницу или введите название банка вручную.';
bankInput.closest('.form-item').find('.form-item__warning')
.text(warningText)
.css('color', '#dc3545');
}
}
// Загружаем банки при загрузке страницы
$(document).ready(function() {
// Небольшая задержка, чтобы убедиться, что DOM готов
setTimeout(function() {
loadBanksList();
}, 100);
});
// Популярные банки (показываются первыми)
var popularBanks = ['Сбербанк', 'ВТБ', 'Альфа-Банк', 'Тинькофф', 'Райффайзен Банк', 'Газпромбанк', 'Россельхозбанк', 'ПСБ', 'МКБ', 'ЮМани'];
// Функция для сортировки банков (популярные вверху)
function sortBanks(banks) {
return banks.sort(function(a, b) {
var aIndex = popularBanks.findIndex(function(name) {
return a.bankName.indexOf(name) !== -1;
});
var bIndex = popularBanks.findIndex(function(name) {
return b.bankName.indexOf(name) !== -1;
});
if (aIndex === -1 && bIndex === -1) return 0;
if (aIndex === -1) return 1;
if (bIndex === -1) return -1;
return aIndex - bIndex;
});
}
// Автоподстановка банков
$('.js-bank-autocomplete').on('input keyup', function(e) {
var sourceInput = $(this);
var query = $(this).val().toLowerCase().trim();
var dropdown = sourceInput.closest('.form-item').find('.form-item__dropdown');
// Очищаем предыдущие результаты
dropdown.empty();
// Если запрос пустой, показываем больше банков (30) с популярными вверху
if (query.length === 0) {
var sortedBanks = sortBanks(banksList.slice());
showBanksDropdown(sortedBanks.slice(0, 30), dropdown, sourceInput, banksList.length, true);
return;
}
// Фильтруем банки по запросу
var filteredBanks = banksList.filter(function(bank) {
return bank.bankName.toLowerCase().indexOf(query) !== -1;
});
// Показываем результаты (максимум 50 при поиске)
showBanksDropdown(filteredBanks.slice(0, 50), dropdown, sourceInput, filteredBanks.length, false);
});
// Функция для отображения выпадающего списка банков
function showBanksDropdown(banks, dropdown, sourceInput, totalCount, showHint) {
dropdown.empty();
if (banks.length === 0) {
dropdown.append('<div class="autocomplete__item" style="padding: 10px; color: #999;">Банки не найдены</div>');
return;
}
banks.forEach(function(bank) {
var item = $('<div class="autocomplete__item" data-bank-id="' + bank.bankId + '" data-bank-name="' + bank.bankName + '" style="cursor: pointer;">' + bank.bankName + '</div>');
dropdown.append(item);
});
// Добавляем подсказку внизу списка
if (showHint && totalCount > banks.length) {
var hint = $('<div class="autocomplete__hint" style="padding: 12px 15px; background: #f8f9fa; border-top: 1px solid #e9ecef; font-size: 12px; color: #6c757d; text-align: center; border-radius: 0 0 4px 4px;">' +
'<strong>Показано ' + banks.length + ' из ' + totalCount + ' банков</strong><br>' +
'Начните вводить название банка для поиска по всем ' + totalCount + ' банкам'
+ '</div>');
dropdown.append(hint);
} else if (!showHint && totalCount > banks.length) {
var hint = $('<div class="autocomplete__hint" style="padding: 10px 15px; background: #f8f9fa; border-top: 1px solid #e9ecef; font-size: 12px; color: #6c757d; text-align: center;">' +
'Найдено: ' + totalCount + ' банков. Показано ' + banks.length + '. Уточните запрос для более точного поиска.'
+ '</div>');
dropdown.append(hint);
}
}
// Обработчик выбора банка - используем mousedown для надежности
$(document).on('mousedown', '.form-item__dropdown .autocomplete__item', function(e) {
e.preventDefault();
e.stopPropagation();
var selectedItem = $(this);
var bankId = selectedItem.attr('data-bank-id');
var bankName = selectedItem.attr('data-bank-name');
var formItem = selectedItem.closest('.form-item');
// Проверяем, что это не подсказка
if (selectedItem.hasClass('autocomplete__hint')) {
return false;
}
// Заполняем поля
var bankInput = formItem.find('.js-bank-autocomplete');
var bankIdInput = formItem.find('input[name="bank_id"]');
bankInput.val(bankName);
bankIdInput.val(bankId);
// Очищаем выпадающий список
formItem.find('.form-item__dropdown').empty();
// Убираем предупреждение
formItem.find('.form-item__warning').text('');
// Убираем фокус с input
bankInput.blur();
// Отладочный вывод отключен
// console.log('Банк выбран:', bankName, 'ID:', bankId);
return false;
});
// Дублируем обработчик на click для совместимости
$(document).on('click', '.form-item__dropdown .autocomplete__item', function(e) {
e.preventDefault();
e.stopPropagation();
var selectedItem = $(this);
// Проверяем, что это не подсказка
if (selectedItem.hasClass('autocomplete__hint')) {
return false;
}
// Если mousedown не сработал, обрабатываем здесь
var bankId = selectedItem.attr('data-bank-id');
var bankName = selectedItem.attr('data-bank-name');
var formItem = selectedItem.closest('.form-item');
if (bankId && bankName) {
formItem.find('.js-bank-autocomplete').val(bankName);
formItem.find('input[name="bank_id"]').val(bankId);
formItem.find('.form-item__dropdown').empty();
formItem.find('.form-item__warning').text('');
}
return false;
});
// При фокусе показываем список банков
$('.js-bank-autocomplete').on('focus', function() {
var sourceInput = $(this);
var dropdown = sourceInput.closest('.form-item').find('.form-item__dropdown');
var query = $(this).val().toLowerCase().trim();
if (banksList.length === 0) {
// Если банки еще не загружены, пробуем загрузить
loadBanksList();
return;
}
if (query.length === 0) {
var sortedBanks = sortBanks(banksList.slice());
showBanksDropdown(sortedBanks.slice(0, 30), dropdown, sourceInput, banksList.length, true);
} else {
// Триггерим событие input для фильтрации
$(this).trigger('input');
}
});
// Скрываем выпадающий список при потере фокуса (с задержкой для клика)
$('.js-bank-autocomplete').on('blur', function(e) {
var sourceInput = $(this);
var dropdown = sourceInput.closest('.form-item').find('.form-item__dropdown');
// Увеличиваем задержку, чтобы клик успел обработаться
setTimeout(function() {
// Проверяем, не кликнули ли мы на элемент списка или внутри dropdown
var activeElement = document.activeElement;
var relatedTarget = e.relatedTarget;
// Если фокус перешел на элемент из dropdown, не скрываем
if (relatedTarget && $(relatedTarget).closest('.form-item__dropdown').length) {
return;
}
if (!$(activeElement).hasClass('autocomplete__item') &&
!$(activeElement).closest('.form-item__dropdown').length) {
dropdown.empty();
}
}, 200);
});
// Предотвращаем blur при клике на dropdown
$(document).on('mousedown', '.form-item__dropdown', function(e) {
// Останавливаем всплытие, чтобы blur не сработал на input
e.stopPropagation();
});
// Инициализация автодополнения адресов при загрузке страницы
setTimeout(function() {
initAddressSuggestions();
}, 1000);
// $('input[name=db_birthday],input[name=db_inn]').keyup(function(e){
$(document).on('click', '.js-check-in', function(e) {
e.preventDefault();
let birthday=$('input[name=birthday]').val();
let police_number=$('input[name=police_number]').val();
if(police_number.slice(0,1)=="Е"){
police_number=police_number.replace(/Е/g, 'E');
}
if(police_number.slice(0,1)=="А"){
police_number=police_number.replace(/А/g, 'A');
}
let dbdata={
"action" : "user_verify",
'birthday' : birthday.replace(/-/g, '.'),
'inn' : police_number
}
// Показываем загрузку
$('.js-check-in').prop('disabled', true).text('Проверка...');
$('.js-result').html('').removeClass('danger form-item__warning--success');
$.ajax({
url: 'database.php',
method: 'post',
data: dbdata,
dataType: 'json',
success: function(data) {
$('.js-check-in').prop('disabled', false).text('Проверить наличие полиса');
// Если data уже объект, не парсим
let res = typeof data === 'string' ? JSON.parse(data) : data;
if(res.success=="true"){
// Полис валидный - показываем успешное сообщение
$('.js-result').html(res.message);
$('.js-result').removeClass("danger");
$('.js-result').addClass("form-item__warning--success");
$('input[name=insured_from]').val(res.result.insured_from.replace(/\./g, '-'));
$('input[name=insured_to]').val(res.result.insured_to.replace(/\./g, '-'));
$('.js-indatabase').val('1');
$('.policy-upload-section').addClass('d-none');
// Показываем поля телефона и банка после успешной проверки полиса
$('.policy-validated-fields').removeClass('d-none');
// Разблокируем кнопку "Отправить смс" если полис валидный
$('.js-send-sms').removeClass('disabled');
$('.js-send-sms').prop('disabled', false);
$('.form__warning').hide();
// Если SMS уже подтверждено, сразу показываем форму для заполнения
if($('.sms-success').is(':visible') || !$('.sms-success').hasClass('d-none')) {
$('.db-success').removeClass('d-none');
$('.form-step[data-step=1]').removeClass('disabled');
}
// Инициализируем автодополнение адресов после проверки полиса
setTimeout(function() {
initAddressSuggestions();
}, 500);
} else {
// Полис не найден - показываем ТОЛЬКО поле для загрузки скана полиса
$('.js-indatabase').val('0');
// Убираем сообщение об ошибке из .js-result
$('.js-result').html('');
$('.js-result').removeClass("danger form-item__warning--success");
// НЕ показываем форму (.sms-success), только блок загрузки полиса
$('.sms-success').addClass('d-none');
$('.db-success').addClass('d-none');
// Показываем ТОЛЬКО блок для загрузки полиса
$('.policy-upload-section').removeClass('d-none');
$('.policy-upload-section').find('input[type=file]').removeClass("notvalidate");
$('.policy-upload-section').find('input[type=file]').removeClass("disabled");
// Показываем уведомление о необходимости загрузить полис
$('.policy-upload-section').find('.form-item__warning')
.text('Загрузите скан полиса для продолжения')
.css('color', '#856404')
.show();
// Скрываем поля телефона и банка
$('.policy-validated-fields').addClass('d-none');
// Блокируем кнопку "Отправить смс"
$('.js-send-sms').addClass('disabled');
$('.js-send-sms').prop('disabled', true);
$('.form__warning').hide();
}
return false;
},
error: function (jqXHR, exception) {
$('.js-check-in').prop('disabled', false).text('Проверить наличие полиса');
var errorMsg = 'Ошибка при проверке полиса';
if (jqXHR.responseText) {
try {
var errorData = JSON.parse(jqXHR.responseText);
if (errorData.message) {
errorMsg = errorData.message;
}
} catch(e) {
errorMsg = jqXHR.responseText.substring(0, 100);
}
}
$('.js-result').html(errorMsg)
.removeClass('form-item__warning--success')
.addClass('danger');
console.error('Ошибка проверки полиса:', jqXHR, exception);
return false;
}
});
});
$('input[name=birthday]').on("change input", function (e) {
// Отладочный вывод отключен
// console.log("Date changed: ", e.target.value);
let birthday=$(this).val();
if(getAge(birthday)<18) {
// Если возраст меньше 18 - разблокируем поле
$("input[data-enableby=birthday]").removeClass('disabled');
$("input[data-disabledby=birthday]").removeClass('disabled');
$("input[data-enableby=birthday]").prop('disabled', false);
$("input[data-enableby=birthday]").prop('readonly', false);
} else {
// Если возраст 18 и больше - блокируем поле
$("input[data-enableby=birthday]").addClass('disabled');
$("input[data-disabledby=birthday]").addClass('disabled');
$("input[data-enableby=birthday]").prop('disabled', true);
$("input[data-enableby=birthday]").prop('readonly', true);
$("input[data-enableby=birthday]").val(''); // Очищаем значение при блокировке
}
});
$('input[name=lastname],input[name=firstname],input[name=patronymic]').keyup(function(e){
let full_name=$('input[name=lastname]').val()+" "+$('input[name=firstname]').val()+" "+$('input[name=patronymic]').val();
$("input[data-enableby=birthday]").val(full_name);
});
function getAge(dateString) {
var today = new Date();
var birthDate = new Date(dateString.replace( /(\d{2})-(\d{2})-(\d{4})/, "$2/$1/$3"));
var age = today.getFullYear() - birthDate.getFullYear();
var m = today.getMonth() - birthDate.getMonth();
if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) {
age--;
}
return age;
}
// Загрузка файлов
function declOfNum(number, words) {
return words[(number % 100 > 4 && number % 100 < 20) ? 2 : [2, 0, 1, 1, 1, 2][(number % 10 < 5) ? Math.abs(number) % 10 : 5]];
}
function updateSize(elem) {
var filesQty = elem[0].files.length;
if(filesQty>10) {
elem.closest('.form-item').find('.form-item__warning').text("Разрешено не более 10 файлов");
return;
}
elem.closest('.form-item').find('.form-item__warning').text('');
let file_status=[];
var formats = ['pdf','jpg','png','gif','jpeg'];
for(var i=0; i<filesQty; i++) {
var file = elem[0].files[i],
ext = "не определилось",
parts = file.name.split('.');
if (parts.length > 1) ext = parts.pop();
if(!formats.includes(ext)) {
elem.closest('.form-item').find('.form-item__warning').append('<div> Файл '+file.name+' не подходит по формату. Доступные форматы: .pdf, .jpg, .png, .gif </div>');
elem.addClass('error');
file_status.push(false);
} else {
// elem.closest('.form-item').find('.form-item__warning').text();
if((file.size/1024/1024) > 5){
file_status.push(false);
elem.closest('.form-item').find('.form-item__warning').append('<div>Размер файла '+file.name+' превышает 5 Мб. </div>');
} else {
elem.removeClass('error');
file_status.push(true);
}
}
}
// ОТКЛЮЧЕНО: старая система загрузки файлов через fileupload_v2.php
// Файлы теперь отправляются напрямую в submit.php как бинарные данные
if(file_status.every(val => val === true))
{
// upload_file(elem); // ОТКЛЮЧЕНО - файлы отправляются напрямую при submit формы
$('.form__action').find('.js-btn-next').removeClass('disabled');
} else {
$('.form__action').find('.js-btn-next').addClass('disabled');
}
}
function upload_file(thisfile) {
let formData = new FormData();
let field_name=thisfile.data('crmname') || thisfile.data('field-type');
let docname=thisfile.data('docname');
// Отладочный вывод отключен
// console.log('=== UPLOAD_FILE FUNCTION ===');
// console.log('Uploading for field:', field_name, 'docname:', docname);
// console.log('File input element:', thisfile[0]);
// console.log('Files in input:', thisfile[0].files);
// console.log('Field type:', thisfile.data('field-type'));
// console.log('Form item:', thisfile.closest('.form-item')[0]);
let sub_dir=jQuery('input[name=sub_dir]').val();
jQuery.each(thisfile[0].files, function(i, file) {
formData.append(field_name+'-'+i, file);
});
thisfile.closest('.form-item').find('.suсcess-upload').remove();
formData.append('lastname',jQuery('input[name=lastname]').val());
formData.append('files_names[]',field_name);
formData.append('docs_names[]',docname);
formData.append('sub_dir',sub_dir);
thisfile.closest('.form-item').append("<p class='info-upload'></p>");
// for (var pair of formData.entries()) {
// console.log(pair[0]+ ', ' + pair[1]);
// }
$.ajax({
xhr: function() {
var xhr = new window.XMLHttpRequest();
// Upload progress
xhr.upload.addEventListener("progress", function(evt){
if (evt.lengthComputable) {
var percentComplete = evt.loaded / evt.total;
//Do something with upload progress
let complete=Math.round(percentComplete * 100);
// Отладочный вывод отключен
// console.log(complete);
thisfile.closest('.form-item').find(".info-upload").text("Загружено "+complete+" %");
}
}, false);
// Download progress
xhr.addEventListener("progress", function(evt){
if (evt.lengthComputable) {
var percentComplete = evt.loaded / evt.total;
// Do something with download progress
// Отладочный вывод отключен
// console.log(percentComplete);
}
}, false);
return xhr;
},
url: 'https://form.clientright.ru/fileupload_v2.php',
method: 'post',
cache: false,
contentType: false,
processData: false,
data: formData,
// dataType : 'json',
beforeSend : function (){
$('.form__action').find('.js-btn-next').addClass('disabled');
$('.form__action').find('.btn--submit').addClass('disabled');
},
success: function(data) {
let res=JSON.parse(data);
if(res.success=="true"){
// Отладочный вывод отключен
// console.log(res);
// thisfile.closest('.form-item').append("<p class='suсcess-upload'>Файл успешно загружен на сервер.</p>");
thisfile.attr('data-uploadurl',res.empty_file);
thisfile.attr('data-uploadurl_real',res.real_file);
// thisfile.closest('.form-item').append("<p class='suсcess-upload'>"+res.message+"</p>");
thisfile.closest('.form-item').find('.info-upload').remove();
$('.form__action').find('.js-btn-next').removeClass('disabled');
$('.form__action').find('.btn--submit').removeClass('disabled');
} else {
}
return false;
},
error: function (jqXHR, exception) {
return false;
}
});
}
function formatBytes(bytes, decimals = 2) {
if (!+bytes) return '0 Bytes'
const k = 1024
const dm = decimals < 0 ? 0 : decimals
const sizes = ['Bytes', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']
const i = Math.floor(Math.log(bytes) / Math.log(k))
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`
}
var fileIdCounter = 0;
jQuery('.js-attach').each(function() {
var fieldType = $(this).data('field-type'); // Получаем тип поля
let filethis = $(this);
// Создаем изолированное хранилище файлов для каждого поля
var fieldFiles = {
filesToUpload: [],
fieldType: fieldType
};
filethis.change(function (evt) {
var output = [];
let elem= $(this);
let currentFieldFiles = fieldFiles; // Используем изолированное хранилище
let currentFormItem = elem.closest('.form-item');
// Очищаем предупреждения только для текущего поля
currentFormItem.find('.form-item__warning').text('');
let file_status=[];
var formats = ['pdf','jpg','png','gif','jpeg'];
// Отладочный вывод отключен
// console.log('=== FILE UPLOAD START ===');
// console.log('Processing files for field type:', currentFieldFiles.fieldType);
// console.log('Field element:', elem[0]);
// console.log('Form item:', currentFormItem[0]);
// console.log('Files to process:', evt.target.files);
// console.log('Current fieldFiles state:', currentFieldFiles);
if(evt.target.files.length>10) {
elem.closest('.form-item').find('.form-item__warning').text("Разрешено не более 10 файлов");
return;
}
// Очищаем предыдущий список файлов для этого поля
currentFormItem.find('.fileList').empty();
currentFieldFiles.filesToUpload = [];
for (var i = 0; i < evt.target.files.length; i++) {
fileIdCounter++;
var file = evt.target.files[i];
var fileId = "fileid_" + fileIdCounter;
// Отладочный вывод отключен
// console.log(file);
let ext = "не определилось";
let parts = file.name.split('.');
if (parts.length > 1) ext = parts.pop();
if(!formats.includes(ext)) {
elem.closest('.form-item').find('.form-item__warning').append('<div> Файл '+file.name+' не подходит по формату. Доступные форматы: .pdf, .jpg, .png, .gif </div>');
elem.addClass('error');
file_status.push(false);
} else {
// elem.closest('.form-item').find('.form-item__warning').text();
if((file.size/1024/1024) > 5){
file_status.push(false);
elem.closest('.form-item').find('.form-item__warning').append('<div>Размер файла '+file.name+' превышает 5 Мб. </div>');
} else {
elem.removeClass('error');
file_status.push(true);
var removeLink = "<a class=\"removefile\" href=\"#\" data-fileid=\"" + fileId + "\"></a>";
output.push("<li><strong>", file.name, "</strong> <span class='size'> ", formatBytes(file.size) , " </span> ", removeLink, "</li> ");
currentFieldFiles.filesToUpload.push({
id: fileId,
file: file
});
}
}
//evt.target.value = null;
// elem.closest('.form-item').find('.upload-action').removeClass('d-none');
};
currentFormItem.find(".fileList").append(output.join(""));
let container = new DataTransfer();
for (var i = 0, len = currentFieldFiles.filesToUpload.length; i < len; i++) {
container.items.add(currentFieldFiles.filesToUpload[i].file);
}
elem[0].files = container.files;
if(file_status.every(val => val === true))
{
// Отладочный вывод отключен
// console.log('=== FILE UPLOAD SUCCESS ===');
// console.log('Uploading files for field type:', currentFieldFiles.fieldType);
// console.log('Final fieldFiles state:', currentFieldFiles);
// console.log('Files in DataTransfer:', elem[0].files);
// upload_file(elem); // ОТКЛЮЧЕНО - файлы отправляются напрямую при submit формы
$('.form__action').find('.js-btn-next').removeClass('disabled');
// Если загружен полис из блока policy-upload-section, показываем телефон и банк
if(currentFieldFiles.fieldType === 'polis' && elem.closest('.policy-upload-section').length > 0) {
// Скрываем блок загрузки полиса
$('.policy-upload-section').addClass('d-none');
// Показываем поля телефона и банка
$('.policy-validated-fields').removeClass('d-none');
// Разблокируем кнопку "Отправить смс"
$('.js-send-sms').removeClass('disabled');
$('.js-send-sms').prop('disabled', false);
// Убираем уведомление
$('.policy-upload-section').find('.form-item__warning').text('').hide();
}
} else {
// Отладочный вывод отключен
// console.log('=== FILE UPLOAD FAILED ===');
// console.log('File status:', file_status);
$('.form__action').find('.js-btn-next').addClass('disabled');
}
});
// Обработчик удаления файлов с доступом к fieldFiles через замыкание
$(this).closest('.form-item').on("click", ".removefile", function (e) {
let elem = $(this);
e.preventDefault();
var fileId = elem.data("fileid");
// Находим соответствующий input файла для этого .form-item
let fileInput = elem.closest('.form-item').find('input[type="file"].js-attach');
let fieldType = fileInput.data('field-type');
// Отладочный вывод отключен
// console.log('=== REMOVE FILE ===');
// console.log('Removing file with ID:', fileId);
// console.log('From field type:', fieldType);
// console.log('Current fieldFiles:', fieldFiles);
// Используем fieldFiles из замыкания
for (var i = 0; i < fieldFiles.filesToUpload.length; ++i) {
if (fieldFiles.filesToUpload[i].id === fileId) {
fieldFiles.filesToUpload.splice(i, 1);
// Отладочный вывод отключен
// console.log('File removed from fieldFiles');
break;
}
}
elem.parent().remove();
if(fieldFiles.filesToUpload.length == 0) {
elem.closest('.form-item').find('.upload-action').addClass('d-none');
elem.closest('.form-item').find('.suсcess-upload').text('');
} else {
let container = new DataTransfer();
for (var i = 0, len = fieldFiles.filesToUpload.length; i < len; i++) {
container.items.add(fieldFiles.filesToUpload[i].file);
}
fileInput[0].files = container.files;
updateSize(fileInput);
}
});
});
// End Загрузка файлов
});