|
|
@@ -26,260 +26,260 @@
|
|
|
|
|
|
<q-card-section class="q-pt-sm" style="height: 65vh; overflow-y: auto">
|
|
|
<div v-show="activeTab === 'dados'">
|
|
|
- <div class="text-subtitle1 q-mb-md">Dados do Aluno</div>
|
|
|
-
|
|
|
- <div class="row q-col-gutter-sm">
|
|
|
- <div class="col-12">
|
|
|
- <DefaultInput
|
|
|
- :model-value="props.student.name"
|
|
|
- label="Aluno"
|
|
|
- disable
|
|
|
- />
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="col-6">
|
|
|
- <DefaultInput
|
|
|
- :model-value="props.student.document_number"
|
|
|
- label="CPF"
|
|
|
- disable
|
|
|
- />
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="col-6">
|
|
|
- <DefaultInput
|
|
|
- :model-value="formattedBirthDate"
|
|
|
- label="Data de Nascimento"
|
|
|
- disable
|
|
|
- />
|
|
|
- </div>
|
|
|
+ <div class="text-subtitle1 q-mb-md">Dados do Aluno</div>
|
|
|
+
|
|
|
+ <div class="row q-col-gutter-sm">
|
|
|
+ <div class="col-12">
|
|
|
+ <DefaultInput
|
|
|
+ :model-value="props.student.name"
|
|
|
+ label="Aluno"
|
|
|
+ disable
|
|
|
+ />
|
|
|
</div>
|
|
|
|
|
|
- <div class="text-subtitle1 q-mt-lg q-mb-md">Dados do Contrato</div>
|
|
|
-
|
|
|
- <div class="row q-col-gutter-sm">
|
|
|
- <div class="col-4">
|
|
|
- <DefaultInput v-model="form.protocol" label="Protocolo" />
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="col-4">
|
|
|
- <DefaultInputDatePicker
|
|
|
- v-model="form.signature_date"
|
|
|
- label="Data Assinatura"
|
|
|
- />
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="col-4">
|
|
|
- <DefaultInputDatePicker
|
|
|
- v-model="form.end_date"
|
|
|
- label="Data Encerramento"
|
|
|
- />
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="col-5">
|
|
|
- <DefaultSelect
|
|
|
- v-model="form.package_id"
|
|
|
- label="Pacote de Aulas"
|
|
|
- :options="packages"
|
|
|
- option-value="id"
|
|
|
- option-label="name"
|
|
|
- emit-value
|
|
|
- map-options
|
|
|
- />
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="col-7">
|
|
|
- <DefaultInput
|
|
|
- v-model="form.class_quantity"
|
|
|
- label="Qtd. Aulas"
|
|
|
- type="number"
|
|
|
- disable
|
|
|
- />
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="col-4">
|
|
|
- <DefaultSelect
|
|
|
- v-model="form.weekday"
|
|
|
- label="Dia da Semana"
|
|
|
- :options="weekdays"
|
|
|
- option-value="value"
|
|
|
- option-label="label"
|
|
|
- emit-value
|
|
|
- map-options
|
|
|
- />
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="col-4">
|
|
|
- <DefaultInput
|
|
|
- v-model="form.start_time"
|
|
|
- label="Hora de Início"
|
|
|
- mask="##:##"
|
|
|
- >
|
|
|
- <template #append>
|
|
|
- <q-icon name="mdi-clock-outline" />
|
|
|
- </template>
|
|
|
- </DefaultInput>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="col-4">
|
|
|
- <DefaultInput
|
|
|
- v-model="form.end_time"
|
|
|
- label="Hora de Término"
|
|
|
- mask="##:##"
|
|
|
- >
|
|
|
- <template #append>
|
|
|
- <q-icon name="mdi-clock-outline" />
|
|
|
- </template>
|
|
|
- </DefaultInput>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="col-4">
|
|
|
- <DefaultSelect
|
|
|
- v-model="form.second_weekday"
|
|
|
- label="2° Dia da Semana"
|
|
|
- :options="weekdays"
|
|
|
- option-value="value"
|
|
|
- option-label="label"
|
|
|
- emit-value
|
|
|
- map-options
|
|
|
- />
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="col-4">
|
|
|
- <DefaultInput
|
|
|
- v-model="form.second_start_time"
|
|
|
- label="Hora de Início"
|
|
|
- mask="##:##"
|
|
|
- >
|
|
|
- <template #append>
|
|
|
- <q-icon name="mdi-clock-outline" />
|
|
|
- </template>
|
|
|
- </DefaultInput>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="col-4">
|
|
|
- <DefaultInput
|
|
|
- v-model="form.second_end_time"
|
|
|
- label="Hora de Término"
|
|
|
- mask="##:##"
|
|
|
- >
|
|
|
- <template #append>
|
|
|
- <q-icon name="mdi-clock-outline" />
|
|
|
- </template>
|
|
|
- </DefaultInput>
|
|
|
- </div>
|
|
|
+ <div class="col-6">
|
|
|
+ <DefaultInput
|
|
|
+ :model-value="props.student.document_number"
|
|
|
+ label="CPF"
|
|
|
+ disable
|
|
|
+ />
|
|
|
</div>
|
|
|
|
|
|
- <div class="text-subtitle1 q-mt-lg q-mb-md">Dados Financeiros</div>
|
|
|
-
|
|
|
- <div class="row q-col-gutter-sm">
|
|
|
- <div class="col-4">
|
|
|
- <DefaultInput
|
|
|
- v-model="form.due_day"
|
|
|
- label="Dia de Vencimento"
|
|
|
- type="number"
|
|
|
- />
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="col-4">
|
|
|
- <DefaultCurrencyInput
|
|
|
- v-model="form.enrollment_fee"
|
|
|
- label="Taxa de Matrícula"
|
|
|
- disable
|
|
|
- />
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="col-4">
|
|
|
- <DefaultInput
|
|
|
- v-model="form.total_classes"
|
|
|
- label="Total de Aulas"
|
|
|
- type="number"
|
|
|
- disable
|
|
|
- />
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="col-3">
|
|
|
- <DefaultCurrencyInput v-model="form.down_payment" label="Entrada" />
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="col-3">
|
|
|
- <DefaultSelect
|
|
|
- v-model="form.installments"
|
|
|
- label="Parcelas"
|
|
|
- :options="installmentOptions"
|
|
|
- option-value="value"
|
|
|
- option-label="label"
|
|
|
- emit-value
|
|
|
- map-options
|
|
|
- />
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="col-6">
|
|
|
- <DefaultInput
|
|
|
- v-model="form.early_payment_discount"
|
|
|
- label="Desconto até o vencimento (%)"
|
|
|
- type="number"
|
|
|
- />
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="col-3">
|
|
|
- <DefaultCurrencyInput
|
|
|
- v-model="form.material_value"
|
|
|
- label="Valor dos Materiais"
|
|
|
- />
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="col-3">
|
|
|
- <DefaultSelect
|
|
|
- v-model="form.material_installments"
|
|
|
- label="Parcelas"
|
|
|
- :options="installmentOptions"
|
|
|
- option-value="value"
|
|
|
- option-label="label"
|
|
|
- emit-value
|
|
|
- map-options
|
|
|
- />
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="col-6">
|
|
|
- <DefaultInput
|
|
|
- v-model="form.interest_rate"
|
|
|
- label="Juros (%) a.m"
|
|
|
- type="number"
|
|
|
- />
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="col-6">
|
|
|
- <DefaultSelect
|
|
|
- v-model="form.payment_method"
|
|
|
- label="Forma de Pagamento"
|
|
|
- :options="paymentMethods"
|
|
|
- option-value="value"
|
|
|
- option-label="label"
|
|
|
- emit-value
|
|
|
- map-options
|
|
|
- />
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="col-6">
|
|
|
- <DefaultInput
|
|
|
- v-model="form.late_fee"
|
|
|
- label="Multa (%)"
|
|
|
- type="number"
|
|
|
- />
|
|
|
- </div>
|
|
|
+ <div class="col-6">
|
|
|
+ <DefaultInput
|
|
|
+ :model-value="formattedBirthDate"
|
|
|
+ label="Data de Nascimento"
|
|
|
+ disable
|
|
|
+ />
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
+ <div class="text-subtitle1 q-mt-lg q-mb-md">Dados do Contrato</div>
|
|
|
+
|
|
|
+ <div class="row q-col-gutter-sm">
|
|
|
+ <div class="col-4">
|
|
|
+ <DefaultInput v-model="form.protocol" label="Protocolo" />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="col-4">
|
|
|
+ <DefaultInputDatePicker
|
|
|
+ v-model="form.signature_date"
|
|
|
+ label="Data Assinatura"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="col-4">
|
|
|
+ <DefaultInputDatePicker
|
|
|
+ v-model="form.end_date"
|
|
|
+ label="Data Encerramento"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="col-5">
|
|
|
+ <DefaultSelect
|
|
|
+ v-model="form.package_id"
|
|
|
+ label="Pacote de Aulas"
|
|
|
+ :options="packages"
|
|
|
+ option-value="id"
|
|
|
+ option-label="name"
|
|
|
+ emit-value
|
|
|
+ map-options
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="col-7">
|
|
|
+ <DefaultInput
|
|
|
+ v-model="form.class_quantity"
|
|
|
+ label="Qtd. Aulas"
|
|
|
+ type="number"
|
|
|
+ disable
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="col-4">
|
|
|
+ <DefaultSelect
|
|
|
+ v-model="form.weekday"
|
|
|
+ label="Dia da Semana"
|
|
|
+ :options="weekdays"
|
|
|
+ option-value="value"
|
|
|
+ option-label="label"
|
|
|
+ emit-value
|
|
|
+ map-options
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="col-4">
|
|
|
+ <DefaultInput
|
|
|
+ v-model="form.start_time"
|
|
|
+ label="Hora de Início"
|
|
|
+ mask="##:##"
|
|
|
+ >
|
|
|
+ <template #append>
|
|
|
+ <q-icon name="mdi-clock-outline" />
|
|
|
+ </template>
|
|
|
+ </DefaultInput>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="col-4">
|
|
|
+ <DefaultInput
|
|
|
+ v-model="form.end_time"
|
|
|
+ label="Hora de Término"
|
|
|
+ mask="##:##"
|
|
|
+ >
|
|
|
+ <template #append>
|
|
|
+ <q-icon name="mdi-clock-outline" />
|
|
|
+ </template>
|
|
|
+ </DefaultInput>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="col-4">
|
|
|
+ <DefaultSelect
|
|
|
+ v-model="form.second_weekday"
|
|
|
+ label="2° Dia da Semana"
|
|
|
+ :options="weekdays"
|
|
|
+ option-value="value"
|
|
|
+ option-label="label"
|
|
|
+ emit-value
|
|
|
+ map-options
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="col-4">
|
|
|
+ <DefaultInput
|
|
|
+ v-model="form.second_start_time"
|
|
|
+ label="Hora de Início"
|
|
|
+ mask="##:##"
|
|
|
+ >
|
|
|
+ <template #append>
|
|
|
+ <q-icon name="mdi-clock-outline" />
|
|
|
+ </template>
|
|
|
+ </DefaultInput>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="col-4">
|
|
|
+ <DefaultInput
|
|
|
+ v-model="form.second_end_time"
|
|
|
+ label="Hora de Término"
|
|
|
+ mask="##:##"
|
|
|
+ >
|
|
|
+ <template #append>
|
|
|
+ <q-icon name="mdi-clock-outline" />
|
|
|
+ </template>
|
|
|
+ </DefaultInput>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="text-subtitle1 q-mt-lg q-mb-md">Dados Financeiros</div>
|
|
|
+
|
|
|
+ <div class="row q-col-gutter-sm">
|
|
|
+ <div class="col-4">
|
|
|
+ <DefaultInput
|
|
|
+ v-model="form.due_day"
|
|
|
+ label="Dia de Vencimento"
|
|
|
+ type="number"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="col-4">
|
|
|
+ <DefaultCurrencyInput
|
|
|
+ v-model="form.enrollment_fee"
|
|
|
+ label="Taxa de Matrícula"
|
|
|
+ disable
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="col-4">
|
|
|
+ <DefaultInput
|
|
|
+ v-model="form.total_classes"
|
|
|
+ label="Total de Aulas"
|
|
|
+ type="number"
|
|
|
+ disable
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="col-3">
|
|
|
+ <DefaultCurrencyInput v-model="form.down_payment" label="Entrada" />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="col-3">
|
|
|
+ <DefaultSelect
|
|
|
+ v-model="form.installments"
|
|
|
+ label="Parcelas"
|
|
|
+ :options="installmentOptions"
|
|
|
+ option-value="value"
|
|
|
+ option-label="label"
|
|
|
+ emit-value
|
|
|
+ map-options
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="col-6">
|
|
|
+ <DefaultInput
|
|
|
+ v-model="form.early_payment_discount"
|
|
|
+ label="Desconto até o vencimento (%)"
|
|
|
+ type="number"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="col-3">
|
|
|
+ <DefaultCurrencyInput
|
|
|
+ v-model="form.material_value"
|
|
|
+ label="Valor dos Materiais"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="col-3">
|
|
|
+ <DefaultSelect
|
|
|
+ v-model="form.material_installments"
|
|
|
+ label="Parcelas"
|
|
|
+ :options="installmentOptions"
|
|
|
+ option-value="value"
|
|
|
+ option-label="label"
|
|
|
+ emit-value
|
|
|
+ map-options
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="col-6">
|
|
|
+ <DefaultInput
|
|
|
+ v-model="form.interest_rate"
|
|
|
+ label="Juros (%) a.m"
|
|
|
+ type="number"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="col-6">
|
|
|
+ <DefaultSelect
|
|
|
+ v-model="form.payment_method"
|
|
|
+ label="Forma de Pagamento"
|
|
|
+ :options="paymentMethods"
|
|
|
+ option-value="value"
|
|
|
+ option-label="label"
|
|
|
+ emit-value
|
|
|
+ map-options
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="col-6">
|
|
|
+ <DefaultInput
|
|
|
+ v-model="form.late_fee"
|
|
|
+ label="Multa (%)"
|
|
|
+ type="number"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
<div v-if="props.contract" v-show="activeTab === 'midias'">
|
|
|
<DefaultTable
|
|
|
- v-model:rows="files"
|
|
|
+ v-model:rows="medias"
|
|
|
title="Mídias"
|
|
|
:columns="mediaColumns"
|
|
|
descricao="mídias"
|
|
|
:feminino="true"
|
|
|
no-api-call
|
|
|
:show-search-field="false"
|
|
|
- :loading="loadingFiles"
|
|
|
+ :loading="loadingMedias"
|
|
|
>
|
|
|
<template #body-cell-actions="{ row }">
|
|
|
<q-td align="center">
|
|
|
@@ -331,9 +331,9 @@ import { useDialogPluginComponent, useQuasar } from "quasar";
|
|
|
import DefaultDialogHeader from "src/components/defaults/DefaultDialogHeader.vue";
|
|
|
import DefaultInput from "src/components/defaults/DefaultInput.vue";
|
|
|
import DefaultSelect from "src/components/defaults/DefaultSelect.vue";
|
|
|
+import DefaultTable from "src/components/defaults/DefaultTable.vue";
|
|
|
import DefaultCurrencyInput from "src/components/defaults/DefaultCurrencyInput.vue";
|
|
|
import DefaultInputDatePicker from "src/components/defaults/DefaultInputDatePicker.vue";
|
|
|
-import DefaultTable from "src/components/defaults/DefaultTable.vue";
|
|
|
import { useSubmitHandler } from "src/composables/useSubmitHandler";
|
|
|
import { useFormUpdateTracker } from "src/composables/useFormUpdateTracker";
|
|
|
import { formatDateYMDtoDMY, formatDateDMYtoYMD } from "src/helpers/utils";
|
|
|
@@ -361,10 +361,9 @@ const { dialogRef, onDialogHide, onDialogOK, onDialogCancel } =
|
|
|
useDialogPluginComponent();
|
|
|
|
|
|
const $q = useQuasar();
|
|
|
-
|
|
|
const activeTab = ref("dados");
|
|
|
-const files = ref([]);
|
|
|
-const loadingFiles = ref(false);
|
|
|
+const medias = ref([]);
|
|
|
+const loadingMedias = ref(false);
|
|
|
|
|
|
const trimTime = (t) => (t ? t.slice(0, 5) : null);
|
|
|
|
|
|
@@ -414,31 +413,51 @@ const weekdays = [
|
|
|
{ value: 0, label: "Domingo" },
|
|
|
];
|
|
|
|
|
|
+const packages = ref([]);
|
|
|
+
|
|
|
const mediaColumns = [
|
|
|
{ name: "created_at", label: "Data de Anexo", field: "created_at", align: "left" },
|
|
|
{ name: "actions", label: "Ações", field: null, align: "center" },
|
|
|
];
|
|
|
|
|
|
-const packages = ref([]);
|
|
|
-
|
|
|
-async function fetchFiles() {
|
|
|
+async function fetchMedias() {
|
|
|
if (!props.contract) return;
|
|
|
- loadingFiles.value = true;
|
|
|
+ loadingMedias.value = true;
|
|
|
try {
|
|
|
- files.value = await getContractMedias(props.contract.id);
|
|
|
+ medias.value = await getContractMedias(props.contract.id);
|
|
|
} finally {
|
|
|
- loadingFiles.value = false;
|
|
|
+ loadingMedias.value = false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+watch(activeTab, (tab) => {
|
|
|
+ if (tab === "midias") fetchMedias();
|
|
|
+});
|
|
|
+
|
|
|
onMounted(async () => {
|
|
|
packages.value = await getUnitPackages();
|
|
|
- await fetchFiles();
|
|
|
});
|
|
|
|
|
|
-watch(activeTab, (tab) => {
|
|
|
- if (tab === "midias") fetchFiles();
|
|
|
-});
|
|
|
+function openFile(url) {
|
|
|
+ window.open(url, "_blank");
|
|
|
+}
|
|
|
+
|
|
|
+function handleDeleteMedia(media) {
|
|
|
+ $q.dialog({
|
|
|
+ title: "Excluir mídia",
|
|
|
+ message: "Deseja excluir esta mídia permanentemente?",
|
|
|
+ ok: { color: "negative", label: "Excluir" },
|
|
|
+ cancel: { color: "primary", outline: true, label: "Cancelar" },
|
|
|
+ }).onOk(async () => {
|
|
|
+ try {
|
|
|
+ await deleteStudentMedia(media.id);
|
|
|
+ medias.value = medias.value.filter((m) => m.id !== media.id);
|
|
|
+ } catch (e) {
|
|
|
+ console.error(e);
|
|
|
+ $q.notify({ type: "negative", message: "Erro ao excluir mídia." });
|
|
|
+ }
|
|
|
+ });
|
|
|
+}
|
|
|
|
|
|
watch(
|
|
|
() => form.package_id,
|
|
|
@@ -488,27 +507,6 @@ function buildPayload() {
|
|
|
};
|
|
|
}
|
|
|
|
|
|
-function openFile(url) {
|
|
|
- window.open(url, "_blank");
|
|
|
-}
|
|
|
-
|
|
|
-function handleDeleteMedia(media) {
|
|
|
- $q.dialog({
|
|
|
- title: "Excluir mídia",
|
|
|
- message: "Deseja excluir esta mídia permanentemente?",
|
|
|
- ok: { color: "negative", label: "Excluir" },
|
|
|
- cancel: { color: "primary", outline: true, label: "Cancelar" },
|
|
|
- }).onOk(async () => {
|
|
|
- try {
|
|
|
- await deleteStudentMedia(media.id);
|
|
|
- files.value = files.value.filter((f) => f.id !== media.id);
|
|
|
- } catch (e) {
|
|
|
- console.error(e);
|
|
|
- $q.notify({ type: "negative", message: "Erro ao excluir mídia." });
|
|
|
- }
|
|
|
- });
|
|
|
-}
|
|
|
-
|
|
|
async function handleSave() {
|
|
|
const payload = buildPayload();
|
|
|
await execute(() =>
|