Fix critical member management issues: dues tracking, member IDs, and profile display
All checks were successful
Build And Push Image / docker (push) Successful in 2m20s

- Fix dues payment logic to automatically calculate payment_due_date as 1 year from payment date
- Remove redundant dues_paid_until field and replace with payment_due_date throughout
- Implement member ID generation system with format MUSA-YYYY-XXXX
- Create migration endpoints for generating member IDs and fixing payment dates
- Update admin members page to display actual member_id from database
- Ensure ProfileAvatar components use correct member_id field
- Add support for profile images in list and grid views with initials fallback
- Fix countries export alias for backward compatibility

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-09-04 18:43:57 +02:00
parent 67bb9e32ac
commit d34d16fda1
8 changed files with 326 additions and 24 deletions

View File

@@ -177,7 +177,7 @@
/>
<div>
<div class="font-weight-medium">{{ item.first_name }} {{ item.last_name }}</div>
<div class="text-caption text-medium-emphasis">Member ID: {{ item.member_id }}</div>
<div class="text-caption text-medium-emphasis">ID: {{ item.member_id || `Pending (DB ID: ${item.Id})` }}</div>
</div>
</div>
</template>
@@ -710,7 +710,8 @@ const loadMembers = async () => {
const duesPaidThisYear = lastPaid && lastPaid.getFullYear() === currentYear;
return {
member_id: member.Id || member.id,
...member, // Keep all original fields including Id for API calls
member_id: member.member_id || '', // Use the actual member_id field
first_name: member.first_name,
last_name: member.last_name,
name: `${member.last_name || ''}, ${member.first_name || ''}`.trim(),
@@ -721,6 +722,8 @@ const loadMembers = async () => {
dues_status: member.dues_status || (duesPaidThisYear ? 'Paid' : 'Due'),
dues_paid_this_year: duesPaidThisYear,
last_dues_paid: member.last_dues_paid,
membership_date_paid: member.membership_date_paid,
payment_due_date: member.payment_due_date,
join_date: member.member_since || member.created_at,
phone: member.phone_number || member.phone || ''
};

View File

@@ -509,7 +509,7 @@ const loadPayments = async () => {
// If member has dues due/overdue, create a pending payment record
if (member.dues_status === 'Due' || member.dues_status === 'Overdue') {
const dueDate = member.dues_paid_until ? new Date(member.dues_paid_until) : null;
const dueDate = member.payment_due_date ? new Date(member.payment_due_date) : null;
if (dueDate) {
paymentRecords.push({
id: transactionCounter++,