// server/api/members/dues-status.get.ts export default defineEventHandler(async (event) => { try { const { getMembers } = await import('~/server/utils/nocodb'); // Get all members const allMembers = await getMembers(); if (!allMembers?.list) { return { success: true, data: { overdue: [], upcoming: [] } }; } const today = new Date(); const thirtyDaysFromNow = new Date(); thirtyDaysFromNow.setDate(today.getDate() + 30); const overdueMembers: any[] = []; const upcomingMembers: any[] = []; for (const member of allMembers.list) { // Skip if dues are already paid if (member.current_year_dues_paid === 'true') { continue; } // Check if member has a payment due date if (member.payment_due_date) { const dueDate = new Date(member.payment_due_date); if (dueDate < today) { // Overdue overdueMembers.push(member); } else if (dueDate <= thirtyDaysFromNow) { // Due within 30 days upcomingMembers.push(member); } } } // Sort by due date (most overdue/earliest due first) overdueMembers.sort((a, b) => { const dateA = new Date(a.payment_due_date); const dateB = new Date(b.payment_due_date); return dateA.getTime() - dateB.getTime(); }); upcomingMembers.sort((a, b) => { const dateA = new Date(a.payment_due_date); const dateB = new Date(b.payment_due_date); return dateA.getTime() - dateB.getTime(); }); return { success: true, data: { overdue: overdueMembers, upcoming: upcomingMembers } }; } catch (error: any) { console.error('[API] Error fetching dues status:', error); throw createError({ statusCode: error.statusCode || 500, statusMessage: error.message || 'Failed to fetch dues status' }); } });