diff --git a/server.js b/server.js
index 2d0594d..1bafe84 100644
--- a/server.js
+++ b/server.js
@@ -1661,16 +1661,21 @@ initializeDatabase().then(() => {
}
});
+ // Main list: only OPEN offers (still to be decided on). Taken-over offers
+ // live on their own page (/jobangebote/uebernommen).
app.get('/jobangebote', async (req, res) => {
try {
const jobangebote = await dbAll(
`SELECT j.*, b.datum AS bewerbung_datum
FROM jobangebote j
LEFT JOIN bewerbungen b ON b.id = j.verknuepfte_bewerbung_id
+ WHERE j.status = 'offen'
ORDER BY j.created_at DESC, j.id DESC`
);
+ const uebernommenRow = await dbGet("SELECT COUNT(*) AS c FROM jobangebote WHERE status = 'uebernommen'");
res.render('jobangebote', {
jobangebote,
+ uebernommenCount: uebernommenRow ? uebernommenRow.c : 0,
artOptions: ART_OPTIONS,
statusOptions: STATUS_OPTIONS,
hideSettings: false,
@@ -1681,6 +1686,28 @@ initializeDatabase().then(() => {
}
});
+ // Taken-over offers: which offers were turned into applications.
+ app.get('/jobangebote/uebernommen', async (req, res) => {
+ try {
+ const uebernommen = await dbAll(
+ `SELECT j.*, b.datum AS bewerbung_datum, b.status AS bewerbung_status
+ FROM jobangebote j
+ LEFT JOIN bewerbungen b ON b.id = j.verknuepfte_bewerbung_id
+ WHERE j.status = 'uebernommen'
+ ORDER BY j.updated_at DESC, j.id DESC`
+ );
+ const offenRow = await dbGet("SELECT COUNT(*) AS c FROM jobangebote WHERE status = 'offen'");
+ res.render('jobangebote_uebernommen', {
+ uebernommen,
+ offenCount: offenRow ? offenRow.c : 0,
+ hideSettings: false,
+ });
+ } catch (error) {
+ console.error('Error listing taken-over offers:', error);
+ res.status(500).send('Serverfehler');
+ }
+ });
+
// Convert a job offer into a Bewerbung draft (mirrors the Indeed import flow:
// creates a bewerbung with status "Entwurf", records the initial timeline entry,
// and links the offer back to it).
diff --git a/views/jobangebote.ejs b/views/jobangebote.ejs
index eb91eca..bfdcc15 100644
--- a/views/jobangebote.ejs
+++ b/views/jobangebote.ejs
@@ -15,6 +15,16 @@
Zurück zur Übersicht
+
+
+
@@ -23,7 +33,8 @@
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.
+ als Bewerbung-Entwurf übernehmen. Hier siehst du nur offene
+ Angebote — bereits übernommene findest du im Tab „Übernommen“.
diff --git a/views/jobangebote_uebernommen.ejs b/views/jobangebote_uebernommen.ejs
new file mode 100644
index 0000000..06e5c21
--- /dev/null
+++ b/views/jobangebote_uebernommen.ejs
@@ -0,0 +1,151 @@
+
+
+
+ <%- include('partials/head') %>
+
+
+ <%- include('partials/header') %>
+
+
+
+
+
+
+
+ Zurück zu den Jobangeboten
+
+
+
+
+
+
+
+
+
Übernommene Jobangebote
+
+ Diese Angebote wurden bereits als Bewerbung übernommen. Über „Zur Bewerbung“
+ gelangst du direkt zur jeweiligen Bewerbung.
+
+
+
+
+ <%= uebernommen.length %> übernommen
+
+
+
+ <% if (uebernommen && uebernommen.length) { %>
+
+ <% uebernommen.forEach(function(j){ %>
+
+
+
+
+ Übernommen
+ <% if (j.bewerbung_status) { %>
+ Status: <%= j.bewerbung_status %>
+ <% } %>
+ <% if (j.quelle && j.quelle !== 'drittanbieter') { %>
+ Quelle: <%= j.quelle %>
+ <% } %>
+
+
<%= j.firma %>
+
<%= j.stelle %>
+ <% if (j.ort || j.gehalt) { %>
+
+ <% if (j.ort) { %><%= j.ort %><% } %>
+ <% if (j.ort && j.gehalt) { %> · <% } %>
+ <% if (j.gehalt) { %><%= j.gehalt %><% } %>
+
+ <% } %>
+ <% 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') : '' %>
+
+
+ Übernommen: <%= j.updated_at ? new Date(j.updated_at + 'Z').toLocaleString('de-DE') : '' %>
+
+
+
+
+
+
+
+
+ <% }); %>
+
+ <% } else { %>
+
+
+
+
+
Noch keine Angebote übernommen.
+
+ Übernimm ein offenes Angebot im Tab
+ „Offen“ .
+
+
+ <% } %>
+
+
+
+ <%- include('partials/footer') %>
+
+
+
+