import requests import pytz from dotenv import load_dotenv from datetime import datetime, timedelta import logging from .auth import token_required # Importa a função de autenticação from flask import request, jsonify load_dotenv() base_url = "https://zammad.itguys.com.br/api/v1" zammad_token = "NDBGddnn7ntkHBZFGlo8mncxgBoLR6fkiLo1bF-GU4egE_n3fUU0-Dm2vW4iepJ_" # Token expira em 2065 # Mapeamento de domínio para organization_id DOMINIO_ORG_ID = { "esghl.local": [3], "oestepan.com.br": [7], "ivvcg.com.br": [6], "itguys.com.br": list(range(1,15)), "integramedbr.com.br": [9], "frc.com.br": [4], "grupopralog.com.br": [10], "zstation.com.br": [11], "ibap.org.br": [14] } @token_required def listar_tickets(data): """Lista os tickets filtrados pelo domínio do usuário autenticado.""" domain = data.get("domain") print(domain) if not domain: return {"error": "Domínio do usuário não encontrado no token"}, 403 organization_ids = DOMINIO_ORG_ID.get(domain) if not organization_ids: return {"error": "Domínio do usuário não possui organização associada"}, 403 tickets_filtrados = [] page = 1 per_page = 100 data_fim = datetime.now(pytz.timezone('America/Sao_Paulo')) # Horário atual com fuso horário de São Paulo data_inicio = data_fim - timedelta(days=30) logging.debug(f"Buscando tickets de {data_inicio} até {data_fim} para organizações {organization_ids}") brasil_tz = pytz.timezone('America/Sao_Paulo') while True: url = f"{base_url}/tickets?page={page}&per_page={per_page}&expand=true" headers = { "Authorization": f"Token token={zammad_token}", "Content-Type": "application/json" } response = requests.get(url, headers=headers, timeout=10) # Adicionando log para inspecionar a resposta logging.debug(f"Resposta da API para página {page}: {response.status_code}, Conteúdo: {response.text[:100]}...") # Log apenas os primeiros 100 caracteres para evitar longos logs if response.status_code == 200: try: tickets = response.json() # Tenta acessar o JSON da resposta except ValueError as e: logging.error(f"Erro ao converter resposta para JSON: {e}") return {"error": "Erro ao converter resposta para JSON"}, 500 if not tickets: logging.debug(f"Página {page} vazia, encerrando busca.") break for ticket in tickets: created_at_str = ticket.get("created_at") if created_at_str: try: created_at_dt = datetime.strptime(created_at_str, '%Y-%m-%dT%H:%M:%S.%fZ') except ValueError: created_at_dt = datetime.strptime(created_at_str, '%Y-%m-%dT%H:%M:%SZ') created_at_utc = pytz.utc.localize(created_at_dt) # Localiza como UTC created_at_brasil = created_at_utc.astimezone(brasil_tz) # Converte para o horário de Brasília # Filtra pelo intervalo de tempo e pela organização if data_inicio <= created_at_brasil <= data_fim and ticket.get("organization_id") in organization_ids: tickets_filtrados.append({ "title": ticket.get("title"), "type": ticket.get("type"), "created_by": ticket.get("created_by"), "created_id": ticket.get("created_id"), "created_at": created_at_brasil.strftime('%Y-%m-%d %H:%M:%S'), # Formata para string no horário de Brasília "close_at": ticket.get("close_at"), "priority": ticket.get("priority"), "state": ticket.get("state"), "state_id": ticket.get("state_id"), "pending_time": ticket.get("pending_time"), "number": ticket.get("number"), "organization_id": ticket.get("organization_id"), "customer_id": ticket.get("customer_id"), "customer": ticket.get("customer"), }) logging.debug(f"Página {page} processada, {len(tickets)} tickets retornados.") page += 1 else: logging.error(f"Erro ao buscar tickets na página {page}: {response.status_code}") return {"error": f"Erro ao buscar tickets: {response.status_code}", "details": response.text}, response.status_code logging.debug(f"Total de tickets filtrados nos últimos 30 dias: {len(tickets_filtrados)}") if tickets_filtrados: return tickets_filtrados, 200 # Retorna os tickets como uma lista else: return {"message": "Nenhum ticket encontrado nos últimos 30 dias."}, 405 # Mensagem de ausência de tickets