Kartu Anggota Koperasi Merah Putih

📝 Formulir Anggota

Format: 16 digit angka

Logo KOMALADELSI (Tetap)

Logo resmi yang tidak dapat diubah

🔒 Logo terlindungi untuk konsistensi identitas

👤

JPG, PNG max 2MB

ID otomatis: KOMALADELSI-XXXXXX

Tanggal hari ini (otomatis)

3 tahun sejak tanggal pembuatan (otomatis)

📋 Ringkasan

• Pastikan semua data sudah benar

• Foto akan dipotong otomatis sesuai ukuran kartu

• ID anggota dibuat otomatis dengan format KOMALADELSI-XXXXXX

`); printWindow.document.close(); // Auto focus and show print dialog after a short delay setTimeout(() => { printWindow.focus(); }, 500); showSuccessModal('Jendela cetak telah dibuka! Klik tombol Cetak untuk mencetak kartu.'); }); }function loadMembersTable() { const tbody = document.getElementById('membersTableBody'); if (members.length === 0) { tbody.innerHTML = ` Belum ada data anggota. Silakan tambah anggota baru di tab Formulir. `; return; }tbody.innerHTML = members.map(member => { const expiryDate = member.cardExpiryDate ? new Date(member.cardExpiryDate) : null; const today = new Date(); const isExpired = expiryDate && today > expiryDate; let expiryText = 'Tidak ada data'; let expiryClass = 'text-gray-500'; if (expiryDate) { expiryText = formatDate(member.cardExpiryDate); expiryClass = isExpired ? 'text-red-600' : 'text-green-600'; if (isExpired) { expiryText = `⚠️ EXPIRED: ${expiryText}`; } else { expiryText = `✅ ${expiryText}`; } } return `
${member.photo ? `` : '👤' }
${member.id}${member.fullName}${member.nik}${formatDate(member.birthDate)}${member.phone}
${expiryText}
`; }).join(''); }function searchMembers() { const query = document.getElementById('searchInput').value.toLowerCase(); const filteredMembers = members.filter(member => member.fullName.toLowerCase().includes(query) || member.nik.includes(query) || member.id.toLowerCase().includes(query) ); const tbody = document.getElementById('membersTableBody'); if (filteredMembers.length === 0) { tbody.innerHTML = ` Tidak ada data yang cocok dengan pencarian "${query}". `; return; }tbody.innerHTML = filteredMembers.map(member => { const expiryDate = member.cardExpiryDate ? new Date(member.cardExpiryDate) : null; const today = new Date(); const isExpired = expiryDate && today > expiryDate; let expiryText = 'Tidak ada data'; let expiryClass = 'text-gray-500'; if (expiryDate) { expiryText = formatDate(member.cardExpiryDate); expiryClass = isExpired ? 'text-red-600' : 'text-green-600'; if (isExpired) { expiryText = `⚠️ EXPIRED: ${expiryText}`; } else { expiryText = `✅ ${expiryText}`; } } return `
${member.photo ? `` : '👤' }
${member.id}${member.fullName}${member.nik}${formatDate(member.birthDate)}${member.phone}
${expiryText}
`; }).join(''); }function editMember(id) { const member = members.find(m => m.id === id); if (!member) return;// Fill form with member data document.getElementById('fullName').value = member.fullName; document.getElementById('nik').value = member.nik; document.getElementById('birthDate').value = member.birthDate; document.getElementById('address').value = member.address; document.getElementById('village').value = member.village || ''; document.getElementById('regency').value = member.regency || ''; document.getElementById('province').value = member.province || ''; document.getElementById('phone').value = member.phone; document.getElementById('memberId').value = member.id; // Set dates if (member.cardCreationDate) { document.getElementById('cardCreationDate').value = member.cardCreationDate; } if (member.cardExpiryDate) { document.getElementById('cardExpiryDate').value = member.cardExpiryDate; }// Set photo if exists if (member.photo) { document.getElementById('photoPreview').innerHTML = ``; document.getElementById('cardPhoto').innerHTML = ``; }currentMember = member; updatePreview(); showTab('form'); }function deleteMember(id) { if (confirm('Yakin ingin menghapus anggota ini?')) { members = members.filter(m => m.id !== id); localStorage.setItem('members', JSON.stringify(members)); updateMemberCount(); loadMembersTable(); showSuccessModal('Anggota berhasil dihapus!'); } }function previewMember(id) { const member = members.find(m => m.id === id); if (!member) return;currentMember = member; // Update preview document.getElementById('cardName').textContent = member.fullName.toUpperCase(); document.getElementById('cardId').textContent = `ID: ${member.id}`; // Update location const locationText = (member.village && member.regency && member.province) ? `${member.village}, ${member.regency}, ${member.province}` : 'Desa, Kabupaten, Provinsi'; document.getElementById('cardLocation').textContent = locationText; // Update birth date const birthText = member.birthDate ? `Lahir: ${formatDate(member.birthDate)}` : 'Lahir: -'; document.getElementById('cardBirth').textContent = birthText; // Use stored expiry date if (member.cardExpiryDate) { const expiryDate = new Date(member.cardExpiryDate); const today = new Date(); const isExpired = today > expiryDate; const expiryText = isExpired ? `⚠️ EXPIRED: ${formatDate(member.cardExpiryDate)}` : `Berlaku s/d: ${formatDate(member.cardExpiryDate)}`; document.getElementById('cardExpiry').textContent = expiryText; document.getElementById('cardExpiry').style.color = isExpired ? '#dc2626' : 'white'; document.getElementById('cardExpiry').style.fontWeight = isExpired ? 'bold' : 'normal'; // Update status based on expiry const statusText = isExpired ? '⚠️ Kartu sudah expired! Perlu diperpanjang.' : 'Kartu siap diunduh!'; document.getElementById('previewStatus').textContent = statusText; } else { document.getElementById('cardExpiry').textContent = 'Berlaku s/d: -'; document.getElementById('cardExpiry').style.color = 'white'; document.getElementById('cardExpiry').style.fontWeight = 'normal'; document.getElementById('previewStatus').textContent = 'Kartu siap diunduh!'; } if (member.photo) { document.getElementById('cardPhoto').innerHTML = ``; } else { document.getElementById('cardPhoto').innerHTML = '👤'; } showTab('preview'); }function clearAllData() { if (confirm('Yakin ingin menghapus SEMUA data anggota? Tindakan ini tidak dapat dibatalkan!')) { members = []; localStorage.setItem('members', JSON.stringify(members)); updateMemberCount(); loadMembersTable(); showSuccessModal('Semua data anggota berhasil dihapus!'); } }function exportToExcel() { if (members.length === 0) { alert('Tidak ada data untuk diekspor!'); return; }const csvContent = [ ['ID Anggota', 'Nama Lengkap', 'NIK', 'Tanggal Lahir', 'Alamat', 'Desa/Kelurahan', 'Kabupaten/Kota', 'Provinsi', 'No. HP', 'Tanggal Pembuatan', 'Masa Berlaku', 'Status'], ...members.map(member => { const expiryDate = member.cardExpiryDate ? new Date(member.cardExpiryDate) : null; const today = new Date(); const isExpired = expiryDate && today > expiryDate; const status = isExpired ? 'EXPIRED' : 'AKTIF'; return [ member.id, member.fullName, member.nik, member.birthDate, member.address, member.village || '-', member.regency || '-', member.province || '-', member.phone, member.cardCreationDate || new Date(member.createdAt).toISOString().split('T')[0], member.cardExpiryDate || '-', status ]; }) ].map(row => row.join(',')).join('\n');const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' }); const link = document.createElement('a'); link.href = URL.createObjectURL(blob); link.download = `data-anggota-koperasi-${new Date().toISOString().split('T')[0]}.csv`; link.click(); showSuccessModal('Data berhasil diekspor ke CSV!'); }function updateMemberCount() { document.getElementById('totalMembers').textContent = members.length; }function showSuccessModal(message) { document.getElementById('successMessage').textContent = message; document.getElementById('successModal').classList.remove('hidden'); document.getElementById('successModal').classList.add('flex'); }function closeModal() { document.getElementById('successModal').classList.add('hidden'); document.getElementById('successModal').classList.remove('flex'); }
Scroll to Top