| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496 |
- <template>
- <q-dialog ref="dialogRef" @hide="onDialogHide">
- <q-card
- class="q-dialog-plugin overflow-hidden"
- style="width: 100%; max-width: 1350px"
- >
- <DefaultDialogHeader
- title="Visualizar Contrato"
- @close="onDialogCancel"
- />
- <template v-if="loading">
- <q-card-section
- class="flex flex-center"
- style="height: 65vh"
- >
- <q-spinner
- color="primary"
- size="40px"
- />
- </q-card-section>
- </template>
- <template v-else-if="contract">
- <q-tabs
- v-model="activeTab"
- active-color="primary"
- align="left"
- class="q-px-md text-grey-7"
- dense
- indicator-color="primary"
- >
- <q-tab
- label="Dados do Contrato"
- name="dados"
- />
- <q-tab
- label="Mídias do Contrato"
- name="midias"
- />
- </q-tabs>
- <q-separator />
- <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="contract.student_name"
- disable
- label="Aluno"
- />
- </div>
- <div class="col-6">
- <DefaultInput
- :model-value="contract.student_document"
- :mask="masks.Brasil.cpf"
- :rules="[inputRules.cpf]"
- disable
- label="CPF"
- />
- </div>
- <div class="col-6">
- <DefaultInput
- :model-value="contract.student_birth_date"
- disable
- label="Data de Nascimento"
- />
- </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
- :model-value="contract.protocol"
- disable
- label="Protocolo"
- />
- </div>
- <div class="col-4">
- <DefaultInput
- :model-value="contract.signature_date"
- disable
- label="Data Assinatura"
- />
- </div>
- <div class="col-4">
- <DefaultInput
- :model-value="contract.end_date"
- disable
- label="Data Encerramento"
- />
- </div>
- <div class="col-5">
- <DefaultInput
- :model-value="contract.package_name"
- disable
- label="Pacote de Aulas"
- />
- </div>
- <div class="col-7">
- <DefaultInput
- :model-value="contract.class_quantity"
- disable
- label="Qtd. Aulas"
- />
- </div>
- <div class="col-6">
- <DefaultCurrencyInput
- :model-value="contract.package_value"
- disable
- label="Total do Contrato"
- />
- </div>
- <div class="col-6">
- <DefaultInput
- :model-value="contractWeeks"
- disable
- label="Total de Semanas"
- />
- </div>
- <div class="col-4">
- <DefaultInput
- :model-value="weekdayLabel(contract.weekday)"
- disable
- label="Dia da Semana"
- />
- </div>
- <div class="col-4">
- <DefaultInput
- :model-value="contract.start_time"
- disable
- label="Hora de Início"
- >
- <template #append>
- <q-icon name="mdi-clock-outline" />
- </template>
- </DefaultInput>
- </div>
- <div class="col-4">
- <DefaultInput
- :model-value="contract.end_time"
- disable
- label="Hora de Término"
- >
- <template #append>
- <q-icon name="mdi-clock-outline" />
- </template>
- </DefaultInput>
- </div>
- <div class="col-4">
- <DefaultInput
- :model-value="weekdayLabel(contract.second_weekday)"
- disable
- label="2° Dia da Semana"
- />
- </div>
- <div class="col-4">
- <DefaultInput
- :model-value="contract.second_start_time"
- disable
- label="Hora de Início"
- >
- <template #append>
- <q-icon name="mdi-clock-outline" />
- </template>
- </DefaultInput>
- </div>
- <div class="col-4">
- <DefaultInput
- :model-value="contract.second_end_time"
- disable
- label="Hora de Término"
- >
- <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
- :model-value="contract.due_day"
- disable
- label="Dia de Vencimento"
- />
- </div>
- <div class="col-4">
- <DefaultCurrencyInput
- :model-value="contract.tax_register"
- disable
- label="Taxa de Matrícula"
- />
- </div>
- <div class="col-4">
- <DefaultInput
- :model-value="contract.class_quantity"
- disable
- label="Total de Aulas"
- />
- </div>
- <div class="col-3">
- <DefaultCurrencyInput
- :model-value="contract.down_payment"
- disable
- label="Entrada"
- />
- </div>
- <div class="col-3">
- <DefaultInput
- :model-value="
- contract.installments
- ? `${contract.installments}x`
- : null
- "
- disable
- label="Parcelas"
- />
- </div>
- <div class="col-6">
- <DefaultInput
- :model-value="contract.early_payment_discount"
- disable
- label="Desconto até o vencimento (%)"
- />
- </div>
- <div class="col-3">
- <DefaultCurrencyInput
- :model-value="contract.material_value"
- disable
- label="Valor dos Materiais"
- />
- </div>
- <div class="col-3">
- <DefaultInput
- :model-value="
- contract.material_installments
- ? `${contract.material_installments}x`
- : null
- "
- disable
- label="Parcelas"
- />
- </div>
- <div class="col-6">
- <DefaultInput
- :model-value="contract.interest_rate"
- disable
- label="Juros (%) a.m"
- />
- </div>
- <div class="col-6">
- <DefaultInput
- :model-value="
- paymentMethodLabel(contract.payment_method)
- "
- disable
- label="Forma de Pagamento"
- />
- </div>
- <div class="col-6">
- <DefaultInput
- :model-value="contract.fine_cancelled"
- disable
- label="Multa (%)"
- />
- </div>
- </div>
- </div>
- <div v-show="activeTab === 'midias'">
- <DefaultTable
- v-model:rows="medias"
- :columns="mediaColumns"
- :feminino="true"
- :loading="loadingMedias"
- :show-search-field="false"
- descricao="mídias"
- no-api-call
- title="Mídias"
- >
- <template #body-cell-actions="{ row }">
- <q-td align="center">
- <q-btn
- icon="mdi-eye-outline"
- outline
- style="width: 36px"
- @click.prevent.stop="openFile(row.file_url)"
- />
- </q-td>
- </template>
- </DefaultTable>
- </div>
- </q-card-section>
- </template>
- <q-card-actions
- align="right"
- class="q-px-md q-pb-md"
- >
- <q-btn
- color="primary"
- label="Fechar"
- no-caps
- outline
- @click="onDialogCancel"
- />
- </q-card-actions>
- </q-card>
- </q-dialog>
- </template>
- <script setup>
- import { computed, onMounted, ref, watch } from "vue";
- import {
- differenceInCalendarDays,
- isValid,
- parse,
- } from "date-fns";
- import { getContractMedias } from "src/api/student_media";
- import { getStudentContractById } from "src/api/studentContract";
- import { useDialogPluginComponent } from "quasar";
- import { useInputRules } from "src/composables/useInputRules";
- import masks from "src/helpers/masks";
- import DefaultCurrencyInput from "src/components/defaults/DefaultCurrencyInput.vue";
- import DefaultDialogHeader from "src/components/defaults/DefaultDialogHeader.vue";
- import DefaultInput from "src/components/defaults/DefaultInput.vue";
- import DefaultTable from "src/components/defaults/DefaultTable.vue";
- defineEmits([...useDialogPluginComponent.emits]);
- const props = defineProps({
- id: {
- type: Number,
- required: true,
- },
- });
- const { dialogRef, onDialogHide, onDialogCancel } =
- useDialogPluginComponent();
- const { inputRules } = useInputRules();
- const activeTab = ref("dados");
- const contract = ref(null);
- const loading = ref(false);
- const loadingMedias = ref(false);
- const medias = ref([]);
- const contractWeeks = computed(() => {
- if (!contract.value?.signature_date || !contract.value?.end_date) {
- return null;
- }
- const startDate = parse(
- contract.value.signature_date,
- "dd/MM/yyyy",
- new Date(),
- );
- const endDate = parse(
- contract.value.end_date,
- "dd/MM/yyyy",
- new Date(),
- );
- if (!isValid(startDate) || !isValid(endDate)) {
- return null;
- }
- const days = differenceInCalendarDays(
- endDate,
- startDate,
- );
- return days < 0
- ? null
- : Math.max(1, Math.round(days / 7));
- });
- const mediaColumns = [
- {
- align: "left",
- field: "created_at",
- label: "Data de Anexo",
- name: "created_at",
- },
- {
- align: "center",
- field: null,
- label: "Ações",
- name: "actions",
- },
- ];
- const paymentMethods = {
- credit_card: "Cartão de Crédito",
- debit_card: "Cartão de Débito",
- pix: "Pix",
- };
- const weekdays = {
- 0: "Domingo",
- 1: "Segunda",
- 2: "Terça",
- 3: "Quarta",
- 4: "Quinta",
- 5: "Sexta",
- 6: "Sábado",
- };
- const fetchMedias = async () => {
- loadingMedias.value = true;
- try {
- medias.value = await getContractMedias(props.id);
- } finally {
- loadingMedias.value = false;
- }
- };
- const openFile = (url) => {
- window.open(url, "_blank");
- };
- const paymentMethodLabel = (value) =>
- value ? paymentMethods[value] ?? value : null;
- const weekdayLabel = (value) =>
- value != null ? weekdays[value] ?? null : null;
- watch(activeTab, (tab) => {
- if (tab === "midias") {
- fetchMedias();
- }
- });
- onMounted(async () => {
- loading.value = true;
- try {
- contract.value = await getStudentContractById(
- props.id,
- );
- } finally {
- loading.value = false;
- }
- });
- </script>
|