import React, { useState, useEffect } from 'react'; import { Building, BuildingFinancialData } from '../../types'; import { TrendingUp, TrendingDown, DollarSign, Calendar, Filter, Download } from 'lucide-react'; interface BuildingFinancialSummaryProps { buildingId: string; building?: Building; } export const BuildingFinancialSummary: React.FC = ({ buildingId, building }) => { const [financialData, setFinancialData] = useState([]); const [loading, setLoading] = useState(true); const [filters, setFilters] = useState({ periodStart: '', periodEnd: '', periodType: 'month' as 'month' | 'quarter' | 'year' }); useEffect(() => { fetchFinancialData(); }, [buildingId, filters]); const fetchFinancialData = async () => { setLoading(true); try { const params = new URLSearchParams(); if (filters.periodStart) params.append('periodStart', filters.periodStart); if (filters.periodEnd) params.append('periodEnd', filters.periodEnd); if (filters.periodType) params.append('periodType', filters.periodType); const response = await fetch(`/api/finance/building/${buildingId}?${params}`); if (response.ok) { const data = await response.json(); setFinancialData(data); } } catch (error) { console.error('Ошибка загрузки финансовых данных:', error); } finally { setLoading(false); } }; const calculateTotals = () => { return financialData.reduce((acc, item) => ({ totalIncome: acc.totalIncome + (item.totalIncome || 0), totalExpenses: acc.totalExpenses + (item.totalExpenses || 0), balance: acc.balance + (item.balance || 0) }), { totalIncome: 0, totalExpenses: 0, balance: 0 }); }; const totals = calculateTotals(); if (loading) { return (
); } return (
{/* Заголовок */}

Финансовая сводка

{building && (

{building.passport.address}

)}
{/* Фильтры */}
Фильтры
setFilters({ ...filters, periodStart: e.target.value })} className="w-full px-3 py-2 border border-slate-300 rounded-lg text-sm" />
setFilters({ ...filters, periodEnd: e.target.value })} className="w-full px-3 py-2 border border-slate-300 rounded-lg text-sm" />
{/* Итоговые показатели */}
{totals.totalIncome.toLocaleString('ru-RU')} ₽

Общий доход

{totals.totalExpenses.toLocaleString('ru-RU')} ₽

Общие расходы

= 0 ? 'bg-primary-50 text-primary-600' : 'bg-red-50 text-red-600' }`}>
= 0 ? 'text-primary-600' : 'text-red-600' }`}> {totals.balance.toLocaleString('ru-RU')} ₽

Баланс

{/* Детальная таблица */} {financialData.length > 0 ? (

Детальная разбивка по периодам

{financialData.map((item) => ( ))}
Период Доходы Расходы Баланс Действия
{new Date(item.periodStart).toLocaleDateString('ru-RU')} - {new Date(item.periodEnd).toLocaleDateString('ru-RU')}
{item.totalIncome.toLocaleString('ru-RU')} ₽ {item.totalExpenses.toLocaleString('ru-RU')} ₽ = 0 ? 'text-primary-600' : 'text-red-600' }`}> {item.balance.toLocaleString('ru-RU')} ₽
) : (

Нет данных за выбранный период

Загрузите отчеты из 1С для отображения финансовых данных

)}
); };