|
108 | 108 | } |
109 | 109 | } |
110 | 110 |
|
| 111 | + function formatDate(iso) { |
| 112 | + // expect ISO date (YYYY-MM-DD) or ISO datetime; return DD.MM.YYYY |
| 113 | + try { |
| 114 | + const d = new Date(iso); |
| 115 | + const dd = String(d.getUTCDate()).padStart(2, '0'); |
| 116 | + const mm = String(d.getUTCMonth() + 1).padStart(2, '0'); |
| 117 | + const yyyy = d.getUTCFullYear(); |
| 118 | + return `${dd}.${mm}.${yyyy}`; |
| 119 | + } catch (e) { |
| 120 | + return iso; |
| 121 | + } |
| 122 | + } |
| 123 | + |
111 | 124 | if (data.status === 'valid') { |
112 | | - const verifiedAt = data.verified_at ? formatDateTime(data.verified_at) : ''; |
| 125 | + // prefer certificate creation date; fallback to verified_at when missing |
| 126 | + const creation = data.certificate_created_at || data.created_at || null; |
| 127 | + const createdAtStr = creation ? formatDate(creation) : (data.verified_at ? formatDateTime(data.verified_at) : ''); |
113 | 128 | return ` |
114 | 129 | <div class="verify-result-card verify-result-success"> |
115 | 130 | <div class="verify-result-header success"> |
|
118 | 133 | <p class="verify-result-description">Dieses Zertifikat wurde erfolgreich geprüft und als gültig bestätigt.</p> |
119 | 134 | </div> |
120 | 135 | <div class="verify-details-grid"> |
121 | | - ${renderMeta('Student-ID', data.student_id || '-')} |
122 | 136 | ${renderMeta('Teilnehmer', data.student_name || '-')} |
123 | 137 | ${renderMeta('Kurs', data.course_title || '-')} |
124 | 138 | ${renderMeta('Abschlussdatum', data.completion_date || '-')} |
125 | 139 | ${renderMeta('Dauer', (data.duration_hours != null) ? `${data.duration_hours} Unterrichtsstunden` : '-')} |
| 140 | + ${renderMeta('Anwesenheit', (data.attendance_percentage != null) ? `${data.attendance_percentage}%` : '-')} |
| 141 | + ${renderMeta('Aufgabenabschluss', (data.assignment_completion_percentage != null) ? `${data.assignment_completion_percentage}%` : '-')} |
| 142 | + ${renderMeta('Kurslevel', data.course_level || '-')} |
| 143 | + ${renderMeta('Format', data.course_format || '-')} |
| 144 | + ${renderMeta('Sprache', data.instruction_language || '-')} |
| 145 | + ${data.course_link ? `<div class="verify-meta-item"><span class="verify-meta-label">Kurslink</span><span class="verify-meta-value"><a href="${escapeHtml(data.course_link)}" target="_blank" rel="noreferrer">${escapeHtml(data.course_link)}</a></span></div>` : ''} |
126 | 146 | ${renderMeta('Herausgeber', data.issuer || 'MathCodeLab')} |
127 | 147 | ${renderMeta('Dozent', data.instructor || 'Mohammad Orabe')} |
128 | 148 | ${renderMeta('Zertifikat-ID', data.certificate_id)} |
129 | | - ${verifiedAt ? renderMeta('Verifiziert am', verifiedAt) : ''} |
| 149 | + ${createdAtStr ? renderMeta('Erstellt am', createdAtStr) : ''} |
130 | 150 | </div> |
131 | 151 | <div class="verify-note">Hinweis:\nDieses Zertifikat bestätigt die erfolgreiche Teilnahme bzw. den Abschluss eines von MathCodeLab durchgeführten Kurses. Es stellt keinen akademischen Abschluss dar und beinhaltet keine Vergabe von Leistungspunkten (ECTS). Eine mögliche Anerkennung durch Dritten erfolgt ausschließlich im Ermessen der jeweiligen Institution.<br>Weitere Informationen sind unter <a href="https://mathcodelab.de" target="_blank" rel="noreferrer">https://mathcodelab.de</a> verfügbar.</div> |
132 | 152 | <div class="verify-result-footer">${renderContactLine()}</div> |
|
0 commit comments