Browse Source

feat: ✨ feat (relatorio) novo relatorio de usos do convenio

foi criado o novo relatorio de usos do convenio, exportavel em excel

fase:dev | origin:escopo
Gustavo Zanatta 8 hours ago
parent
commit
4611d7a019

+ 8 - 0
src/api/relatorio.js

@@ -26,11 +26,19 @@ export const getExclusoesMesPaginated = async ({ page = 1, perPage = 10, filter
   return { data: { result: data.payload } };
 };
 
+export const getUsosConvenioPaginated = async ({ page = 1, perPage = 10, filter } = {}) => {
+  const params = { page, per_page: perPage };
+  if (filter) params.search = filter;
+  const { data } = await api.get("/relatorio/usos-convenio", { params });
+  return { data: { result: data.payload } };
+};
+
 export const exportRelatorio = async (tipo, search) => {
   const nomes = {
     "novos-associados": "novos_associados",
     "contatos-associados": "contatos_associados",
     "exclusoes-mes": "exclusoes_mes",
+    "usos-convenio": "usos_convenio",
   };
 
   const hoje = new Date();

+ 10 - 1
src/i18n/locales/en.json

@@ -807,9 +807,18 @@
     "novos_associados": "New Associates",
     "contatos": "Contacts",
     "exclusoes_mes": "Monthly Exclusions",
+    "usos_convenio": "Agreement Usage",
     "col": {
       "cadastro": "Registration",
-      "exclusao": "Exclusion"
+      "exclusao": "Exclusion",
+      "convenio": "Agreement",
+      "tipo": "Type",
+      "criacao_agendamento": "Appointment Created At",
+      "data_agendamento": "Appointment Date"
+    },
+    "tipo": {
+      "parceiro": "Partner",
+      "convenio_medico": "Medical Agreement"
     }
   },
   "import_log": {

+ 10 - 1
src/i18n/locales/es.json

@@ -807,9 +807,18 @@
     "novos_associados": "Nuevos Asociados",
     "contatos": "Contactos",
     "exclusoes_mes": "Exclusiones del Mes",
+    "usos_convenio": "Usos del Convenio",
     "col": {
       "cadastro": "Registro",
-      "exclusao": "Exclusión"
+      "exclusao": "Exclusión",
+      "convenio": "Convenio",
+      "tipo": "Tipo",
+      "criacao_agendamento": "Creación de la Cita",
+      "data_agendamento": "Fecha de la Cita"
+    },
+    "tipo": {
+      "parceiro": "Socio",
+      "convenio_medico": "Convenio Médico"
     }
   },
   "import_log": {

+ 10 - 1
src/i18n/locales/pt.json

@@ -808,9 +808,18 @@
     "novos_associados": "Novos Associados",
     "contatos": "Contatos",
     "exclusoes_mes": "Exclusões do Mês",
+    "usos_convenio": "Usos do Convênio",
     "col": {
       "cadastro": "Cadastro",
-      "exclusao": "Exclusão"
+      "exclusao": "Exclusão",
+      "convenio": "Convênio",
+      "tipo": "Tipo",
+      "criacao_agendamento": "Criação do Agendamento",
+      "data_agendamento": "Data do Agendamento"
+    },
+    "tipo": {
+      "parceiro": "Parceiro",
+      "convenio_medico": "Convênio Médico"
     }
   },
   "import_log": {

+ 69 - 1
src/pages/relatorios/RelatoriosPage.vue

@@ -65,6 +65,17 @@
         :show-search-field="true"
       />
     </div>
+
+    <div v-else-if="activeTab === 'usos-convenio'">
+      <DefaultTableServerSide
+        ref="tableRef"
+        :key="tableKey"
+        :columns="columnsUsosConvenio"
+        :api-call="getUsosConvenioPaginated"
+        :add-item="false"
+        :show-search-field="true"
+      />
+    </div>
   </div>
 </template>
 
@@ -79,6 +90,7 @@ import {
   getNovoAssociadosPaginated,
   getContatosAssociadosPaginated,
   getExclusoesMesPaginated,
+  getUsosConvenioPaginated,
   exportRelatorio,
 } from "src/api/relatorio.js";
 
@@ -93,6 +105,7 @@ const counters = ref({
   novos_associados: undefined,
   contatos: undefined,
   exclusoes_mes: undefined,
+  usos_convenio: undefined,
 });
 
 const tabs = computed(() => [
@@ -114,6 +127,12 @@ const tabs = computed(() => [
     icon: "mdi-account-remove-outline",
     counterKey: "exclusoes_mes",
   },
+  {
+    name: "usos-convenio",
+    label: t("relatorio.usos_convenio"),
+    icon: "mdi-calendar-check-outline",
+    counterKey: "usos_convenio",
+  },
 ]);
 
 const columnsNovosAssociados = computed(() => [
@@ -188,6 +207,54 @@ const columnsExclusoes = computed(() => [
   },
 ]);
 
+const columnsUsosConvenio = computed(() => [
+  {
+    name: "convenio",
+    label: t("relatorio.col.convenio"),
+    field: "convenio",
+    align: "left",
+    sortable: false,
+  },
+  {
+    name: "type",
+    label: t("relatorio.col.tipo"),
+    field: "type",
+    align: "left",
+    sortable: false,
+    format: (val) =>
+      val === "agreement" ? t("relatorio.tipo.convenio_medico") : t("relatorio.tipo.parceiro"),
+  },
+  {
+    name: "servico",
+    label: t("parceiro.service"),
+    field: "servico",
+    align: "left",
+    sortable: false,
+  },
+  {
+    name: "associado",
+    label: t("agendamento.associado"),
+    field: "associado",
+    align: "left",
+    sortable: false,
+  },
+  {
+    name: "criado_em",
+    label: t("relatorio.col.criacao_agendamento"),
+    field: "criado_em",
+    align: "left",
+    sortable: false,
+  },
+  {
+    name: "agendado_em",
+    label: t("relatorio.col.data_agendamento"),
+    field: "agendado_em",
+    align: "left",
+    sortable: false,
+    format: (val) => val || "—",
+  },
+]);
+
 const selectTab = (name) => {
   activeTab.value = name;
   tableKey.value++;
@@ -220,11 +287,12 @@ onMounted(async () => {
 
 .relatorio-tabs-row {
   display: flex;
+  flex-wrap: wrap;
   gap: 12px;
 }
 
 .relatorio-tab-card {
-  flex: 1;
+  flex: 1 1 200px;
   display: flex;
   align-items: center;
   gap: 12px;