118 lines
5.0 KiB
Python
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
|
|
|
|
|