diff --git a/src/app/(protected)/workorders/_components/detail/use-work-order-slide-over.ts b/src/app/(protected)/workorders/_components/detail/use-work-order-slide-over.ts index 62a31d71..9120bb5f 100644 --- a/src/app/(protected)/workorders/_components/detail/use-work-order-slide-over.ts +++ b/src/app/(protected)/workorders/_components/detail/use-work-order-slide-over.ts @@ -14,6 +14,7 @@ import { useUploadWorkOrderMedia, } from "@/domain/work-orders/use-cases/use-work-order-mutations"; import { isWorkOrderDocumentsReadOnly } from "@/domain/work-orders/utils/work-order-media-limits"; +import { todayIso } from "@/domain/work-orders/utils/wizard-date-utils"; import { useAuthContext } from "@/providers/auth-context"; import { useSlideOverEditState } from "./use-slide-over-edit-state"; import { useSlideOverMediaState } from "./use-slide-over-media-state"; @@ -103,7 +104,7 @@ export function useWorkOrderSlideOver({ // Mirror CompDoc finalize: ensure completedDate then mark docStatus Yes. const patch: WorkOrderTablePatch = { docStatus: "Yes" }; if (!infoSource.completedDate) { - patch.completedDate = new Date().toISOString().slice(0, 10); + patch.completedDate = todayIso(); } try { await new Promise((resolve, reject) => { diff --git a/src/test/domain/work-orders/utils/wizard-date-utils.test.ts b/src/test/domain/work-orders/utils/wizard-date-utils.test.ts index 3ee9c66a..8f63bbbf 100644 --- a/src/test/domain/work-orders/utils/wizard-date-utils.test.ts +++ b/src/test/domain/work-orders/utils/wizard-date-utils.test.ts @@ -1,8 +1,10 @@ -import { describe, expect, it } from "vitest"; +import { afterEach, describe, expect, it, vi } from "vitest"; import { fmtDateRange, fmtShortDate, + pad2, rangeDayCount, + todayIso, } from "@/domain/work-orders/utils/wizard-date-utils"; describe("fmtShortDate", () => { @@ -29,3 +31,27 @@ describe("rangeDayCount", () => { expect(rangeDayCount("2026-06-08", "2026-06-08")).toBe(1); }); }); + +describe("todayIso", () => { + afterEach(() => { + vi.useRealTimers(); + }); + + it("uses local calendar day, not UTC ISO date, near midnight", () => { + // 02:30 UTC is still the previous local evening in Americas (UTC−N). + vi.useFakeTimers(); + vi.setSystemTime(new Date("2026-08-11T02:30:00.000Z")); + + const now = new Date(); + const expectedLocal = `${now.getFullYear()}-${pad2(now.getMonth() + 1)}-${pad2(now.getDate())}`; + const utcSlice = now.toISOString().slice(0, 10); + + expect(todayIso()).toBe(expectedLocal); + expect(utcSlice).toBe("2026-08-11"); + + if (now.getTimezoneOffset() > 0) { + expect(todayIso()).toBe("2026-08-10"); + expect(todayIso()).not.toBe(utcSlice); + } + }); +});