| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -49,7 +49,6 @@ SPREADSHEET_ID = '1j12H6NCZec9MEWQypPbzhETNtn58fnin1HBRkkr3a1w' | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					SHEET_NAME_GROUPS = 'Лист2' | 
					 | 
					 | 
					 | 
					SHEET_NAME_GROUPS = 'Лист2' | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					SHEET_NAME_EMPLOYEES = 'Лист1' | 
					 | 
					 | 
					 | 
					SHEET_NAME_EMPLOYEES = 'Лист1' | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					RANGE_NAME = 'Лист1!A1:O'  # Диапазон данных в таблице | 
					 | 
					 | 
					 | 
					RANGE_NAME = 'Лист1!A1:O'  # Диапазон данных в таблице | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					CHAT_IDS = [-1002306913175, -1002266505101]  # Замените на ID чатов, где бот администратор | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					# Логирование | 
					 | 
					 | 
					 | 
					# Логирование | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					logging.basicConfig(level=logging.INFO) | 
					 | 
					 | 
					 | 
					logging.basicConfig(level=logging.INFO) | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -97,9 +96,21 @@ SPREADSHEET_NAME = "Корпоративные группы Клиники в Т | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					def load_changes(): | 
					 | 
					 | 
					 | 
					def load_changes(): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    """Считываем данные из файла changes.json.""" | 
					 | 
					 | 
					 | 
					    file_path = r"C:\Users\ilyac\PycharmProjects\Bot_for_clinic\sheets_backup\changes.json"  # Укажите ваш путь к JSON-файлу | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    with open(CHANGES_FILE, "r", encoding="utf-8") as f: | 
					 | 
					 | 
					 | 
					    if not os.path.exists(file_path): | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        return json.load(f) | 
					 | 
					 | 
					 | 
					        raise FileNotFoundError(f"Файл {file_path} не найден.") | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    with open(file_path, 'r', encoding='utf-8') as f: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        content = f.read().strip()  # Читаем и удаляем лишние пробелы | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        if not content: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            raise ValueError(f"Файл {file_path} пуст.") | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        try: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            return json.loads(content)  # Используем json.loads для строки | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        except json.JSONDecodeError as e: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            raise ValueError(f"Ошибка декодирования JSON в файле {file_path}: {e}") | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					def get_sheet_data2(sheet_name): | 
					 | 
					 | 
					 | 
					def get_sheet_data2(sheet_name): | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -601,54 +612,48 @@ gc = gspread.service_account(filename=SERVICE_ACCOUNT_FILE) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					sheet = gc.open_by_key(SPREADSHEET_ID).sheet1  # Открываем первую таблицу | 
					 | 
					 | 
					 | 
					sheet = gc.open_by_key(SPREADSHEET_ID).sheet1  # Открываем первую таблицу | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					@dp.message_handler(commands=['kick'], chat_type=types.ChatType.PRIVATE) | 
					 | 
					 | 
					 | 
					@dp.message_handler(commands=['kick']) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					async def kick_user(message: types.Message): | 
					 | 
					 | 
					 | 
					async def kick_employee(message: types.Message): | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if message.from_user.id != ADMIN_ID: | 
					 | 
					 | 
					 | 
					    args = message.get_args() | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        await message.answer("Эта команда доступна только администратору бота.") | 
					 | 
					 | 
					 | 
					    if not args: | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        await message.reply("Введите ФИО сотрудника после команды /kick.") | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        return | 
					 | 
					 | 
					 | 
					        return | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    # Получаем ФИО из сообщения | 
					 | 
					 | 
					 | 
					    full_name = args.strip() | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    full_name = message.get_args().strip() | 
					 | 
					 | 
					 | 
					    employees_data = get_sheet_data1("Лист1") | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if not full_name: | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        await message.answer("Пожалуйста, укажите ФИО пользователя для кика.") | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        return | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    # Поиск ID пользователя по ФИО в Google Таблице | 
					 | 
					 | 
					 | 
					    if len(employees_data) < 2: | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    try: | 
					 | 
					 | 
					 | 
					        await message.reply("Данные о сотрудниках отсутствуют.") | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        data = sheet.get_all_values()  # Получаем все значения в таблице | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    except Exception as e: | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        await message.answer("Не удалось получить данные из таблицы.") | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        return | 
					 | 
					 | 
					 | 
					        return | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    user_id = None | 
					 | 
					 | 
					 | 
					    employee_id = None | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    for row in data: | 
					 | 
					 | 
					 | 
					    for row in employees_data[1:]:  # Пропускаем заголовок | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        if row and row[0] == full_name:  # ФИО в первом столбце | 
					 | 
					 | 
					 | 
					        if len(row) >= 14 and row[0].strip().lower() == full_name.lower(): | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            user_id = row[13]  # ID в 14-м столбце (индекс 13) | 
					 | 
					 | 
					 | 
					            employee_id = row[13] | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            break | 
					 | 
					 | 
					 | 
					            break | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if user_id is None: | 
					 | 
					 | 
					 | 
					    if not employee_id: | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        await message.answer(f"Пользователь с ФИО '{full_name}' не найден в таблице.") | 
					 | 
					 | 
					 | 
					        await message.reply("Сотрудник не найден в базе.") | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        return | 
					 | 
					 | 
					 | 
					        return | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    errors = []  # Список для хранения ошибок | 
					 | 
					 | 
					 | 
					    # Получаем список ID групп из Лист2 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    for chat_id in CHAT_IDS: | 
					 | 
					 | 
					 | 
					    chat_ids = get_sheet_data("Лист2") | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    if not chat_ids or not chat_ids[0]: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        await message.reply("Список групп для удаления не найден.") | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        return | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    kicked_from = [] | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    for chat_id in chat_ids[0]:  # Берем ID групп из первой строки | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        try: | 
					 | 
					 | 
					 | 
					        try: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            await bot.kick_chat_member(chat_id, user_id) | 
					 | 
					 | 
					 | 
					            await bot.kick_chat_member(chat_id, employee_id) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        except BadRequest as e: | 
					 | 
					 | 
					 | 
					            kicked_from.append(chat_id) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            errors.append(f"Ошибка в чате {chat_id}: {e}") | 
					 | 
					 | 
					 | 
					        except Exception as e: | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            print(f"Ошибка при исключении из {chat_id}: {e}") | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    # Отправляем сообщение админу один раз | 
					 | 
					 | 
					 | 
					    if kicked_from: | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if errors: | 
					 | 
					 | 
					 | 
					        await message.reply(f"Сотрудник {full_name} исключен из {len(kicked_from)} групп.") | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        await bot.send_message( | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            ADMIN_ID, | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            f"Пользователь с ID {user_id} был исключён из чатов, " | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            f"но произошли ошибки: {'; '.join(errors)}" | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        ) | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    else: | 
					 | 
					 | 
					 | 
					    else: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        await bot.send_message(ADMIN_ID, f"Пользователь с ID {user_id} был исключён из всех чатов.") | 
					 | 
					 | 
					 | 
					        await message.reply("Не удалось исключить сотрудника.") | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    await message.answer(f"Команда на кик пользователя с ФИО '{full_name}' отправлена во все чаты.") | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					def get_registration_button(): | 
					 | 
					 | 
					 | 
					def get_registration_button(): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    keyboard = ReplyKeyboardMarkup(resize_keyboard=True) | 
					 | 
					 | 
					 | 
					    keyboard = ReplyKeyboardMarkup(resize_keyboard=True) | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -669,7 +674,7 @@ def get_consent_keyboard(): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					# Получение данных из Google Таблицы | 
					 | 
					 | 
					 | 
					# Получение данных из Google Таблицы | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					def get_sheet_data(sheet_name): | 
					 | 
					 | 
					 | 
					def get_sheet_data(sheet_name): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    range_name = f"{sheet_name}!B1:C3"  # Диапазон для строки с chat_id и группами | 
					 | 
					 | 
					 | 
					    range_name = f"{sheet_name}!B1:AE3"  # Диапазон для строки с chat_id и группами | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    result = service.spreadsheets().values().get( | 
					 | 
					 | 
					 | 
					    result = service.spreadsheets().values().get( | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        spreadsheetId=SPREADSHEET_ID, | 
					 | 
					 | 
					 | 
					        spreadsheetId=SPREADSHEET_ID, | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        range=range_name | 
					 | 
					 | 
					 | 
					        range=range_name | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -679,7 +684,7 @@ def get_sheet_data(sheet_name): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					# Получение данных из Google Таблицы | 
					 | 
					 | 
					 | 
					# Получение данных из Google Таблицы | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					def get_sheet_data1(sheet_name): | 
					 | 
					 | 
					 | 
					def get_sheet_data1(sheet_name): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    range_name = f"{sheet_name}!A1:P100"  # Диапазон для строки с chat_id и группами | 
					 | 
					 | 
					 | 
					    range_name = f"{sheet_name}!A1:Q200"  # Диапазон для строки с chat_id и группами | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    result = service.spreadsheets().values().get( | 
					 | 
					 | 
					 | 
					    result = service.spreadsheets().values().get( | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        spreadsheetId=SPREADSHEET_ID, | 
					 | 
					 | 
					 | 
					        spreadsheetId=SPREADSHEET_ID, | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        range=range_name | 
					 | 
					 | 
					 | 
					        range=range_name | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
  |