Quellcode durchsuchen

tela de logs de importacoes

Gustavo Zanatta vor 1 Monat
Ursprung
Commit
7265f1b98b

+ 6 - 0
src/api/importLog.js

@@ -0,0 +1,6 @@
+import api from "src/api";
+
+export const getImportLogsPaginated = async ({ page = 1, perPage = 10, type } = {}) => {
+  const { data } = await api.get(`/import-logs/${type}`, { params: { page, per_page: perPage } });
+  return { data: { result: data.payload } };
+};

+ 74 - 0
src/components/ImportHistoryDialog.vue

@@ -0,0 +1,74 @@
+<template>
+  <q-dialog ref="dialogRef" @hide="onDialogHide">
+    <q-card style="min-width: 800px; max-width: 95vw">
+      <DefaultDialogHeader
+        :title="() => $t('import_log.history_title')"
+        icon="mdi-clock-outline"
+        @close="onDialogCancel"
+      />
+
+      <q-separator />
+
+      <q-card-section class="q-pa-none">
+        <DefaultTableServerSide
+          :columns="columns"
+          :api-call="apiCall"
+          :add-item="false"
+          :show-search-field="false"
+        >
+          <template #body-cell-imported_at="{ row }">
+            <q-td>{{ formatDateTime(row.imported_at) }}</q-td>
+          </template>
+
+          <template #body-cell-user="{ row }">
+            <q-td>{{ row.user?.name ?? '—' }}</q-td>
+          </template>
+        </DefaultTableServerSide>
+      </q-card-section>
+    </q-card>
+  </q-dialog>
+</template>
+
+<script setup>
+import { useDialogPluginComponent } from "quasar";
+import { useI18n } from "vue-i18n";
+import DefaultDialogHeader from "src/components/defaults/DefaultDialogHeader.vue";
+import DefaultTableServerSide from "src/components/defaults/DefaultTableServerSide.vue";
+import { getImportLogsPaginated } from "src/api/importLog";
+
+const props = defineProps({
+  type: {
+    type: String,
+    required: true,
+  },
+});
+
+defineEmits([...useDialogPluginComponent.emits]);
+
+const { t } = useI18n();
+const { dialogRef, onDialogHide, onDialogCancel } = useDialogPluginComponent();
+
+const columns = [
+  { name: "imported_at", label: t("import_log.date_time"),   field: "imported_at", align: "left",   sortable: false },
+  { name: "user",        label: t("import_log.imported_by"), field: "user",        align: "left",   sortable: false },
+  { name: "total",       label: t("import_log.total"),       field: "total",       align: "center", sortable: false },
+  { name: "created",     label: t("import_log.created"),     field: "created",     align: "center", sortable: false },
+  { name: "updated",     label: t("import_log.updated"),     field: "updated",     align: "center", sortable: false },
+  { name: "inactivated", label: t("import_log.inactivated"), field: "inactivated", align: "center", sortable: false },
+];
+
+const apiCall = (params) => getImportLogsPaginated({ ...params, type: props.type });
+
+const formatDateTime = (isoString) => {
+  if (!isoString) return "—";
+  const d = new Date(isoString);
+  return d.toLocaleString("pt-BR", {
+    day: "2-digit",
+    month: "2-digit",
+    year: "numeric",
+    hour: "2-digit",
+    minute: "2-digit",
+    second: "2-digit",
+  });
+};
+</script>

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

@@ -718,5 +718,15 @@
       "cadastro": "Registration",
       "exclusao": "Exclusion"
     }
+  },
+  "import_log": {
+    "history_title": "Import History",
+    "date_time":     "Date/Time",
+    "imported_by":   "Imported by",
+    "total":         "Total",
+    "created":       "New",
+    "updated":       "Updated",
+    "inactivated":   "Inactivated",
+    "no_history":    "No imports recorded"
   }
 }

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

@@ -718,5 +718,15 @@
       "cadastro": "Registro",
       "exclusao": "Exclusión"
     }
+  },
+  "import_log": {
+    "history_title": "Historial de Importaciones",
+    "date_time":     "Fecha/Hora",
+    "imported_by":   "Importado por",
+    "total":         "Total",
+    "created":       "Nuevos",
+    "updated":       "Actualizados",
+    "inactivated":   "Desactivados",
+    "no_history":    "Ninguna importación registrada"
   }
 }

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

@@ -719,5 +719,15 @@
       "cadastro": "Cadastro",
       "exclusao": "Exclusão"
     }
+  },
+  "import_log": {
+    "history_title": "Histórico de Importações",
+    "date_time":     "Data/Hora",
+    "imported_by":   "Importado por",
+    "total":         "Total",
+    "created":       "Novos",
+    "updated":       "Atualizados",
+    "inactivated":   "Desativados",
+    "no_history":    "Nenhuma importação registrada"
   }
 }

+ 15 - 0
src/pages/gestao-associados/GestaoAssociadosPage.vue

@@ -27,6 +27,14 @@
             :loading="importing"
             @click="onImportClick"
           />
+          <q-btn
+            unelevated
+            class="btn-gradient"
+            icon="mdi-clock-outline"
+            padding="8px 12px"
+            :title="$t('import_log.history_title')"
+            @click="onOpenImportHistory"
+          />
           <q-btn
             unelevated
             class="btn-gradient"
@@ -94,6 +102,9 @@ import AccessLogsTable from "./components/AccessLogsTable.vue";
 const AddEditAssociadoDialog = defineAsyncComponent(
   () => import("./components/AddEditAssociadoDialog.vue"),
 );
+const ImportHistoryDialog = defineAsyncComponent(
+  () => import("src/components/ImportHistoryDialog.vue"),
+);
 
 const permission_store = permissionStore();
 const $q = useQuasar();
@@ -208,6 +219,10 @@ const onSetOnLeave = (row) => {
   });
 };
 
+const onOpenImportHistory = () => {
+  $q.dialog({ component: ImportHistoryDialog, componentProps: { type: 'associado' } });
+};
+
 const onImportClick = () => {
   if (!permission_store.getAccess("associado", "add")) {
     $q.notify({ type: "negative", message: t("validation.permissions.add") });

+ 17 - 1
src/pages/parceiros-convenios/ConveniosMedicosPage.vue

@@ -20,6 +20,14 @@
             :loading="importingConvenios"
             @click="onImportConveniosClick"
           />
+          <q-btn
+            unelevated
+            class="btn-gradient"
+            icon="mdi-clock-outline"
+            padding="8px 12px"
+            :title="$t('import_log.history_title')"
+            @click="onOpenImportHistory"
+          />
           <q-btn
             unelevated
             class="btn-gradient"
@@ -90,7 +98,7 @@
 </template>
 
 <script setup>
-import { ref, computed, onMounted, useTemplateRef } from "vue";
+import { ref, computed, onMounted, useTemplateRef, defineAsyncComponent } from "vue";
 import { useRouter } from "vue-router";
 import { useQuasar } from "quasar";
 import { useI18n } from "vue-i18n";
@@ -103,6 +111,10 @@ import { useImportPoller } from "src/composables/useImportPoller";
 import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
 import PartnerAgreementCard from "./components/PartnerAgreementCard.vue";
 
+const ImportHistoryDialog = defineAsyncComponent(
+  () => import("src/components/ImportHistoryDialog.vue"),
+);
+
 const router = useRouter();
 const $q    = useQuasar();
 const { t } = useI18n();
@@ -157,6 +169,10 @@ const loadItems = async () => {
   categories.value  = cats;
 };
 
+const onOpenImportHistory = () => {
+  $q.dialog({ component: ImportHistoryDialog, componentProps: { type: 'convenio' } });
+};
+
 const onImportConveniosClick = () => {
   if (!permission_store.getAccess("parceiro.convenio", "add")) {
     $q.notify({ type: "negative", message: t("validation.permissions.add") });

+ 17 - 1
src/pages/parceiros-convenios/ParceirosConveniosPage.vue

@@ -20,6 +20,14 @@
             :loading="importingParceiros"
             @click="onImportParceirosClick"
           />
+          <q-btn
+            unelevated
+            class="btn-gradient"
+            icon="mdi-clock-outline"
+            padding="8px 12px"
+            :title="$t('import_log.history_title')"
+            @click="onOpenImportHistory"
+          />
           <q-btn
             unelevated
             class="btn-gradient"
@@ -90,7 +98,7 @@
 </template>
 
 <script setup>
-import { ref, computed, onMounted, useTemplateRef } from "vue";
+import { ref, computed, onMounted, useTemplateRef, defineAsyncComponent } from "vue";
 import { useRouter } from "vue-router";
 import { useQuasar } from "quasar";
 import { useI18n } from "vue-i18n";
@@ -100,6 +108,10 @@ import { getPartnerAgreements, importParceiros } from "src/api/partnerAgreement"
 import { getCategories } from "src/api/category";
 import { normalizeString } from "src/helpers/utils";
 import { useImportPoller } from "src/composables/useImportPoller";
+
+const ImportHistoryDialog = defineAsyncComponent(
+  () => import("src/components/ImportHistoryDialog.vue"),
+);
 import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
 import PartnerAgreementCard from "./components/PartnerAgreementCard.vue";
 
@@ -157,6 +169,10 @@ const loadPartners = async () => {
   categories.value  = cats;
 };
 
+const onOpenImportHistory = () => {
+  $q.dialog({ component: ImportHistoryDialog, componentProps: { type: 'parceiro' } });
+};
+
 const onImportParceirosClick = () => {
   if (!permission_store.getAccess("parceiro.convenio", "add")) {
     $q.notify({ type: "negative", message: t("validation.permissions.add") });