|
@@ -1,7 +1,6 @@
|
|
|
<template>
|
|
<template>
|
|
|
<div>
|
|
<div>
|
|
|
<DefaultHeaderPage title="Financeiro" :show-filter-icon="false" />
|
|
<DefaultHeaderPage title="Financeiro" :show-filter-icon="false" />
|
|
|
- <div class="q-px-md"><DevBanner /></div>
|
|
|
|
|
<div class="row justify-end q-px-md q-mb-xs">
|
|
<div class="row justify-end q-px-md q-mb-xs">
|
|
|
<q-btn
|
|
<q-btn
|
|
|
flat
|
|
flat
|
|
@@ -20,25 +19,25 @@
|
|
|
<FinancialCard
|
|
<FinancialCard
|
|
|
title="Fundo de Marketing"
|
|
title="Fundo de Marketing"
|
|
|
icon="mdi-cash-multiple"
|
|
icon="mdi-cash-multiple"
|
|
|
- :financial-value="0"
|
|
|
|
|
- :percentage="0"
|
|
|
|
|
- description="Estável"
|
|
|
|
|
|
|
+ :financial-value="overview.marketing_fund.value"
|
|
|
|
|
+ :percentage="overview.marketing_fund.percentage"
|
|
|
|
|
+ :description="trend(overview.marketing_fund.percentage)"
|
|
|
:hide-values="!showValues"
|
|
:hide-values="!showValues"
|
|
|
/>
|
|
/>
|
|
|
<FinancialCard
|
|
<FinancialCard
|
|
|
title="Receita de Mensalidade"
|
|
title="Receita de Mensalidade"
|
|
|
icon="mdi-cash-multiple"
|
|
icon="mdi-cash-multiple"
|
|
|
- :financial-value="0"
|
|
|
|
|
- :percentage="0"
|
|
|
|
|
- description="Estável"
|
|
|
|
|
|
|
+ :financial-value="overview.monthly_revenue.value"
|
|
|
|
|
+ :percentage="overview.monthly_revenue.percentage"
|
|
|
|
|
+ :description="trend(overview.monthly_revenue.percentage)"
|
|
|
:hide-values="!showValues"
|
|
:hide-values="!showValues"
|
|
|
/>
|
|
/>
|
|
|
<FinancialCard
|
|
<FinancialCard
|
|
|
title="TBR Total"
|
|
title="TBR Total"
|
|
|
icon="mdi-cash-multiple"
|
|
icon="mdi-cash-multiple"
|
|
|
- :financial-value="0"
|
|
|
|
|
- :percentage="0"
|
|
|
|
|
- description="Estável"
|
|
|
|
|
|
|
+ :financial-value="overview.tbr_total.value"
|
|
|
|
|
+ :percentage="overview.tbr_total.percentage"
|
|
|
|
|
+ :description="trend(overview.tbr_total.percentage)"
|
|
|
:hide-values="!showValues"
|
|
:hide-values="!showValues"
|
|
|
/>
|
|
/>
|
|
|
<TreasuryCard />
|
|
<TreasuryCard />
|
|
@@ -48,45 +47,81 @@
|
|
|
<FinancialCard
|
|
<FinancialCard
|
|
|
title="Contas a Pagar"
|
|
title="Contas a Pagar"
|
|
|
icon="mdi-cash-minus"
|
|
icon="mdi-cash-minus"
|
|
|
- :financial-value="0"
|
|
|
|
|
- :integer="0"
|
|
|
|
|
|
|
+ :financial-value="overview.accounts_payable.value"
|
|
|
|
|
+ :integer="overview.accounts_payable.count"
|
|
|
integer-label="pagamentos pendentes"
|
|
integer-label="pagamentos pendentes"
|
|
|
:hide-values="!showValues"
|
|
:hide-values="!showValues"
|
|
|
/>
|
|
/>
|
|
|
<FinancialCard
|
|
<FinancialCard
|
|
|
title="Contas a Receber"
|
|
title="Contas a Receber"
|
|
|
icon="mdi-cash-plus"
|
|
icon="mdi-cash-plus"
|
|
|
- :financial-value="0"
|
|
|
|
|
- :integer="0"
|
|
|
|
|
|
|
+ :financial-value="overview.accounts_receivable.value"
|
|
|
|
|
+ :integer="overview.accounts_receivable.count"
|
|
|
integer-label="pagamentos pendentes"
|
|
integer-label="pagamentos pendentes"
|
|
|
:hide-values="!showValues"
|
|
:hide-values="!showValues"
|
|
|
/>
|
|
/>
|
|
|
<FinancialCard
|
|
<FinancialCard
|
|
|
title="Saldo Bancário Total"
|
|
title="Saldo Bancário Total"
|
|
|
icon="mdi-bank-outline"
|
|
icon="mdi-bank-outline"
|
|
|
- :financial-value="0"
|
|
|
|
|
|
|
+ :financial-value="overview.bank_balance_total"
|
|
|
:hide-values="!showValues"
|
|
:hide-values="!showValues"
|
|
|
/>
|
|
/>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="row q-px-md q-gutter-md q-mt-none">
|
|
<div class="row q-px-md q-gutter-md q-mt-none">
|
|
|
- <LastTransactionsCard />
|
|
|
|
|
- <FranchisePerformanceCard />
|
|
|
|
|
|
|
+ <LastTransactionsCard :rows="overview.last_transactions" :loading="loading" />
|
|
|
|
|
+ <FranchisePerformanceCard :rows="overview.franchise_performance" :loading="loading" />
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script setup>
|
|
<script setup>
|
|
|
-import { ref, watch } from "vue";
|
|
|
|
|
|
|
+import { ref, watch, onMounted } from "vue";
|
|
|
|
|
+import { Notify } from "quasar";
|
|
|
import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
|
|
import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
|
|
|
-import DevBanner from "src/components/shared/DevBanner.vue";
|
|
|
|
|
import FinancialCard from "src/components/financial/FinancialCard.vue";
|
|
import FinancialCard from "src/components/financial/FinancialCard.vue";
|
|
|
import TreasuryCard from "src/components/financial/TreasuryCard.vue";
|
|
import TreasuryCard from "src/components/financial/TreasuryCard.vue";
|
|
|
import LastTransactionsCard from "src/components/financial/LastTransactionsCard.vue";
|
|
import LastTransactionsCard from "src/components/financial/LastTransactionsCard.vue";
|
|
|
import FranchisePerformanceCard from "src/components/financial/FranchisePerformanceCard.vue";
|
|
import FranchisePerformanceCard from "src/components/financial/FranchisePerformanceCard.vue";
|
|
|
|
|
+import { getFinancialOverview } from "src/api/financial_dashboard";
|
|
|
|
|
|
|
|
const STORAGE_KEY = "financial_show_values";
|
|
const STORAGE_KEY = "financial_show_values";
|
|
|
const showValues = ref(localStorage.getItem(STORAGE_KEY) !== "false");
|
|
const showValues = ref(localStorage.getItem(STORAGE_KEY) !== "false");
|
|
|
|
|
|
|
|
watch(showValues, (val) => localStorage.setItem(STORAGE_KEY, String(val)));
|
|
watch(showValues, (val) => localStorage.setItem(STORAGE_KEY, String(val)));
|
|
|
|
|
+
|
|
|
|
|
+const loading = ref(false);
|
|
|
|
|
+const overview = ref(emptyOverview());
|
|
|
|
|
+
|
|
|
|
|
+function emptyOverview() {
|
|
|
|
|
+ return {
|
|
|
|
|
+ marketing_fund: { value: 0, percentage: 0 },
|
|
|
|
|
+ monthly_revenue: { value: 0, percentage: 0 },
|
|
|
|
|
+ tbr_total: { value: 0, percentage: 0 },
|
|
|
|
|
+ accounts_payable: { value: 0, count: 0 },
|
|
|
|
|
+ accounts_receivable: { value: 0, count: 0 },
|
|
|
|
|
+ bank_balance_total: 0,
|
|
|
|
|
+ last_transactions: [],
|
|
|
|
|
+ franchise_performance: [],
|
|
|
|
|
+ };
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const trend = (percentage) => {
|
|
|
|
|
+ if (percentage > 0) return "Em alta";
|
|
|
|
|
+ if (percentage < 0) return "Em queda";
|
|
|
|
|
+ return "Estável";
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+const fetchOverview = async () => {
|
|
|
|
|
+ loading.value = true;
|
|
|
|
|
+ try {
|
|
|
|
|
+ overview.value = await getFinancialOverview();
|
|
|
|
|
+ } catch {
|
|
|
|
|
+ Notify.create({ message: "Não foi possível carregar os dados financeiros.", type: "negative" });
|
|
|
|
|
+ } finally {
|
|
|
|
|
+ loading.value = false;
|
|
|
|
|
+ }
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+onMounted(fetchOverview);
|
|
|
</script>
|
|
</script>
|