testes/app/routes/zammad.py

118 lines
5.0 KiB
Python

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