diff --git a/src/app/api/dashboard/route.js b/src/app/api/dashboard/route.js index 94e679b..9039093 100644 --- a/src/app/api/dashboard/route.js +++ b/src/app/api/dashboard/route.js @@ -35,6 +35,9 @@ export async function GET(request) { }; }); + // Calculate values by contract + const contractSummary = {}; + projects.forEach(project => { const value = parseFloat(project.wartosc_zlecenia) || 0; const type = project.project_type; @@ -46,6 +49,26 @@ export async function GET(request) { } else if (project.wartosc_zlecenia && project.project_status !== 'cancelled') { typeSummary[type].unrealisedValue += value; } + + // Group by contract + if (project.contract_number && project.wartosc_zlecenia && project.project_status !== 'cancelled') { + const contractKey = project.contract_number; + if (!contractSummary[contractKey]) { + contractSummary[contractKey] = { + contract_name: project.contract_name || project.contract_number, + realisedValue: 0, + unrealisedValue: 0, + totalValue: 0 + }; + } + + if (project.project_status === 'fulfilled' && project.completion_date) { + contractSummary[contractKey].realisedValue += value; + } else { + contractSummary[contractKey].unrealisedValue += value; + } + contractSummary[contractKey].totalValue += value; + } }); // Calculate overall totals @@ -132,6 +155,26 @@ export async function GET(request) { realisedValue: 158000, unrealisedValue: 242000 } + }, + byContract: { + 'UMK/001/2024': { + contract_name: 'Modernizacja budynku głównego', + realisedValue: 320000, + unrealisedValue: 180000, + totalValue: 500000 + }, + 'UMK/002/2024': { + contract_name: 'Budowa parkingu wielopoziomowego', + realisedValue: 480000, + unrealisedValue: 320000, + totalValue: 800000 + }, + 'UMK/003/2024': { + contract_name: 'Remont elewacji', + realisedValue: 158000, + unrealisedValue: 242000, + totalValue: 400000 + } } }; } else { @@ -251,6 +294,17 @@ export async function GET(request) { unrealisedValue: Math.round(data.unrealisedValue) } ]) + ), + byContract: Object.fromEntries( + Object.entries(contractSummary).map(([contractNumber, data]) => [ + contractNumber, + { + contract_name: data.contract_name, + realisedValue: Math.round(data.realisedValue), + unrealisedValue: Math.round(data.unrealisedValue), + totalValue: Math.round(data.totalValue) + } + ]) ) } }); diff --git a/src/app/dashboard/page.js b/src/app/dashboard/page.js index 2b55827..a64a2bb 100644 --- a/src/app/dashboard/page.js +++ b/src/app/dashboard/page.js @@ -284,6 +284,87 @@ export default function TeamLeadsDashboard() { + + {/* By Contract Section */} + {summaryData?.byContract && Object.keys(summaryData.byContract).length > 0 && ( +
+

+ {t('teamDashboard.byContract')} +

+ +
+ + ({ + name: contractNumber, + fullName: data.contract_name, + realised: data.realisedValue, + unrealised: data.unrealisedValue, + total: data.totalValue + }))} + margin={{ + top: 20, + right: 30, + left: 20, + bottom: 100, + }} + > + + + `${(value / 1000).toFixed(0)}k`} + /> + { + if (active && payload && payload.length) { + return ( +
+

{payload[0].payload.fullName}

+

{payload[0].payload.name}

+

+ {`${t('teamDashboard.realised')}: ${formatCurrency(payload[0].payload.realised)}`} +

+

+ {`${t('teamDashboard.unrealised')}: ${formatCurrency(payload[0].payload.unrealised)}`} +

+

+ {`${t('teamDashboard.total')}: ${formatCurrency(payload[0].payload.total)}`} +

+
+ ); + } + return null; + }} + /> + + + +
+
+
+
+ )} ); diff --git a/src/lib/i18n.js b/src/lib/i18n.js index 29ccdc8..e3561d5 100644 --- a/src/lib/i18n.js +++ b/src/lib/i18n.js @@ -136,6 +136,8 @@ const translations = { realisedValue: "Wartość zrealizowana", unrealisedValue: "Wartość niezrealizowana", byProjectType: "Według typu projektu", + byContract: "Według umowy", + total: "Razem", monthLabel: "Miesiąc:", monthlyValue: "Wartość miesięczna:", cumulative: "Skumulowana:", @@ -769,6 +771,8 @@ const translations = { realisedValue: "Realised Value", unrealisedValue: "Unrealised Value", byProjectType: "By Project Type", + byContract: "By Contract", + total: "Total", monthLabel: "Month:", monthlyValue: "Monthly Value:", cumulative: "Cumulative:",