@ -6,6 +6,8 @@ from oauth2client.service_account import ServiceAccountCredentials
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					import  json  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					import  datetime  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					from  config  import  config  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					import  requests  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					# Авторизация Google API  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					def  authorize_google ( ) :  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -18,27 +20,172 @@ def authorize_google():
					 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    client  =  gspread . authorize ( creds )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    return  client   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					def  find_patients ( data ) :  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    """   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    Поиск  пациента  в  таблице  по  данным .   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    """   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    sheet  =  authorize_google ( ) . open ( " Пациенты клиники " ) . sheet1   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    records  =  sheet . get_all_records ( )   # Получаем все строки таблицы   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    for  i ,  record  in  enumerate ( records ,  start = 2 ) :   # Нумерация строк Google Таблицы начинается с 2   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        try :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            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 )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    # {'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 Sheets   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        # Поиск пациента   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        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 )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    print ( " Полученные данные: " ,  raw_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://46.146.229.242:1980/AppFindPac " ,  headers = HEADER ,  json = data )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        if  response . status_code  ==  200 :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            result  =  response . json ( )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            print ( " Результат JSON: " ,  result )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            if  result . get ( ' ok ' ) :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                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 } )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        json_data  =  response . json ( )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        verification_code  =  None   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        current_time  =  datetime . 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 " )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            # Записываем данные и код верификации в таблицу   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            sheet . append_row ( [   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        data [ ' fio ' ] ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        data [ ' tel ' ] ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        data [ ' dob ' ] ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        data [ ' user_id ' ] ,         # Записываем Telegram ID пользователя   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        data [ ' current_time ' ]             # Записываем время отправки данных   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                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 " :  " Ошибка вызова через SMS.ru " } )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    except  Exception  as  e :   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        print ( f " Ошибка при обработке SMS верификации:  { e } " )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        return  jsonify ( { ' success ' :  False ,  " error " :  " Ошибка при обработке SMS верификации " } )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    return  jsonify ( { ' success ' : True } )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					@webApp . route ( ' / ' )