diff --git a/src/components/budgets/BudgetView2.vue b/src/components/budgets/BudgetView2.vue index ed1c441..4f81513 100644 --- a/src/components/budgets/BudgetView2.vue +++ b/src/components/budgets/BudgetView2.vue @@ -12,7 +12,7 @@ import { } from "@/services/budgetsService"; import {Budget, BudgetCategory, Warn} from "@/models/Budget"; import {useRoute} from "vue-router"; -import {formatAmount, formatDate} from "@/utils/utils"; +import {formatAmount, formatDate, getMonthName, getMonthName2} from "@/utils/utils"; import ProgressBar from "primevue/progressbar"; import ProgressSpinner from "primevue/progressspinner"; import BudgetCategoryView from "@/components/budgets/BudgetCategoryView.vue"; @@ -27,7 +27,7 @@ import Divider from "primevue/divider"; import TransactionForm from "@/components/transactions/TransactionForm.vue"; import Checkbox from "primevue/checkbox"; import {useDrawerStore} from "@/stores/drawerStore"; -import { EventBus } from '@/utils/EventBus.ts'; +import {EventBus} from '@/utils/EventBus.ts'; // Зарегистрируем плагин ChartJS.register(ChartDataLabels); @@ -624,6 +624,74 @@ const expandCats = (value: boolean) => { } } }; +const calendarExpanded = ref(false); +const calendar = ref<{ date: Date, dateStr: string, expenses: any[], expensesSum: number }[]>([]); + +watch([budget, plannedExpenses], () => { + if (!budget.value?.dateFrom || !budget.value?.dateTo) { + calendar.value = []; + return; + } + + const result: { date: Date, dateStr: string, expenses: any[], expensesSum: number, }[] = []; + + const startDate = new Date(budget.value.dateFrom); + const endDate = new Date(budget.value.dateTo); + let currentDate = new Date(startDate); + let lastDateWithExpenses = null; + let periodStart = null; + + while (currentDate <= endDate) { + const formattedDate = currentDate.toISOString().split("T")[0]; + const expenses = plannedExpenses.value.filter((transaction) => { + return transaction.date === formattedDate; + }); + const expensesSum = expenses.reduce((sum, expense) => sum + (expense.amount || 0), 0); + + if (expenses.length == 0) { + if (!periodStart) periodStart = new Date(currentDate); // Сохраняем начало периода без трат + } else { + if (lastDateWithExpenses && periodStart) { + // Добавляем период без трат, если он был + result.push({ + date: currentDate, + dateStr: periodStart.toLocaleDateString('ru-RU') === new Date(new Date(currentDate).setDate(currentDate.getDate() - 1)).toLocaleDateString('ru-RU') + ? periodStart.getUTCDate() + " " + getMonthName2(periodStart.getMonth(), "род") + " " + periodStart.getUTCFullYear() + ' трат нет.' + : `В период с ${periodStart.toLocaleDateString('ru-RU')} по ${new Date(new Date(currentDate).setDate(currentDate.getDate() - 1)).toLocaleDateString('ru-RU')} трат нет.`, + expenses: [], + expensesSum: 0, + }); + periodStart = null; + } + + // Добавляем день с тратами + lastDateWithExpenses = new Date(currentDate) + result.push({ + date: currentDate, + dateStr: currentDate.getUTCDate() + " " + getMonthName2(currentDate.getMonth(), "род") + " " + currentDate.getUTCFullYear(), + expenses: expenses, + expensesSum: expensesSum, + }); + + // lastDateWithExpenses = new Date(currentDate); // Сохраняем дату с тратами + } + + currentDate.setDate(currentDate.getDate() + 1); + } + + // Добавляем последний период без трат, если он был + if (lastDateWithExpenses && periodStart) { + result.push({ + date: currentDate, + dateStr: `В период с ${periodStart.toLocaleDateString('ru-RU')} по ${lastDateWithExpenses.toLocaleDateString('ru-RU')} трат нет.`, + expenses: [], + expensesSum: 0 + }); + periodStart = null; + } + + calendar.value = result; +}, {immediate: true}); onMounted(async () => { updateLoading.value = true; @@ -637,7 +705,7 @@ onMounted(async () => { // fetchBudgetCategories(), // fetchBudgetTransactions(), ]); - EventBus.on('transactions-updated', fetchBudgetInfo,true); + EventBus.on('transactions-updated', fetchBudgetInfo, true); } catch (error) { console.error('Error during fetching data:', error); } finally { @@ -645,7 +713,7 @@ onMounted(async () => { } }); -onUnmounted( async () => { +onUnmounted(async () => { EventBus.off('transactions-updated', fetchBudgetInfo); }) @@ -656,7 +724,7 @@ onUnmounted( async () => {
{{ day.dateStr }} Траты по плану: {{ formatAmount(day.expensesSum) }} ₽
+ +