from flask import abort , request , render_template , url_for , jsonify
from webApp import *
from webApp import webApp
import gspread
from oauth2client . service_account import ServiceAccountCredentials
import json
from config import config
import requests
from datetime import datetime
# Авторизация Google API
def authorize_google ( ) :
# google_json = {}
# for key in config["GOOGLE"].keys():
# google_json[key] = config["GOOGLE"][key]
scope = [ " https://spreadsheets.google.com/feeds " , " https://www.googleapis.com/auth/drive " ]
creds = ServiceAccountCredentials . from_json_keyfile_name ( " botforclinic-436512-0c117dd103a8.json " , scope )
# creds = ServiceAccountCredentials.from_json_keyfile_dict(google_json, scope)
client = gspread . authorize ( creds )
return client
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
return None , None
@webApp . route ( ' /form_submit ' , methods = [ ' POST ' ] )
def form_submit ( ) :
"""
Обработка данных формы и обновление записи в Google Таблице .
"""
try :
data = json . loads ( request . data )
data [ ' current_time ' ] = datetime . now ( ) . strftime ( " %d . % m. % Y, % H: % M " )
# Поиск пациента
row_number , patient_row = find_patients ( data )
if not patient_row :
return jsonify ( { ' success ' : False , ' error ' : " Пациент не найден " } )
# Проверка кода верификации
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 = 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 " : " Дата рождения отсутствует " } )
birth_year = dob . split ( " - " ) [ 0 ] # Предполагается формат "YYYY-MM-DD"
# Данные для отправки в сервер Полимед
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 :
data = request . get_json ( )
print ( data )
user_id = data . get ( ' user_id ' )
# taxpayer_fio = data.get('taxpayer_fio')
patient_fio = data . get ( ' patient_fio ' )
sheet = authorize_google ( ) . open ( " Пациенты клиники " ) . sheet1
records = sheet . get_all_values ( )
# Получаем список всех людей с таким user_id
birthday_users = [ datetime . strptime ( row [ 2 ] , " % Y- % m- %d " ) . strftime ( " % Y- % m- %d T00:00:00.000Z " ) for row in records [ 1 : ] if row [ 0 ] == patient_fio ]
print ( birthday_users )
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 [ 0 ] if birthday_users else None
}
print ( payload )
headers = { " User-Agent " : " Mozilla/5.0 " , " Content-Type " : " application/json " }
url = " http://192.168.1.10:8081/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- %d T % H: % M: % S. %f Z " ) . strftime ( " % Y- % m- %d " )
if result . get ( " pct_birthday " ) else " " )
formatted_birthdate = (
datetime . strptime ( result . get ( " pct_birthday " , " " ) , " % Y- % m- %d T % H: % M: % S. %f Z " ) . strftime ( " %d . % m. % Y " )
if result . get ( " pct_birthday " ) else " " )
formatted_passport_date = (
datetime . strptime ( result . get ( " pct_doc_date " , " " ) , " % Y- % m- %d T % H: % M: % S. %f Z " ) . strftime ( " %d . % m. % Y " )
if result . get ( " pct_doc_date " ) else " " )
return jsonify (
user_id = user_id ,
fio = patient_fio ,
server_data = result ,
formatted_birthdate = formatted_birthdate ,
js_formatted_birthdate = js_formatted_birthdate ,
formatted_passport_date = 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- %d T % 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- %d T % 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:8081/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
@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 ( ' /fns ' )
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