237 lines
5.5 KiB
TypeScript
237 lines
5.5 KiB
TypeScript
import type { UserReport, User, Client, FitnessProfile } from "@fitai/shared";
|
|
|
|
// Mock data for testing
|
|
const mockUser: User = {
|
|
id: "user_123",
|
|
email: "john.doe@example.com",
|
|
firstName: "John",
|
|
lastName: "Doe",
|
|
role: "client",
|
|
phone: "555-1234",
|
|
createdAt: new Date("2024-01-15"),
|
|
updatedAt: new Date("2024-01-15"),
|
|
};
|
|
|
|
const mockClient: Client = {
|
|
id: "client_123",
|
|
userId: "user_123",
|
|
membershipType: "premium",
|
|
membershipStatus: "active",
|
|
joinDate: new Date("2024-01-15"),
|
|
};
|
|
|
|
const mockProfile: FitnessProfile = {
|
|
id: "profile_123",
|
|
userId: "user_123",
|
|
height: 175,
|
|
weight: 70,
|
|
age: 30,
|
|
gender: "male",
|
|
activityLevel: "moderately_active",
|
|
createdAt: new Date("2024-01-15"),
|
|
updatedAt: new Date("2024-01-15"),
|
|
};
|
|
|
|
const mockReport: UserReport = {
|
|
userId: "user_123",
|
|
user: mockUser,
|
|
client: mockClient,
|
|
fitnessProfile: mockProfile,
|
|
reportPeriod: {
|
|
startDate: "2024-01-01",
|
|
endDate: "2024-01-31",
|
|
},
|
|
weeklyCheckIns: [
|
|
{
|
|
weekStart: "2024-01-01",
|
|
weekEnd: "2024-01-07",
|
|
totalCheckIns: 4,
|
|
totalTimeMinutes: 240,
|
|
averageDurationMinutes: 60,
|
|
checkInsByType: [
|
|
{ type: "gym", count: 3 },
|
|
{ type: "class", count: 1 },
|
|
],
|
|
},
|
|
{
|
|
weekStart: "2024-01-08",
|
|
weekEnd: "2024-01-14",
|
|
totalCheckIns: 5,
|
|
totalTimeMinutes: 300,
|
|
averageDurationMinutes: 60,
|
|
checkInsByType: [
|
|
{ type: "gym", count: 4 },
|
|
{ type: "class", count: 1 },
|
|
],
|
|
},
|
|
],
|
|
nutrition: {
|
|
dailySummaries: [
|
|
{
|
|
date: "2024-01-01",
|
|
totalCalories: 2000,
|
|
calorieGoal: 2200,
|
|
caloriesDelta: -200,
|
|
mealsCount: 3,
|
|
},
|
|
{
|
|
date: "2024-01-02",
|
|
totalCalories: 2300,
|
|
calorieGoal: 2200,
|
|
caloriesDelta: 100,
|
|
mealsCount: 4,
|
|
},
|
|
],
|
|
averageDailyCalories: 2150,
|
|
totalDays: 2,
|
|
daysMetGoal: 1,
|
|
},
|
|
hydration: {
|
|
dailySummaries: [
|
|
{
|
|
date: "2024-01-01",
|
|
totalWater: 2000,
|
|
waterGoal: 2500,
|
|
hydrationPercentage: 80,
|
|
},
|
|
{
|
|
date: "2024-01-02",
|
|
totalWater: 2600,
|
|
waterGoal: 2500,
|
|
hydrationPercentage: 104,
|
|
},
|
|
],
|
|
averageDailyWater: 2300,
|
|
totalDays: 2,
|
|
daysMetGoal: 1,
|
|
},
|
|
goals: {
|
|
active: [
|
|
{
|
|
id: "goal_1",
|
|
userId: "user_123",
|
|
goalType: "weight_target",
|
|
title: "Lose 5kg",
|
|
description: "Lose weight for summer",
|
|
targetValue: 65,
|
|
currentValue: 70,
|
|
unit: "kg",
|
|
startDate: new Date("2024-01-01"),
|
|
status: "active",
|
|
progress: 0,
|
|
priority: "high",
|
|
createdAt: new Date("2024-01-01"),
|
|
updatedAt: new Date("2024-01-01"),
|
|
},
|
|
],
|
|
completed: [
|
|
{
|
|
id: "goal_2",
|
|
userId: "user_123",
|
|
goalType: "strength_milestone",
|
|
title: "Bench press 100kg",
|
|
targetValue: 100,
|
|
currentValue: 100,
|
|
unit: "kg",
|
|
startDate: new Date("2023-11-01"),
|
|
completedDate: new Date("2023-12-15"),
|
|
status: "completed",
|
|
progress: 100,
|
|
priority: "medium",
|
|
createdAt: new Date("2023-11-01"),
|
|
updatedAt: new Date("2023-12-15"),
|
|
},
|
|
],
|
|
totalActive: 1,
|
|
totalCompleted: 1,
|
|
averageProgress: 0,
|
|
},
|
|
profileHistory: [
|
|
{
|
|
changeType: "weight",
|
|
fieldName: "weight",
|
|
previousValue: "72",
|
|
newValue: "70",
|
|
changedAt: new Date("2024-01-15"),
|
|
},
|
|
],
|
|
recommendations: {
|
|
accepted: [
|
|
{
|
|
id: "rec_1",
|
|
userId: "user_123",
|
|
fitnessProfileId: "profile_123",
|
|
recommendationText: "Increase protein intake to 150g per day",
|
|
activityPlan: "High protein diet",
|
|
dietPlan: "Protein focused",
|
|
status: "approved",
|
|
generatedAt: new Date("2024-01-10"),
|
|
approvedAt: new Date("2024-01-11"),
|
|
approvedBy: "user_trainer",
|
|
createdAt: new Date("2024-01-10"),
|
|
updatedAt: new Date("2024-01-11"),
|
|
},
|
|
],
|
|
rejected: [],
|
|
pending: [
|
|
{
|
|
id: "rec_2",
|
|
userId: "user_123",
|
|
fitnessProfileId: "profile_123",
|
|
recommendationText: "Try HIIT workouts 3 times per week",
|
|
activityPlan: "HIIT training",
|
|
dietPlan: "No change",
|
|
status: "pending",
|
|
generatedAt: new Date("2024-01-20"),
|
|
createdAt: new Date("2024-01-20"),
|
|
updatedAt: new Date("2024-01-20"),
|
|
},
|
|
],
|
|
totalAccepted: 1,
|
|
totalRejected: 0,
|
|
totalPending: 1,
|
|
},
|
|
generatedAt: new Date(),
|
|
};
|
|
|
|
// Test function
|
|
export async function testPDFGeneration() {
|
|
try {
|
|
const { generateReportPDFBase64 } = await import(
|
|
"@/lib/pdf/report-helpers"
|
|
);
|
|
|
|
console.log("Generating PDF from mock report...");
|
|
const pdfBase64 = generateReportPDFBase64(mockReport);
|
|
|
|
console.log(`PDF generated successfully!`);
|
|
console.log(`PDF size: ${Math.round(pdfBase64.length / 1024)} KB`);
|
|
|
|
// Verify it's a valid base64 string
|
|
if (pdfBase64.startsWith("JVBERi0")) {
|
|
console.log("✓ PDF is valid (starts with PDF header)");
|
|
} else {
|
|
console.log("✗ PDF is invalid");
|
|
}
|
|
|
|
return true;
|
|
} catch (error) {
|
|
console.error("✗ PDF generation failed:", error);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Run if executed directly
|
|
if (typeof window === "undefined" && process.argv[1]?.includes("test-pdf")) {
|
|
testPDFGeneration()
|
|
.then((success) => {
|
|
process.exit(success ? 0 : 1);
|
|
})
|
|
.catch((err) => {
|
|
console.error(err);
|
|
process.exit(1);
|
|
});
|
|
}
|
|
|
|
export default testPDFGeneration;
|