from datetime import datetime import aiohttp # Для выполнения HTTP-запросов from loguru import logger async def get_user_teams(token): url = "https://api.otask.ru/api/v1/teams" headers = { "Authorization": f"Bearer {token}", "Content-Type": "application/json", "Accept": "application/json" } async with aiohttp.ClientSession() as session: async with session.get(url, headers=headers) as response: if response.status == 200: teams = await response.json() # logger.info(teams) slugs = [] for group in teams['data']['teams']: # logger.info(group) # logger.info(group['slug']) slugs.append(group['slug']) logger.info(slugs) return slugs else: print(f"Failed to get teams. Status code: {response.status}") return None async def get_client_name(token, ws_slug, client_id): """Получаем имя клиента по его идентификатору (client_id).""" url = f"https://api.otask.ru/api/v1/ws/{ws_slug}/clients" headers = { "Authorization": f"Bearer {token}", "Content-Type": "application/json", "Accept": "application/json", } async with aiohttp.ClientSession() as session: async with session.get(url, headers=headers) as response: if response.status == 200: data = await response.json() clients = data.get('data', {}).get('clients', []) # Ищем клиента по client_id в списке клиентов for client in clients: if client.get('id') == client_id: return client else: logger.error(f"Failed to get client info for workspace {ws_slug}. Status code: {response.status}") return None async def get_regular_projects(token): slugs = await get_user_teams(token) # Получаем все слуги команд пользователя regular_projects = [] # Список для хранения регулярных проектов for slug in slugs: url = f"https://api.otask.ru/api/v1/ws/{slug}/panel/projects" headers = { "Authorization": f"Bearer {token}", "Content-Type": "application/json", "Accept": "application/json", } params = { "is_regular": "true" } async with aiohttp.ClientSession() as session: async with session.get(url, headers=headers, params=params) as response: if response.status == 200: data = await response.json() # Получаем все проекты # Извлекаем проекты из ответа projects = data.get('data', {}).get('projects', []).get('data', []) for p in projects: if p['end_at'] is not None: end_at = datetime.fromisoformat(p['end_at'].replace("Z", "+00:00")) difference_in_days = end_at.date().day - datetime.utcnow().date().day if difference_in_days == 0: # Наступила дата платежа project_info = { 'name': p.get('name', 'Неизвестный проект'), 'amount': p.get('amount', 'Неизвестная сумма')} client_id = p.get('client_id','') if client_id: client = await get_client_name(token, slug, client_id) project_info['first_name'] = client.get('first_name', 'Неизвестный клиент') project_info["description"] = '' if client['description']: project_info["description"] = client["description"] regular_projects.append(project_info) else: pass # логика для регулярного проекта в котором нет даты платежа # Фильтруем регулярные проекты else: logger.error(f"Failed to get projects for workspace {slug}. Status code: {response.status}") return regular_projects