Add dues management system with UI improvements
All checks were successful
Build And Push Image / docker (push) Successful in 3m3s
All checks were successful
Build And Push Image / docker (push) Successful in 3m3s
- Add BoardDuesManagement and DuesActionCard components - Create API endpoints for dues status tracking and payment marking - Integrate dues management section into board dashboard - Move create portal account button to member card action buttons - Add edit button to member view dialog - Implement member update handlers and navigation between views
This commit is contained in:
52
server/api/members/[id]/mark-dues-paid.post.ts
Normal file
52
server/api/members/[id]/mark-dues-paid.post.ts
Normal file
@@ -0,0 +1,52 @@
|
||||
// server/api/members/[id]/mark-dues-paid.post.ts
|
||||
export default defineEventHandler(async (event) => {
|
||||
try {
|
||||
const memberId = getRouterParam(event, 'id');
|
||||
|
||||
if (!memberId) {
|
||||
throw createError({
|
||||
statusCode: 400,
|
||||
statusMessage: 'Member ID is required'
|
||||
});
|
||||
}
|
||||
|
||||
const { updateMember, getMemberById } = await import('~/server/utils/nocodb');
|
||||
|
||||
// Get current member data
|
||||
const currentMember = await getMemberById(memberId);
|
||||
|
||||
if (!currentMember) {
|
||||
throw createError({
|
||||
statusCode: 404,
|
||||
statusMessage: 'Member not found'
|
||||
});
|
||||
}
|
||||
|
||||
// Prepare update data
|
||||
const today = new Date();
|
||||
const updateData = {
|
||||
current_year_dues_paid: 'true',
|
||||
membership_date_paid: today.toISOString().split('T')[0], // YYYY-MM-DD format
|
||||
payment_due_date: undefined // Clear the due date since it's now paid
|
||||
};
|
||||
|
||||
// Update the member
|
||||
const updatedMember = await updateMember(memberId, updateData);
|
||||
|
||||
console.log(`[API] Successfully marked dues as paid for member ${memberId}`);
|
||||
|
||||
return {
|
||||
success: true,
|
||||
data: updatedMember,
|
||||
message: `Dues marked as paid for ${updatedMember.first_name} ${updatedMember.last_name}`
|
||||
};
|
||||
|
||||
} catch (error: any) {
|
||||
console.error('[API] Error marking dues as paid:', error);
|
||||
|
||||
throw createError({
|
||||
statusCode: error.statusCode || 500,
|
||||
statusMessage: error.message || 'Failed to mark dues as paid'
|
||||
});
|
||||
}
|
||||
});
|
||||
75
server/api/members/dues-status.get.ts
Normal file
75
server/api/members/dues-status.get.ts
Normal file
@@ -0,0 +1,75 @@
|
||||
// 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'
|
||||
});
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user