Filter
Anstehende Termine
-
<% kommendeTermine.forEach(function(t){
var when = t.ganztags
? new Date(t.start).toLocaleDateString('de-DE', { timeZone: caldavTz, weekday: 'short', day: '2-digit', month: '2-digit', year: 'numeric' })
: new Date(t.start).toLocaleString('de-DE', { timeZone: caldavTz, weekday: 'short', day: '2-digit', month: '2-digit', hour: '2-digit', minute: '2-digit' });
%>
-
<% if (t.bewerbung_id) { %> Öffnen <% } %><%= t.typ === 'vorstellungsgespraech' ? 'Gespräch' : 'Termin' %> <%= t.titel %>
<%= when %> Uhr<% if (t.bewerbung_firma) { %> · <%= t.bewerbung_firma %><% } %>
<% }); %>
Statistik
<%= statistics.total %>
Gesamtbewerbungen
Nach Bewerbungsart
<% if (statistics.byArt.length > 0) { %>
<% statistics.byArt.forEach(item => { %>
<%= item.art %>
<%= item.count %>
<% }); %>
<% } else { %>
Keine Daten verfügbar
<% } %>Nach Status
<% if (statistics.byStatus.length > 0) { %>
<% statistics.byStatus.forEach(item => { %>
<%= item.status %>
<%= item.count %>
<% }); %>
<% } else { %>
Keine Daten verfügbar
<% } %>
Datum
Firma
Stelle
Art
Status
Aktionen
<% if (applications.length > 0) { %>
<%
// Status-Reihenfolge synchron zu public/js/main.js halten
const statusOrder = ['Entwurf', 'Gesendet', 'Eingangsbestätigung', 'Vorstellungsgespräch',
'Einstellung', 'Absage', 'Keine Rückmeldung'];
const statusDot = {
'Entwurf': 'bg-purple-500',
'Gesendet': 'bg-indigo-500',
'Eingangsbestätigung': 'bg-blue-500',
'Vorstellungsgespräch': 'bg-yellow-500',
'Einstellung': 'bg-green-500',
'Absage': 'bg-red-500',
'Keine Rückmeldung': 'bg-gray-400',
'Ohne Status': 'bg-gray-300'
};
const groups = {};
applications.forEach(a => {
const key = (a.status && a.status.trim()) ? a.status.trim() : 'Ohne Status';
(groups[key] = groups[key] || []).push(a);
});
const orderedKeys = [
...statusOrder.filter(s => groups[s]),
...Object.keys(groups).filter(k => !statusOrder.includes(k))
];
%>
<% orderedKeys.forEach(statusKey => { %>
<% }); %>
<% } else { %>
<% groups[statusKey].forEach(app => { %>
<%
const hatNotizen = app.notizen && app.notizen.trim().length > 0;
const hatInterne = app.interne_notizen && app.interne_notizen.trim().length > 0;
const hatVerlauf = app.verlauf && app.verlauf.length > 0;
const hatDetails = hatNotizen || hatInterne || hatVerlauf;
%>
">
<% } %>
<% }); %>
<% if (hatDetails) { %>
<% } %>
<%= new Date(app.datum).toLocaleDateString('de-DE') %>
<%= app.firma %>
<%= app.stelle %>
<%= app.art || '-' %>
<%= app.status || '-' %>
<% if (hatDetails) { %>
<% if (hatVerlauf) { %>
<% } %>
<% if (hatNotizen) { %>
<% } %>
<% if (hatInterne) { %>
<% } %>
Status-Verlauf
-
<% app.verlauf.forEach(v => { %>
- <%= new Date(v.datum).toLocaleDateString('de-DE') %> <%= v.status %> <% if (v.kommentar && v.kommentar.trim()) { %> – <%= v.kommentar %> <% } %> <% }); %>
Notizen
<%= app.notizen %>
Interne Notizen · nicht im PDF
<%= app.interne_notizen %>
Keine Bewerbungen gefunden.
Klicken Sie auf "Bewerbung hinzufügen", um Ihre erste Bewerbung einzutragen.