浏览代码

feat(contract): implement default contract date handling and confirmation dialog for date changes

ebagabee 1 周之前
父节点
当前提交
2f0311488e
共有 1 个文件被更改,包括 69 次插入2 次删除
  1. 69 2
      src/pages/students/components/AddEditContractDialog.vue

+ 69 - 2
src/pages/students/components/AddEditContractDialog.vue

@@ -354,6 +354,7 @@
 <script setup>
 import { computed, ref, watch, onMounted, nextTick } from "vue";
 import { useDialogPluginComponent, useQuasar } from "quasar";
+import { addYears, format } from "date-fns";
 import DefaultDialogHeader from "src/components/defaults/DefaultDialogHeader.vue";
 import DefaultInput from "src/components/defaults/DefaultInput.vue";
 import DefaultSelect from "src/components/defaults/DefaultSelect.vue";
@@ -399,10 +400,21 @@ const loadingMedias = ref(false);
 
 const trimTime = (t) => (t ? t.slice(0, 5) : null);
 
+const defaultContractDates = (() => {
+  if (props.contract) return null;
+
+  const start = new Date();
+  return {
+    signature_date: format(start, "dd/MM/yyyy"),
+    end_date: format(addYears(start, 1), "dd/MM/yyyy"),
+  };
+})();
+
 const { form } = useFormUpdateTracker({
   protocol: props.contract?.protocol ?? null,
-  signature_date: props.contract?.signature_date ?? null,
-  end_date: props.contract?.end_date ?? null,
+  signature_date:
+    props.contract?.signature_date ?? defaultContractDates?.signature_date ?? null,
+  end_date: props.contract?.end_date ?? defaultContractDates?.end_date ?? null,
   package_id: props.contract?.class_package_unit_id ?? null,
   class_quantity: props.contract?.class_quantity ?? null,
   weekday: props.contract?.weekday ?? null,
@@ -425,6 +437,61 @@ const { form } = useFormUpdateTracker({
   late_fee: props.contract?.fine_cancelled ?? null,
 });
 
+const dateOverrideConfirmed = ref(false);
+const dateConfirmationOpen = ref(false);
+const restoringDefaultDates = ref(false);
+const completeDatePattern = /^\d{2}\/\d{2}\/\d{4}$/;
+
+function restoreDefaultContractDates() {
+  restoringDefaultDates.value = true;
+  form.signature_date = defaultContractDates.signature_date;
+  form.end_date = defaultContractDates.end_date;
+  nextTick(() => {
+    restoringDefaultDates.value = false;
+    dateConfirmationOpen.value = false;
+  });
+}
+
+watch(
+  [() => form.signature_date, () => form.end_date],
+  ([signatureDate, endDate]) => {
+    if (
+      props.contract ||
+      dateOverrideConfirmed.value ||
+      dateConfirmationOpen.value ||
+      restoringDefaultDates.value
+    ) {
+      return;
+    }
+
+    const datesAreStillDefault =
+      signatureDate === defaultContractDates.signature_date &&
+      endDate === defaultContractDates.end_date;
+    if (datesAreStillDefault) return;
+
+    // Evita abrir a confirmação enquanto o usuário ainda está digitando a data.
+    const datesAreComplete =
+      (!signatureDate || completeDatePattern.test(signatureDate)) &&
+      (!endDate || completeDatePattern.test(endDate));
+    if (!datesAreComplete) return;
+
+    dateConfirmationOpen.value = true;
+    $q.dialog({
+      title: "Alterar duração do contrato?",
+      message:
+        "As datas foram preenchidas automaticamente para a duração de um ano. Tem certeza de que deseja alterá-las?",
+      ok: { color: "primary", label: "Sim" },
+      cancel: { color: "primary", outline: true, label: "Não" },
+      persistent: true,
+    })
+      .onOk(() => {
+        dateOverrideConfirmed.value = true;
+        dateConfirmationOpen.value = false;
+      })
+      .onCancel(restoreDefaultContractDates);
+  },
+);
+
 const enrollmentInstallmentOptions = Array.from({ length: 12 }, (_, i) => ({
   value: i + 1,
   label: `${i + 1}x`,