<%= favAnsicht ? 'Gemerkte Jobangebote' : 'Jobangebote' %>
<% if (favAnsicht) { %>
Angebote, die du dir mit dem Stern gemerkt hast — unabhängig davon, ob sie
noch offen oder bereits übernommen sind. Ein erneuter Klick auf den Stern
entfernt das Angebot wieder aus dieser Liste. Die Merkliste gilt nur für
Jobangebote und ist von den gemerkten Bewerbungen getrennt.
<% } else { %>
Hier landen Stellen, die von Drittanbietersoftware über die
POST /api/v1/joboffers
REST-Schnittstelle eingespielt werden. Ein Angebot lässt sich per Klick
als Bewerbung-Entwurf übernehmen. Hier siehst du nur offene
Angebote — bereits übernommene findest du im Tab „Übernommen“.
Mit dem Stern gemerkte Angebote stehen oben.
<% } %>
-
<% jobangebote.forEach(function(j){ %>
- class="rounded-lg border px-4 py-4 <%= j.favorit
? 'border-amber-300 dark:border-amber-400/40 bg-amber-50/60 dark:bg-amber-500/5'
: 'border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-700/40' %>">
<%= j.status === 'offen' ? 'Offen' : (j.status === 'uebernommen' ? 'Übernommen' : (j.status === 'abgelehnt' ? 'Abgelehnt' : j.status)) %> <% if (j.quelle && j.quelle !== 'drittanbieter') { %> Quelle: <%= j.quelle %> <% } %> <% if (j.art) { %> <%= j.art %> <% } %>
<%= j.firma %>
<%= j.stelle %>
<% if (j.labelsArr && j.labelsArr.length) { %><%- include('partials/labelChips', { labels: j.labelsArr }) %><% } %> <% if (j.ort || j.gehalt) { %><% if (j.ort) { %><%= j.ort %><% } %> <% if (j.ort && j.gehalt) { %> · <% } %> <% if (j.gehalt) { %><%= j.gehalt %><% } %>
<% } %> <% if (j.adresse) { %>Anschrift: <%= j.adresse %>
<% } %> <% if (j.ansprechpartner) { %>Ansprechpartner: <%= j.ansprechpartner %>
<% } %> <% if (j.anzeige_datum) { %>Anzeige: <%= new Date(j.anzeige_datum).toLocaleDateString('de-DE') %>
<% } %> <% if (j.kontakt_email) { %>Kontakt: <%= j.kontakt_email %>
<% } %> <% if (j.beschreibung) { %><%= j.beschreibung %>
<% if (j.beschreibung.length > 400) { %> <% } %> <% } %> <% if (j.quelle_url) { %> <%= j.quelle_url %> <% } %><% if (j.verknuepfte_bewerbung_id && j.bewerbung_datum) { %> Bewerbung vom: <%= new Date(j.bewerbung_datum).toLocaleDateString('de-DE') %> <% } %> Einspielung: <%= j.created_at ? new Date(j.created_at + 'Z').toLocaleString('de-DE') : '' %> <% if (j.verknuepfte_bewerbung_id) { %> · Bewerbung #<%= j.verknuepfte_bewerbung_id %> <% } %>
<%- include('partials/favorit-button', { j: j }) %> <% if (j.verknuepfte_bewerbung_id) { %> Zur Bewerbung <% } else { %> <% } %>Beschreibung / Details bearbeiten
<% }); %>
Noch keine Jobangebote gemerkt.
Klicke bei einem Angebot auf Merken — es erscheint dann hier und steht in der offenen Liste ganz oben.
Noch keine Jobangebote vorhanden.
Drittanbietersoftware kann Angebote über
POST /api/v1/joboffers
einspielen.
Wie werden Jobangebote eingespielt?
Jedes Angebot hat zwei Datumswerte:
- Anzeige (
anzeige_datum) — wann die Stellenanzeige ursprünglich erschienen ist; wird vom Einsender im Request mitgegeben. - Einspielung (
created_at) — wann das Angebot hier im Tracker über die REST-API angekommen ist; wird automatisch vom Server gesetzt, nicht im Request gesendet.
Angebot über die REST-API anlegen (API-Key im Header X-API-Key):
curl -X POST https://<host>/api/v1/joboffers \
-H "X-API-Key: $API_TOKEN" -H "Content-Type: application/json" \
-d '{
"external_id": "job-12345",
"quelle": "mein-crm",
"firma": "Acme GmbH",
"stelle": "Softwareentwickler (m/w/d)",
"ort": "Berlin",
"gehalt": "55.000 €",
"beschreibung": "…",
"quelle_url": "https://acme.example/job/12345",
"art": "Online-Portal",
"anzeige_datum": "2026-07-01",
"kontakt_email": "bewerbung@acme.example"
// "created_at" (Einspielung) NICHT mitsenden — wird vom Server automatisch gesetzt.
}'
Wiederholtes Senden mit derselben quelle + external_id aktualisiert das Angebot (Upsert). Die Doku/Swagger-UI liegt unter /swagger.