Add overdue dues management system with notifications and status updates
All checks were successful
Build And Push Image / docker (push) Successful in 2m55s

- Create DuesOverdueBanner component for displaying overdue member counts
- Add API endpoints for overdue count retrieval and status updates
- Integrate overdue dues banner into admin and member list dashboards
- Implement handlers for viewing overdue members and updating statuses
- Add dues management section to admin dashboard
This commit is contained in:
2025-08-10 23:29:48 +02:00
parent d3c3a865ba
commit ff85d1c722
6 changed files with 535 additions and 6 deletions

View File

@@ -112,6 +112,29 @@
</v-col>
</v-row>
<!-- Overdue Dues Banner -->
<DuesOverdueBanner
:overdue-count="overdueCount"
:can-update-statuses="true"
:can-send-reminders="true"
:refresh-trigger="overdueRefreshTrigger"
@view-overdue="viewOverdueMembers"
@send-reminders="sendDuesReminders"
@statuses-updated="handleStatusesUpdated"
/>
<!-- Dues Management -->
<v-row class="mb-6">
<v-col cols="12">
<BoardDuesManagement
:refresh-trigger="duesRefreshTrigger"
@view-member="handleViewMember"
@view-all-members="navigateToMembers"
@member-updated="handleMemberUpdated"
/>
</v-col>
</v-row>
<!-- Portal Configuration -->
<v-row class="mb-6">
<v-col cols="12">
@@ -390,6 +413,11 @@ const showRecaptchaConfig = ref(false);
const showMembershipConfig = ref(false);
const showEmailConfig = ref(false);
// Dues management
const overdueCount = ref(0);
const overdueRefreshTrigger = ref(0);
const duesRefreshTrigger = ref(0);
// Create user dialog data
const createUserValid = ref(false);
const creatingUser = ref(false);
@@ -622,9 +650,60 @@ const systemMaintenance = () => {
// TODO: Implement maintenance mode
};
// Load stats on component mount
// Dues management handlers
const loadOverdueCount = async () => {
try {
const response = await $fetch<{ success: boolean; data: { count: number } }>('/api/members/overdue-count');
if (response.success) {
overdueCount.value = response.data.count;
}
} catch (error: any) {
console.error('Error loading overdue count:', error);
}
};
const viewOverdueMembers = () => {
// Navigate to member list with overdue filter applied
navigateTo('/dashboard/member-list');
};
const sendDuesReminders = () => {
// Placeholder for dues reminder functionality
console.log('Send dues reminders - feature to be implemented');
};
const handleStatusesUpdated = async (updatedCount: number) => {
console.log(`Successfully updated ${updatedCount} member${updatedCount !== 1 ? 's' : ''} to inactive status`);
// Refresh overdue count
await loadOverdueCount();
// Trigger banner refresh
overdueRefreshTrigger.value += 1;
};
const handleViewMember = (member: any) => {
// Navigate to member details or open modal
console.log('View member:', member.FullName || `${member.first_name} ${member.last_name}`);
navigateTo('/dashboard/member-list');
};
const navigateToMembers = () => {
// Navigate to member list page
navigateTo('/dashboard/member-list');
};
const handleMemberUpdated = (member: any) => {
console.log('Member updated:', member.FullName || `${member.first_name} ${member.last_name}`);
// Trigger dues refresh
duesRefreshTrigger.value += 1;
};
// Load stats and overdue count on component mount
onMounted(async () => {
await loadStats();
await loadOverdueCount();
});
</script>

View File

@@ -13,6 +13,17 @@
</v-col>
</v-row>
<!-- Overdue Dues Banner -->
<DuesOverdueBanner
:overdue-count="overdueCount"
:can-update-statuses="isAdmin"
:can-send-reminders="isAdmin || isBoard"
:refresh-trigger="overdueRefreshTrigger"
@view-overdue="viewOverdueMembers"
@send-reminders="sendDuesReminders"
@statuses-updated="handleStatusesUpdated"
/>
<!-- Search and Filter Controls -->
<v-row class="mb-4">
<v-col cols="12" md="2">
@@ -290,6 +301,10 @@ const successMessage = ref('');
// Portal account creation
const creatingPortalAccountIds = ref<string[]>([]);
// Overdue dues management
const overdueCount = ref(0);
const overdueRefreshTrigger = ref(0);
// Filter options
const activeFilterOptions = [
{ title: 'Active Members', value: 'active' },
@@ -554,9 +569,50 @@ const createPortalAccount = async (member: Member) => {
}
};
// Load members on mount
onMounted(() => {
loadMembers();
// Overdue dues handlers
const loadOverdueCount = async () => {
try {
const response = await $fetch<{ success: boolean; data: { count: number } }>('/api/members/overdue-count');
if (response.success) {
overdueCount.value = response.data.count;
}
} catch (error: any) {
console.error('Error loading overdue count:', error);
}
};
const viewOverdueMembers = () => {
// Filter to show only inactive members (who were marked inactive due to overdue dues)
activeFilter.value = 'inactive';
duesFilter.value = 'unpaid';
showSuccess.value = true;
successMessage.value = 'Showing members with overdue dues (marked as inactive)';
};
const sendDuesReminders = () => {
// Placeholder for dues reminder functionality
console.log('Send dues reminders - feature to be implemented');
showSuccess.value = true;
successMessage.value = 'Dues reminder feature coming soon!';
};
const handleStatusesUpdated = async (updatedCount: number) => {
showSuccess.value = true;
successMessage.value = `Successfully updated ${updatedCount} member${updatedCount !== 1 ? 's' : ''} to inactive status`;
// Refresh members list and overdue count
await loadMembers();
await loadOverdueCount();
// Trigger banner refresh
overdueRefreshTrigger.value += 1;
};
// Load members and overdue count on mount
onMounted(async () => {
await loadMembers();
await loadOverdueCount();
});
</script>