86 lines
2.7 KiB
TypeScript
86 lines
2.7 KiB
TypeScript
// 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'
|
|
});
|
|
}
|
|
|
|
// Get request body for custom payment date
|
|
const body = await readBody(event).catch(() => ({}));
|
|
const customPaymentDate = body.paymentDate;
|
|
|
|
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'
|
|
});
|
|
}
|
|
|
|
// Determine payment date - use custom date if provided, otherwise today
|
|
let paymentDate: string;
|
|
let paymentDateObj: Date;
|
|
|
|
if (customPaymentDate) {
|
|
try {
|
|
// Validate the custom date
|
|
paymentDateObj = new Date(customPaymentDate);
|
|
if (isNaN(paymentDateObj.getTime())) {
|
|
throw new Error('Invalid date format');
|
|
}
|
|
paymentDate = paymentDateObj.toISOString().split('T')[0]; // YYYY-MM-DD format
|
|
} catch (error) {
|
|
throw createError({
|
|
statusCode: 400,
|
|
statusMessage: 'Invalid payment date provided. Please use YYYY-MM-DD format.'
|
|
});
|
|
}
|
|
} else {
|
|
// Default to today if no custom date provided
|
|
paymentDateObj = new Date();
|
|
paymentDate = paymentDateObj.toISOString().split('T')[0];
|
|
}
|
|
|
|
// Calculate next payment due date (1 year from payment date)
|
|
const nextDueDate = new Date(paymentDateObj);
|
|
nextDueDate.setFullYear(nextDueDate.getFullYear() + 1);
|
|
const nextDueDateStr = nextDueDate.toISOString().split('T')[0];
|
|
|
|
// Prepare update data
|
|
const updateData = {
|
|
current_year_dues_paid: 'true',
|
|
membership_date_paid: paymentDate,
|
|
payment_due_date: nextDueDateStr, // Set to 1 year from payment date
|
|
membership_status: 'Active' // Ensure member is marked as active when dues are paid
|
|
};
|
|
|
|
// Update the member
|
|
const updatedMember = await updateMember(memberId, updateData);
|
|
|
|
console.log(`[API] Successfully marked dues as paid for member ${memberId} with payment date: ${paymentDate}`);
|
|
|
|
return {
|
|
success: true,
|
|
data: updatedMember,
|
|
message: `Dues marked as paid for ${updatedMember.first_name} ${updatedMember.last_name} (Payment Date: ${paymentDate})`
|
|
};
|
|
|
|
} 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'
|
|
});
|
|
}
|
|
});
|