// 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[] = []; const severelyOverdueMembers: any[] = []; for (const member of allMembers.list) { // Check for severely overdue members (more than 1 year past due date) let isSeverelyOverdue = false; if (member.current_year_dues_paid === 'true' && member.membership_date_paid) { // If dues are marked as paid, check if it's been more than 1 year since payment const lastPaidDate = new Date(member.membership_date_paid); const oneYearFromPayment = new Date(lastPaidDate); oneYearFromPayment.setFullYear(oneYearFromPayment.getFullYear() + 1); if (today > oneYearFromPayment) { isSeverelyOverdue = true; } } else if (member.current_year_dues_paid !== 'true') { // If dues are not paid, check payment due date or member since date let dueDate: Date; if (member.payment_due_date) { dueDate = new Date(member.payment_due_date); } else if (member.member_since) { // Fallback: 1 year from member since date dueDate = new Date(member.member_since); dueDate.setFullYear(dueDate.getFullYear() + 1); } else { // Skip if we can't determine due date continue; } // Check if more than 1 year overdue const oneYearOverdue = new Date(dueDate); oneYearOverdue.setFullYear(oneYearOverdue.getFullYear() + 1); if (today > oneYearOverdue) { isSeverelyOverdue = true; } } if (isSeverelyOverdue) { severelyOverdueMembers.push(member); continue; // Don't add to other lists } // Skip if dues are already paid (and not severely overdue) 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 (but not severely 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' }); } });