import React, { useState, useEffect } from 'react'; const ANALYTICS_API_BASE = 'http://localhost:3001/api/analytics'; const AnalyticsDashboard = () => { const [kpis, setKpis] = useState(null); const [employees, setEmployees] = useState([]); const [customers, setCustomers] = useState([]); const [materials, setMaterials] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [activeTab, setActiveTab] = useState('overview'); // Fetch analytics data useEffect(() => { const fetchAnalyticsData = async () => { try { setLoading(true); const [kpisRes, employeesRes, customersRes, materialsRes] = await Promise.all([ fetch(`${ANALYTICS_API_BASE}/kpis`), fetch(`${ANALYTICS_API_BASE}/employees`), fetch(`${ANALYTICS_API_BASE}/customers?top=10`), fetch(`${ANALYTICS_API_BASE}/materials`) ]); const [kpisData, employeesData, customersData, materialsData] = await Promise.all([ kpisRes.json(), employeesRes.json(), customersRes.json(), materialsRes.json() ]); setKpis(kpisData.data); setEmployees(employeesData.data?.slice(0, 10) || []); setCustomers(customersData.data || []); setMaterials(materialsData.data?.slice(0, 8) || []); } catch (err) { setError(err.message); console.error('Analytics fetch error:', err); } finally { setLoading(false); } }; fetchAnalyticsData(); }, []); const formatCurrency = (amount) => { if (!amount) return '0 kr'; if (amount >= 1000000) { return `${(amount / 1000000).toFixed(1)}M kr`; } else if (amount >= 1000) { return `${(amount / 1000).toFixed(0)}k kr`; } return `${amount.toLocaleString()} kr`; }; const formatNumber = (num) => { if (!num) return '0'; return num.toLocaleString(); }; if (loading) { return (
📊 Indlæser nøgletal...
); } if (error) { return (
❌ Fejl ved indlæsning: {error}
); } const KPICard = ({ title, value, icon, color = 'blue' }) => (

{title}

{value}

{icon}
); const TabButton = ({ id, label, isActive, onClick }) => ( ); const DataTable = ({ title, data, columns }) => (

{title}

{columns.map((col) => ( ))} {data.map((item, index) => ( {columns.map((col) => ( ))} ))}
{col.label}
{col.format ? col.format(item[col.key]) : item[col.key]}
); return (

📊 Business Nøgletal

Sidst opdateret: {new Date().toLocaleString('da-DK')}
{/* KPI Cards */}
{/* Tabs */}
{/* Tab Content */} {activeTab === 'overview' && (

📈 Business Metrics

Unikke Kunder {formatNumber(kpis?.unique_customers)}
Gennemsnit Projekt Værdi {formatCurrency(kpis?.avg_project_value)}
Total Timer Logget {formatNumber(kpis?.total_hours_logged)}t
Gennemsnit Timer/Projekt {kpis?.avg_hours_per_project}t

🔨 Material Overview

Total Material Indkøb {formatCurrency(kpis?.total_material_costs)}
Total Material Salg {formatCurrency(kpis?.total_material_sales)}
Material Profit {formatCurrency(kpis?.total_material_sales - kpis?.total_material_costs)}
Unikke Leverandører {formatNumber(kpis?.unique_suppliers)}
)} {activeTab === 'employees' && ( `${val}t` }, { key: 'projects_worked', label: 'Projekter' }, { key: 'total_labor_value', label: 'Værdi', format: formatCurrency }, { key: 'avg_daily_hours', label: 'Ø Timer/Dag', format: (val) => `${val}t` } ]} /> )} {activeTab === 'customers' && ( `${val}t` } ]} /> )} {activeTab === 'materials' && ( `${val}%` } ]} /> )}
); }; export default AnalyticsDashboard;