atendimentos.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import { apiFetch, apiBaseUrl, fetchAutenticado } from "./client.js";
  2. import { baixarBlob } from "../utils/download.js";
  3. export function sincronizarAtendimentos(params = {}) {
  4. return apiFetch("/api/atendimentos/sync", { method: "POST", body: params });
  5. }
  6. export function sincronizarTodosAtendimentos(params = {}) {
  7. return apiFetch("/api/atendimentos/sync-all", { method: "POST", body: params });
  8. }
  9. export function obterAtendimento(id) {
  10. return apiFetch(`/api/atendimentos/${id}`);
  11. }
  12. export function sincronizarAtendimento(id) {
  13. return apiFetch(`/api/atendimentos/${id}/sync`, { method: "POST", body: {} });
  14. }
  15. export function avaliarAtendimentosPendentes(params = {}) {
  16. return apiFetch("/api/atendimentos/avaliar", { method: "POST", body: params });
  17. }
  18. export function avaliarAtendimento(id) {
  19. return apiFetch(`/api/atendimentos/${id}/avaliar`, { method: "POST", body: {} });
  20. }
  21. export function listarAvaliacoes({ page = 1, pageSize = 20, setor, resolvido, sentimento, statusCancelamento, scoreMax, busca, ordenacao, dataInicio, dataFim } = {}) {
  22. const query = new URLSearchParams({ page: String(page), pageSize: String(pageSize) });
  23. if (setor) query.set("setor", setor);
  24. if (resolvido) query.set("resolvido", resolvido);
  25. if (sentimento) query.set("sentimento", sentimento);
  26. if (statusCancelamento) query.set("statusCancelamento", statusCancelamento);
  27. if (scoreMax !== undefined) query.set("scoreMax", String(scoreMax));
  28. if (busca) query.set("busca", busca);
  29. if (ordenacao === "asc") query.set("ordenacao", ordenacao);
  30. if (dataInicio) query.set("dataInicio", dataInicio);
  31. if (dataFim) query.set("dataFim", dataFim);
  32. return apiFetch(`/api/atendimentos/avaliacoes?${query.toString()}`);
  33. }
  34. export function estatisticasAvaliacoes({ setor, resolvido, sentimento, statusCancelamento, busca, dataInicio, dataFim } = {}) {
  35. const query = new URLSearchParams();
  36. if (setor) query.set("setor", setor);
  37. if (resolvido) query.set("resolvido", resolvido);
  38. if (sentimento) query.set("sentimento", sentimento);
  39. if (statusCancelamento) query.set("statusCancelamento", statusCancelamento);
  40. if (busca) query.set("busca", busca);
  41. if (dataInicio) query.set("dataInicio", dataInicio);
  42. if (dataFim) query.set("dataFim", dataFim);
  43. const qs = query.toString();
  44. return apiFetch(`/api/atendimentos/avaliacoes/estatisticas${qs ? `?${qs}` : ""}`);
  45. }
  46. export function listarSetoresAvaliacoes() {
  47. return apiFetch("/api/atendimentos/avaliacoes/setores");
  48. }
  49. export function listarGoldenSet({ status, setor } = {}) {
  50. const query = new URLSearchParams();
  51. if (status) query.set("status", status);
  52. if (setor) query.set("setor", setor);
  53. const qs = query.toString();
  54. return apiFetch(`/api/atendimentos/golden-set${qs ? `?${qs}` : ""}`);
  55. }
  56. export function salvarGoldenLabel(id, dados) {
  57. return apiFetch(`/api/atendimentos/${id}/golden-label`, { method: "PATCH", body: dados });
  58. }
  59. export function aceitarGoldenLabelComoIa(id) {
  60. return apiFetch(`/api/atendimentos/${id}/golden-label/aceitar`, { method: "POST" });
  61. }
  62. export async function baixarRelatorioNaoResolvidos({ setor, sentimento, busca, ordenacao, dataInicio, dataFim } = {}) {
  63. const query = new URLSearchParams();
  64. if (setor) query.set("setor", setor);
  65. if (sentimento) query.set("sentimento", sentimento);
  66. if (busca) query.set("busca", busca);
  67. if (ordenacao === "asc") query.set("ordenacao", ordenacao);
  68. if (dataInicio) query.set("dataInicio", dataInicio);
  69. if (dataFim) query.set("dataFim", dataFim);
  70. const reqUrl = `${apiBaseUrl}/api/atendimentos/avaliacoes/relatorio?${query.toString()}`;
  71. const res = await fetchAutenticado(reqUrl);
  72. if (!res.ok) {
  73. const text = await res.text().catch(() => "");
  74. let payload = null;
  75. try { payload = JSON.parse(text); } catch {}
  76. if (payload?.error === "relatorio_muito_grande") {
  77. throw new Error(`Muitos atendimentos para gerar o relatório (limite: ${payload.limite}). ${payload.dica ?? "Estreite o período ou os filtros."}`);
  78. }
  79. throw new Error(payload?.error || text || `http_error:${res.status}`);
  80. }
  81. baixarBlob(await res.blob(), `atendimentos-nao-resolvidos-${new Date().toISOString().slice(0, 10)}.pdf`);
  82. }