Skip to content

Commit fff9eb4

Browse files
committed
operations on date objects use utc
1 parent 5dd5abd commit fff9eb4

21 files changed

Lines changed: 108 additions & 77 deletions

src/backend/src/services/notifications.services.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,9 +197,9 @@ export default class NotificationsService {
197197
const workPackageNames = event.workPackages.map((wp) => wp.wbsElement.name).join(', ');
198198

199199
// Get the earliest scheduled start time for display
200-
const earliestSlot = event.scheduledTimes
200+
const [earliestSlot] = event.scheduledTimes
201201
.filter((slot) => slot.startTime)
202-
.sort((a, b) => new Date(a.startTime!).getTime() - new Date(b.startTime!).getTime())[0];
202+
.sort((a, b) => new Date(a.startTime!).getTime() - new Date(b.startTime!).getTime());
203203
const timeDisplay = earliestSlot ? formatTimeForSlack(new Date(earliestSlot.startTime!)) : 'TBD';
204204

205205
return (

src/backend/src/utils/change-requests.utils.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -105,11 +105,7 @@ export const updateBlocking = async (
105105
const change = {
106106
changeRequestId: crId,
107107
implementerId: reviewer.userId,
108-
detail: buildChangeDetail(
109-
'Start Date',
110-
formatDateOnly(currWbs.workPackage.startDate),
111-
formatDateOnly(newStartDate)
112-
)
108+
detail: buildChangeDetail('Start Date', formatDateOnly(currWbs.workPackage.startDate), formatDateOnly(newStartDate))
113109
};
114110

115111
await prisma.work_Package.update({

src/backend/src/utils/slack.utils.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@ import {
77
CreateSponsorTask,
88
User,
99
Event,
10-
formatForSlack,
11-
formatDateForSlack,
12-
formatTimeForSlack
10+
formatForSlack
1311
} from 'shared';
1412
import { Account_Code, Reimbursement_Product_Other_Reason, Sponsor_Task } from '@prisma/client';
1513
import {

src/backend/tests/unit/finance.test.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ describe('Finance Tests', () => {
6767
expect(result.name).toEqual('Google');
6868
expect(result.activeStatus).toBe(true);
6969
expect(result.sponsorValue).toBe(5000);
70-
expect(result.joinDate).toEqual(new Date(12, 1, 24));
70+
expect(result.joinDate).toEqual(new Date(Date.UTC(12, 1, 24)));
7171
expect(result.activeYears).toEqual([2024, 2025]);
7272
expect(result.tier.sponsorTierId).toEqual(sponsorTierId);
7373
expect(result.taxExempt).toBe(true);
@@ -228,8 +228,8 @@ describe('Finance Tests', () => {
228228
);
229229

230230
expect(newSponsorTask.notes).toEqual('newNotes');
231-
expect(newSponsorTask.dueDate).toEqual(new Date(12, 10, 24));
232-
expect(newSponsorTask.notifyDate).toEqual(new Date(12, 20, 24));
231+
expect(newSponsorTask.dueDate).toEqual(new Date(Date.UTC(12, 10, 24)));
232+
expect(newSponsorTask.notifyDate).toEqual(new Date(Date.UTC(12, 20, 24)));
233233
expect(newSponsorTask.assigneeUserId).toEqual(user.userId);
234234
});
235235
it('Edit fails with non head user trying to edit', async () => {
@@ -459,7 +459,7 @@ describe('Finance Tests', () => {
459459

460460
expect(result.assignee?.userId).toEqual(user.userId);
461461
expect(result.notes).toEqual('hello notes');
462-
expect(result.dueDate).toEqual(new Date(1, 2, 3));
462+
expect(result.dueDate).toEqual(new Date(Date.UTC(1, 2, 3)));
463463
expect(result.assignee?.userId).toEqual(user.userId);
464464
});
465465
});
@@ -529,7 +529,7 @@ describe('Finance Tests', () => {
529529
expect(updatedSponsor.name).toBe('newName');
530530
expect(updatedSponsor.activeStatus).toBe(false);
531531
expect(updatedSponsor.sponsorValue).toBe(4000);
532-
expect(updatedSponsor.joinDate).toEqual(new Date(5, 11, 25));
532+
expect(updatedSponsor.joinDate).toEqual(new Date(Date.UTC(5, 11, 25)));
533533
expect(updatedSponsor.activeYears).toEqual([2024, 2025]);
534534
expect(updatedSponsor.tier.sponsorTierId).toBe(sponsorTierId);
535535
expect(updatedSponsor.sponsorContact).toBe('New Vendor Contact');

src/backend/tests/unit/recruitment.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ describe('Recruitment Tests', () => {
121121

122122
expect(result.name).toEqual('name');
123123
expect(result.description).toEqual('description');
124-
expect(result.dateOfEvent).toEqual(new Date('11/12/24'));
124+
expect(result.dateOfEvent).toEqual(new Date('2024-11-12'));
125125
});
126126
});
127127

@@ -202,7 +202,7 @@ describe('Recruitment Tests', () => {
202202

203203
expect(updatedMilestone.name).toEqual('new name');
204204
expect(updatedMilestone.description).toEqual('new description');
205-
expect(updatedMilestone.dateOfEvent).toEqual(new Date('11/14/24'));
205+
expect(updatedMilestone.dateOfEvent).toEqual(new Date('2024-11-14'));
206206
});
207207
});
208208

src/backend/tests/unit/reimbursement-requests.test.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ describe('Reimbursement Requests', () => {
182182
expect(rr.indexCode.name).toEqual('CASH');
183183
expect(rr.vendor.vendorId).toEqual(createdVendor.vendorId);
184184
expect(rr.recipient.userId).toEqual(createdUser.userId);
185-
expect(rr.dateOfExpense).toEqual(new Date('12-29-2023'));
185+
expect(rr.dateOfExpense).toEqual(new Date('2023-12-29'));
186186
expect(rr.reimbursementProducts).toHaveLength(1);
187187
expect(rr.reimbursementProducts[0].name).toEqual('GLUE');
188188
expect(rr.reimbursementProducts[0].cost).toEqual(200000);
@@ -267,7 +267,11 @@ describe('Reimbursement Requests', () => {
267267
dateToSetAsDelivered
268268
);
269269

270-
expect(updatedRR.dateDelivered).toEqual(dateToSetAsDelivered);
270+
// @db.Date strips time component, so compare date portion only
271+
const expectedDate = new Date(
272+
Date.UTC(dateToSetAsDelivered.getFullYear(), dateToSetAsDelivered.getMonth(), dateToSetAsDelivered.getDate())
273+
);
274+
expect(updatedRR.dateDelivered).toEqual(expectedDate);
271275
});
272276
});
273277

src/backend/tests/unmocked/recruitment.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ describe('Recruitment Tests', () => {
121121

122122
expect(result.name).toEqual('name');
123123
expect(result.description).toEqual('description');
124-
expect(result.dateOfEvent).toEqual(new Date('11/12/24'));
124+
expect(result.dateOfEvent).toEqual(new Date('2024-11-12'));
125125
});
126126
});
127127

@@ -202,7 +202,7 @@ describe('Recruitment Tests', () => {
202202

203203
expect(updatedMilestone.name).toEqual('new name');
204204
expect(updatedMilestone.description).toEqual('new description');
205-
expect(updatedMilestone.dateOfEvent).toEqual(new Date('11/14/24'));
205+
expect(updatedMilestone.dateOfEvent).toEqual(new Date('2024-11-14'));
206206
});
207207
});
208208

src/backend/tests/unmocked/reimbursement-requests.test.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ describe('Reimbursement Requests', () => {
193193
expect(rr.indexCode.name).toEqual('CASH');
194194
expect(rr.vendor.vendorId).toEqual(createdVendor.vendorId);
195195
expect(rr.recipient.userId).toEqual(createdUser.userId);
196-
expect(rr.dateOfExpense).toEqual(new Date('12-29-2023'));
196+
expect(rr.dateOfExpense).toEqual(new Date('2023-12-29'));
197197
expect(rr.reimbursementProducts).toHaveLength(1);
198198
expect(rr.reimbursementProducts[0].name).toEqual('GLUE');
199199
expect(rr.reimbursementProducts[0].cost).toEqual(200000);
@@ -274,7 +274,11 @@ describe('Reimbursement Requests', () => {
274274
dateToSetAsDelivered
275275
);
276276

277-
expect(updatedRR.dateDelivered).toEqual(dateToSetAsDelivered);
277+
// @db.Date strips time component, so compare date portion only
278+
const expectedDate = new Date(
279+
Date.UTC(dateToSetAsDelivered.getFullYear(), dateToSetAsDelivered.getMonth(), dateToSetAsDelivered.getDate())
280+
);
281+
expect(updatedRR.dateDelivered).toEqual(expectedDate);
278282
});
279283
});
280284

src/backend/tests/unmocked/statistics.test.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,9 @@ describe('Statistics Tests', () => {
152152
graphDisplayType: 'PIE',
153153
measure: Measure.AVG
154154
});
155-
expect(result.startDate).toStrictEqual(new Date('12/12/1970'));
156-
expect(result.endDate?.getTime()).toBeGreaterThan(new Date('12/12/2024').getTime());
155+
expect(result.startDate).toStrictEqual(new Date('1970-12-12'));
156+
// @db.Date stores only date portion, so endDate becomes 2024-12-12 midnight UTC
157+
expect(result.endDate).toStrictEqual(new Date('2024-12-12'));
157158

158159
expect(result.graphData).toStrictEqual([
159160
{
@@ -194,7 +195,7 @@ describe('Statistics Tests', () => {
194195
graphDisplayType: 'BAR',
195196
measure: Measure.SUM
196197
});
197-
expect(result.startDate).toStrictEqual(new Date('12/12/1970'));
198+
expect(result.startDate).toStrictEqual(new Date('1970-12-12'));
198199
expect(result.endDate?.getTime()).toBeGreaterThan(new Date('12/12/2024').getTime());
199200

200201
expect(result.graphData).toStrictEqual([
@@ -276,8 +277,8 @@ describe('Statistics Tests', () => {
276277
graphDisplayType: 'BAR',
277278
measure: Measure.SUM
278279
});
279-
expect(result.startDate).toStrictEqual(new Date('12/12/1970'));
280-
expect(result.endDate).toStrictEqual(new Date('12/12/1971'));
280+
expect(result.startDate).toStrictEqual(new Date('1970-12-12'));
281+
expect(result.endDate).toStrictEqual(new Date('1971-12-12'));
281282

282283
expect(result.graphData).toStrictEqual([
283284
{
@@ -459,8 +460,8 @@ describe('Statistics Tests', () => {
459460

460461
describe('Edit Graph', () => {
461462
it('Edit graph correctly updates startDate, endDate, title, and graphType', async () => {
462-
const updatedStartDate = new Date('12/13/2024');
463-
const updatedEndDate = new Date(updatedStartDate.getTime() + 10000);
463+
const updatedStartDate = new Date('2024-12-13');
464+
const updatedEndDate = new Date('2024-12-14');
464465
const updatedTitle = 'Updated Graph';
465466
const updatedGraphType = Graph_Type.PROJECT_BUDGET_BY_PROJECT;
466467
const updatedMeasure = Measure.AVG;

src/frontend/src/pages/CalendarPage/AvailabilityScheduleView.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Typography } from '@mui/material';
2-
import { Availability, Event, EventWithMembers, getDayOfWeek, getNextSevenDays, User } from 'shared';
2+
import { Availability, dbDateToLocalDate, Event, EventWithMembers, getDayOfWeek, getNextSevenDays, User } from 'shared';
33
import React, { useState } from 'react';
44
import { enumToArray, getBackgroundColor, NUMBER_OF_TIME_SLOTS, REVIEW_TIMES } from '../../utils/design-review.utils';
55
import { datePipe } from '../../utils/pipes';
@@ -30,8 +30,10 @@ const AvailabilityScheduleView: React.FC<AvailabilityScheduleViewProps> = ({
3030
}) => {
3131
const totalUsers = usersToAvailabilities.size;
3232
const [selectedTimeslot, setSelectedTimeslot] = useState<number | null>(null);
33-
// Use displayDate if provided, otherwise fall back to event's initial date
34-
const initialDate = displayDate || event.initialDateScheduled || new Date();
33+
// Use displayDate if provided, otherwise fall back to event's initial date.
34+
// initialDateScheduled is @db.Date (midnight UTC) — normalize to local calendar date.
35+
const initialDate =
36+
displayDate || (event.initialDateScheduled ? dbDateToLocalDate(event.initialDateScheduled) : new Date());
3537
const potentialDays = getNextSevenDays(initialDate);
3638

3739
// Handle hover - updates the sidebar with available/unavailable users and slot info

0 commit comments

Comments
 (0)