Skip to content

Commit 7866e88

Browse files
authored
Merge pull request #32 from hackclub/bkend_second
FIX - again, wrong db hours
2 parents 87b4bb0 + c1e87e5 commit 7866e88

3 files changed

Lines changed: 42 additions & 8 deletions

File tree

client/src/components/ProjectsPage.jsx

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,22 @@ function getShipLockReason(project) {
117117
return missing.length ? `Locked: ${missing.join(", ")}.` : "";
118118
}
119119

120+
function formatHours(value) {
121+
return Number(value ?? 0).toFixed(2);
122+
}
123+
124+
function getLoggedHours(project) {
125+
return Number(project.combinedHours ?? project.totalHours ?? project.journalHours ?? 0);
126+
}
127+
128+
function getApprovedBankedHours(project) {
129+
return Math.max(Number(project.approvedHours ?? 0), Number(project.pastApprovedHours ?? 0));
130+
}
131+
132+
function getUnshippedHours(project) {
133+
return Math.max(0, Number((getLoggedHours(project) - getApprovedBankedHours(project)).toFixed(2)));
134+
}
135+
120136
export function ProjectsPage() {
121137
const { user } = useAuth();
122138
const [projects, setProjects] = useState([]);
@@ -490,6 +506,7 @@ export function ProjectsPage() {
490506

491507
function ProjectDetailsModal({ project, onClose, onEdit, onJournal, onShip, onDelete }) {
492508
const shipLockReason = getShipLockReason(project);
509+
const unshippedHours = getUnshippedHours(project);
493510

494511
return (
495512
<div className="projects-page__modal-overlay" role="presentation" onClick={onClose}>
@@ -518,19 +535,23 @@ function ProjectDetailsModal({ project, onClose, onEdit, onJournal, onShip, onDe
518535
</div>
519536
<div className="projects-page__modal-row">
520537
<span>Hours logged (combined)</span>
521-
<strong>{project.combinedHours ?? project.totalHours ?? 0}</strong>
538+
<strong>{formatHours(getLoggedHours(project))}</strong>
522539
</div>
523540
<div className="projects-page__modal-row">
524541
<span>Hours approved</span>
525-
<strong>{project.approvedHours || 0}</strong>
542+
<strong>{formatHours(getApprovedBankedHours(project))}</strong>
543+
</div>
544+
<div className="projects-page__modal-row">
545+
<span>Unshipped hours</span>
546+
<strong>{formatHours(unshippedHours)}</strong>
526547
</div>
527548
<div className="projects-page__modal-row">
528549
<span>Journal hours</span>
529-
<strong>{project.journalHours || 0}</strong>
550+
<strong>{formatHours(project.journalHours)}</strong>
530551
</div>
531552
<div className="projects-page__modal-row">
532553
<span>Hackatime hours</span>
533-
<strong>{project.hackatimeHours || 0}</strong>
554+
<strong>{formatHours(project.hackatimeHours)}</strong>
534555
</div>
535556
<div className="projects-page__modal-row">
536557
<span>Hackatime projects</span>

server/airtableYsws.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,12 @@ function totalLoggedHours(project) {
129129
return roundedHours(numberOrZero(project.total_hours) + numberOrZero(project.hackatime_hours));
130130
}
131131

132+
function approvedBankedHours(project) {
133+
return roundedHours(Math.max(numberOrZero(project.past_approved_hours), numberOrZero(project.approved_hours)));
134+
}
135+
132136
function pendingHours(project) {
133-
return Math.max(0, roundedHours(totalLoggedHours(project) - numberOrZero(project.past_approved_hours)));
137+
return Math.max(0, roundedHours(totalLoggedHours(project) - approvedBankedHours(project)));
134138
}
135139

136140
function yswsStatusForProject(project) {

server/projects.js

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,11 @@ export async function ensureProjectsTable() {
8686
await pool.query("ALTER TABLE projects DROP COLUMN IF EXISTS github_username");
8787
await pool.query(`UPDATE projects SET reviewed = FALSE WHERE reviewed IS NULL`);
8888
await pool.query(`UPDATE projects SET past_approved_hours = COALESCE(approved_hours, 0) WHERE past_approved_hours IS NULL`);
89+
await pool.query(`
90+
UPDATE projects
91+
SET past_approved_hours = GREATEST(COALESCE(past_approved_hours, 0), COALESCE(approved_hours, 0))
92+
WHERE COALESCE(past_approved_hours, 0) < COALESCE(approved_hours, 0)
93+
`);
8994
await pool.query(`UPDATE projects SET bricks_earned = 0 WHERE bricks_earned IS NULL`);
9095
await pool.query(`UPDATE projects SET fraud_flag = FALSE WHERE fraud_flag IS NULL`);
9196
await pool.query(`UPDATE projects SET ship_kind = 'initial' WHERE ship_kind IS NULL`);
@@ -404,7 +409,7 @@ export async function approveAdminReviewProject(adminId, projectId, input = {})
404409
if (!project.shipped) throw new Error("Project is not in the review queue.");
405410
if (project.reviewed && project.status === "approved") throw new Error("Project is already approved.");
406411

407-
const bankedHours = roundedHours(project.past_approved_hours);
412+
const bankedHours = approvedBankedHours(project);
408413
const totalLoggedHours = loggedHours(project);
409414
const pendingCap = pendingReviewHours(project);
410415
if (approvedHours > pendingCap) {
@@ -941,8 +946,12 @@ function loggedHours(row) {
941946
return roundedHours(numberOrZero(row.journal_hours ?? row.total_hours) + numberOrZero(row.hackatime_hours));
942947
}
943948

949+
function approvedBankedHours(row) {
950+
return roundedHours(Math.max(numberOrZero(row.past_approved_hours), numberOrZero(row.approved_hours)));
951+
}
952+
944953
function pendingReviewHours(row) {
945-
return Math.max(0, roundedHours(loggedHours(row) - numberOrZero(row.past_approved_hours)));
954+
return Math.max(0, roundedHours(loggedHours(row) - approvedBankedHours(row)));
946955
}
947956

948957
async function getProjectRowForAirtableSync(projectId) {
@@ -1034,7 +1043,7 @@ function toPublicProject(row) {
10341043
combinedHours: Number((journalHours + hackatimeHours).toFixed(2)),
10351044
baselineHours: row.baseline_hours != null ? Number(row.baseline_hours) : null,
10361045
approvedHours: Number(row.approved_hours ?? 0),
1037-
pastApprovedHours: Number(row.past_approved_hours ?? 0),
1046+
pastApprovedHours: approvedBankedHours(row),
10381047
bricksEarned: Number(row.bricks_earned ?? 0),
10391048
adminFeedback: row.admin_feedback,
10401049
hourJustification: row.hour_justification,

0 commit comments

Comments
 (0)