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:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user