From f586b2c240c3c8ef0fa98de193668434659494e2 Mon Sep 17 00:00:00 2001 From: Jeremiah Saunders Date: Thu, 17 Jul 2025 15:13:22 -0500 Subject: [PATCH 1/2] Fix currency calculation counting unapproved projects within the top 4 projects as approved, resulting in additional shells from the top 4 approved projects. Also check for any hours missing from the top 4 approved projects, and subtract those from currency calculation. --- lib/project.ts | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/lib/project.ts b/lib/project.ts index 94c351a..c6ce4d7 100644 --- a/lib/project.ts +++ b/lib/project.ts @@ -348,9 +348,20 @@ export function calculateProgressMetrics(projects: any[]): ProgressMetrics { } }); + // Get top 4 approved projects for currency calculation + const top4ApprovedProjects = top4Projects.filter(({project}) => getProjectApprovedHours(project) > 0).slice(0, 4); + const top4ApprovedProjectIds = new Set(top4ApprovedProjects.map(({project}) => project.projectID)); + + // Calculate how many approved hours the user is missing from their top 4 projects + let missingApprovedHours = 0; + top4Projects.forEach(({project}) => { + const approvedHours = getProjectApprovedHours(project); + if (approvedHours < 15) { + missingApprovedHours += (15 - approvedHours); + } + }); const phi = (1 + Math.sqrt(5)) / 2; - const top4ProjectIds = new Set(top4Projects.map(({ project }) => project.projectID)); allProjectsWithHours.forEach(({ project, hours }) => { rawHours += hours; @@ -361,14 +372,24 @@ export function calculateProgressMetrics(projects: any[]): ProgressMetrics { if (approvedHours > 0) { - if (top4ProjectIds.has(project.projectID)) { + if (top4ApprovedProjectIds.has(project.projectID)) { // Top 4 projects: beyond 15 hours if (approvedHours > 15) { currency += (approvedHours - 15) * (phi * 10); } } else { // All other shipped projects - currency += approvedHours * (phi * 10); + let validProjectHours; + // If the user is missing approved hours from their top 4 approved projects + if (missingApprovedHours > 0) { + // Add any overflow to the currency + validProjectHours = Math.min(approvedHours - missingApprovedHours, 0); + // Reduce missing approved hours by the project hours + missingApprovedHours = Math.max(0, missingApprovedHours - approvedHours); + } else { + validProjectHours = approvedHours; + } + currency += validProjectHours * (phi * 10); } } } From 6bf29e07e5a78d6ee88a0eb43e4e3d78c2e1e1a8 Mon Sep 17 00:00:00 2001 From: Jeremiah Saunders <46662314+UCYT5040@users.noreply.github.com> Date: Fri, 18 Jul 2025 02:02:20 +0000 Subject: [PATCH 2/2] Also fix currency calculation for the client --- lib/project-client.ts | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/lib/project-client.ts b/lib/project-client.ts index e223b2e..3b43d7b 100644 --- a/lib/project-client.ts +++ b/lib/project-client.ts @@ -108,8 +108,20 @@ export function calculateProgressMetrics(projects: any[], purchasedProgressHours }); + // Get top 4 approved projects for currency calculation + const top4ApprovedProjects = top4Projects.filter(({project}) => getProjectApprovedHours(project) > 0).slice(0, 4); + const top4ApprovedProjectIds = new Set(top4ApprovedProjects.map(({project}) => project.projectID)); + + // Calculate how many approved hours the user is missing from their top 4 projects + let missingApprovedHours = 0; + top4Projects.forEach(({project}) => { + const approvedHours = getProjectApprovedHours(project); + if (approvedHours < 15) { + missingApprovedHours += (15 - approvedHours); + } + }); + const phi = (1 + Math.sqrt(5)) / 2; - const top4ProjectIds = new Set(top4Projects.map(({ project }) => project.projectID)); allProjectsWithHours.forEach(({ project, hours }) => { rawHours += hours; @@ -120,14 +132,24 @@ export function calculateProgressMetrics(projects: any[], purchasedProgressHours if (approvedHours > 0) { - if (top4ProjectIds.has(project.projectID)) { + if (top4ApprovedProjectIds.has(project.projectID)) { // Top 4 projects: beyond 15 hours if (approvedHours > 15) { currency += (approvedHours - 15) * (phi * 10); } } else { // All other shipped projects - currency += approvedHours * (phi * 10); + let validProjectHours; + // If the user is missing approved hours from their top 4 approved projects + if (missingApprovedHours > 0) { + // Add any overflow to the currency + validProjectHours = Math.min(approvedHours - missingApprovedHours, 0); + // Reduce missing approved hours by the project hours + missingApprovedHours = Math.max(0, missingApprovedHours - approvedHours); + } else { + validProjectHours = approvedHours; + } + currency += validProjectHours * (phi * 10); } } }