Implement member management enhancements; add bulk import functionality and duplicate checking based on geburtsdatum. Update API to support new fields and improve error handling for member data submissions. Refactor member-related components for better user experience and data validation.

This commit is contained in:
Torsten Schulz (local)
2025-11-05 14:34:31 +01:00
parent dd4691b462
commit 623a63c29f
21 changed files with 1765 additions and 513 deletions

View File

@@ -106,6 +106,37 @@ export async function getMemberById(id) {
return members.find(m => m.id === id)
}
// Normalize date string for comparison (handles different date formats)
export function normalizeDate(dateString) {
if (!dateString) return ''
// Try to parse and normalize to ISO format (YYYY-MM-DD)
try {
const date = new Date(dateString)
if (isNaN(date.getTime())) return dateString.trim()
return date.toISOString().split('T')[0]
} catch (e) {
return dateString.trim()
}
}
// Check for duplicate member based on firstName, lastName, and geburtsdatum
function findDuplicateMember(members, firstName, lastName, geburtsdatum) {
const normalizedFirstName = (firstName || '').trim().toLowerCase()
const normalizedLastName = (lastName || '').trim().toLowerCase()
const normalizedDate = normalizeDate(geburtsdatum)
return members.find(m => {
const mFirstName = (m.firstName || '').trim().toLowerCase()
const mLastName = (m.lastName || '').trim().toLowerCase()
const mDate = normalizeDate(m.geburtsdatum)
return mFirstName === normalizedFirstName &&
mLastName === normalizedLastName &&
mDate === normalizedDate &&
mDate !== '' // Only match if date is provided for both
})
}
// Add or update manual member
export async function saveMember(memberData) {
const members = await readMembers()
@@ -114,11 +145,37 @@ export async function saveMember(memberData) {
// Update existing
const index = members.findIndex(m => m.id === memberData.id)
if (index !== -1) {
// Check for duplicate (excluding current member)
const duplicate = findDuplicateMember(
members.filter(m => m.id !== memberData.id),
memberData.firstName,
memberData.lastName,
memberData.geburtsdatum
)
if (duplicate) {
throw new Error('Ein Mitglied mit diesem Namen und Geburtsdatum existiert bereits.')
}
members[index] = { ...members[index], ...memberData }
} else {
throw new Error('Mitglied nicht gefunden')
}
} else {
// Add new - check for duplicate first
if (memberData.firstName && memberData.lastName && memberData.geburtsdatum) {
const duplicate = findDuplicateMember(
members,
memberData.firstName,
memberData.lastName,
memberData.geburtsdatum
)
if (duplicate) {
throw new Error('Ein Mitglied mit diesem Namen und Geburtsdatum existiert bereits.')
}
}
// Add new - use UUID for guaranteed uniqueness
const newMember = {
...memberData,