12 changed files with 862 additions and 26 deletions
			
			
		@ -1,3 +0,0 @@ | 
				
			|||||||
# Default ignored files | 
					 | 
				
			||||||
/shelf/ | 
					 | 
				
			||||||
/workspace.xml | 
					 | 
				
			||||||
@ -1,7 +1,7 @@ | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?> | 
					<?xml version="1.0" encoding="UTF-8"?> | 
				
			||||||
<project version="4"> | 
					<project version="4"> | 
				
			||||||
  <component name="Black"> | 
					  <component name="Black"> | 
				
			||||||
    <option name="sdkName" value="Python 3.8 (tgflaskform)" /> | 
					    <option name="sdkName" value="Python 3.8 (tgFlaskFormPolimed)" /> | 
				
			||||||
  </component> | 
					  </component> | 
				
			||||||
  <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.8 (tgFlaskForm)" project-jdk-type="Python SDK" /> | 
					  <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.8 (tgFlaskFormPolimed)" project-jdk-type="Python SDK" /> | 
				
			||||||
</project> | 
					</project> | 
				
			||||||
@ -1,8 +0,0 @@ | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?> | 
					 | 
				
			||||||
<project version="4"> | 
					 | 
				
			||||||
  <component name="ProjectModuleManager"> | 
					 | 
				
			||||||
    <modules> | 
					 | 
				
			||||||
      <module fileurl="file://$PROJECT_DIR$/.idea/tgflaskform.iml" filepath="$PROJECT_DIR$/.idea/tgflaskform.iml" /> | 
					 | 
				
			||||||
    </modules> | 
					 | 
				
			||||||
  </component> | 
					 | 
				
			||||||
</project> | 
					 | 
				
			||||||
@ -1,10 +1,7 @@ | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?> | 
					<?xml version="1.0" encoding="UTF-8"?> | 
				
			||||||
<module type="PYTHON_MODULE" version="4"> | 
					<module version="4"> | 
				
			||||||
  <component name="NewModuleRootManager"> | 
					  <component name="PyDocumentationSettings"> | 
				
			||||||
    <content url="file://$MODULE_DIR$"> | 
					    <option name="format" value="PLAIN" /> | 
				
			||||||
      <excludeFolder url="file://$MODULE_DIR$/.venv" /> | 
					    <option name="myDocStringFormat" value="Plain" /> | 
				
			||||||
    </content> | 
					 | 
				
			||||||
    <orderEntry type="jdk" jdkName="Python 3.8 (tgFlaskForm)" jdkType="Python SDK" /> | 
					 | 
				
			||||||
    <orderEntry type="sourceFolder" forTests="false" /> | 
					 | 
				
			||||||
  </component> | 
					  </component> | 
				
			||||||
</module> | 
					</module> | 
				
			||||||
@ -0,0 +1,102 @@ | 
				
			|||||||
 | 
					include 2.0/application | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/choices.js/public/assets/styles/choices.min.css"> | 
				
			||||||
 | 
					<script src="https://cdn.jsdelivr.net/npm/choices.js/public/assets/scripts/choices.min.js"></script> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					link(rel="stylesheet" href="/css/1_model_app.css?q="~randomString()) | 
				
			||||||
 | 
					link(rel="stylesheet" href="/css/1_model_icons.css?q="~randomString()) | 
				
			||||||
 | 
					script(type="text/javascript", src="/js/UFMS.js?q="~randomString()) | 
				
			||||||
 | 
					script(type="text/javascript", src="/js/2.0.dashboard.fns.js?q="~randomString()) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.enterblock.custom-font.py-5 | 
				
			||||||
 | 
					    .row.mx-auto(style='max-width: 448px; vertical-align: middle; padding-bottom: 120%;') | 
				
			||||||
 | 
					        .col-12.my-md-auto.p-0.card.shadow.rounded-3(style='min-height: 500px;') | 
				
			||||||
 | 
					            .card-body.px-0.pb-0 | 
				
			||||||
 | 
					                h5.mx-4.fw-bold Заказать справку ФНС | 
				
			||||||
 | 
					                input.tg_input#user_id(type="hidden", value=user_id) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    //-.my-3.mx-4.success-field.primary-field | 
				
			||||||
 | 
					                        label.form-label.m-0(for="taxpayer_fio") Выберите налогоплательщика | 
				
			||||||
 | 
					                        select.form-control.tg_input#taxpayer_fio(name="taxpayer_fio" required) | 
				
			||||||
 | 
					                            option(value="") -- Выберите налогоплательщика -- | 
				
			||||||
 | 
					                            each user in users | 
				
			||||||
 | 
					                                option(value=user) #{user} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                .my-3.mx-4.success-field.primary-field | 
				
			||||||
 | 
					                    label.form-label.m-0(for="patient_fio") Выберите пациента, на данный момент можно заказать справку только для налогоплательщика | 
				
			||||||
 | 
					                    select.form-control.tg_input#patient_fio(name="patient_fio" required) | 
				
			||||||
 | 
					                        option(value="") Выберите пациента | 
				
			||||||
 | 
					                        each user in users | 
				
			||||||
 | 
					                            option(value=user) #{user} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                .my-3.mx-4.primary-field | 
				
			||||||
 | 
					                    button.btn.btn-success.float-end.mb-3#form_submit(type="submit") | 
				
			||||||
 | 
					                        span.spinner-border.spinner-border-sm.me-1.d-none(role="status" aria-hidden="true") | 
				
			||||||
 | 
					                        span Отправить | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                .my-3.mx-4.success-field.verification(style="display: none;") | 
				
			||||||
 | 
					                    label.form-label.m-0(for="fio")='Фамилия Имя Отчество' | 
				
			||||||
 | 
					                    input.form-control.tg_input#fio(type="text" name="fio") | 
				
			||||||
 | 
					                    small="(Пожалуйста, проверьте правильность данных)" | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                .my-3.mx-4.success-field.verification(style="display: none;") | 
				
			||||||
 | 
					                    label.form-label.m-0(for="birthdate")='Дата рождения' | 
				
			||||||
 | 
					                    input.form-control.tg_input#dob(type="date") | 
				
			||||||
 | 
					                    small="(Пожалуйста, проверьте правильность данных)" | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                .my-3.mx-4.success-field.verification(style="display: none;") | 
				
			||||||
 | 
					                    label.form-label.m-0(for="passport")='Серия и номер паспорта' | 
				
			||||||
 | 
					                    input.form-control.tg_input#passport | 
				
			||||||
 | 
					                    small="(Пожалуйста, проверьте правильность данных)" | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                .my-3.mx-4.success-field.verification(style="display: none;") | 
				
			||||||
 | 
					                    label.form-label.m-0(for="passport_date")='Дата выдачи паспорта' | 
				
			||||||
 | 
					                    input.form-control.tg_input#passport_date(type="date") | 
				
			||||||
 | 
					                    small="(Пожалуйста, проверьте правильность данных)" | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                .my-3.mx-4.success-field.verification(style="display: none;") | 
				
			||||||
 | 
					                    label.form-label.m-0(for="postal_code")='Код подразделения' | 
				
			||||||
 | 
					                    input.form-control.tg_input#postal_code | 
				
			||||||
 | 
					                    small="(Пожалуйста, проверьте правильность данных)" | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                .my-3.mx-4.success-field.verification(style="display: none;") | 
				
			||||||
 | 
					                    label.form-label.m-0(for="passport_issued_by")='Кем выдан паспорт' | 
				
			||||||
 | 
					                    select.form-select.tg_input#passport_issued_by(style="") | 
				
			||||||
 | 
					                        option(disabled, selected)="Кем выдан паспорт" | 
				
			||||||
 | 
					                    small="(Пожалуйста, проверьте правильность данных)" | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                .my-3.mx-4.success-field.verification(style="display: none;") | 
				
			||||||
 | 
					                    label.form-label.m-0(for="inn")='ИНН' | 
				
			||||||
 | 
					                    input.form-control.tg_input#inn(type="text" name="#inn") | 
				
			||||||
 | 
					                    small="(Пожалуйста, проверьте правильность данных)" | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                .my-3.mx-4.success-field.verification(style="display: none;") | 
				
			||||||
 | 
					                    label.form-label.m-0(for="email")='Электронная почта' | 
				
			||||||
 | 
					                    input.form-control.tg_input#email(type="text" name="email" value=pct_email) | 
				
			||||||
 | 
					                    small="(Пожалуйста, проверьте правильность данных)" | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                .my-3.mx-4.success-field.verification(style="display: none;") | 
				
			||||||
 | 
					                    label.form-label.m-0 За какой год выдать данные | 
				
			||||||
 | 
					                    .checkbox-container | 
				
			||||||
 | 
					                        each year in [2025, 2024, 2023, 2022] | 
				
			||||||
 | 
					                            label.checkbox-item | 
				
			||||||
 | 
					                                input(type="checkbox" name="god_zapros" value=year) | 
				
			||||||
 | 
					                                span= year | 
				
			||||||
 | 
					                    button.btn.btn-primary#select-all Выбрать все | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                .my-3.mx-4.primary-field.verification(style="display: none;") | 
				
			||||||
 | 
					                    button.btn.btn-success.float-end.mb-3#code_submit | 
				
			||||||
 | 
					                        span.spinner-border.spinner-border-sm.me-1.d-none(role="status" aria-hidden="true") | 
				
			||||||
 | 
					                        span="Заказать справку" | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                .my-3.mx-4.primary-field.success_window(style="display: none;") | 
				
			||||||
 | 
					                    h3="Отлично!" | 
				
			||||||
 | 
					                    p="Справка заказана." | 
				
			||||||
@ -0,0 +1,521 @@ | 
				
			|||||||
 | 
					function show_error(message){ | 
				
			||||||
 | 
					    $('#error_alert').slideDown(500); | 
				
			||||||
 | 
					    $('#success_alert').hide(); | 
				
			||||||
 | 
					    $('#error_alert').delay(5000).slideUp(); | 
				
			||||||
 | 
					    $('#alert_error_text').empty(); | 
				
			||||||
 | 
					    if (message) | 
				
			||||||
 | 
					        $('#alert_error_text').append(message) | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function show_success(message){ | 
				
			||||||
 | 
					    $('#success_alert').slideDown(500); | 
				
			||||||
 | 
					    $('#success_alert').delay(5000).slideUp(); | 
				
			||||||
 | 
					    $('#alert_success_text').empty(); | 
				
			||||||
 | 
					    if (message) | 
				
			||||||
 | 
					        $('#alert_success_text').append(message); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function validate_length(val, dest_len){ | 
				
			||||||
 | 
					    if(val.length < dest_len){ | 
				
			||||||
 | 
					        return false; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					    return true; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(document).ready(function(){ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    $("#postal_code").change(function(){ | 
				
			||||||
 | 
					        $('#passport_issued_by').empty(); | 
				
			||||||
 | 
					        $('#passport_issued_by').append('<option disabled="" selected="">Кем выдан паспорт</option>') | 
				
			||||||
 | 
					        for(i in UFMS_list[$(this).val()]) | 
				
			||||||
 | 
					        { | 
				
			||||||
 | 
					            item = UFMS_list[$(this).val()][i]; | 
				
			||||||
 | 
					            $('#passport_issued_by').append('<option>'+item+'</option>'); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					//        $('#passport_issued_by').select2("change");
 | 
				
			||||||
 | 
					    }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    $("#select-all").on("click", function() { | 
				
			||||||
 | 
					    $("input[name='god_zapros']").prop("checked", true); | 
				
			||||||
 | 
					    }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    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,}))$/ | 
				
			||||||
 | 
					      ); | 
				
			||||||
 | 
					    }; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const validate = () => { | 
				
			||||||
 | 
					      const email = $('#email').val(); | 
				
			||||||
 | 
					      if(validateEmail(email)){ | 
				
			||||||
 | 
					        $('#email').parent().removeClass('errors-field').addClass('success-field'); | 
				
			||||||
 | 
					      } else{ | 
				
			||||||
 | 
					        $('#email').parent().removeClass('success-field').addClass('errors-field'); | 
				
			||||||
 | 
					      } | 
				
			||||||
 | 
					      return false; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    $('#email').on('input', validate); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    $('#email').on('input', function() { | 
				
			||||||
 | 
					        let input = $(this).val(); | 
				
			||||||
 | 
					        // Разрешаем только буквы, цифры, точки, дефисы и подчеркивания
 | 
				
			||||||
 | 
					        input = input.replace(/[^a-zA-Z0-9._@-]/g, ''); | 
				
			||||||
 | 
					        // Обновляем поле ввода
 | 
				
			||||||
 | 
					        $(this).val(input); | 
				
			||||||
 | 
					    }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    $('body').append('<div id="error_alert" class="alert alert-danger" role="alert" style="position: fixed; top: 50px; left: 10%; right: 10%; z-index: 9999; display: none;">Ошибка<br><small id="alert_error_text"></small></div>'); | 
				
			||||||
 | 
					    $('body').append('<div id="success_alert" class="alert alert-success" role="alert" style="position: fixed; top: 50px; left: 10%; right: 10%; z-index: 9999; display: none;">Успех<br><small id="alert_success_text"></small></div>'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    $('#fio').on('input', function () { | 
				
			||||||
 | 
					    let input = $(this).val(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Убираем все лишние символы, кроме букв и пробелов
 | 
				
			||||||
 | 
					    input = input.replace(/[^a-zA-Zа-яА-ЯёЁ ]/g, ''); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Преобразуем каждое слово, чтобы оно начиналось с заглавной буквы
 | 
				
			||||||
 | 
					    let formattedInput = input.split(' ').map(word => { | 
				
			||||||
 | 
					        if (word.length > 0) { | 
				
			||||||
 | 
					            return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase(); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					        return ''; // Пустые слова не трогаем
 | 
				
			||||||
 | 
					    }).join(' '); // Объединяем обратно с пробелами
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Обновляем поле ввода с отформатированным текстом
 | 
				
			||||||
 | 
					    $(this).val(formattedInput); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Проверяем количество слов
 | 
				
			||||||
 | 
					    let words = formattedInput.trim().split(/\s+/); // Убираем лишние пробелы
 | 
				
			||||||
 | 
					    if (words.length < 3 || words.some(word => word.length < 2)) { | 
				
			||||||
 | 
					        $(this).parent().removeClass('success-field').addClass('errors-field'); // Подсветить поле
 | 
				
			||||||
 | 
					    } else { | 
				
			||||||
 | 
					        $(this).parent().removeClass('errors-field').addClass('success-field'); // Убрать подсветку
 | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					    }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    $('#tel').on('change', function() { | 
				
			||||||
 | 
					        if($(this).val().length != 16){ | 
				
			||||||
 | 
					            $(this).parent().removeClass('success-field').addClass('errors-field'); | 
				
			||||||
 | 
					        } else{ | 
				
			||||||
 | 
					            $(this).parent().removeClass('errors-field').addClass('success-field'); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					    }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       // Проверка на дату рождения (не старше 80 лет)
 | 
				
			||||||
 | 
					    $('#dob').on('change', function() { | 
				
			||||||
 | 
					        const dob = new Date($(this).val()); | 
				
			||||||
 | 
					        const currentDate = new Date(); | 
				
			||||||
 | 
					        const age = currentDate.getFullYear() - dob.getFullYear(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Проверка на возраст (не старше 80 лет)
 | 
				
			||||||
 | 
					        if (age > 100 || (age === 100 && (currentDate.getMonth() < dob.getMonth() || (currentDate.getMonth() === dob.getMonth() && currentDate.getDate() < dob.getDate())))) { | 
				
			||||||
 | 
					            // Если возраст больше 80 лет, подсвечиваем ячейку как ошибку
 | 
				
			||||||
 | 
					            $(this).parent().removeClass('success-field').addClass('errors-field'); | 
				
			||||||
 | 
					        } else { | 
				
			||||||
 | 
					            // Если возраст нормален, подсвечиваем ячейку как успешную
 | 
				
			||||||
 | 
					            $(this).parent().removeClass('errors-field').addClass('success-field'); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					    }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    $('#postal_code').on('input', function() { | 
				
			||||||
 | 
					    let input = $(this).val(); | 
				
			||||||
 | 
					    // Удаляем все символы, кроме цифр
 | 
				
			||||||
 | 
					    input = input.replace(/\D/g, ''); | 
				
			||||||
 | 
					    // Форматируем ввод в "000-000" только при наличии 4 и более цифр
 | 
				
			||||||
 | 
					    if (input.length > 3) { | 
				
			||||||
 | 
					        input = input.replace(/(\d{3})(\d{0,3})/, '$1-$2'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					    // Ограничиваем длину до "000-000"
 | 
				
			||||||
 | 
					    if (input.length > 7) { | 
				
			||||||
 | 
					        input = input.slice(0, 7); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					    // Обновляем поле ввода
 | 
				
			||||||
 | 
					    $(this).val(input); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Проверка на минимальную длину (не менее 11 символов)
 | 
				
			||||||
 | 
					    if (input.length < 7) { | 
				
			||||||
 | 
					        // Если введено меньше цифр, показываем ошибку
 | 
				
			||||||
 | 
					        $(this).parent().removeClass('success-field').addClass('errors-field'); | 
				
			||||||
 | 
					    } else { | 
				
			||||||
 | 
					        // Если введено достаточно цифр, показываем успех
 | 
				
			||||||
 | 
					        $(this).parent().removeClass('errors-field').addClass('success-field'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					    }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    $('#passport').on('input', function() { | 
				
			||||||
 | 
					    let input = $(this).val(); | 
				
			||||||
 | 
					    // Удаляем все символы, кроме цифр
 | 
				
			||||||
 | 
					    input = input.replace(/\D/g, ''); | 
				
			||||||
 | 
					    // Форматируем ввод в "000-000" только при наличии 4 и более цифр
 | 
				
			||||||
 | 
					    if (input.length > 4) { | 
				
			||||||
 | 
					        input = input.replace(/(\d{4})(\d{0,4})/, '$1 $2'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					    // Ограничиваем длину до "000-000"
 | 
				
			||||||
 | 
					    if (input.length > 11) { | 
				
			||||||
 | 
					        input = input.slice(0, 11); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					    // Обновляем поле ввода
 | 
				
			||||||
 | 
					    $(this).val(input); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Проверка на минимальную длину (не менее 11 символов)
 | 
				
			||||||
 | 
					    if (input.length < 11) { | 
				
			||||||
 | 
					        // Если введено меньше цифр, показываем ошибку
 | 
				
			||||||
 | 
					        $(this).parent().removeClass('success-field').addClass('errors-field'); | 
				
			||||||
 | 
					    } else { | 
				
			||||||
 | 
					        // Если введено достаточно цифр, показываем успех
 | 
				
			||||||
 | 
					        $(this).parent().removeClass('errors-field').addClass('success-field'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					    }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    $("#inn").attr('maxlength','12'); | 
				
			||||||
 | 
					    $('#inn').on('input', function() { | 
				
			||||||
 | 
					    let input = $(this).val(); | 
				
			||||||
 | 
					    // Убираем все символы, кроме цифр
 | 
				
			||||||
 | 
					    input = input.replace(/\D/g, ''); | 
				
			||||||
 | 
					    // Ограничиваем длину до 12 символов
 | 
				
			||||||
 | 
					    if (input.length > 12) { | 
				
			||||||
 | 
					        input = input.slice(0, 12); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					    // Обновляем значение в поле ввода
 | 
				
			||||||
 | 
					    $(this).val(input); | 
				
			||||||
 | 
					    if (input.length < 12) { | 
				
			||||||
 | 
					        // Если введено меньше цифр, показываем ошибку
 | 
				
			||||||
 | 
					        $(this).parent().removeClass('success-field').addClass('errors-field'); | 
				
			||||||
 | 
					    } else { | 
				
			||||||
 | 
					        // Если введено достаточно цифр, показываем успех
 | 
				
			||||||
 | 
					        $(this).parent().removeClass('errors-field').addClass('success-field'); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					    }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    $('#passport_date').on('change', function() { | 
				
			||||||
 | 
					        const dob = new Date($(this).val()); | 
				
			||||||
 | 
					        const currentDate = new Date(); | 
				
			||||||
 | 
					        const age = currentDate.getFullYear() - dob.getFullYear(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Проверка на возраст (не старше 80 лет)
 | 
				
			||||||
 | 
					        if (age > 100 || (age === 100 && (currentDate.getMonth() < dob.getMonth() || (currentDate.getMonth() === dob.getMonth() && currentDate.getDate() < dob.getDate())))) { | 
				
			||||||
 | 
					            // Если возраст больше 80 лет, подсвечиваем ячейку как ошибку
 | 
				
			||||||
 | 
					            $(this).parent().removeClass('success-field').addClass('errors-field'); | 
				
			||||||
 | 
					        } else { | 
				
			||||||
 | 
					            // Если возраст нормален, подсвечиваем ячейку как успешную
 | 
				
			||||||
 | 
					            $(this).parent().removeClass('errors-field').addClass('success-field'); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					    }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//    function verification(){
 | 
				
			||||||
 | 
					//        $("#form_submit").children(".spinner-border").removeClass('d-none');
 | 
				
			||||||
 | 
					//        $("#form_submit").attr("disabled", true);
 | 
				
			||||||
 | 
					//        message = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//        if(!(validate_length($('#fio').val(), 3)))
 | 
				
			||||||
 | 
					//        {
 | 
				
			||||||
 | 
					//            show_error('Введите ФИО', false);
 | 
				
			||||||
 | 
					//            $("#form_submit").children(".spinner-border").addClass('d-none');
 | 
				
			||||||
 | 
					//            $("#form_submit").removeAttr("disabled");
 | 
				
			||||||
 | 
					//            return;
 | 
				
			||||||
 | 
					//        }
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//        if(!(validate_length($('#tel').val(), 16)))
 | 
				
			||||||
 | 
					//        {
 | 
				
			||||||
 | 
					//            show_error('Введите Телефон', false);
 | 
				
			||||||
 | 
					//            $("#form_submit").children(".spinner-border").addClass('d-none');
 | 
				
			||||||
 | 
					//            $("#form_submit").removeAttr("disabled");
 | 
				
			||||||
 | 
					//            return;
 | 
				
			||||||
 | 
					//        }
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//        if ($('#dob').val().length !== 10 || new Date().getFullYear() - new Date($('#dob').val()).getFullYear() > 100) {
 | 
				
			||||||
 | 
					//            show_error('Дата рождения должна быть корректной и возраст не более 80 лет', false);
 | 
				
			||||||
 | 
					//            $("#form_submit").children(".spinner-border").addClass('d-none');
 | 
				
			||||||
 | 
					//            $("#form_submit").removeAttr("disabled");
 | 
				
			||||||
 | 
					//            return;
 | 
				
			||||||
 | 
					//        }
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//        if ($('#dob').val().length !== 10 || new Date().getFullYear() < new Date($('#dob').val()).getFullYear()) {
 | 
				
			||||||
 | 
					//            show_error('Проверьте дату ввода, вы указали дату больше чем сегодняшняя дата', false);
 | 
				
			||||||
 | 
					//            $("#form_submit").children(".spinner-border").addClass('d-none');
 | 
				
			||||||
 | 
					//            $("#form_submit").removeAttr("disabled");
 | 
				
			||||||
 | 
					//            return;
 | 
				
			||||||
 | 
					//        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function verification(){ | 
				
			||||||
 | 
					        $("#form_submit").children(".spinner-border").removeClass('d-none'); | 
				
			||||||
 | 
					        $("#form_submit").attr("disabled", true); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let message = {}; | 
				
			||||||
 | 
					        $('.tg_input').each(function() { | 
				
			||||||
 | 
					            message[$(this).attr("id")] = $(this).val(); | 
				
			||||||
 | 
					        }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        show_success("Ваши данные отправлены на проверку."); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $.ajax({ | 
				
			||||||
 | 
					            type: "POST", | 
				
			||||||
 | 
					            url: "/request_patient", | 
				
			||||||
 | 
					            contentType: "application/json",  // <-- Указываем JSON
 | 
				
			||||||
 | 
					            data: JSON.stringify(message),  // <-- Преобразуем объект в JSON
 | 
				
			||||||
 | 
					            success: function(data) { | 
				
			||||||
 | 
					                console.log(data); | 
				
			||||||
 | 
					                if (data.success) { | 
				
			||||||
 | 
					                    $('.primary-field').hide(); | 
				
			||||||
 | 
					                    $('.verification').show(); | 
				
			||||||
 | 
					                    $('#fio').val(data.fio); | 
				
			||||||
 | 
					                    $('#fio').prop('readonly', true); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    $('#dob').val(data.js_formatted_birthdate); | 
				
			||||||
 | 
					                    $('#dob').prop('readonly', true); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    $('#passport').val(data.pct_doc_ser + ' ' + data.pct_doc_nom); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    $('#passport_date').val(data.formatted_passport_date); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    $('#postal_code').val(data.pct_doc_org_kod); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    for(i in UFMS_list[data.pct_doc_org_kod]) | 
				
			||||||
 | 
					                    { | 
				
			||||||
 | 
					                        item = UFMS_list[data.pct_doc_org_kod][i]; | 
				
			||||||
 | 
					                        console.log(item.toLowerCase()) | 
				
			||||||
 | 
					                        console.log(data.pct_doc_org_name.toLowerCase()) | 
				
			||||||
 | 
					                        console.log(item.toLowerCase()==data.pct_doc_org_name.toLowerCase()) | 
				
			||||||
 | 
					                        if(item.toLowerCase()==data.pct_doc_org_name.toLowerCase()) | 
				
			||||||
 | 
					                        { | 
				
			||||||
 | 
					                            $('#passport_issued_by').append('<option selected>'+item+'</option>'); | 
				
			||||||
 | 
					                        } | 
				
			||||||
 | 
					                        else{ | 
				
			||||||
 | 
					                            $('#passport_issued_by').append('<option>'+item+'</option>'); | 
				
			||||||
 | 
					                        } | 
				
			||||||
 | 
					                    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    $('#inn').val(data.pct_inn); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    $('#email').val(data.pct_email); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                } else { | 
				
			||||||
 | 
					                    show_error(data.error); | 
				
			||||||
 | 
					                } | 
				
			||||||
 | 
					                $("#form_submit").children(".spinner-border").addClass('d-none'); | 
				
			||||||
 | 
					                $("#form_submit").removeAttr("disabled"); | 
				
			||||||
 | 
					            }, | 
				
			||||||
 | 
					            error: function(jqXHR) { | 
				
			||||||
 | 
					                show_error('Что-то пошло не так'); | 
				
			||||||
 | 
					                $("#form_submit").children(".spinner-border").addClass('d-none'); | 
				
			||||||
 | 
					                $("#form_submit").removeAttr("disabled"); | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					        }); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    $("#form_submit").click(function(){ | 
				
			||||||
 | 
					//        show_success("Hello <br> world");
 | 
				
			||||||
 | 
					        verification(); | 
				
			||||||
 | 
					    }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    $("#code_submit").click(function(){ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $(this).children(".spinner-border").removeClass('d-none'); | 
				
			||||||
 | 
					        $(this).attr("disabled", true); | 
				
			||||||
 | 
					        message = {} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(!(validate_length($('#fio').val(), 3))) | 
				
			||||||
 | 
					        { | 
				
			||||||
 | 
					            show_error('Введите ФИО', false); | 
				
			||||||
 | 
					            $(this).children(".spinner-border").addClass('d-none'); | 
				
			||||||
 | 
					            $(this).removeAttr("disabled"); | 
				
			||||||
 | 
					            return; | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(!(validateEmail($('#email').val()))){ | 
				
			||||||
 | 
					            show_error('Введите корректный Email', false); | 
				
			||||||
 | 
					            $(this).children(".spinner-border").addClass('d-none'); | 
				
			||||||
 | 
					            $(this).removeAttr("disabled"); | 
				
			||||||
 | 
					            return; | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($('#dob').val().length !== 10 || new Date().getFullYear() - new Date($('#dob').val()).getFullYear() > 100) { | 
				
			||||||
 | 
					            show_error('Дата рождения должна быть корректной и возраст не более 80 лет', false); | 
				
			||||||
 | 
					            $(this).children(".spinner-border").addClass('d-none'); | 
				
			||||||
 | 
					            $(this).removeAttr("disabled"); | 
				
			||||||
 | 
					            return; | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($('#passport_date').val().length !== 10 || (new Date($('#passport_date').val()).getFullYear() - new Date($('#dob').val()).getFullYear()) < 13) { | 
				
			||||||
 | 
					            show_error('Проверьте дату выдачи паспорта, паспорт РФ может быть выдан с 14 лет', false); | 
				
			||||||
 | 
					            $(this).children(".spinner-border").addClass('d-none'); | 
				
			||||||
 | 
					            $(this).removeAttr("disabled"); | 
				
			||||||
 | 
					            return; | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(!(validate_length($('#postal_code').val(), 7))) | 
				
			||||||
 | 
					        { | 
				
			||||||
 | 
					            show_error('Введите код подразделения', false); | 
				
			||||||
 | 
					            $(this).children(".spinner-border").addClass('d-none'); | 
				
			||||||
 | 
					            $(this).removeAttr("disabled"); | 
				
			||||||
 | 
					            return; | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(!(validate_length($('#passport').val(), 11))) | 
				
			||||||
 | 
					        { | 
				
			||||||
 | 
					            show_error('Введите серию и номер паспорта', false); | 
				
			||||||
 | 
					            $(this).children(".spinner-border").addClass('d-none'); | 
				
			||||||
 | 
					            $(this).removeAttr("disabled"); | 
				
			||||||
 | 
					            return; | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if($('#passport_issued_by').val() == null){ | 
				
			||||||
 | 
					            show_error("Выберите кем выдан паспорт"); | 
				
			||||||
 | 
					            $(this).children(".spinner-border").addClass('d-none'); | 
				
			||||||
 | 
					            $(this).removeAttr("disabled"); | 
				
			||||||
 | 
					            return; | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(!(validate_length($('#inn').val(), 12))) | 
				
			||||||
 | 
					        { | 
				
			||||||
 | 
					            show_error('Введите ИНН', false); | 
				
			||||||
 | 
					            $(this).children(".spinner-border").addClass('d-none'); | 
				
			||||||
 | 
					            $(this).removeAttr("disabled"); | 
				
			||||||
 | 
					            return; | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Добавление значений с чекбоксов (годы)
 | 
				
			||||||
 | 
					        let selectedYears = []; | 
				
			||||||
 | 
					        $("input[name='god_zapros']:checked").each(function() { | 
				
			||||||
 | 
					            selectedYears.push($(this).val()); | 
				
			||||||
 | 
					        }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (selectedYears.length > 0) { | 
				
			||||||
 | 
					            message['selected_years'] = selectedYears; | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $.each($('.tg_input'), function(e) { | 
				
			||||||
 | 
					            message[$(this).prop("id")] = $(this).val(); | 
				
			||||||
 | 
					        }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $.ajax({ | 
				
			||||||
 | 
					            type: "post", | 
				
			||||||
 | 
					            url: "/sending_patient", | 
				
			||||||
 | 
					            processData: false,  // tell jQuery not to process the data
 | 
				
			||||||
 | 
					            contentType: false,  // tell jQuery not to set contentType
 | 
				
			||||||
 | 
					            async: true, | 
				
			||||||
 | 
					            data: JSON.stringify(message), | 
				
			||||||
 | 
					            success: (data) => { | 
				
			||||||
 | 
					                if(data.success==true){ | 
				
			||||||
 | 
					                    $('.primary-field').hide(); | 
				
			||||||
 | 
					                    $('.verification').hide(); | 
				
			||||||
 | 
					                    $('.success_window').show(); | 
				
			||||||
 | 
					                } | 
				
			||||||
 | 
					                else{ | 
				
			||||||
 | 
					                    show_error(data.error); | 
				
			||||||
 | 
					                    $(this).children(".spinner-border").addClass('d-none'); | 
				
			||||||
 | 
					                    $(this).removeAttr("disabled"); | 
				
			||||||
 | 
					                } | 
				
			||||||
 | 
					            }, | 
				
			||||||
 | 
					            error:function (jqXHR, exception) { | 
				
			||||||
 | 
					                $(this).children(".spinner-border").addClass('d-none'); | 
				
			||||||
 | 
					                $(this).removeAttr("disabled"); | 
				
			||||||
 | 
					                show_error('Что-то пошло не так', false) | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					        }); | 
				
			||||||
 | 
					    }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//    $('.alert-placeholder').mouseenter(function(){
 | 
				
			||||||
 | 
					//        var popOverSettings = {
 | 
				
			||||||
 | 
					//            placement: 'bottom',
 | 
				
			||||||
 | 
					//            content: $(this).data('content'),
 | 
				
			||||||
 | 
					//            trigger: 'hover',
 | 
				
			||||||
 | 
					//            container: this,
 | 
				
			||||||
 | 
					//            offset: '0'
 | 
				
			||||||
 | 
					//        }
 | 
				
			||||||
 | 
					//        $(this).popover(popOverSettings);
 | 
				
			||||||
 | 
					//        $(this).popover('show');
 | 
				
			||||||
 | 
					//        $('.popover').addClass('alert-popover');
 | 
				
			||||||
 | 
					//    });
 | 
				
			||||||
 | 
					//    $('.alert-placeholder').mouseleave(function(){
 | 
				
			||||||
 | 
					//        $('.alert-popover').remove()
 | 
				
			||||||
 | 
					//    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let phoneStr = ''; | 
				
			||||||
 | 
					    let formattedStr = ''; | 
				
			||||||
 | 
					    let deleteMode = false; | 
				
			||||||
 | 
					    const phoneInput = document.querySelector('#tel'); | 
				
			||||||
 | 
					    const defaultFormat = '+7({0}{1}{2}){3}{4}{5}-{6}{7}-{8}{9}'; | 
				
			||||||
 | 
					//    phoneInput.value = formatPhoneString();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//    phoneInput.addEventListener('keydown', (e) => {
 | 
				
			||||||
 | 
					//      if (e.key === 'Backspace')
 | 
				
			||||||
 | 
					//        deleteMode = true;
 | 
				
			||||||
 | 
					//      else
 | 
				
			||||||
 | 
					//        deleteMode = false;
 | 
				
			||||||
 | 
					//    });
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//    phoneInput.addEventListener('input', (e) => {
 | 
				
			||||||
 | 
					//      if (deleteMode) {
 | 
				
			||||||
 | 
					//        phoneInput.value = phoneInput.value;
 | 
				
			||||||
 | 
					//        phoneStr = parsePhoneString(phoneInput.value.replace("+7", "").replace("-", ""));
 | 
				
			||||||
 | 
					//      } else {
 | 
				
			||||||
 | 
					//        if (e.inputType == 'insertText' && !isNaN(parseInt(e.data))) {
 | 
				
			||||||
 | 
					//          if (phoneStr.length <= 9)
 | 
				
			||||||
 | 
					//            phoneStr += e.data;
 | 
				
			||||||
 | 
					//        }
 | 
				
			||||||
 | 
					//        phoneInput.value = formatPhoneString();
 | 
				
			||||||
 | 
					//      }
 | 
				
			||||||
 | 
					//    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function formatPhoneString() { | 
				
			||||||
 | 
					      let strArr = phoneStr.split(''); | 
				
			||||||
 | 
					      formattedStr = defaultFormat; | 
				
			||||||
 | 
					      for (let i = 0; i < strArr.length; i++) { | 
				
			||||||
 | 
					        formattedStr = formattedStr.replace(`{${i}}`, strArr[i]); | 
				
			||||||
 | 
					      } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (formattedStr.indexOf('{') === -1) | 
				
			||||||
 | 
					      { | 
				
			||||||
 | 
					        return formattedStr; | 
				
			||||||
 | 
					      } | 
				
			||||||
 | 
					      else | 
				
			||||||
 | 
					      { | 
				
			||||||
 | 
					        return formattedStr.substring(0, formattedStr.indexOf('{')); | 
				
			||||||
 | 
					      } | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function parsePhoneString(str) { | 
				
			||||||
 | 
					      return str.replace(' ', '').replace('(', '').replace(')', '').replace('-', ''); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					}); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					Loading…
					
					
				
		Reference in new issue