diff --git a/src/app/api/doctor-report/pdf/route.ts b/src/app/api/doctor-report/pdf/route.ts index 5b8588998..665067735 100644 --- a/src/app/api/doctor-report/pdf/route.ts +++ b/src/app/api/doctor-report/pdf/route.ts @@ -14,6 +14,7 @@ import { renderDoctorReportPdfBytes } from "@/lib/doctor-report-pdf-core"; import { getServerTranslator } from "@/lib/i18n/server-translator"; import { parseLocaleFromAcceptLanguage } from "@/lib/format-locale"; import { locales, type Locale } from "@/lib/i18n/config"; +import { resolveUserTimezone } from "@/lib/tz/resolver"; /** * Server-rendered PDF doctor report. @@ -58,10 +59,13 @@ export const POST = apiHandler(async (request: NextRequest) => { } } - const data = await collectDoctorReportData(user.id, range, { practiceName }); + const [data, userTz] = await Promise.all([ + collectDoctorReportData(user.id, range, { practiceName }), + resolveUserTimezone(user.id), + ]); const { t } = getServerTranslator(locale); - const pdfBytes = renderDoctorReportPdfBytes(data, { t, locale }); + const pdfBytes = renderDoctorReportPdfBytes(data, { t, locale, userTz }); await auditLog("doctor-report.pdf.generate", { userId: user.id, diff --git a/src/lib/doctor-report-pdf-core.ts b/src/lib/doctor-report-pdf-core.ts index 02b32e440..21826fa09 100644 --- a/src/lib/doctor-report-pdf-core.ts +++ b/src/lib/doctor-report-pdf-core.ts @@ -26,6 +26,14 @@ export interface DoctorReportRenderOptions { * tests; defaults to `new Date()`. */ now?: Date; + /** + * v1.4.25 W7 — per-user display timezone. When omitted the report + * renders timestamps in Europe/Berlin (legacy contract). Server + * callers pass `resolveUserTimezone(user.id)`; client callers pass + * the value from auth context so a US user's PDF carries + * Eastern-time rows even when generated in the browser. + */ + userTz?: string; } /** @@ -137,8 +145,8 @@ export function buildDoctorReportPdfDocument( data: DoctorReportData, options: DoctorReportRenderOptions, ): jsPDF { - const { t, locale, now = new Date() } = options; - const formatters = makeFormatters(locale); + const { t, locale, now = new Date(), userTz } = options; + const formatters = makeFormatters(locale, userTz); const num = (value: number, decimals = 1) => formatters.number(value, decimals); const fmtDate = (iso: string) => formatters.date(iso);