Compare commits
30 Commits
420e7379a3
..
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 3bbfc09827 | |||
| 2ce4053dca | |||
| 9c25df42a6 | |||
| 56af38b943 | |||
| 4d463b09b9 | |||
| b11b519dd5 | |||
| abfce692e1 | |||
| ec52f30625 | |||
| a31d2ce5d7 | |||
| e6ca354ba4 | |||
| e6ecfc6994 | |||
| 6f9326f045 | |||
| ffa8efb893 | |||
| a3dd3337bd | |||
| 52594ba9f4 | |||
| 24548b0331 | |||
| f78c073174 | |||
| 33f544b19e | |||
| d5dc036b5d | |||
| 36fd0adc63 | |||
| 7cec21f7a6 | |||
| 2b3a7f3d2a | |||
| 8cbf9b3909 | |||
| a85d48028d | |||
| 9ffeab6b3a | |||
| 2ec8a806e6 | |||
| bfbd55b40d | |||
| cf9b0a17bc | |||
| d984d83149 | |||
| 582ea5e18e |
Generated
-3
@@ -1,3 +0,0 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
Generated
+2
-2
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Black">
|
||||
<option name="sdkName" value="Python 3.8 (tgflaskform)" />
|
||||
<option name="sdkName" value="Python 3.8 (tgFlaskFormPolimed)" />
|
||||
</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>
|
||||
Generated
-8
@@ -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>
|
||||
Generated
+4
-7
@@ -1,10 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="PYTHON_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<excludeFolder url="file://$MODULE_DIR$/.venv" />
|
||||
</content>
|
||||
<orderEntry type="jdk" jdkName="Python 3.8 (tgFlaskForm)" jdkType="Python SDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<module version="4">
|
||||
<component name="PyDocumentationSettings">
|
||||
<option name="format" value="PLAIN" />
|
||||
<option name="myDocStringFormat" value="Plain" />
|
||||
</component>
|
||||
</module>
|
||||
Generated
+6
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
[WEB_APP]
|
||||
PORT = 8084
|
||||
template_folder = C:\Users\ilyac\PycharmProjects\tgFlaskForm\webApp\templates
|
||||
PORT = 3103
|
||||
template_folder = C:\Users\ilyac\PycharmProjects\tgFlaskFormPolimed\webApp\templates
|
||||
environment = test
|
||||
[GOOGLE]
|
||||
type = service_account
|
||||
|
||||
Binary file not shown.
@@ -4,8 +4,9 @@ from webApp import webApp
|
||||
import gspread
|
||||
from oauth2client.service_account import ServiceAccountCredentials
|
||||
import json
|
||||
import datetime
|
||||
from config import config
|
||||
import requests
|
||||
from datetime import datetime
|
||||
|
||||
# Авторизация Google API
|
||||
def authorize_google():
|
||||
@@ -18,54 +19,805 @@ def authorize_google():
|
||||
client = gspread.authorize(creds)
|
||||
return client
|
||||
|
||||
# Функция проверки существования пользователя в таблице
|
||||
def user_exists(sheet, fio, tel, user_id):
|
||||
records = sheet.get_all_values() # Получаем все данные таблицы без заголовков
|
||||
def find_patients(data):
|
||||
"""
|
||||
Поиск пациента в таблице по данным.
|
||||
"""
|
||||
sheet = authorize_google().open("Пациенты клиники").sheet1
|
||||
records = sheet.get_all_records() # Получаем все строки таблицы
|
||||
print(data)
|
||||
for i, record in enumerate(records, start=2): # Нумерация строк Google Таблицы начинается с 2
|
||||
try:
|
||||
print(str(record.get("Telegram ID", "")).strip(), str(record.get("ФИО", "")).strip().lower(), str(record.get("Дата рождения", "")).strip(), str(record.get("Номер телефона", "")).strip())
|
||||
print(str(data.get("user_id", "")).strip(), str(data.get("fio", "")).strip().lower(), str(data.get("dob", "")).strip(), str(data.get("tel", "")).strip())
|
||||
if (
|
||||
str(record.get("Telegram ID", "")).strip() == str(data.get("user_id", "")).strip() and
|
||||
str(record.get("ФИО", "")).strip().lower() == str(data.get("fio", "")).strip().lower() and
|
||||
str(record.get("Дата рождения", "")).strip() == str(data.get("dob", "")).strip() and
|
||||
str(record.get("Номер телефона", "")).strip() == str(data.get("tel", "")).strip()
|
||||
):
|
||||
return i, record # Возвращаем номер строки и запись
|
||||
except Exception as e:
|
||||
print(f"Ошибка при сравнении записи: {e}")
|
||||
continue
|
||||
|
||||
for row in records[1:]: # Пропускаем первую строку, если там заголовки, или уберите [1:], если заголовков нет
|
||||
if len(row) > 1 and row[0] == fio and row[1] == tel:# and row[13] == user_id:
|
||||
return True, 'Ваши данные уже присутствуют в таблице' # Если ФИО, телефон и user_id совпадают, значит, запись уже существует
|
||||
if row[13] == user_id:
|
||||
return True, 'C данного Telegram аккаунта уже проведена регистрация'
|
||||
return False, 'Ок'
|
||||
return None, None
|
||||
|
||||
|
||||
# Обработка формы
|
||||
@webApp.route('/form_submit', methods=['POST'])
|
||||
def form_submit():
|
||||
data = json.loads(request.data)
|
||||
# {'fio': '', 'tel': '', 'email': '', 'passport': '', 'passport_date': '', 'postal_code': '', 'address': '', 'snils': '', 'inn': '', 'dob': ''}
|
||||
data['current_time'] = datetime.datetime.now().strftime("%d.%m.%Y, %H:%M")
|
||||
"""
|
||||
Обработка данных формы и обновление записи в Google Таблице.
|
||||
"""
|
||||
try:
|
||||
data = json.loads(request.data)
|
||||
data['current_time'] = datetime.now().strftime("%d.%m.%Y, %H:%M")
|
||||
|
||||
# Авторизация и добавление данных в Google Sheets
|
||||
sheet = authorize_google().open("Информация о сотрудниках").sheet1
|
||||
# Поиск пациента
|
||||
row_number, patient_row = find_patients(data)
|
||||
if not patient_row:
|
||||
return jsonify({'success': False, 'error': "Пациент не найден"})
|
||||
|
||||
# Проверка, существует ли уже пользователь
|
||||
exists_flag, message = user_exists(sheet, data['fio'], data['tel'], data['user_id'])
|
||||
if exists_flag:
|
||||
return jsonify({'success': False, 'error': message})
|
||||
# Проверка кода верификации
|
||||
expected_code = str(patient_row.get("Верификация", "")).strip()
|
||||
received_code = str(data.get("verification_code", "")).strip()
|
||||
if expected_code != received_code:
|
||||
return jsonify({'success': False, 'error': "Код верификации не совпадает"})
|
||||
|
||||
sheet.append_row([
|
||||
data['fio'],
|
||||
data['tel'],
|
||||
data['email'],
|
||||
data['passport'][:5],
|
||||
data['passport'][5:],
|
||||
data['passport_issued_by'],
|
||||
data['passport_date'],
|
||||
data['postal_code'],
|
||||
data['address'],
|
||||
data['residential_address'],
|
||||
data['snils'],
|
||||
data['inn'],
|
||||
data['dob'],
|
||||
data['user_id'], # Записываем Telegram ID пользователя
|
||||
data['current_time'] # Записываем время отправки данных
|
||||
])
|
||||
# Обновление записи в таблице
|
||||
sheet = authorize_google().open("Пациенты клиники").sheet1
|
||||
|
||||
# Определяем динамический столбец по заголовкам
|
||||
headers = sheet.row_values(1)
|
||||
verification_col = headers.index("Верификация") + 1 # Столбцы нумеруются с 1
|
||||
sheet.update_cell(row_number, verification_col, "Пройдена")
|
||||
|
||||
return jsonify({'success': True})
|
||||
|
||||
except KeyError as e:
|
||||
print(f"Ключ отсутствует в данных: {e}")
|
||||
return jsonify({'success': False, 'error': f"Некорректные данные: {e}"})
|
||||
|
||||
except Exception as e:
|
||||
print(f"Ошибка при обработке формы: {e}")
|
||||
return jsonify({'success': False, 'error': str(e)})
|
||||
|
||||
|
||||
|
||||
|
||||
@webApp.route('/tel_verification', methods=['POST'])
|
||||
def send_registration_request():
|
||||
raw_data = json.loads(request.data)
|
||||
"""
|
||||
Блок записи в Полимед
|
||||
"""
|
||||
try:
|
||||
HEADER = {
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
|
||||
# Разделение ФИО на части
|
||||
fio = raw_data.get("fio", "")
|
||||
parts = fio.split(" ")
|
||||
if len(parts) < 3:
|
||||
return jsonify({'success': False, "error": "ФИО должно содержать 3 слова"})
|
||||
|
||||
first_name = parts[1]
|
||||
middle_name = " ".join(parts[2:])
|
||||
last_name = parts[0]
|
||||
|
||||
# Обработка номера телефона
|
||||
raw_phone = raw_data.get("tel", "")
|
||||
formatted_phone = ''.join(filter(str.isdigit, raw_phone))
|
||||
if formatted_phone.startswith("7"):
|
||||
formatted_phone = formatted_phone
|
||||
|
||||
# Обработка даты рождения
|
||||
dob = raw_data.get("dob", "")
|
||||
if not dob:
|
||||
return jsonify({'success': False, "error": "Дата рождения отсутствует"})
|
||||
|
||||
try:
|
||||
# Преобразуем формат из 2016-09-25 в datetime объект
|
||||
date_obj = datetime.strptime(dob, "%Y-%m-%d")
|
||||
# Преобразуем datetime объект в строку в формате ISO 8601
|
||||
birth_year = date_obj.strftime("%Y-%m-%dT%H:%M:%S.000Z")
|
||||
except ValueError:
|
||||
return jsonify({'success': False, "error": "Неверный формат даты рождения"}), 400
|
||||
|
||||
|
||||
# Данные для отправки в сервер Полимед
|
||||
data = {
|
||||
"telegram_id": raw_data.get("user_id"),
|
||||
"first_name": first_name,
|
||||
"second_name": middle_name,
|
||||
"last_name": last_name,
|
||||
"mobile_phone": formatted_phone,
|
||||
"birthday": birth_year
|
||||
}
|
||||
|
||||
print("Отправляемые данные на сервер:", data)
|
||||
response = requests.post("http://192.168.1.10:8080/AppFindPac", headers=HEADER, json=data)
|
||||
|
||||
if response.status_code == 200:
|
||||
result = response.json()
|
||||
print("Результат JSON:", result)
|
||||
if result.get('result', None):
|
||||
if result.get('result', None) == 'OK':
|
||||
# return jsonify({'success': True, 'message': "Скоро вам позвонят!"})
|
||||
pass
|
||||
else:
|
||||
return jsonify({'success': False, "error": "Пользователь не найден среди пациентов клиники. <br> Если у Вас возникли вопросы по регистрации, Вы можете связаться с нами в рабочие часы по телефону: +7 (342)207-03-03."})
|
||||
else:
|
||||
return jsonify({'success': False, "error": "Ошибка формата запроса"})
|
||||
else:
|
||||
print(f"Ошибка при отправке данных. Статус-код: {response.status_code}")
|
||||
return jsonify({'success': False, "error": "Ошибка отправки данных в Полимед"})
|
||||
|
||||
except Exception as e:
|
||||
print(f"Ошибка обработки данных для Полимед: {e}")
|
||||
return jsonify({'success': False, "error": "Ошибка обработки данных для Полимед"})
|
||||
"""
|
||||
Блок верификации через SMS
|
||||
"""
|
||||
try:
|
||||
url = "https://sms.ru/code/call"
|
||||
api_key = "2ED72E61-76C8-5637-3587-2792D47B698C"
|
||||
|
||||
# Отправка запроса на вызов с кодом верификации
|
||||
response = requests.post(url, data={"phone": formatted_phone, "api_id": api_key})
|
||||
print(response)
|
||||
json_data = response.json()
|
||||
|
||||
verification_code = None
|
||||
current_time = datetime.now().strftime("%d.%m.%Y, %H:%M")
|
||||
|
||||
# Авторизация и доступ к таблице
|
||||
sheet = authorize_google().open("Пациенты клиники").sheet1
|
||||
|
||||
# Проверка успешного получения кода
|
||||
if json_data and json_data["status"] == "OK":
|
||||
verification_code = json_data.get("code")
|
||||
|
||||
# Поиск пациента
|
||||
row_number, patient_row = find_patients(raw_data)
|
||||
if patient_row:
|
||||
# Обновление записи в таблице
|
||||
sheet = authorize_google().open("Пациенты клиники").sheet1
|
||||
|
||||
# Определяем динамический столбец по заголовкам
|
||||
headers = sheet.row_values(1)
|
||||
verification_col = headers.index("Верификация") + 1 # Столбцы нумеруются с 1
|
||||
sheet.update_cell(row_number, verification_col, verification_code)
|
||||
|
||||
else:
|
||||
# Записываем данные и код верификации в таблицу
|
||||
sheet.append_row([
|
||||
fio,
|
||||
raw_phone,
|
||||
dob,
|
||||
raw_data.get("user_id"), # Telegram ID пользователя
|
||||
current_time, # Время отправки данных
|
||||
verification_code # Код верификации
|
||||
])
|
||||
print(f"Код верификации, отправленный пользователю: {verification_code}")
|
||||
return jsonify({'success': True})
|
||||
else:
|
||||
print("Звонок не может быть выполнен.")
|
||||
print("Текст ошибки:", json_data.get("status_text"))
|
||||
return jsonify({'success': False, "error": "Если звонок не поступил, это может быть связано с временными работами на сервере. <br> Пожалуйста, попробуйте зарегистрироваться позже!"})
|
||||
|
||||
except Exception as e:
|
||||
print(f"Ошибка при обработке SMS верификации: {e}")
|
||||
return jsonify({'success': False, "error": "Если звонок не поступил, это может быть связано с временными работами на сервере. <br> Пожалуйста, попробуйте зарегистрироваться позже!"})
|
||||
|
||||
|
||||
|
||||
|
||||
@webApp.route('/request_patient', methods=['POST'])
|
||||
def request_patient_information():
|
||||
try:
|
||||
# return {
|
||||
# "fio": "Чистогов Илья Дмитриевич",
|
||||
# "formatted_birthdate": "24.09.2003",
|
||||
# "js_formatted_passport_date": "2016-09-25",
|
||||
# "js_formatted_birthdate": "2003-09-24",
|
||||
# "pct_doc_ser": "1234",
|
||||
# "pct_doc_nom": "123456",
|
||||
# "pct_doc_org_kod": "590-003",
|
||||
# "pct_doc_org_name": "ГУ МВД РОССИИ ПО ПЕРМСКОМУ КРАЮ",
|
||||
# "pct_email": "1@1.ru",
|
||||
# "pct_inn": "123123123123",
|
||||
# "taxpayer_status_zapros": "Отец",
|
||||
# "pct_doc_ind": "1",
|
||||
# "server_data": {
|
||||
# "pct_birthday": "2003-09-24T00:00:00.000Z",
|
||||
# "pct_doc_date": "",
|
||||
# "pct_doc_ind": "",
|
||||
# "pct_doc_nom": "",
|
||||
# "pct_doc_org_kod": "",
|
||||
# "pct_doc_org_name": "",
|
||||
# "pct_doc_ser": "",
|
||||
# "pct_doc_type": "",
|
||||
# "pct_email": "",
|
||||
# "pct_first_name": "Илья",
|
||||
# "pct_inn": "",
|
||||
# "pct_last_name": "Чистогов",
|
||||
# "pct_second_name": "Дмитриевич",
|
||||
# "result": "OK",
|
||||
# "status_code": 200
|
||||
# },
|
||||
# "success": True,
|
||||
# "user_id": "766945900"
|
||||
# }
|
||||
|
||||
|
||||
data = request.get_json()
|
||||
print(data)
|
||||
user_id = data.get('user_id')
|
||||
# taxpayer_fio = data.get('taxpayer_fio')
|
||||
patient_fio = data.get('patient_fio')
|
||||
|
||||
url = "http://192.168.1.10:8080/AppFindPacFromTel"
|
||||
data = {"telegram_id": user_id}
|
||||
|
||||
response = requests.post(url, json=data)
|
||||
|
||||
if response.status_code == 200:
|
||||
result = response.json()
|
||||
patients = [] # Список пациентов
|
||||
birthday_pac = {} # Словарь для хранения ФИО и даты рождения
|
||||
|
||||
for patient in result.get("Pacients", []):
|
||||
# Формируем строку ФИО
|
||||
fio = f"{patient['last_name']} {patient['first_name']} {patient['second_name']}"
|
||||
patients.append(fio)
|
||||
|
||||
# Сохраняем дату рождения в словарь с ключом ФИО
|
||||
birthday_pac[fio] = patient['birthday']
|
||||
print("список:", patients)
|
||||
print("даты рождения:", birthday_pac)
|
||||
birthday_users = birthday_pac.get(patient_fio)
|
||||
|
||||
|
||||
|
||||
|
||||
if not user_id or not patient_fio: #or not taxpayer_fio
|
||||
return "Ошибка: Не выбраны налогоплательщик и пациент", 400
|
||||
|
||||
payload = {
|
||||
"telegram_id": int(user_id),
|
||||
"first_name": patient_fio.split()[1] if len(patient_fio.split()) > 1 else "",
|
||||
"second_name": patient_fio.split()[2] if len(patient_fio.split()) > 2 else "",
|
||||
"last_name": patient_fio.split()[0],
|
||||
"pac_poluchat": "True",
|
||||
"poluchat_status": "",
|
||||
"birthday": birthday_users
|
||||
}
|
||||
print(payload)
|
||||
headers = {"User-Agent": "Mozilla/5.0", "Content-Type": "application/json"}
|
||||
url = "http://192.168.1.10:8080/AppZaprSvedPac"
|
||||
response = requests.post(url, json=payload, headers=headers)
|
||||
|
||||
if response.status_code == 200:
|
||||
print("Ответ:", response.text)
|
||||
result = response.json
|
||||
print(result)
|
||||
try:
|
||||
result = response.json()
|
||||
except:
|
||||
result = {}
|
||||
|
||||
js_formatted_birthdate = (
|
||||
datetime.strptime(result.get("pct_birthday", ""), "%Y-%m-%dT%H:%M:%S.%fZ").strftime("%Y-%m-%d")
|
||||
if result.get("pct_birthday") else "")
|
||||
|
||||
|
||||
js_formatted_passport_date = (
|
||||
datetime.strptime(result.get("pct_doc_date", ""), "%Y-%m-%dT%H:%M:%S.%fZ").strftime("%Y-%m-%d")
|
||||
if result.get("pct_doc_date") else "")
|
||||
|
||||
return jsonify(
|
||||
user_id=user_id,
|
||||
fio=patient_fio,
|
||||
server_data=result,
|
||||
js_formatted_birthdate=js_formatted_birthdate,
|
||||
js_formatted_passport_date=js_formatted_passport_date,
|
||||
pct_doc_ser=result.get('pct_doc_ser', ''),
|
||||
pct_doc_nom=result.get('pct_doc_nom', ''),
|
||||
pct_inn=result.get('pct_inn', ''),
|
||||
pct_email=result.get('pct_email', ''),
|
||||
pct_doc_org_kod=result.get('pct_doc_org_kod', ''),
|
||||
pct_doc_org_name=result.get('pct_doc_org_name', ''),
|
||||
success = True
|
||||
)
|
||||
else:
|
||||
return f"Ошибка: {response.status_code} - {response.text}", 500
|
||||
except Exception as e:
|
||||
return f"Произошла ошибка: {e}", 500
|
||||
|
||||
|
||||
|
||||
@webApp.route('/sending_patient', methods=['POST'])
|
||||
def sending_patient_data():
|
||||
try:
|
||||
raw_data = json.loads(request.data)
|
||||
|
||||
print(raw_data)
|
||||
|
||||
# Разделение ФИО
|
||||
fio = raw_data.get("fio", "")
|
||||
parts = fio.split(" ")
|
||||
if len(parts) < 3:
|
||||
return jsonify({'success': False, "error": "ФИО должно содержать 3 слова"}), 400 # Код 400 - ошибка клиента
|
||||
|
||||
first_name = parts[1]
|
||||
middle_name = " ".join(parts[2:])
|
||||
last_name = parts[0]
|
||||
passport = raw_data.get("passport", "")
|
||||
part = passport.split(" ")
|
||||
pct_doc_ser = part[0]
|
||||
plc_doc_nom = part[1]
|
||||
# Обработка даты рождения
|
||||
dob = raw_data.get("dob", "")
|
||||
if dob:
|
||||
# Преобразуем формат из 2016-09-25 в datetime объект
|
||||
date_obje = datetime.strptime(dob, "%Y-%m-%d")
|
||||
|
||||
# Преобразуем datetime объект в строку в формате ISO 8601
|
||||
pct_birthday = date_obje.strftime("%Y-%m-%dT%H:%M:%S.000Z")
|
||||
pct_inn = raw_data.get("inn", "")
|
||||
formatted_date = raw_data.get("passport_date", "")
|
||||
# Преобразуем строку в объект datetime
|
||||
if formatted_date:
|
||||
# Преобразуем формат из 2016-09-25 в datetime объект
|
||||
date_obj = datetime.strptime(formatted_date, "%Y-%m-%d")
|
||||
|
||||
# Преобразуем datetime объект в строку в формате ISO 8601
|
||||
plc_doc_date = date_obj.strftime("%Y-%m-%dT%H:%M:%S.000Z")
|
||||
plc_doc_org_name = raw_data.get("passport_issued_by", "")
|
||||
plc_doc_org_kod = raw_data.get("postal_code", "")
|
||||
pct_email = raw_data.get("email", "")
|
||||
# Извлекаем список выбранных годов
|
||||
selected_years = raw_data.get('selected_years', [])
|
||||
|
||||
if selected_years:
|
||||
# Преобразуем элементы в целые числа
|
||||
selected_years = list(map(int, selected_years))
|
||||
|
||||
# Находим минимальный и максимальный год
|
||||
year_beg_spr = min(selected_years)
|
||||
year_end_spr = max(selected_years)
|
||||
|
||||
# Если выбран только один год, то обе переменные будут одинаковыми
|
||||
if year_beg_spr == year_end_spr:
|
||||
year_end_spr = year_beg_spr
|
||||
|
||||
# Теперь у нас есть year_beg_spr и year_end_spr
|
||||
print("Минимальный год:", year_beg_spr)
|
||||
print("Максимальный год:", year_end_spr)
|
||||
|
||||
|
||||
# Формируем данные для отправки
|
||||
data1 = {
|
||||
"telegram_id": raw_data.get("user_id"),
|
||||
"pct_first_name": first_name,
|
||||
"pct_second_name": middle_name,
|
||||
"pct_last_name": last_name,
|
||||
"pct_birthday": pct_birthday,
|
||||
"pct_inn": pct_inn,
|
||||
"pct_doc_type": "Паспорт",
|
||||
"pct_doc_ind": 1,
|
||||
"pct_doc_ser": pct_doc_ser,
|
||||
"pct_doc_nom": plc_doc_nom,
|
||||
"pct_doc_date": plc_doc_date,
|
||||
"pct_doc_org_name": plc_doc_org_name,
|
||||
"pct_doc_org_kod": plc_doc_org_kod,
|
||||
"pac_poluchat": "True",
|
||||
"pct_email": pct_email,
|
||||
"year_beg_spr": year_beg_spr,
|
||||
"year_end_spr": year_end_spr
|
||||
}
|
||||
|
||||
print("Отправляемые данные:", data1)
|
||||
|
||||
#Успешный ответ
|
||||
HEADER1 = {"User-Agent": "Mozilla/5.0", "Content-Type": "application/json"}
|
||||
try:
|
||||
response = requests.post("http://192.168.1.10:8080/AppSaveSvedPac", headers=HEADER1, json=data1, timeout=5)
|
||||
print("Ответ сервера:", response.text) # вдруг сервер всё же что-то вернёт
|
||||
if response.status_code == 200:
|
||||
return jsonify({'success': True})
|
||||
else:
|
||||
return jsonify({'success': False, 'error': f'Сервер вернул статус {response.status_code}'}), 500
|
||||
|
||||
except requests.exceptions.RequestException as e:
|
||||
return jsonify({'success': False, 'error': f'Ошибка соединения: {str(e)}'}), 500
|
||||
|
||||
except Exception as e:
|
||||
print(f"Ошибка: {e}")
|
||||
return jsonify({'success': False, 'error': str(e)}), 500
|
||||
# Заглушка — вместо отправки просто возвращаем успех
|
||||
# return jsonify({'success': True})
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@webApp.route('/request_patient2', methods=['POST'])
|
||||
def request_patient2():
|
||||
try:
|
||||
# return {
|
||||
# "fio": "Чистогов Илья Дмитриевич",
|
||||
# "formatted_birthdate": "24.09.2003",
|
||||
# "js_formatted_passport_date": "2016-09-25",
|
||||
# "js_formatted_birthdate": "2003-09-24",
|
||||
# "pct_doc_ser": "1234",
|
||||
# "pct_doc_nom": "123456",
|
||||
# "pct_doc_org_kod": "590-003",
|
||||
# "pct_doc_org_name": "ГУ МВД РОССИИ ПО ПЕРМСКОМУ КРАЮ",
|
||||
# "pct_email": "1@1.ru",
|
||||
# "pct_inn": "123123123123",
|
||||
# "taxpayer_status_zapros": "Отец",
|
||||
# "pct_doc_ind": "1",
|
||||
# "server_data": {
|
||||
# "pct_birthday": "2003-09-24T00:00:00.000Z",
|
||||
# "pct_doc_date": "",
|
||||
# "pct_doc_ind": "",
|
||||
# "pct_doc_nom": "",
|
||||
# "pct_doc_org_kod": "",
|
||||
# "pct_doc_org_name": "",
|
||||
# "pct_doc_ser": "",
|
||||
# "pct_doc_type": "",
|
||||
# "pct_email": "",
|
||||
# "pct_first_name": "Илья",
|
||||
# "pct_inn": "",
|
||||
# "pct_last_name": "Чистогов",
|
||||
# "pct_second_name": "Дмитриевич",
|
||||
# "result": "OK",
|
||||
# "status_code": 200
|
||||
# },
|
||||
# "success": True,
|
||||
# "user_id": "766945900"
|
||||
# }
|
||||
|
||||
|
||||
data = request.get_json()
|
||||
print(data)
|
||||
user_id = data.get('user_id')
|
||||
taxpayer_status_zapros = data.get('taxpayer_status')
|
||||
patient_fio = data.get('patient_fio')
|
||||
|
||||
url = "http://192.168.1.10:8080/AppFindPacFromTel"
|
||||
data = {"telegram_id": user_id}
|
||||
|
||||
response = requests.post(url, json=data)
|
||||
|
||||
if response.status_code == 200:
|
||||
result = response.json()
|
||||
patients = [] # Список пациентов
|
||||
birthday_pac = {} # Словарь для хранения ФИО и даты рождения
|
||||
|
||||
for patient in result.get("Pacients", []):
|
||||
# Формируем строку ФИО
|
||||
fio = f"{patient['last_name']} {patient['first_name']} {patient['second_name']}"
|
||||
patients.append(fio)
|
||||
|
||||
# Сохраняем дату рождения в словарь с ключом ФИО
|
||||
birthday_pac[fio] = patient['birthday']
|
||||
print("список:", patients)
|
||||
print("даты рождения:", birthday_pac)
|
||||
birthday_users = birthday_pac.get(patient_fio)
|
||||
|
||||
print(birthday_users)
|
||||
|
||||
|
||||
payload = {
|
||||
"telegram_id": int(user_id),
|
||||
"first_name": patient_fio.split()[1] if len(patient_fio.split()) > 1 else "",
|
||||
"second_name": patient_fio.split()[2] if len(patient_fio.split()) > 2 else "",
|
||||
"last_name": patient_fio.split()[0],
|
||||
"pac_poluchat": "False",
|
||||
"poluchat_status": taxpayer_status_zapros,
|
||||
"birthday": birthday_users
|
||||
}
|
||||
print(payload)
|
||||
headers = {"User-Agent": "Mozilla/5.0", "Content-Type": "application/json"}
|
||||
url = "http://192.168.1.10:8080/AppZaprSvedPac"
|
||||
response = requests.post(url, json=payload, headers=headers)
|
||||
|
||||
if response.status_code == 200:
|
||||
print("Ответ:", response.text)
|
||||
result = response.json
|
||||
print(result)
|
||||
try:
|
||||
result = response.json()
|
||||
except:
|
||||
result = {}
|
||||
|
||||
js_formatted_birthdate = (
|
||||
datetime.strptime(result.get("pct_birthday", ""), "%Y-%m-%dT%H:%M:%S.%fZ").strftime("%Y-%m-%d")
|
||||
if result.get("pct_birthday") else "")
|
||||
|
||||
js_formatted_birthdate_plc = (
|
||||
datetime.strptime(result.get("plc_birthday", ""), "%Y-%m-%dT%H:%M:%S.%fZ").strftime("%Y-%m-%d")
|
||||
if result.get("plc_birthday") else "")
|
||||
|
||||
js_formatted_passport_date = (
|
||||
datetime.strptime(result.get("pct_doc_date", ""), "%Y-%m-%dT%H:%M:%S.%fZ").strftime("%Y-%m-%d")
|
||||
if result.get("pct_doc_date") else "")
|
||||
|
||||
js_formatted_passport_date_plc = (
|
||||
datetime.strptime(result.get("plc_doc_date", ""), "%Y-%m-%dT%H:%M:%S.%fZ").strftime("%Y-%m-%d")
|
||||
if result.get("plc_doc_date") else "")
|
||||
|
||||
return jsonify(
|
||||
user_id=user_id,
|
||||
taxpayer_status_zapros=taxpayer_status_zapros,
|
||||
fio=patient_fio,
|
||||
server_data=result,
|
||||
js_formatted_birthdate=js_formatted_birthdate,
|
||||
js_formatted_passport_date=js_formatted_passport_date,
|
||||
pct_doc_ser=result.get('pct_doc_ser', ''),
|
||||
pct_doc_nom=result.get('pct_doc_nom', ''),
|
||||
pct_inn=result.get('pct_inn', ''),
|
||||
pct_doc_type=result.get('pct_doc_type', ''),
|
||||
pct_doc_ind=result.get('pct_doc_ind', ''),
|
||||
pct_email=result.get('pct_email', ''),
|
||||
pct_doc_org_kod=result.get('pct_doc_org_kod', ''),
|
||||
pct_doc_org_name=result.get('pct_doc_org_name', ''),
|
||||
plc_status=result.get('plc_status', ''),
|
||||
plc_fio=result.get('plc_fio', ''),
|
||||
js_formatted_birthdate_plc=js_formatted_birthdate_plc,
|
||||
plc_inn=result.get('plc_inn', ''),
|
||||
plc_doc_type=result.get('plc_doc_type', ''),
|
||||
plc_doc_ind=result.get('plc_doc_ind', ''),
|
||||
plc_doc_ser=result.get('plc_doc_ser', ''),
|
||||
plc_doc_nom=result.get('plc_doc_nom', ''),
|
||||
js_formatted_passport_date_plc=js_formatted_passport_date_plc,
|
||||
plc_doc_org_name=result.get('plc_doc_org_name', ''),
|
||||
plc_doc_org_kod=result.get('plc_doc_org_kod', ''),
|
||||
success = True
|
||||
)
|
||||
else:
|
||||
return f"Ошибка: {response.status_code} - {response.text}", 500
|
||||
except Exception as e:
|
||||
return f"Произошла ошибка: {e}", 500
|
||||
|
||||
|
||||
|
||||
|
||||
@webApp.route('/sending_patient2', methods=['POST'])
|
||||
def send_registration_request2():
|
||||
try:
|
||||
raw_data = json.loads(request.data)
|
||||
|
||||
print("Полученные данные:", raw_data)
|
||||
|
||||
# Разделение ФИО
|
||||
|
||||
|
||||
# Определение документа
|
||||
if raw_data.get("passport1") and raw_data.get("passport_date1") and raw_data.get(
|
||||
"postal_code1") and raw_data.get("passport_issued_by1"):
|
||||
pct_doc_type = "Паспорт"
|
||||
pct_doc_ind = 1
|
||||
passport = raw_data.get("passport1", "")
|
||||
parts = passport.split(" ")
|
||||
pct_doc_ser = parts[0]
|
||||
pct_doc_nom = parts[1]
|
||||
formatted_date = raw_data.get("passport_date1", "")
|
||||
date_obj = datetime.strptime(formatted_date, "%Y-%m-%d")
|
||||
pct_doc_date = date_obj.strftime("%Y-%m-%dT00:00:00.000Z")
|
||||
pct_doc_org_name = raw_data.get("passport_issued_by1", "")
|
||||
pct_doc_org_kod = raw_data.get("postal_code1", "")
|
||||
inn1 = ""
|
||||
|
||||
elif raw_data.get("svedetelstvo") and raw_data.get("svedetelstvo_date") and raw_data.get(
|
||||
"svedetelstvo_issued_by"):
|
||||
pct_doc_type = "Свидетельство о рождении"
|
||||
pct_doc_ind = 2
|
||||
pct_doc_ser, pct_doc_nom = raw_data.get("svedetelstvo", "").split(" ")
|
||||
formatted_date = raw_data.get("svedetelstvo_date", "")
|
||||
date_obj = datetime.strptime(formatted_date, "%Y-%m-%d")
|
||||
pct_doc_date = date_obj.strftime("%Y-%m-%dT00:00:00.000Z")
|
||||
pct_doc_org_name = raw_data.get("svedetelstvo_issued_by", "")
|
||||
pct_doc_org_kod = ""
|
||||
inn1 = ""
|
||||
elif raw_data.get("inn1"):
|
||||
inn1 = raw_data.get("inn1", "")
|
||||
pct_doc_type = ""
|
||||
pct_doc_ind = ""
|
||||
pct_doc_ser = ""
|
||||
pct_doc_nom = ""
|
||||
pct_doc_date = ""
|
||||
pct_doc_org_name = ""
|
||||
pct_doc_org_kod = ""
|
||||
|
||||
else:
|
||||
return jsonify({'success': False, "error": "Недостаточно данных для определения документа пациента."}), 400
|
||||
|
||||
fio = raw_data.get("patient_fio", "")
|
||||
parts = fio.split(" ")
|
||||
if len(parts) < 3:
|
||||
return jsonify({'success': False, "error": "ФИО должно содержать 3 слова"}), 400
|
||||
|
||||
pct_last_name = parts[0]
|
||||
pct_first_name = parts[1]
|
||||
pct_second_name = " ".join(parts[2:])
|
||||
|
||||
# Обработка даты рождения
|
||||
dob = raw_data.get("dob1", "")
|
||||
if dob:
|
||||
date_obj = datetime.strptime(dob, "%Y-%m-%d")
|
||||
pct_birthday = date_obj.strftime("%Y-%m-%dT00:00:00.000Z")
|
||||
|
||||
# Данные родителей
|
||||
plc_fio = raw_data.get("fional", "")
|
||||
plc_status = raw_data.get("taxpayer_status_zapros", "")
|
||||
dob_parent = raw_data.get("dobnal", "")
|
||||
plc_birthday = ""
|
||||
if dob_parent:
|
||||
date_obj = datetime.strptime(dob_parent, "%Y-%m-%d")
|
||||
plc_birthday = date_obj.strftime("%Y-%m-%dT00:00:00.000Z")
|
||||
|
||||
plc_doc_ser, plc_doc_nom = raw_data.get("passportnal", "").split(" ")
|
||||
formatted_date = raw_data.get("passport_datenal", "")
|
||||
date_obj = datetime.strptime(formatted_date, "%Y-%m-%d")
|
||||
plc_doc_date = date_obj.strftime("%Y-%m-%dT00:00:00.000Z")
|
||||
plc_doc_org_name = raw_data.get("passport_issued_bynal", "")
|
||||
plc_doc_org_kod = raw_data.get("postal_codenal", "")
|
||||
plc_inn = raw_data.get("innnal", "")
|
||||
|
||||
user_id = raw_data.get('user_id')
|
||||
|
||||
email1=raw_data.get("email1", "")
|
||||
# Извлекаем годы
|
||||
selected_years = raw_data.get('selected_years', [])
|
||||
|
||||
if selected_years:
|
||||
# Преобразуем элементы в целые числа
|
||||
selected_years = list(map(int, selected_years))
|
||||
|
||||
# Находим минимальный и максимальный год
|
||||
year_beg_spr1 = min(selected_years)
|
||||
year_end_spr2 = max(selected_years)
|
||||
|
||||
# Если выбран только один год, то обе переменные будут одинаковыми
|
||||
if year_beg_spr1 == year_end_spr2:
|
||||
year_end_spr2 = year_beg_spr1
|
||||
|
||||
# Теперь у нас есть year_beg_spr и year_end_spr
|
||||
print("Минимальный год:", year_beg_spr1)
|
||||
print("Максимальный год:", year_end_spr2)
|
||||
|
||||
# Формируем данные
|
||||
data2 = {
|
||||
"telegram_id": int(user_id),
|
||||
"pct_last_name": pct_last_name,
|
||||
"pct_first_name": pct_first_name,
|
||||
"pct_second_name": pct_second_name,
|
||||
"pct_birthday": pct_birthday,
|
||||
"pct_inn": inn1,
|
||||
"pct_doc_type": pct_doc_type,
|
||||
"pct_doc_ind": pct_doc_ind,
|
||||
"pct_doc_ser": pct_doc_ser,
|
||||
"pct_doc_nom": pct_doc_nom,
|
||||
"pct_doc_date": pct_doc_date,
|
||||
"pct_doc_org_name": pct_doc_org_name,
|
||||
"pct_doc_org_kod": pct_doc_org_kod,
|
||||
"pac_poluchat": "False",
|
||||
"pct_email": email1,
|
||||
"plc_status": plc_status,
|
||||
"plc_fio": plc_fio,
|
||||
"plc_birthday": plc_birthday,
|
||||
"plc_inn": plc_inn,
|
||||
"plc_doc_type": "Паспорт",
|
||||
"plc_doc_ind": 1,
|
||||
"plc_doc_ser": plc_doc_ser,
|
||||
"plc_doc_nom": plc_doc_nom,
|
||||
"plc_doc_date": plc_doc_date,
|
||||
"plc_doc_org_name": raw_data.get("passport_issued_bynal"),
|
||||
"plc_doc_org_kod": plc_doc_org_kod,
|
||||
"year_beg_spr": year_beg_spr1,
|
||||
"year_end_spr": year_end_spr2
|
||||
}
|
||||
|
||||
# print("Отправляемые данные:", data2)
|
||||
# return jsonify({'success': True, 'data': data2})
|
||||
# except Exception as e:
|
||||
# return jsonify({'success': False, 'error': str(e)}), 500
|
||||
|
||||
|
||||
print("Отправляемые данные:", data2)
|
||||
|
||||
# Успешный ответ
|
||||
HEADER2 = {"User-Agent": "Mozilla/5.0", "Content-Type": "application/json"}
|
||||
try:
|
||||
response = requests.post("http://192.168.1.10:8080/AppSaveSvedPac", headers=HEADER2, json=data2, timeout=5)
|
||||
print("Ответ сервера:", response.text) # вдруг сервер всё же что-то вернёт
|
||||
if response.status_code == 200:
|
||||
return jsonify({'success': True})
|
||||
else:
|
||||
return jsonify({'success': False, 'error': f'Сервер вернул статус {response.status_code}'}), 500
|
||||
|
||||
except requests.exceptions.RequestException as e:
|
||||
return jsonify({'success': False, 'error': f'Ошибка соединения: {str(e)}'}), 500
|
||||
|
||||
except Exception as e:
|
||||
print(f"Ошибка: {e}")
|
||||
return jsonify({'success': False, 'error': str(e)}), 500
|
||||
|
||||
return jsonify({'success':True})
|
||||
|
||||
|
||||
@webApp.route('/')
|
||||
def main_page_2_0():
|
||||
return render_template('2.0/main_page.pug', user_id=request.args.get('user_id', None))
|
||||
|
||||
|
||||
|
||||
@webApp.route('/fnstest')
|
||||
def main_page_2_0_fns():
|
||||
try:
|
||||
user_id = request.args.get('user_id')
|
||||
if not user_id:
|
||||
return "Ошибка: не передан user_id", 400
|
||||
|
||||
sheet = authorize_google().open("Пациенты клиники").sheet1
|
||||
records = sheet.get_all_values()
|
||||
|
||||
# Получаем список всех людей с таким user_id
|
||||
matching_users = [row[0] for row in records[1:] if row[3] == user_id]
|
||||
matching_users = sum(matching_users, []) if any(isinstance(i, list) for i in matching_users) else matching_users
|
||||
|
||||
print(matching_users)
|
||||
|
||||
if not matching_users:
|
||||
return "Ошибка: пользователь не найден", 404
|
||||
|
||||
return render_template('2.0/main_page_fns.pug', user_id=user_id, users=matching_users)
|
||||
except Exception as e:
|
||||
return f"Произошла ошибка: {e}", 500
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@webApp.route('/fns')
|
||||
def main_page_2_0_fns_test():
|
||||
try:
|
||||
user_id = request.args.get('user_id')
|
||||
if not user_id:
|
||||
return "Ошибка: не передан user_id", 400
|
||||
|
||||
url = "http://192.168.1.10:8080/AppFindPacFromTel"
|
||||
data = {"telegram_id": user_id}
|
||||
|
||||
response = requests.post(url, json=data)
|
||||
patients = []
|
||||
|
||||
if response.status_code == 200:
|
||||
result = response.json()
|
||||
for patient in result.get("Pacients", []):
|
||||
# Формируем строку ФИО
|
||||
fio = f"{patient['last_name']} {patient['first_name']} {patient['second_name']}"
|
||||
patients.append(fio)
|
||||
print("список:", patients)
|
||||
birthday_pac = {patient['birthday']}
|
||||
|
||||
|
||||
if not patients:
|
||||
return "Ошибка: пользователь не найден", 404
|
||||
|
||||
return render_template('2.0/main_page_fns2.pug', user_id=user_id, users=patients, birthday_paci=birthday_pac)
|
||||
except Exception as e:
|
||||
return f"Произошла ошибка: {e}", 500
|
||||
@@ -22,58 +22,41 @@ script(type="text/javascript", src="/js/2.0.dashboard.js?q="~randomString())
|
||||
|
||||
|
||||
|
||||
.my-3.mx-4
|
||||
label.form-label.m-0(for="fio")='Фамилия Имя Отчество полностью'
|
||||
.my-3.mx-4.success-field.primary-field
|
||||
label.form-label.m-0(for="fio")='Укажите ФИО пациента строго в формате “Фамилия Имя Отчество”. Если пациентом является Ваш ребенок, введите только ФИО ребенка.'
|
||||
input.form-control.tg_input#fio
|
||||
.my-3.mx-4.success-field
|
||||
small="(Пожалуйста, проверьте формат ввода)"
|
||||
.my-3.mx-4.success-field.primary-field
|
||||
label.form-label.m-0(for="tel")="Телефон"
|
||||
.row.m-0.p-0.justify-content-between
|
||||
.col-auto.m-0.p-0(style="min-width: 85%;")
|
||||
input.form-control.tg_input#tel(type="text")
|
||||
input.form-control.tg_input#tel(type="tel")
|
||||
.col-auto.m-0.p-0
|
||||
button.btn.btn-danger#clear_tel
|
||||
span.x-icn
|
||||
small="(Пожалуйста, проверьте формат ввода)"
|
||||
.my-3.mx-4.success-field
|
||||
label.form-label.m-0(for="dob")='Дата рождения'
|
||||
.my-3.mx-4.success-field.primary-field
|
||||
label.form-label.m-0(for="dob")='Пожалуйста, введите дату рождения пациента. В случае, если пациентом является Ваш ребенок, укажите его дату рождения.'
|
||||
input.form-control.tg_input#dob(type="date")
|
||||
small="(Пожалуйста, проверьте формат ввода)"
|
||||
.my-3.mx-4.success-field
|
||||
label.form-label.m-0(for="email")='Электронная почта'
|
||||
input.form-control.tg_input#email
|
||||
small="(Пожалуйста, проверьте формат ввода)"
|
||||
.my-3.mx-4.success-field
|
||||
label.form-label.m-0(for="passport")='Серия и номер паспорта'
|
||||
input.form-control.tg_input#passport
|
||||
small="(Пожалуйста, проверьте формат ввода)"
|
||||
.my-3.mx-4.success-field
|
||||
label.form-label.m-0(for="passport_date")='Дата выдачи паспорта'
|
||||
input.form-control.tg_input#passport_date(type="date")
|
||||
small="(Пожалуйста, проверьте формат ввода)"
|
||||
.my-3.mx-4.success-field
|
||||
label.form-label.m-0(for="postal_code")='Код подразделения'
|
||||
input.form-control.tg_input#postal_code
|
||||
small="(Пожалуйста, проверьте формат ввода)"
|
||||
.my-3.mx-4
|
||||
label.form-label.m-0(for="passport_issued_by")='Кем выдан паспорт'
|
||||
select.form-select.tg_input#passport_issued_by(style="")
|
||||
option(disabled, selected)="Кем выдан паспорт"
|
||||
.my-3.mx-4
|
||||
label.form-label.m-0(for="address")='Адрес регистрации'
|
||||
input.form-control.tg_input#address
|
||||
.my-3.mx-4
|
||||
label.form-label.m-0(for="residential_address")='Адрес проживания'
|
||||
input.form-control.tg_input#residential_address
|
||||
.my-3.mx-4.success-field
|
||||
label.form-label.m-0(for="snils")='СНИЛС'
|
||||
input.form-control.tg_input#snils
|
||||
small="(Пожалуйста, проверьте формат ввода)"
|
||||
.my-3.mx-4.success-field
|
||||
label.form-label.m-0(for="inn")='ИНН'
|
||||
input.form-control.tg_input#inn
|
||||
|
||||
.my-3.mx-4.success-field.verification(style="display: none;")
|
||||
label.form-label.m-0(for="kod")='Для завершения процесса верификации на указанный Вами номер телефона поступит звонок с уникального номера. Пожалуйста, введите последние четыре цифры этого номера.'
|
||||
input.form-control#kod
|
||||
small="(Пожалуйста, проверьте формат ввода)"
|
||||
|
||||
.my-3.mx-4
|
||||
button.btn.btn-success.float-end.mb-3#form_submit
|
||||
.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="Подтвердить"
|
||||
span="Подтвердить"
|
||||
|
||||
.my-3.mx-4.primary-field.verification(style="display: none;")
|
||||
p.mx-auto.text-center#repeat_call(href="#", style="cursor: pointer; text-decoration: underline dotted;")="Заказать повторный звонок"
|
||||
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="Регистрация завершена. Перейдите в Telegram, чтобы продолжить."
|
||||
|
||||
|
||||
@@ -0,0 +1,123 @@
|
||||
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
|
||||
p="Обращаем Ваше внимание, что на данный момент заказать справку можно только для налогоплательщика, который является пациентом нашей Клиники."
|
||||
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;")
|
||||
p="Пожалуйста, проверьте корректность данных. Если информация неполная, добавьте недостающие сведения."
|
||||
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 Ваша заявка принята. Справка будет оформлена в течение <strong>трёх рабочих дней</strong>.
|
||||
p <strong>Готовые документы</strong> будут отправлены на вашу электронную почту.
|
||||
p
|
||||
| 📍 Также их можно забрать лично по адресу:
|
||||
br
|
||||
strong г. Пермь, ул. Г. Звезда, д. 31 А
|
||||
| , в удобное для вас время:
|
||||
br
|
||||
| – будни: <strong>с 09:00 до 21:00</strong>
|
||||
br
|
||||
| – выходные и праздничные дни: <strong>с 09:00 до 19:00</strong>
|
||||
br
|
||||
em (❗️Обращаем внимание! Каждый четвёртый четверг месяца Клиника работает до 17:00).
|
||||
p
|
||||
| ☝️
|
||||
strong Важно:
|
||||
br
|
||||
| Справку может получить налогоплательщик при предъявлении паспорта или его представитель с доверенностью и паспортом.
|
||||
p Спасибо за ваше обращение! 😊
|
||||
@@ -0,0 +1,272 @@
|
||||
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.test_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="patient_fio") <strong>Выберите пациента</strong>
|
||||
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.success-field.primary-field
|
||||
label.form-label.m-0(for="taxpayer_status") <strong>Выберите статус налогоплательщика</strong>
|
||||
select.form-select.tg_input#taxpayer_status
|
||||
option(disabled, selected)='Выберите статус'
|
||||
small="(Пожалуйста, выберите подходящий вариант)"
|
||||
|
||||
.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") <strong>Фамилия Имя Отчество</strong>
|
||||
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") <strong>Дата рождения</strong>
|
||||
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") <strong>Серия и номер паспорта</strong>
|
||||
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") <strong>Дата выдачи паспорта</strong>
|
||||
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") <strong>Код подразделения</strong>
|
||||
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") <strong>Кем выдан паспорт</strong>
|
||||
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") <strong>ИНН</strong>
|
||||
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") <strong>Электронная почта</strong>
|
||||
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 <strong>За какой год выдать данные</strong>
|
||||
.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 Выбрать все
|
||||
|
||||
hr.primary-field(style="display: none;")
|
||||
.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 Ваша заявка принята. Справка будет оформлена в течение <strong>трёх рабочих дней</strong>.
|
||||
p <strong>Готовые документы</strong> будут отправлены на вашу электронную почту.
|
||||
p
|
||||
| 📍 Также их можно забрать лично по адресу:
|
||||
br
|
||||
strong г. Пермь, ул. Г. Звезда, д. 31 А
|
||||
| , в удобное для вас время:
|
||||
br
|
||||
| – будни: <strong>с 09:00 до 21:00</strong>
|
||||
br
|
||||
| – выходные и праздничные дни: <strong>с 09:00 до 19:00</strong>
|
||||
br
|
||||
em (❗️Обращаем внимание! Каждый четвёртый четверг месяца Клиника работает до 17:00).
|
||||
p
|
||||
| ☝️
|
||||
strong Важно:
|
||||
br
|
||||
| Справку может получить налогоплательщик при предъявлении паспорта или его представитель с доверенностью и паспортом.
|
||||
p Спасибо за ваше обращение! 😊
|
||||
|
||||
|
||||
|
||||
|
||||
.my-3.mx-4.success-field.verificationpacient(style="display: none;")
|
||||
p <strong>ДАННЫЕ ПАЦИЕНТА</strong>
|
||||
|
||||
.my-3.mx-4.success-field.verificationpacient(style="display: none;")
|
||||
label.form-label.m-0(for="fio") <strong>Фамилия Имя Отчество</strong>
|
||||
input.form-control.tg_input#fio1(type="text" name="fio")
|
||||
small="(Пожалуйста, проверьте правильность данных)"
|
||||
|
||||
|
||||
.my-3.mx-4.success-field.verificationpacient(style="display: none;")
|
||||
label.form-label.m-0(for="birthdate") <strong>Дата рождения</strong>
|
||||
input.form-control.tg_input#dob1(type="date")
|
||||
small="(Пожалуйста, проверьте правильность данных)"
|
||||
|
||||
|
||||
.my-3.mx-4.success-field.verificationpacient(style="display: none;")
|
||||
label.form-label.m-0(for="documentTypePacient") <strong>Документ пациента:</strong> выберите паспорт, ИНН или свидетельство о рождении и введите его данные.
|
||||
.my-3.d-flex.justify-content-between.gap-2
|
||||
button.btn.btn-secondary.flex-fill#passportBtn(type="button") Паспортные данные пациента
|
||||
button.btn.btn-secondary.flex-fill#INNpacientBtn(type="button") ИНН пациента
|
||||
button.btn.btn-secondary.flex-fill#SvidetelstvoBth(type="button") Свидетельство о рождении
|
||||
|
||||
|
||||
|
||||
#passportFields.d-none
|
||||
.my-3.mx-4.success-field.verificationpacient
|
||||
label.form-label.m-0(for="passport") <strong>Серия и номер паспорта</strong>
|
||||
input.form-control.tg_input#passport1
|
||||
small="(Пожалуйста, проверьте правильность данных)"
|
||||
|
||||
.my-3.mx-4.success-field.verificationpacient
|
||||
label.form-label.m-0(for="passport_date") <strong>Дата выдачи паспорта</strong>
|
||||
input.form-control.tg_input#passport_date1(type="date")
|
||||
small="(Пожалуйста, проверьте правильность данных)"
|
||||
|
||||
|
||||
.my-3.mx-4.success-field.verificationpacient
|
||||
label.form-label.m-0(for="postal_code") <strong>Код подразделения</strong>
|
||||
input.form-control.tg_input#postal_code1
|
||||
small="(Пожалуйста, проверьте правильность данных)"
|
||||
|
||||
|
||||
.my-3.mx-4.success-field.verificationpacient
|
||||
label.form-label.m-0(for="passport_issued_by") <strong>Кем выдан паспорт</strong>
|
||||
select.form-select.tg_input#passport_issued_by1(style="")
|
||||
option(disabled, selected)="Кем выдан паспорт"
|
||||
small="(Пожалуйста, проверьте правильность данных)"
|
||||
|
||||
#INNpacientFields.d-none
|
||||
.my-3.mx-4.success-field.verificationpacient
|
||||
label.form-label.m-0(for="inn") <strong>ИНН</strong>
|
||||
input.form-control.tg_input#inn1(type="text" name="#inn")
|
||||
small="(Пожалуйста, проверьте правильность данных)"
|
||||
|
||||
#SvidetelstvoFields.d-none
|
||||
.my-3.mx-4.success-field.verificationpacient
|
||||
label.form-label.m-0(for="svedetelstvo") <strong>Серия и номер свидетельства о рождении</strong>
|
||||
input.form-control.tg_input#svedetelstvo
|
||||
small="(Пожалуйста, проверьте правильность данных)"
|
||||
|
||||
.my-3.mx-4.success-field.verificationpacient
|
||||
label.form-label.m-0(for="svedetelstvo_date") <strong>Дата выдачи свидетельства о рождении</strong>
|
||||
input.form-control.tg_input#svedetelstvo_date(type="date")
|
||||
small="(Пожалуйста, проверьте правильность данных)"
|
||||
|
||||
|
||||
.my-3.mx-4.success-field.verificationpacient
|
||||
label.form-label.m-0(for="svedetelstvo_issued_by") <strong>Кем выдано свидетельство о рождении</strong>
|
||||
input.form-control.tg_input#svedetelstvo_issued_by
|
||||
small="(Пожалуйста, проверьте правильность данных)"
|
||||
|
||||
|
||||
.my-3.mx-4.success-field.verificationpacient(style="display: none;")
|
||||
p <strong>ДАННЫЕ НАЛОГОПЛАТЕЛЬЩИКА</strong>
|
||||
|
||||
|
||||
.my-3.mx-4.success-field.verificationpacient(style="display: none;")
|
||||
label.form-label.m-0(for="taxpayer_status_zapros") <strong>Выберите статус налогоплательщика</strong>
|
||||
select.form-select.tg_input#taxpayer_status_zapros
|
||||
option(disabled, selected)='Выберите статус'
|
||||
small="(Пожалуйста, выберите подходящий вариант)"
|
||||
|
||||
.my-3.mx-4.success-field.verificationpacient(style="display: none;")
|
||||
label.form-label.m-0(for="fio") <strong>Фамилия Имя Отчество</strong>
|
||||
input.form-control.tg_input#fional(type="text" name="fio")
|
||||
small="(Пожалуйста, проверьте правильность данных)"
|
||||
|
||||
.my-3.mx-4.success-field.verificationpacient(style="display: none;")
|
||||
label.form-label.m-0(for="birthdate") <strong>Дата рождения</strong>
|
||||
input.form-control.tg_input#dobnal(type="date")
|
||||
small="(Пожалуйста, проверьте правильность данных)"
|
||||
|
||||
|
||||
.my-3.mx-4.success-field.verificationpacient(style="display: none;")
|
||||
label.form-label.m-0(for="inn") <strong>ИНН</strong>
|
||||
input.form-control.tg_input#innnal(type="text" name="#inn")
|
||||
small="(Пожалуйста, проверьте правильность данных)"
|
||||
|
||||
|
||||
.my-3.mx-4.success-field.verificationpacient(style="display: none;")
|
||||
label.form-label.m-0(for="passport") <strong>Серия и номер паспорта</strong>
|
||||
input.form-control.tg_input#passportnal
|
||||
small="(Пожалуйста, проверьте правильность данных)"
|
||||
|
||||
.my-3.mx-4.success-field.verificationpacient(style="display: none;")
|
||||
label.form-label.m-0(for="passport_date") <strong>Дата выдачи паспорта</strong>
|
||||
input.form-control.tg_input#passport_datenal(type="date")
|
||||
small="(Пожалуйста, проверьте правильность данных)"
|
||||
|
||||
|
||||
.my-3.mx-4.success-field.verificationpacient(style="display: none;")
|
||||
label.form-label.m-0(for="postal_code") <strong>Код подразделения</strong>
|
||||
input.form-control.tg_input#postal_codenal
|
||||
small="(Пожалуйста, проверьте правильность данных)"
|
||||
|
||||
|
||||
.my-3.mx-4.success-field.verificationpacient(style="display: none;")
|
||||
label.form-label.m-0(for="passport_issued_by") <strong>Кем выдан паспорт</strong>
|
||||
select.form-select.tg_input#passport_issued_bynal(style="")
|
||||
option(disabled, selected)="Кем выдан паспорт"
|
||||
small="(Пожалуйста, проверьте правильность данных)"
|
||||
|
||||
|
||||
|
||||
.my-3.mx-4.success-field.verificationpacient(style="display: none;")
|
||||
label.form-label.m-0(for="email") <strong>Электронная почта</strong>
|
||||
input.form-control.tg_input#email1(type="text" name="email" value=pct_email)
|
||||
small="(Пожалуйста, проверьте правильность данных)"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
.my-3.mx-4.success-field.verificationpacient(style="display: none;")
|
||||
label.form-label.m-0 <strong>За какой год выдать данные</strong>
|
||||
.checkbox-container
|
||||
each year in [2025, 2024, 2023, 2022]
|
||||
label.checkbox-item
|
||||
input(type="checkbox" name="god_zapros2" value=year)
|
||||
span= year
|
||||
button.btn.btn-outline-primary.btn-sm#select-all2="Выбрать все"
|
||||
|
||||
hr.primary-field.verificationpacient(style="display: none;")
|
||||
.my-3.mx-4.primary-field.verificationpacient(style="display: none;")
|
||||
button.btn.btn-success.float-end.mb-3#code_submit2
|
||||
span.spinner-border.spinner-border-sm.me-1.d-none(role="status" aria-hidden="true")
|
||||
span="Заказать справку"
|
||||
@@ -23,4 +23,17 @@
|
||||
|
||||
.m-off::before{
|
||||
margin: 0px !important;
|
||||
}
|
||||
|
||||
|
||||
.checkbox-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 5px;
|
||||
}
|
||||
|
||||
.checkbox-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 5px;
|
||||
}
|
||||
@@ -0,0 +1,534 @@
|
||||
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');
|
||||
|
||||
// Функция обработки и проверки ИНН
|
||||
function validateINN(input) {
|
||||
// Убираем все символы, кроме цифр
|
||||
input = input.replace(/\D/g, '');
|
||||
// Ограничиваем длину до 12 символов
|
||||
input = input.slice(0, 12);
|
||||
return input;
|
||||
}
|
||||
|
||||
// Обработка ввода вручную
|
||||
$('#inn').on('input', function () {
|
||||
let input = validateINN($(this).val());
|
||||
$(this).val(input);
|
||||
|
||||
if (input.length < 12) {
|
||||
$(this).parent().removeClass('success-field').addClass('errors-field');
|
||||
} else {
|
||||
$(this).parent().removeClass('errors-field').addClass('success-field');
|
||||
}
|
||||
});
|
||||
|
||||
// Обработка вставки из буфера обмена
|
||||
$('#inn').on('paste', function (e) {
|
||||
e.preventDefault(); // Останавливаем стандартную вставку
|
||||
let clipboardData = (e.originalEvent || e).clipboardData.getData('text');
|
||||
let input = validateINN(clipboardData);
|
||||
$(this).val(input).trigger('input'); // Обновляем значение и вызываем проверку
|
||||
});
|
||||
|
||||
$('#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.js_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 ($('#dob').val().length !== 10 || new Date().getFullYear() - new Date($('#dob').val()).getFullYear() > 100) {
|
||||
show_error('Дата рождения должна быть корректной и возраст не более 100 лет', 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_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($('#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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
if ($("input[name='god_zapros']:checked").length === 0) {
|
||||
show_error("Выберите хотя бы один год запроса");
|
||||
$(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('-', '');
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -1,17 +1,22 @@
|
||||
function show_error(message){
|
||||
$('#error_alert').slideDown(500);
|
||||
$('#error_alert').delay(2000).slideUp();
|
||||
$('#success_alert').hide();
|
||||
$('#error_alert').delay(5000).slideUp();
|
||||
$('#alert_error_text').empty();
|
||||
if (message)
|
||||
$('#alert_error_text').text(message)
|
||||
$('#alert_error_text').append(message)
|
||||
}
|
||||
|
||||
function show_success(message){
|
||||
$('#success_alert').slideDown(500);
|
||||
$('#success_alert').delay(2000).slideUp();
|
||||
$('#success_alert').delay(5000).slideUp();
|
||||
$('#alert_success_text').empty();
|
||||
if (message)
|
||||
$('#alert_success_text').text(message)
|
||||
$('#alert_success_text').append(message);
|
||||
}
|
||||
|
||||
|
||||
|
||||
function validate_length(val, dest_len){
|
||||
if(val.length < dest_len){
|
||||
return false;
|
||||
@@ -22,50 +27,37 @@ function validate_length(val, dest_len){
|
||||
$(document).ready(function(){
|
||||
|
||||
|
||||
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);
|
||||
|
||||
|
||||
$('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() {
|
||||
|
||||
$('#fio').on('input', function () {
|
||||
let input = $(this).val();
|
||||
|
||||
// Убираем все лишние символы, кроме букв и пробелов
|
||||
input = input.replace(/[^a-zA-Zа-яА-ЯёЁ ]/g, '');
|
||||
// Разделение текста по пробелам и преобразование каждого слова
|
||||
let words = input.split(/\s+/); // Разбиваем по пробелам
|
||||
// Преобразуем каждое слово
|
||||
let formattedInput = words.map(word => {
|
||||
|
||||
// Преобразуем каждое слово, чтобы оно начиналось с заглавной буквы
|
||||
let formattedInput = input.split(' ').map(word => {
|
||||
if (word.length > 0) {
|
||||
return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
|
||||
}
|
||||
return ''; // Если слово пустое (например, несколько пробелов), не изменяем
|
||||
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'); // Убрать подсветку
|
||||
}
|
||||
});
|
||||
|
||||
$('#email').on('input', function() {
|
||||
let input = $(this).val();
|
||||
// Разрешаем только буквы, цифры, точки, дефисы и подчеркивания
|
||||
input = input.replace(/[^a-zA-Z0-9._@-]/g, '');
|
||||
// Обновляем поле ввода
|
||||
$(this).val(input);
|
||||
});
|
||||
|
||||
|
||||
$('#tel').on('change', function() {
|
||||
if($(this).val().length != 16){
|
||||
@@ -75,6 +67,8 @@ $(document).ready(function(){
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
// Проверка на дату рождения (не старше 80 лет)
|
||||
$('#dob').on('change', function() {
|
||||
const dob = new Date($(this).val());
|
||||
@@ -82,7 +76,7 @@ $(document).ready(function(){
|
||||
const age = currentDate.getFullYear() - dob.getFullYear();
|
||||
|
||||
// Проверка на возраст (не старше 80 лет)
|
||||
if (age > 80 || (age === 80 && (currentDate.getMonth() < dob.getMonth() || (currentDate.getMonth() === dob.getMonth() && currentDate.getDate() < dob.getDate())))) {
|
||||
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 {
|
||||
@@ -91,80 +85,17 @@ $(document).ready(function(){
|
||||
}
|
||||
});
|
||||
|
||||
// Проверка на дату выдачи паспорта (выдан после 14, 20 или 45 лет)
|
||||
$('#passport_date').on('change', function() {
|
||||
const passportDate = new Date($(this).val());
|
||||
const dob = new Date($('#dob').val());
|
||||
|
||||
// Проверка, что дата рождения введена и корректна
|
||||
if (!dob || isNaN(dob)) {
|
||||
// Если дата рождения не введена или неверна, показываем ошибку
|
||||
$(this).parent().removeClass('success-field').addClass('errors-field');
|
||||
return;
|
||||
}
|
||||
|
||||
const ageAtPassportIssue = passportDate.getFullYear() - dob.getFullYear();
|
||||
|
||||
// Проверка на возраст, в котором может быть выдан паспорт
|
||||
if (ageAtPassportIssue > 12) {
|
||||
// Если возраст при выдаче паспорта соответствует требованиям, подсвечиваем ячейку как успешную
|
||||
$(this).parent().removeClass('errors-field').addClass('success-field');
|
||||
} else {
|
||||
// Если возраст не соответствует, показываем ошибку
|
||||
$(this).parent().removeClass('success-field').addClass('errors-field');
|
||||
}
|
||||
});
|
||||
|
||||
$("#passport").attr('maxlength','12');
|
||||
|
||||
$('#passport').on('input', function() {
|
||||
let input = $(this).val();
|
||||
// Удаляем все символы, кроме цифр и пробелов
|
||||
input = input.replace(/\D/g, '');
|
||||
|
||||
// Форматируем ввод в "00 00 000000" с пробелами
|
||||
if (input.length > 2 && input.length <= 4) {
|
||||
input = input.replace(/(\d{2})(\d{0,2})/, '$1 $2');
|
||||
} else if (input.length > 4 && input.length <= 10) {
|
||||
input = input.replace(/(\d{2})(\d{2})(\d{0,6})/, '$1 $2 $3');
|
||||
}
|
||||
|
||||
// Ограничиваем длину до "00 00 000000"
|
||||
if (input.length > 12) {
|
||||
input = input.slice(0, 12);
|
||||
}
|
||||
|
||||
// Обновляем поле ввода
|
||||
$(this).val(input);
|
||||
|
||||
// Проверка на минимальную длину (не менее 11 символов)
|
||||
if (input.length < 12) {
|
||||
// Если введено меньше цифр, показываем ошибку
|
||||
$(this).parent().removeClass('success-field').addClass('errors-field');
|
||||
} else {
|
||||
// Если введено достаточно цифр, показываем успех
|
||||
$(this).parent().removeClass('errors-field').addClass('success-field');
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
$('#postal_code').on('input', function() {
|
||||
$("#kod").attr('maxlength','4');
|
||||
$('#kod').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) {
|
||||
if (input.length < 4) {
|
||||
// Если введено меньше цифр, показываем ошибку
|
||||
$(this).parent().removeClass('success-field').addClass('errors-field');
|
||||
} else {
|
||||
@@ -173,77 +104,92 @@ $(document).ready(function(){
|
||||
}
|
||||
});
|
||||
|
||||
$('#passport_issued_by').select2({
|
||||
theme: 'bootstrap-5'
|
||||
});
|
||||
function verification(){
|
||||
$("#form_submit").children(".spinner-border").removeClass('d-none');
|
||||
$("#form_submit").attr("disabled", true);
|
||||
message = {}
|
||||
|
||||
$("#postal_code").change(function(){
|
||||
$('#passport_issued_by').empty();
|
||||
$('#passport_issued_by').append('<option disabled="" selected="">Кем выдан паспорт</option>')
|
||||
for(i in UFMS_list[$(this).val()])
|
||||
|
||||
|
||||
if(!(validate_length($('#fio').val(), 3)))
|
||||
{
|
||||
item = UFMS_list[$(this).val()][i];
|
||||
$('#passport_issued_by').append('<option>'+item+'</option>');
|
||||
show_error('Введите ФИО', false);
|
||||
$("#form_submit").children(".spinner-border").addClass('d-none');
|
||||
$("#form_submit").removeAttr("disabled");
|
||||
return;
|
||||
}
|
||||
// $('#passport_issued_by').select2("change");
|
||||
});
|
||||
|
||||
if(!(validate_length($('#tel').val(), 16)))
|
||||
{
|
||||
show_error('Введите Телефон', false);
|
||||
$("#form_submit").children(".spinner-border").addClass('d-none');
|
||||
$("#form_submit").removeAttr("disabled");
|
||||
return;
|
||||
}
|
||||
|
||||
$('#snils').on('input', function() {
|
||||
let input = $(this).val();
|
||||
// Удаляем все символы, кроме цифр
|
||||
input = input.replace(/\D/g, '');
|
||||
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;
|
||||
}
|
||||
|
||||
// Форматируем ввод в "000-000-000-00" только после 3, 6, 9 цифр
|
||||
if (input.length > 3 && input.length <= 6) {
|
||||
input = input.replace(/(\d{3})(\d{0,3})/, '$1-$2');
|
||||
} else if (input.length > 6 && input.length <= 9) {
|
||||
input = input.replace(/(\d{3})(\d{3})(\d{0,3})/, '$1-$2-$3');
|
||||
} else if (input.length > 9) {
|
||||
input = input.replace(/(\d{3})(\d{3})(\d{3})(\d{0,2})/, '$1-$2-$3-$4');
|
||||
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;
|
||||
}
|
||||
|
||||
$.each($('.tg_input'), function(e) {
|
||||
message[$(this).prop("id")] = $(this).val();
|
||||
});
|
||||
|
||||
show_success("Ваши данные отправлены на проверку, <br> На указанный Вами номер телефона в ближайшее время поступит звонок с уникального номера.");
|
||||
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url: "/tel_verification",
|
||||
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').show();
|
||||
// if (data.message)
|
||||
// {
|
||||
// show_success(data.message);
|
||||
// }
|
||||
}
|
||||
else{
|
||||
show_error(data.error);
|
||||
$("#form_submit").children(".spinner-border").addClass('d-none');
|
||||
$("#form_submit").removeAttr("disabled");
|
||||
}
|
||||
},
|
||||
error:function (jqXHR, exception) {
|
||||
$("#form_submit").children(".spinner-border").addClass('d-none');
|
||||
$("#form_submit").removeAttr("disabled");
|
||||
show_error('Что-то пошло не так', false)
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Ограничиваем длину до "000-000-000-00"
|
||||
if (input.length > 14) {
|
||||
input = input.slice(0, 14);
|
||||
}
|
||||
|
||||
// Обновляем поле ввода
|
||||
$(this).val(input);
|
||||
if (input.length < 14) {
|
||||
// Если введено меньше цифр, показываем ошибку
|
||||
$(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');
|
||||
}
|
||||
});
|
||||
|
||||
$("#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);
|
||||
@@ -260,88 +206,26 @@ $(document).ready(function(){
|
||||
return;
|
||||
}
|
||||
|
||||
if ($('#dob').val().length !== 10 || new Date().getFullYear() - new Date($('#dob').val()).getFullYear() > 80) {
|
||||
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(!(validateEmail($('#email').val()))){
|
||||
show_error('Введите корректный Email', false);
|
||||
if ($('#dob').val().length !== 10 || new Date().getFullYear() < new Date($('#dob').val()).getFullYear()) {
|
||||
show_error('Проверьте дату ввода, вы указали дату больше чем сегодняшняя дата', false);
|
||||
$(this).children(".spinner-border").addClass('d-none');
|
||||
$(this).removeAttr("disabled");
|
||||
return;
|
||||
}
|
||||
|
||||
if(!(validate_length($('#passport').val(), 12)))
|
||||
{
|
||||
show_error('Введите серию и номер паспорта', 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($('#passport_issued_by').val() == null){
|
||||
show_error("Выберите кем выдан паспорт");
|
||||
$(this).children(".spinner-border").addClass('d-none');
|
||||
$(this).removeAttr("disabled");
|
||||
return;
|
||||
}
|
||||
|
||||
if(!(validate_length($('#address').val(), 3)))
|
||||
{
|
||||
show_error('Введите адрес регистрации', false);
|
||||
$(this).children(".spinner-border").addClass('d-none');
|
||||
$(this).removeAttr("disabled");
|
||||
return;
|
||||
}
|
||||
|
||||
if(!(validate_length($('#residential_address').val(), 3)))
|
||||
{
|
||||
show_error('Введите адрес проживания', false);
|
||||
$(this).children(".spinner-border").addClass('d-none');
|
||||
$(this).removeAttr("disabled");
|
||||
return;
|
||||
}
|
||||
|
||||
if(!(validate_length($('#snils').val(), 14)))
|
||||
{
|
||||
show_error('Введите СНИЛС', false);
|
||||
$(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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
$.each($('.tg_input'), function(e) {
|
||||
message[$(this).prop("id")] = $(this).val();
|
||||
});
|
||||
|
||||
message["verification_code"] = $("#kod").val();
|
||||
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url: "/form_submit",
|
||||
@@ -351,10 +235,9 @@ $(document).ready(function(){
|
||||
data: JSON.stringify(message),
|
||||
success: (data) => {
|
||||
if(data.success==true){
|
||||
$(this).children(".spinner-border").addClass('d-none');
|
||||
$(this).removeAttr("disabled");
|
||||
console.log(data);
|
||||
show_success("Данные сохранены!")
|
||||
$('.primary-field').hide();
|
||||
$('.verification').hide();
|
||||
$('.success_window').show();
|
||||
}
|
||||
else{
|
||||
show_error(data.error);
|
||||
@@ -370,6 +253,10 @@ $(document).ready(function(){
|
||||
});
|
||||
});
|
||||
|
||||
$("#repeat_call").click(function(){
|
||||
verification();
|
||||
});
|
||||
|
||||
$('#clear_tel').click(function(){
|
||||
phoneStr = '';
|
||||
phoneInput.value = formatPhoneString();
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -5,4 +5,6 @@ from config import config
|
||||
|
||||
if __name__ == '__main__':
|
||||
webApp.run(debug=True, port=config['WEB_APP']['PORT'])
|
||||
# webApp.run(host='0.0.0.0', port=5000)
|
||||
|
||||
#serve(webApp, host='0.0.0.0', port=config['WEB_APP']['PORT'])
|
||||
|
||||
Reference in New Issue
Block a user