From 1875fac7d47c905ef34239c70b2ac39008fe92e4 Mon Sep 17 00:00:00 2001 From: Matt Date: Wed, 13 Aug 2025 23:03:49 +0200 Subject: [PATCH] fixes --- pages/dashboard/admin.vue | 137 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) diff --git a/pages/dashboard/admin.vue b/pages/dashboard/admin.vue index b7f4fd9..3a0c44c 100644 --- a/pages/dashboard/admin.vue +++ b/pages/dashboard/admin.vue @@ -183,6 +183,57 @@ + + + + + + mdi-database-cog + Data Management + + +

Manage data integrity and perform maintenance operations on the portal database.

+ + + + + Assign Member IDs + +
+ Assign unique member IDs (MUSA-0001, MUSA-0002, etc.) to members who don't have them +
+
+ + + + Backfill Event IDs + +
+ Assign business IDs to events that don't have them +
+
+
+
+
+
+
+ @@ -422,6 +473,10 @@ const overdueCount = ref(0); const overdueRefreshTrigger = ref(0); const duesRefreshTrigger = ref(0); +// Data management +const assigningMemberIds = ref(false); +const backfillLoading = ref(false); + // Member dialog state const showViewDialog = ref(false); const showEditDialog = ref(false); @@ -719,6 +774,88 @@ const handleMemberUpdated = (member: any) => { duesRefreshTrigger.value += 1; }; +// Data management functions +const assignMemberIds = async () => { + assigningMemberIds.value = true; + + try { + console.log('Starting member ID assignment...'); + + const response = await $fetch<{ + success: boolean; + message: string; + data: { + totalMembers: number; + membersUpdated: number; + updatedMembers: Array<{ + id: string; + name: string; + email: string; + memberId: string; + }>; + startingId: string | null; + endingId: string | null; + }; + }>('/api/admin/assign-member-ids', { + method: 'POST' + }); + + if (response.success) { + console.log('✅ Member ID assignment completed:', { + totalMembers: response.data.totalMembers, + membersUpdated: response.data.membersUpdated, + startingId: response.data.startingId, + endingId: response.data.endingId + }); + + // Show success message + alert(`Success! Assigned member IDs to ${response.data.membersUpdated} members.\nRange: ${response.data.startingId} to ${response.data.endingId}`); + + // Refresh dues management data + duesRefreshTrigger.value += 1; + } + } catch (error: any) { + console.error('❌ Failed to assign member IDs:', error); + alert(`Error: ${error.statusMessage || error.message || 'Failed to assign member IDs'}`); + } finally { + assigningMemberIds.value = false; + } +}; + +const backfillEventIds = async () => { + backfillLoading.value = true; + + try { + console.log('Starting event ID backfill...'); + + const response = await $fetch<{ + success: boolean; + message: string; + data: { + totalEvents: number; + eventsUpdated: number; + }; + }>('/api/admin/backfill-event-ids', { + method: 'POST' + }); + + if (response.success) { + console.log('✅ Event ID backfill completed:', { + totalEvents: response.data.totalEvents, + eventsUpdated: response.data.eventsUpdated + }); + + // Show success message + alert(`Success! Assigned event IDs to ${response.data.eventsUpdated} events.`); + } + } catch (error: any) { + console.error('❌ Failed to backfill event IDs:', error); + alert(`Error: ${error.statusMessage || error.message || 'Failed to backfill event IDs'}`); + } finally { + backfillLoading.value = false; + } +}; + // Load stats and overdue count on component mount onMounted(async () => { await loadStats();