|
@@ -1,8 +1,41 @@
|
|
|
<template>
|
|
<template>
|
|
|
<div class="parceiros-page">
|
|
<div class="parceiros-page">
|
|
|
|
|
+ <input
|
|
|
|
|
+ ref="importParceiroInput"
|
|
|
|
|
+ type="file"
|
|
|
|
|
+ accept=".xlsx"
|
|
|
|
|
+ class="hidden"
|
|
|
|
|
+ @change="onParceiroFileSelected"
|
|
|
|
|
+ />
|
|
|
|
|
+ <input
|
|
|
|
|
+ ref="importConveniosInput"
|
|
|
|
|
+ type="file"
|
|
|
|
|
+ accept=".xlsx"
|
|
|
|
|
+ class="hidden"
|
|
|
|
|
+ @change="onConveniosFileSelected"
|
|
|
|
|
+ />
|
|
|
|
|
+
|
|
|
<DefaultHeaderPage>
|
|
<DefaultHeaderPage>
|
|
|
<template #after>
|
|
<template #after>
|
|
|
<div v-if="isAdministrador" class="flex gap-sm q-mt-md">
|
|
<div v-if="isAdministrador" class="flex gap-sm q-mt-md">
|
|
|
|
|
+ <q-btn
|
|
|
|
|
+ unelevated
|
|
|
|
|
+ class="btn-gradient"
|
|
|
|
|
+ :label="$t('parceiro.import_parceiros')"
|
|
|
|
|
+ icon="mdi-upload"
|
|
|
|
|
+ padding="8px 12px"
|
|
|
|
|
+ :loading="importingParceiros"
|
|
|
|
|
+ @click="onImportParceirosClick"
|
|
|
|
|
+ />
|
|
|
|
|
+ <q-btn
|
|
|
|
|
+ unelevated
|
|
|
|
|
+ class="btn-gradient"
|
|
|
|
|
+ :label="$t('parceiro.import_convenios')"
|
|
|
|
|
+ icon="mdi-hospital-box"
|
|
|
|
|
+ padding="8px 12px"
|
|
|
|
|
+ :loading="importingConvenios"
|
|
|
|
|
+ @click="onImportConveniosClick"
|
|
|
|
|
+ />
|
|
|
<q-btn
|
|
<q-btn
|
|
|
unelevated
|
|
unelevated
|
|
|
class="btn-gradient"
|
|
class="btn-gradient"
|
|
@@ -74,13 +107,13 @@
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script setup>
|
|
<script setup>
|
|
|
-import { ref, computed, onMounted } from "vue";
|
|
|
|
|
|
|
+import { ref, computed, onMounted, useTemplateRef } from "vue";
|
|
|
import { useRouter } from "vue-router";
|
|
import { useRouter } from "vue-router";
|
|
|
import { useQuasar } from "quasar";
|
|
import { useQuasar } from "quasar";
|
|
|
import { useI18n } from "vue-i18n";
|
|
import { useI18n } from "vue-i18n";
|
|
|
import { permissionStore } from "src/stores/permission";
|
|
import { permissionStore } from "src/stores/permission";
|
|
|
import { userStore } from "src/stores/user";
|
|
import { userStore } from "src/stores/user";
|
|
|
-import { getPartnerAgreements } from "src/api/partnerAgreement";
|
|
|
|
|
|
|
+import { getPartnerAgreements, importParceiros, importConveniosMedicos } from "src/api/partnerAgreement";
|
|
|
import { getCategories } from "src/api/category";
|
|
import { getCategories } from "src/api/category";
|
|
|
import { normalizeString } from "src/helpers/utils";
|
|
import { normalizeString } from "src/helpers/utils";
|
|
|
import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
|
|
import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
|
|
@@ -97,6 +130,10 @@ const allPartners = ref([]);
|
|
|
const categories = ref([]);
|
|
const categories = ref([]);
|
|
|
const activeCategory = ref("all");
|
|
const activeCategory = ref("all");
|
|
|
const searchQuery = ref("");
|
|
const searchQuery = ref("");
|
|
|
|
|
+const importingParceiros = ref(false);
|
|
|
|
|
+const importingConvenios = ref(false);
|
|
|
|
|
+const importParceiroInput = useTemplateRef("importParceiroInput");
|
|
|
|
|
+const importConveniosInput = useTemplateRef("importConveniosInput");
|
|
|
|
|
|
|
|
const filteredPartners = computed(() => {
|
|
const filteredPartners = computed(() => {
|
|
|
let list = allPartners.value;
|
|
let list = allPartners.value;
|
|
@@ -132,14 +169,84 @@ const onEditItem = (partner) => {
|
|
|
router.push({ name: "ParceiroCadastroPage", params: { id: partner.id } });
|
|
router.push({ name: "ParceiroCadastroPage", params: { id: partner.id } });
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
+const loadPartners = async () => {
|
|
|
|
|
+ const [partners, cats] = await Promise.all([
|
|
|
|
|
+ getPartnerAgreements(),
|
|
|
|
|
+ getCategories("partner"),
|
|
|
|
|
+ ]);
|
|
|
|
|
+ allPartners.value = partners;
|
|
|
|
|
+ categories.value = cats;
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+const onImportParceirosClick = () => {
|
|
|
|
|
+ if (!permission_store.getAccess("parceiro.convenio", "add")) {
|
|
|
|
|
+ $q.notify({ type: "negative", message: t("validation.permissions.add") });
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ importParceiroInput.value.value = null;
|
|
|
|
|
+ importParceiroInput.value.click();
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+const onImportConveniosClick = () => {
|
|
|
|
|
+ if (!permission_store.getAccess("parceiro.convenio", "add")) {
|
|
|
|
|
+ $q.notify({ type: "negative", message: t("validation.permissions.add") });
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ importConveniosInput.value.value = null;
|
|
|
|
|
+ importConveniosInput.value.click();
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+const onParceiroFileSelected = async (event) => {
|
|
|
|
|
+ const file = event.target.files?.[0];
|
|
|
|
|
+ if (!file) return;
|
|
|
|
|
+
|
|
|
|
|
+ importingParceiros.value = true;
|
|
|
|
|
+ try {
|
|
|
|
|
+ const stats = await importParceiros(file);
|
|
|
|
|
+ $q.notify({
|
|
|
|
|
+ type: "positive",
|
|
|
|
|
+ message: t("parceiro.import_parceiros_result", {
|
|
|
|
|
+ created: stats.created,
|
|
|
|
|
+ updated: stats.updated,
|
|
|
|
|
+ inactivated: stats.inactivated,
|
|
|
|
|
+ }),
|
|
|
|
|
+ timeout: 7000,
|
|
|
|
|
+ });
|
|
|
|
|
+ await loadPartners();
|
|
|
|
|
+ } catch {
|
|
|
|
|
+ $q.notify({ type: "negative", message: t("http.errors.failed") });
|
|
|
|
|
+ } finally {
|
|
|
|
|
+ importingParceiros.value = false;
|
|
|
|
|
+ }
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+const onConveniosFileSelected = async (event) => {
|
|
|
|
|
+ const file = event.target.files?.[0];
|
|
|
|
|
+ if (!file) return;
|
|
|
|
|
+
|
|
|
|
|
+ importingConvenios.value = true;
|
|
|
|
|
+ try {
|
|
|
|
|
+ const stats = await importConveniosMedicos(file);
|
|
|
|
|
+ $q.notify({
|
|
|
|
|
+ type: "positive",
|
|
|
|
|
+ message: t("parceiro.import_convenios_result", {
|
|
|
|
|
+ partners_created: stats.partners_created,
|
|
|
|
|
+ services_created: stats.services_created,
|
|
|
|
|
+ partners_inactivated: stats.partners_inactivated,
|
|
|
|
|
+ }),
|
|
|
|
|
+ timeout: 7000,
|
|
|
|
|
+ });
|
|
|
|
|
+ await loadPartners();
|
|
|
|
|
+ } catch {
|
|
|
|
|
+ $q.notify({ type: "negative", message: t("http.errors.failed") });
|
|
|
|
|
+ } finally {
|
|
|
|
|
+ importingConvenios.value = false;
|
|
|
|
|
+ }
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
onMounted(async () => {
|
|
onMounted(async () => {
|
|
|
try {
|
|
try {
|
|
|
- const [partners, cats] = await Promise.all([
|
|
|
|
|
- getPartnerAgreements(),
|
|
|
|
|
- getCategories("partner"),
|
|
|
|
|
- ]);
|
|
|
|
|
- allPartners.value = partners;
|
|
|
|
|
- categories.value = cats;
|
|
|
|
|
|
|
+ await loadPartners();
|
|
|
} finally {
|
|
} finally {
|
|
|
loading.value = false;
|
|
loading.value = false;
|
|
|
}
|
|
}
|