import React from 'react'; import { Download, Printer } from 'lucide-react'; interface AggregatedReportViewProps { data: { periodStart: string; periodEnd: string; totalIncome: number; totalExpenses: number; totalBalance: number; totalArea: number; totalLivingArea: number; totalNonLivingArea: number; buildingsCount: number; aggregatedExpenses: Record; title?: string; subtitle?: string; }; } export const AggregatedReportView: React.FC = ({ data }) => { const formatCurrency = (amount: number) => { return new Intl.NumberFormat('ru-RU', { style: 'currency', currency: 'RUB', minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(amount); }; const formatNumber = (num: number) => { return new Intl.NumberFormat('ru-RU', { minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(num); }; const handleDownloadCSV = () => { // TODO: Реализовать экспорт в CSV alert('Экспорт в CSV будет реализован'); }; const handlePrint = () => { window.print(); }; // Рассчитываем период в месяцах const startDate = new Date(data.periodStart); const endDate = new Date(data.periodEnd); const monthsDiff = (endDate.getFullYear() - startDate.getFullYear()) * 12 + (endDate.getMonth() - startDate.getMonth()) + 1; // Группируем расходы по категориям const expenseCategories: Record; total: number }> = {}; for (const [key, amount] of Object.entries(data.aggregatedExpenses)) { const parts = key.split(' > '); const category = parts[0] || 'Прочие'; const item = parts[1] || key; if (!expenseCategories[category]) { expenseCategories[category] = { items: [], total: 0 }; } expenseCategories[category].items.push({ name: item, amount }); expenseCategories[category].total += amount; } // Сортируем категории и элементы const sortedCategories = Object.entries(expenseCategories) .sort((a, b) => b[1].total - a[1].total) .map(([category, data]) => ({ category, items: data.items.sort((a, b) => b.amount - a.amount), total: data.total })); const totalExpensesPerMonth = data.totalExpenses / monthsDiff; const totalExpensesPerSqM = data.totalArea > 0 ? data.totalExpenses / data.totalArea : 0; const totalExpensesPerSqMPerMonth = data.totalArea > 0 ? totalExpensesPerMonth / data.totalArea : 0; return (
{/* Кнопки действий */}
{/* Параметры */}

Параметры:

Период: {new Date(data.periodStart).toLocaleDateString('ru-RU', { day: '2-digit', month: '2-digit', year: 'numeric' })} - {new Date(data.periodEnd).toLocaleDateString('ru-RU', { day: '2-digit', month: '2-digit', year: 'numeric' })}

{data.title && (

{data.title}

)} {data.subtitle && (

{data.subtitle}

)}

Количество домов: {data.buildingsCount}

{data.totalLivingArea > 0 && (

Ж (кв.м)

{formatNumber(data.totalLivingArea)}

)} {data.totalNonLivingArea > 0 && (

НЖ (кв.м) в т.ч.:

{formatNumber(data.totalNonLivingArea)}

)} {data.totalArea > 0 && (

Итого (кв.м)

{formatNumber(data.totalArea)}

)}
{/* Сводка по доходам и расходам */}

Сводка:

Доходы

{formatCurrency(data.totalIncome)}

Расходы

{formatCurrency(data.totalExpenses)}

= 0 ? 'bg-emerald-50' : 'bg-red-50'}`}>

Баланс

= 0 ? 'text-emerald-600' : 'text-red-600'}`}> {formatCurrency(data.totalBalance)}

{/* Детальная таблица расходов */}

Детальная разбивка расходов:

{sortedCategories.map((category, categoryIndex) => ( {category.items.map((item, itemIndex) => { const perMonth = item.amount / monthsDiff; const perSqMPerMonth = data.totalArea > 0 ? perMonth / data.totalArea : 0; return ( ); })} ))}
№ п/п Статья затрат В месяц Сумма руб/кв.м в месяц
{categoryIndex + 1}. {category.category}
{categoryIndex + 1}.{itemIndex + 1} {item.name} {formatCurrency(perMonth)} {formatCurrency(item.amount)} {formatNumber(perSqMPerMonth)}
Итого по {category.category}: {formatCurrency(category.total / monthsDiff)} {formatCurrency(category.total)} {formatNumber((category.total / monthsDiff) / (data.totalArea || 1))}
ИТОГО: {formatCurrency(totalExpensesPerMonth)} {formatCurrency(data.totalExpenses)} {formatNumber(totalExpensesPerSqMPerMonth)}
); };