Kaynağa Gözat

feat: novos campos de cadastro de unidade

ebagabee 3 hafta önce
ebeveyn
işleme
7c56100a88

+ 5 - 0
src/api/unit_financial.js

@@ -11,3 +11,8 @@ export const getFinancialMe = async () => {
   const { data } = await api.get("/unit-financial/me");
   return data.payload;
 };
+
+export const updateFinancialMe = async (payload) => {
+  const { data } = await api.post("/unit-financial/me", payload);
+  return data.payload;
+};

+ 15 - 0
src/pages/students/components/AddEditContractDialog.vue

@@ -364,6 +364,7 @@ import { useSubmitHandler } from "src/composables/useSubmitHandler";
 import { useFormUpdateTracker } from "src/composables/useFormUpdateTracker";
 import { formatDateYMDtoDMY, formatDateDMYtoYMD } from "src/helpers/utils";
 import { getUnitPackages } from "src/api/package";
+import { getFinancialMe } from "src/api/unit_financial";
 import {
   createStudentContract,
   updateStudentContract,
@@ -519,6 +520,20 @@ watch(activeTab, (tab) => {
 
 onMounted(async () => {
   packages.value = await getUnitPackages();
+
+  // Para novo contrato, pré-preenche desconto/juros/multa com os defaults da unidade
+  if (!props.contract) {
+    try {
+      const financial = await getFinancialMe();
+      if (financial) {
+        if (financial.default_discount != null) form.early_payment_discount = financial.default_discount;
+        if (financial.default_interest != null) form.interest_rate = financial.default_interest;
+        if (financial.default_fine     != null) form.late_fee      = financial.default_fine;
+      }
+    } catch (e) {
+      console.error(e);
+    }
+  }
 });
 
 function openFile(url) {

+ 101 - 2
src/pages/unit/tabs/FinancialTab.vue

@@ -98,15 +98,81 @@
         />
       </div>
     </div>
+    <!-- Contratos -->
+    <div>
+      <div class="text-subtitle1 text-weight-medium q-mb-sm">
+        Contratos
+      </div>
+
+      <div class="row q-col-gutter-sm">
+        <DefaultInput
+          v-model.number="contractForm.max_freeze_count"
+          label="Qtde Máxima de Trancamentos"
+          type="number"
+          class="col-12 col-md-4"
+          outlined
+        />
+
+        <DefaultInput
+          v-model.number="contractForm.default_discount"
+          label="Desconto Padrão (%)"
+          type="number"
+          class="col-12 col-md-4"
+          outlined
+        />
+
+        <DefaultInput
+          v-model.number="contractForm.default_interest"
+          label="Juros Padrão (% a.m.)"
+          type="number"
+          class="col-12 col-md-4"
+          outlined
+        />
+
+        <DefaultInput
+          v-model.number="contractForm.default_fine"
+          label="Multa Padrão (%)"
+          type="number"
+          class="col-12 col-md-4"
+          outlined
+        />
+
+        <div class="col-12 col-md-4 flex items-center">
+          <q-toggle
+            v-model="contractForm.charge_roi"
+            label="Cobrar ROI"
+            color="primary"
+          />
+        </div>
+
+        <div class="col-12 col-md-4 flex items-center">
+          <q-toggle
+            v-model="contractForm.charge_fnm"
+            label="Cobrar FNM"
+            color="primary"
+          />
+        </div>
+      </div>
+
+      <div class="row justify-end q-mt-sm">
+        <q-btn
+          color="primary"
+          label="SALVAR CONTRATOS"
+          :loading="savingContracts"
+          @click="saveContractDefaults"
+        />
+      </div>
+    </div>
   </div>
 </template>
 
 <script setup>
 import { ref, onMounted } from "vue";
+import { useQuasar } from "quasar";
 import DefaultInput from "src/components/defaults/DefaultInput.vue";
 import DefaultSelect from "src/components/defaults/DefaultSelect.vue";
 import DefaultInputDatePicker from "src/components/defaults/DefaultInputDatePicker.vue";
-import { getFinancialMe } from "src/api/unit_financial";
+import { getFinancialMe, updateFinancialMe } from "src/api/unit_financial";
 
 const props = defineProps({
   unitId: { type: Number, default: null },
@@ -149,13 +215,46 @@ const defaultForm = () => ({
 
 const form = ref(defaultForm());
 
+const contractForm = ref({
+  max_freeze_count: null,
+  charge_roi: false,
+  charge_fnm: false,
+  default_discount: null,
+  default_interest: null,
+  default_fine: null,
+});
+
+const savingContracts = ref(false);
+const $q = useQuasar();
+
 async function fetchData() {
   if (!props.unitId) return;
   try {
     const data = await getFinancialMe();
-    if (data) Object.assign(form.value, data);
+    if (data) {
+      Object.assign(form.value, data);
+      contractForm.value.max_freeze_count = data.max_freeze_count ?? null;
+      contractForm.value.charge_roi       = data.charge_roi ?? false;
+      contractForm.value.charge_fnm       = data.charge_fnm ?? false;
+      contractForm.value.default_discount = data.default_discount ?? null;
+      contractForm.value.default_interest = data.default_interest ?? null;
+      contractForm.value.default_fine     = data.default_fine ?? null;
+    }
+  } catch (e) {
+    console.error(e);
+  }
+}
+
+async function saveContractDefaults() {
+  savingContracts.value = true;
+  try {
+    await updateFinancialMe(contractForm.value);
+    $q.notify({ type: "positive", message: "Configurações de contratos salvas!" });
   } catch (e) {
     console.error(e);
+    $q.notify({ type: "negative", message: "Erro ao salvar configurações." });
+  } finally {
+    savingContracts.value = false;
   }
 }