119 lines
4.0 KiB
TypeScript
119 lines
4.0 KiB
TypeScript
// server/api/admin/generate-member-ids.post.ts
|
|
export default defineEventHandler(async (event) => {
|
|
try {
|
|
const body = await readBody(event).catch(() => ({}));
|
|
const { forceRegenerate = false } = body;
|
|
|
|
const { getMembers, updateMember } = await import('~/server/utils/nocodb');
|
|
const { generateUniqueMemberId } = await import('~/server/utils/member-id');
|
|
|
|
console.log('[api/admin/generate-member-ids.post] Starting member ID generation...');
|
|
|
|
// Get all members
|
|
const membersResponse = await getMembers();
|
|
const members = membersResponse?.list || [];
|
|
|
|
if (members.length === 0) {
|
|
return {
|
|
success: true,
|
|
message: 'No members found to process',
|
|
stats: {
|
|
total: 0,
|
|
generated: 0,
|
|
skipped: 0,
|
|
failed: 0
|
|
}
|
|
};
|
|
}
|
|
|
|
// Filter members that need IDs (unless force regenerate)
|
|
const membersToProcess = forceRegenerate
|
|
? members
|
|
: members.filter((member: any) => !member.member_id || member.member_id.trim() === '');
|
|
|
|
console.log(`[api/admin/generate-member-ids.post] Found ${membersToProcess.length} members to process (out of ${members.length} total)`);
|
|
|
|
const results = {
|
|
total: members.length,
|
|
generated: 0,
|
|
skipped: members.length - membersToProcess.length,
|
|
failed: 0,
|
|
errors: [] as any[]
|
|
};
|
|
|
|
// Process each member
|
|
for (const member of membersToProcess) {
|
|
try {
|
|
// Generate unique member ID
|
|
const memberID = await generateUniqueMemberId();
|
|
|
|
console.log(`[api/admin/generate-member-ids.post] Generated ID ${memberID} for ${member.first_name} ${member.last_name} (ID: ${member.Id})`);
|
|
|
|
// Update the member with the new ID
|
|
await updateMember(member.Id, {
|
|
member_id: memberID
|
|
});
|
|
|
|
results.generated++;
|
|
|
|
console.log(`[api/admin/generate-member-ids.post] ✅ Successfully assigned ID ${memberID} to member ${member.Id}`);
|
|
|
|
} catch (error: any) {
|
|
console.error(`[api/admin/generate-member-ids.post] ❌ Failed to generate ID for member ${member.Id}:`, error);
|
|
results.failed++;
|
|
results.errors.push({
|
|
memberId: member.Id,
|
|
name: `${member.first_name} ${member.last_name}`,
|
|
error: error.message || 'Unknown error'
|
|
});
|
|
}
|
|
}
|
|
|
|
// Calculate and update payment_due_date for all members with membership_date_paid
|
|
console.log('[api/admin/generate-member-ids.post] Updating payment due dates for paid members...');
|
|
|
|
let duesDatesFixed = 0;
|
|
for (const member of members) {
|
|
if (member.membership_date_paid && !member.payment_due_date) {
|
|
try {
|
|
const paymentDate = new Date(member.membership_date_paid);
|
|
const dueDate = new Date(paymentDate);
|
|
dueDate.setFullYear(dueDate.getFullYear() + 1);
|
|
|
|
await updateMember(member.Id, {
|
|
payment_due_date: dueDate.toISOString().split('T')[0]
|
|
});
|
|
|
|
duesDatesFixed++;
|
|
console.log(`[api/admin/generate-member-ids.post] Fixed payment_due_date for member ${member.Id}`);
|
|
} catch (error) {
|
|
console.error(`[api/admin/generate-member-ids.post] Failed to fix payment_due_date for member ${member.Id}:`, error);
|
|
}
|
|
}
|
|
}
|
|
|
|
const message = `Member ID generation complete!\n` +
|
|
`Generated: ${results.generated} IDs\n` +
|
|
`Skipped: ${results.skipped} (already have IDs)\n` +
|
|
`Failed: ${results.failed}\n` +
|
|
`Payment Due Dates Fixed: ${duesDatesFixed}`;
|
|
|
|
console.log(`[api/admin/generate-member-ids.post] ${message}`);
|
|
|
|
return {
|
|
success: results.failed === 0,
|
|
message,
|
|
stats: {
|
|
...results,
|
|
duesDatesFixed
|
|
}
|
|
};
|
|
|
|
} catch (error: any) {
|
|
console.error('[api/admin/generate-member-ids.post] Error:', error);
|
|
throw createError({
|
|
statusCode: error.statusCode || 500,
|
|
statusMessage: error.message || 'Failed to generate member IDs'
|
|
});
|
|
}
|
|
}); |