monacousa-portal/server/api/members/dues-status.get.ts

118 lines
3.6 KiB
TypeScript

// 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'
});
}
});