diff --git a/src/admin/analytics/charts/AvgTimeChart.jsx b/src/admin/analytics/charts/AvgTimeChart.jsx
new file mode 100644
index 0000000..89966e6
--- /dev/null
+++ b/src/admin/analytics/charts/AvgTimeChart.jsx
@@ -0,0 +1,30 @@
+import React from 'react';
+import { BarChart, Bar, XAxis, YAxis, Tooltip, ResponsiveContainer, Cell } from 'recharts';
+
+const COLORS = ['#f59e0b', '#0ea5e9', '#8b5cf6', '#f97316'];
+
+const AvgTimeChart = ({ data }) => (
+
+
+ Среднее время в стадии (дни)
+
+ {data.every((d) => d.avgDays === 0) ? (
+
+ Недостаточно данных
+
+ ) : (
+
+
+
+
+ [`${v} дней`]} />
+
+ {data.map((entry, i) => | )}
+
+
+
+ )}
+
+);
+
+export default AvgTimeChart;
diff --git a/src/admin/analytics/charts/FunnelChart.jsx b/src/admin/analytics/charts/FunnelChart.jsx
new file mode 100644
index 0000000..f47c632
--- /dev/null
+++ b/src/admin/analytics/charts/FunnelChart.jsx
@@ -0,0 +1,28 @@
+import React from 'react';
+import { BarChart, Bar, XAxis, YAxis, Tooltip, ResponsiveContainer, Cell } from 'recharts';
+
+const COLORS = ['#f59e0b', '#0ea5e9', '#8b5cf6', '#f97316', '#22c55e'];
+
+const FunnelChart = ({ data }) => (
+
+
+ Воронка по стадиям
+
+ {data.every((d) => d.count === 0) ? (
+
Нет данных
+ ) : (
+
+
+
+
+ [`${v} заказов`]} />
+
+ {data.map((entry, i) => | )}
+
+
+
+ )}
+
+);
+
+export default FunnelChart;
diff --git a/src/admin/analytics/charts/ObjectTypeChart.jsx b/src/admin/analytics/charts/ObjectTypeChart.jsx
new file mode 100644
index 0000000..3dcf776
--- /dev/null
+++ b/src/admin/analytics/charts/ObjectTypeChart.jsx
@@ -0,0 +1,31 @@
+import React from 'react';
+import { PieChart, Pie, Cell, Tooltip, Legend, ResponsiveContainer } from 'recharts';
+
+const COLORS = ['#0ea5e9', '#f59e0b', '#8b5cf6', '#22c55e', '#f97316'];
+const TYPE_LABELS = {
+ industrial: 'Промышленный', commercial: 'Коммерческий',
+ infrastructure: 'Инфраструктура', residential: 'Частный', other: 'Другое',
+};
+
+const ObjectTypeChart = ({ data }) => (
+
+
+ Типы объектов
+
+ {data.length === 0 ? (
+
Нет данных
+ ) : (
+
+
+
+ {data.map((entry, i) => | )}
+
+ [v, TYPE_LABELS[name] || name]} />
+
+
+ )}
+
+);
+
+export default ObjectTypeChart;
diff --git a/src/admin/analytics/charts/RevenueChart.jsx b/src/admin/analytics/charts/RevenueChart.jsx
new file mode 100644
index 0000000..8831c10
--- /dev/null
+++ b/src/admin/analytics/charts/RevenueChart.jsx
@@ -0,0 +1,25 @@
+import React from 'react';
+import { LineChart, Line, XAxis, YAxis, Tooltip, ResponsiveContainer, CartesianGrid } from 'recharts';
+
+const RevenueChart = ({ data }) => (
+
+
+ Выручка по месяцам (₽)
+
+ {data.length === 0 ? (
+
Нет закрытых заказов
+ ) : (
+
+
+
+
+ `${(v / 1000).toFixed(0)}к`} />
+ [`${v.toLocaleString('ru-RU')} ₽`, 'Выручка']} />
+
+
+
+ )}
+
+);
+
+export default RevenueChart;