Parcourir la source

feat(student_contracts): adiciona funcionalidade de reativar contrato, e remove dialog anterior

ebagabee il y a 1 mois
Parent
commit
c60efca81a
2 fichiers modifiés avec 79 ajouts et 44 suppressions
  1. 12 2
      src/api/studentContract.js
  2. 67 42
      src/pages/students/tabs/ContractTab.vue

+ 12 - 2
src/api/studentContract.js

@@ -27,8 +27,18 @@ export const attachContractFile = async (id, formData) => {
   return data.payload;
 };
 
-export const updateContractStatus = async (id, status) => {
-  const { data } = await api.patch(`/student-contract/${id}/status`, { status });
+export const freezeContract = async (id) => {
+  const { data } = await api.post(`/student-contract/${id}/freeze`);
+  return data.payload;
+};
+
+export const cancelContract = async (id) => {
+  const { data } = await api.post(`/student-contract/${id}/cancel`);
+  return data.payload;
+};
+
+export const reactivateContract = async (id) => {
+  const { data } = await api.post(`/student-contract/${id}/reactivate`);
   return data.payload;
 };
 

+ 67 - 42
src/pages/students/tabs/ContractTab.vue

@@ -64,13 +64,31 @@
                   >
                     <q-item-section>Visualizar arquivo</q-item-section>
                   </q-item>
-                  <q-item
-                    v-close-popup
-                    clickable
-                    @click="handleContractActions(row)"
-                  >
-                    <q-item-section>Ações do Contrato</q-item-section>
-                  </q-item>
+                  <template v-if="row.status === 'frozen' || row.status === 'cancelled'">
+                    <q-item
+                      v-close-popup
+                      clickable
+                      @click="handleReactivate(row)"
+                    >
+                      <q-item-section>Reativar Contrato</q-item-section>
+                    </q-item>
+                  </template>
+                  <template v-else>
+                    <q-item
+                      v-close-popup
+                      clickable
+                      @click="handleFreeze(row)"
+                    >
+                      <q-item-section>Congelar Contrato</q-item-section>
+                    </q-item>
+                    <q-item
+                      v-close-popup
+                      clickable
+                      @click="handleCancel(row)"
+                    >
+                      <q-item-section>Cancelar Contrato</q-item-section>
+                    </q-item>
+                  </template>
                 </q-list>
               </q-menu>
             </q-btn>
@@ -86,12 +104,13 @@ import { ref, onMounted } from "vue";
 import { useQuasar } from "quasar";
 import DefaultTable from "src/components/defaults/DefaultTable.vue";
 import CreateContractDialog from "src/pages/students/components/CreateContractDialog.vue";
-import ContractActionsDialog from "src/pages/students/components/ContractActionsDialog.vue";
 import ContractActionConfirmDialog from "src/pages/students/components/ContractActionConfirmDialog.vue";
 import {
   getStudentContracts,
   attachContractFile,
-  updateContractStatus,
+  freezeContract,
+  cancelContract,
+  reactivateContract,
 } from "src/api/studentContract";
 
 const props = defineProps({
@@ -158,43 +177,49 @@ function openFile(url) {
   window.open(url, "_blank");
 }
 
-const actionLabels = {
-  frozen: {
-    title: "Congelar Contrato",
-    message:
-      "Você tem certeza que deseja CONGELAR este contrato? isso irá gerar multas e cancelamento da cobrança recorrente.",
-  },
-  cancelled: {
-    title: "Cancelar Contrato",
-    message:
-      "Você tem certeza que deseja CANCELAR este contrato? isso irá gerar multas e cancelamento da cobrança recorrente.",
-  },
-};
-
-function handleContractActions(contract) {
+function confirmAction(title, message, apiFn, contract) {
   $q.dialog({
-    component: ContractActionsDialog,
-  }).onOk((status) => {
-    const { title, message } = actionLabels[status];
-    $q.dialog({
-      component: ContractActionConfirmDialog,
-      componentProps: { title, message },
-    }).onOk(async () => {
-      try {
-        const updated = await updateContractStatus(contract.id, status);
-        const idx = rows.value.findIndex((r) => r.id === contract.id);
-        if (idx !== -1) rows.value[idx] = updated;
-      } catch (e) {
-        console.error(e);
-        $q.notify({
-          type: "negative",
-          message: "Erro ao atualizar status do contrato.",
-        });
-      }
-    });
+    component: ContractActionConfirmDialog,
+    componentProps: { title, message },
+  }).onOk(async () => {
+    try {
+      const updated = await apiFn(contract.id);
+      const idx = rows.value.findIndex((r) => r.id === contract.id);
+      if (idx !== -1) rows.value[idx] = updated;
+    } catch (e) {
+      console.error(e);
+      $q.notify({ type: "negative", message: "Erro ao atualizar status do contrato." });
+    }
   });
 }
 
+function handleFreeze(contract) {
+  confirmAction(
+    "Congelar Contrato",
+    "Você tem certeza que deseja CONGELAR este contrato? Isso irá gerar multas e cancelamento da cobrança recorrente.",
+    freezeContract,
+    contract,
+  );
+}
+
+function handleCancel(contract) {
+  confirmAction(
+    "Cancelar Contrato",
+    "Você tem certeza que deseja CANCELAR este contrato? Isso irá gerar multas e cancelamento da cobrança recorrente.",
+    cancelContract,
+    contract,
+  );
+}
+
+function handleReactivate(contract) {
+  confirmAction(
+    "Reativar Contrato",
+    "Você tem certeza que deseja REATIVAR este contrato?",
+    reactivateContract,
+    contract,
+  );
+}
+
 function statusColor(status) {
   if (status === "active") return "positive";
   if (status === "frozen") return "info";