Add dedicated 'closed' status for listings no longer accepting applications

Distinguishes closed listings from missing apply buttons. Shows in summary
as a separate line item.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-06 13:23:39 -08:00
parent 97aa8472aa
commit 094824abb2
4 changed files with 11 additions and 3 deletions

View File

@@ -304,6 +304,13 @@ async function handleResult(job, result, results, settings, profile, apiKey) {
break;
}
case 'closed':
console.log(` 🚫 Closed — no longer accepting applications`);
updateJobStatus(job.id, 'closed', { title, company });
appendLog({ ...job, title, company, status: 'closed' });
results.closed = (results.closed || 0) + 1;
break;
case 'no_modal':
case 'skipped_no_apply':
case 'skipped_easy_apply_unsupported':

View File

@@ -154,7 +154,7 @@ export async function apply(page, job, formFiller) {
}).catch(() => false);
if (closed) {
console.log(` Job closed — no longer accepting applications`);
return { status: 'skipped_no_apply', meta };
return { status: 'closed', meta };
}
console.log(` ❌ Modal did not open. Page URL: ${page.url()}`);
return { status: 'no_modal', meta };

View File

@@ -24,7 +24,7 @@ export async function apply(page, job, formFiller) {
}).catch(() => false);
if (closed) {
console.log(` Job closed — no longer available`);
return { status: 'skipped_no_apply', meta };
return { status: 'closed', meta };
}
const applyBtn = page.locator('a:has-text("Apply"), button:has-text("Apply Now"), a:has-text("Apply Now")').first();

View File

@@ -95,7 +95,7 @@ export function formatSearchSummary(added, skipped, platforms) {
export function formatApplySummary(results) {
const { submitted, failed, needs_answer, total,
skipped_recruiter, skipped_external, skipped_no_apply,
skipped_other, already_applied, atsCounts } = results;
skipped_other, already_applied, closed, atsCounts } = results;
const lines = [
`✅ *Apply Run Complete* — ${total} jobs processed`,
@@ -106,6 +106,7 @@ export function formatApplySummary(results) {
// Only show non-zero categories to keep the summary clean
if (needs_answer) lines.push(`💬 Needs your answer: ${needs_answer}`);
if (failed) lines.push(`❌ Failed: ${failed}`);
if (closed) lines.push(`🚫 Closed: ${closed}`);
if (skipped_no_apply) lines.push(`⏭️ No apply button: ${skipped_no_apply}`);
if (skipped_recruiter) lines.push(`🚫 Recruiter-only: ${skipped_recruiter}`);
if (already_applied) lines.push(`🔁 Already applied: ${already_applied}`);