|
@@ -85,7 +85,7 @@
|
|
|
<q-separator />
|
|
<q-separator />
|
|
|
<q-card-section class="q-pt-md column q-gutter-sm">
|
|
<q-card-section class="q-pt-md column q-gutter-sm">
|
|
|
<q-btn
|
|
<q-btn
|
|
|
- v-if="canAdd"
|
|
|
|
|
|
|
+ v-if="canAddContracts"
|
|
|
unelevated
|
|
unelevated
|
|
|
color="primary"
|
|
color="primary"
|
|
|
label="Criar contrato"
|
|
label="Criar contrato"
|
|
@@ -94,7 +94,7 @@
|
|
|
@click="onCriarContrato"
|
|
@click="onCriarContrato"
|
|
|
/>
|
|
/>
|
|
|
<q-btn
|
|
<q-btn
|
|
|
- v-if="canEdit"
|
|
|
|
|
|
|
+ v-if="canEditClasses"
|
|
|
unelevated
|
|
unelevated
|
|
|
color="primary"
|
|
color="primary"
|
|
|
label="Registrar presença"
|
|
label="Registrar presença"
|
|
@@ -103,7 +103,7 @@
|
|
|
@click="onRegistrarPresenca"
|
|
@click="onRegistrarPresenca"
|
|
|
/>
|
|
/>
|
|
|
<q-btn
|
|
<q-btn
|
|
|
- v-if="canAdd"
|
|
|
|
|
|
|
+ v-if="canAddOrders"
|
|
|
unelevated
|
|
unelevated
|
|
|
color="primary"
|
|
color="primary"
|
|
|
label="Novo pedido"
|
|
label="Novo pedido"
|
|
@@ -207,8 +207,7 @@ import AniversariantesCard from "src/components/charts/AniversariantesCard.vue";
|
|
|
import FeriadosDialog from "./components/FeriadosDialog.vue";
|
|
import FeriadosDialog from "./components/FeriadosDialog.vue";
|
|
|
import FeriadosEditDialog from "./components/FeriadosEditDialog.vue";
|
|
import FeriadosEditDialog from "./components/FeriadosEditDialog.vue";
|
|
|
import { getHolidays } from "src/api/holiday";
|
|
import { getHolidays } from "src/api/holiday";
|
|
|
-import { getStudents } from "src/api/student";
|
|
|
|
|
-import { getAllContracts } from "src/api/studentContract";
|
|
|
|
|
|
|
+import { getDashboardSummary } from "src/api/franchisee_dashboard";
|
|
|
import { userStore } from "src/stores/user";
|
|
import { userStore } from "src/stores/user";
|
|
|
import { permissionStore } from "src/stores/permission";
|
|
import { permissionStore } from "src/stores/permission";
|
|
|
|
|
|
|
@@ -220,8 +219,14 @@ const permissions = permissionStore();
|
|
|
const canAdd = computed(() =>
|
|
const canAdd = computed(() =>
|
|
|
permissions.getAccess("franchisee_dashboard", "add"),
|
|
permissions.getAccess("franchisee_dashboard", "add"),
|
|
|
);
|
|
);
|
|
|
-const canEdit = computed(() =>
|
|
|
|
|
- permissions.getAccess("franchisee_dashboard", "edit"),
|
|
|
|
|
|
|
+const canAddContracts = computed(() =>
|
|
|
|
|
+ permissions.getAccess("franchisee_contracts", "add"),
|
|
|
|
|
+);
|
|
|
|
|
+const canEditClasses = computed(() =>
|
|
|
|
|
+ permissions.getAccess("franchisee_classes", "edit"),
|
|
|
|
|
+);
|
|
|
|
|
+const canAddOrders = computed(() =>
|
|
|
|
|
+ permissions.getAccess("franchisee_orders", "add"),
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
// Faturamento Serviço / Materiais — zerado (sem fluxo de dados ainda),
|
|
// Faturamento Serviço / Materiais — zerado (sem fluxo de dados ainda),
|
|
@@ -326,19 +331,7 @@ const activeContracts = ref(0);
|
|
|
const students = ref([]);
|
|
const students = ref([]);
|
|
|
|
|
|
|
|
// Aniversariantes do mês corrente (dia + nome), ordenados por dia.
|
|
// Aniversariantes do mês corrente (dia + nome), ordenados por dia.
|
|
|
-const aniversariantes = computed(() => {
|
|
|
|
|
- const month = new Date().getMonth() + 1;
|
|
|
|
|
- return students.value
|
|
|
|
|
- .filter((s) => {
|
|
|
|
|
- if (!s.birth_date) return false;
|
|
|
|
|
- return new Date(s.birth_date + "T00:00:00").getMonth() + 1 === month;
|
|
|
|
|
- })
|
|
|
|
|
- .map((s) => ({
|
|
|
|
|
- day: new Date(s.birth_date + "T00:00:00").getDate(),
|
|
|
|
|
- name: s.name,
|
|
|
|
|
- }))
|
|
|
|
|
- .sort((a, b) => a.day - b.day);
|
|
|
|
|
-});
|
|
|
|
|
|
|
+const aniversariantes = ref([]);
|
|
|
|
|
|
|
|
// Matrículas por Período — alunos cadastrados (created_at) nos últimos 6 meses,
|
|
// Matrículas por Período — alunos cadastrados (created_at) nos últimos 6 meses,
|
|
|
// terminando no mês atual.
|
|
// terminando no mês atual.
|
|
@@ -369,22 +362,17 @@ const matriculasChart = computed(() => {
|
|
|
};
|
|
};
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
-async function fetchAlunos() {
|
|
|
|
|
- try {
|
|
|
|
|
- students.value = await getStudents();
|
|
|
|
|
- totalAlunos.value = students.value.length;
|
|
|
|
|
- } catch {
|
|
|
|
|
- // silencioso
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-async function fetchContracts() {
|
|
|
|
|
|
|
+async function fetchSummary() {
|
|
|
try {
|
|
try {
|
|
|
- const contracts = await getAllContracts();
|
|
|
|
|
- activeContracts.value = contracts.filter((c) => c.status === "active").length;
|
|
|
|
|
- // Posiciona a agulha do medidor na quantidade de contratos ativos
|
|
|
|
|
- // (escala de 0 a 10; valores maiores ficam no topo da escala).
|
|
|
|
|
- gaugeData.value.datasets[0].needleValue = Math.min(activeContracts.value, 10);
|
|
|
|
|
|
|
+ const summary = await getDashboardSummary();
|
|
|
|
|
+ students.value = summary.enrollments;
|
|
|
|
|
+ totalAlunos.value = summary.students_count;
|
|
|
|
|
+ activeContracts.value = summary.contracts.active;
|
|
|
|
|
+ aniversariantes.value = summary.birthdays;
|
|
|
|
|
+ gaugeData.value.datasets[0].needleValue = Math.min(
|
|
|
|
|
+ activeContracts.value,
|
|
|
|
|
+ 10,
|
|
|
|
|
+ );
|
|
|
} catch {
|
|
} catch {
|
|
|
// silencioso
|
|
// silencioso
|
|
|
}
|
|
}
|
|
@@ -464,8 +452,7 @@ watch(
|
|
|
() => store.selectedUnit?.id,
|
|
() => store.selectedUnit?.id,
|
|
|
(newId, oldId) => {
|
|
(newId, oldId) => {
|
|
|
if (newId && newId !== oldId) {
|
|
if (newId && newId !== oldId) {
|
|
|
- fetchAlunos();
|
|
|
|
|
- fetchContracts();
|
|
|
|
|
|
|
+ fetchSummary();
|
|
|
fetchHolidays();
|
|
fetchHolidays();
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
@@ -473,8 +460,7 @@ watch(
|
|
|
|
|
|
|
|
onMounted(() => {
|
|
onMounted(() => {
|
|
|
fetchHolidays();
|
|
fetchHolidays();
|
|
|
- fetchAlunos();
|
|
|
|
|
- fetchContracts();
|
|
|
|
|
|
|
+ fetchSummary();
|
|
|
});
|
|
});
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|