Publisher Logo
Career Assam
Publisher Workspace
Employer & Publisher Hub

Hire the Best Talent in Assam, Instantly

Publish your recruitment notifications on Assam's premium job portal. Reach thousands of verified, high-potential candidates and accelerate your hiring with real-time push alerts.

×

Career ASOM

FORGOT PASSWORD?
or Sign Up

Why Publish on Career ASOM?

Assam's premium job portal designed to connect employers with verified, high-potential candidates across the Northeast.

Targeted Regional Reach

Instantly reach thousands of active candidates in Assam. Filter applicants by region, educational background, and qualifications.

Real-Time Applicant Tracking

Manage recruitment statuses seamlessly. Filter, sort, shortlist, and track candidate pipelines directly within your publisher panel.

Instant Alerts & Push Channels

Your job postings are automatically pushed via email, push alerts, and our premium WhatsApp Channel for 3x faster applicant response.

Secure & Verified Signup

All applicants verify their emails via secure 6-digit OTP, ensuring high-quality, genuine, and spam-free applications.

Easiest Way to Post a Job

Get your job advertisement published and live in 3 simple steps.

1

Quick Signup

Create a publisher account and verify your company email via secure 6-digit OTP code.

2

Fill Job Details

Submit your recruitment advertisement details, criteria, guidelines, and application links.

3

Instant Broadcast

Your job notification is reviewed and broadcasted instantly via push alerts, emails, and WhatsApp channels.

Employer Helpdesk

Need help publishing or tracking your advertisements?

Support Email help@careerasom.in
Support Hours Mon - Sat: 9:00 AM - 6:00 PM IST
Platform Head Office Mangaldai, Darrang, Assam, PIN 784125
Ticket Management Zoho Support Desk Integrated
`); // Inject print trigger script dynamically to avoid HTML parser conflicts const scriptEl = printWindow.document.createElement("script"); scriptEl.textContent = ` window.onload = function() { setTimeout(function() { window.print(); }, 300); }; `; printWindow.document.body.appendChild(scriptEl); printWindow.document.close(); }; } catch (initError) { console.error("Error running initSubmitJobPage:", initError); } })(); // Setup dynamic list adder helper function setupDynamicRow(wrapperId, buttonId, template) { const wrapper = document.getElementById(wrapperId); const button = document.getElementById(buttonId); if (!wrapper || !button) return; button.addEventListener("click", () => { const tempDiv = document.createElement("div"); tempDiv.innerHTML = template.trim(); const newRow = tempDiv.firstChild; // Add remove listener const removeBtn = newRow.querySelector(".remove-row-btn"); if (removeBtn) { removeBtn.addEventListener("click", () => { if (wrapper.querySelectorAll(".dynamic-row").length > 1) { newRow.remove(); } else { if (typeof showToast === 'function') { showToast("At least one row is required.", "error"); } else { alert("At least one row is required."); } } }); } wrapper.appendChild(newRow); }); // Set initial row remove listener const initialRemoveBtn = wrapper.querySelector(".remove-row-btn"); if (initialRemoveBtn) { initialRemoveBtn.addEventListener("click", (e) => { const row = e.currentTarget.closest(".dynamic-row"); if (wrapper.querySelectorAll(".dynamic-row").length > 1) { row.remove(); } else { if (typeof showToast === 'function') { showToast("At least one row is required.", "error"); } else { alert("At least one row is required."); } } }); } } // Setup image upload and client side compression function setupImageUpload(fileInputId, previewId, maxWidth, maxHeight, quality, callback) { const fileInput = document.getElementById(fileInputId); const preview = document.getElementById(previewId); if (!fileInput || !preview) return; fileInput.addEventListener("change", (e) => { const file = e.target.files[0]; if (!file) return; if (!file.type.startsWith("image/")) { alert("Please select a valid image file."); fileInput.value = ""; return; } preview.innerHTML = ``; // Compress image before creating base64 const reader = new FileReader(); reader.readAsDataURL(file); reader.onload = function (event) { const img = new Image(); img.src = event.target.result; img.onload = function () { const canvas = document.createElement("canvas"); let width = img.width; let height = img.height; if (width > height) { if (width > maxWidth) { height = Math.round((height * maxWidth) / width); width = maxWidth; } } else { if (height > maxHeight) { width = Math.round((width * maxHeight) / height); height = maxHeight; } } canvas.width = width; canvas.height = height; const ctx = canvas.getContext("2d"); ctx.drawImage(img, 0, 0, width, height); const dataUrl = canvas.toDataURL("image/jpeg", quality); preview.innerHTML = ``; callback(dataUrl); }; }; }); } // --- 10. CANDIDATE APPLICATIONS (ATS) SYSTEM --- function listenToApplicants() { if (applicantsUnsubscribe) { applicantsUnsubscribe(); } const tbody = document.getElementById("employer-applicants-list-tbody"); if (!tbody) return; if (typeof firebase !== 'undefined' && window.db) { applicantsUnsubscribe = window.db.collection("applicants") .orderBy("appliedAt", "desc") .onSnapshot(snapshot => { currentApplicantsList = []; snapshot.forEach(doc => { currentApplicantsList.push({ docId: doc.id, ...doc.data() }); }); renderApplicantsTable(); }, err => { console.error("Applicants listener error:", err); tbody.innerHTML = `Failed to load candidate applications.`; }); } else { // Mock data for simulated/offline mode currentApplicantsList = [ { docId: "m-1", name: "Rupam Kalita", email: "rupam@gmail.com", phone: "+91 9435012345", jobId: "PV-1039", jobTitle: "PGT Mathematics Teacher", appliedAt: { seconds: Date.now() / 1000 - 86400 }, status: "Applied", resumeUrl: "https://drive.google.com/file/d/1Bxz12345/view", coverLetter: "Dear Hiring Team,\n\nI would love to apply for the PGT Mathematics Teacher position. I have 5 years of teaching experience in high school CBSE syllabus.\n\nWarm regards,\nRupam Kalita", qualification: "Post Graduate", experience: "5+ Years", currentTitle: "TGT Mathematics Teacher", currentCompany: "Don Bosco School, Tezpur", expectedSalary: "20k-30k PM", noticePeriod: "30 Days", prefLocation: "Tezpur", linkedinUrl: "https://linkedin.com/in/rupam-kalita", skills: "Mathematics, Teaching, Pedagogy" }, { docId: "m-2", name: "Ananya Baruah", email: "ananya@gmail.com", phone: "+91 8876054321", jobId: "PV-1039", jobTitle: "PGT Mathematics Teacher", appliedAt: { seconds: Date.now() / 1000 - 3600 }, status: "Shortlisted", resumeUrl: "https://drive.google.com/file/d/1Bxz98765/view", coverLetter: "Respected Sir/Madam,\n\nI am writing to express my interest in the mathematics teacher position. I graduated from Gauhati University with first-class honors.\n\nSincerely,\nAnanya", qualification: "Graduate", experience: "Fresher", currentTitle: "Graduate Assistant", currentCompany: "Gauhati University", expectedSalary: "10k-20k PM", noticePeriod: "Immediate", prefLocation: "Guwahati", linkedinUrl: "https://linkedin.com/in/ananya-baruah", skills: "Algebra, Geometry, Research" } ]; renderApplicantsTable(); } } function renderApplicantsTable() { const tbody = document.getElementById("employer-applicants-list-tbody"); if (!tbody) return; // Filter by employer's approved jobs const approvedJobIds = currentSubmissionsList .filter(s => s.status === "Approved" && s.approvedJobId) .map(s => s.approvedJobId); // Filter applicants who applied to one of our approved jobs let filtered = currentApplicantsList.filter(app => approvedJobIds.includes(app.jobId) || (app.jobId && app.jobId.startsWith("PV-"))); // Fallback for simulated/offline matches // If offline and we have no submissions yet, show all mock applicants for testing if (typeof firebase === 'undefined' || !window.db) { filtered = currentApplicantsList; } // Update badge counts const badgeCount = filtered.length; const badgeText = badgeCount > 99 ? "99+" : badgeCount; const mainBadge = document.getElementById("applicants-badge-count"); const wsBadge = document.getElementById("ws-applicants-badge-count"); if (mainBadge) { mainBadge.innerText = badgeText; mainBadge.style.display = badgeCount > 0 ? "inline-block" : "none"; } if (wsBadge) { wsBadge.innerText = badgeText; wsBadge.style.display = badgeCount > 0 ? "inline-block" : "none"; } // Search query const searchInput = document.getElementById("emp-applicant-search"); const query = searchInput ? searchInput.value.trim().toLowerCase() : ""; // Status Filter const statusFilter = document.getElementById("emp-applicant-status-filter"); const statusVal = statusFilter ? statusFilter.value : "all"; filtered = filtered.filter(app => { if (statusVal !== "all" && app.status !== statusVal) return false; if (query) { const name = (app.name || "").toLowerCase(); const email = (app.email || "").toLowerCase(); const phone = (app.phone || "").toLowerCase(); const jobTitle = (app.jobTitle || "").toLowerCase(); if (!name.includes(query) && !email.includes(query) && !phone.includes(query) && !jobTitle.includes(query)) return false; } return true; }); tbody.innerHTML = ""; if (filtered.length === 0) { tbody.innerHTML = `No matching candidate applications found.`; return; } filtered.forEach(app => { const tr = document.createElement("tr"); tr.style.borderBottom = "1px solid var(--border-color)"; const date = app.appliedAt ? new Date(app.appliedAt.seconds * 1000).toLocaleDateString() : "Recent"; let statusLabel = ""; if (app.status === "Shortlisted") { statusLabel = ` Shortlisted`; } else if (app.status === "Rejected") { statusLabel = ` Rejected`; } else if (app.status === "Hired") { statusLabel = ` Hired`; } else { statusLabel = ` Applied`; } const coverLetterBtn = app.coverLetter ? ` ` : ""; let detailsHtml = ""; if (app.qualification || app.experience || app.skills || app.currentTitle || app.expectedSalary || app.noticePeriod || app.prefLocation || app.linkedinUrl) { detailsHtml = `
${app.qualification ? ` Edu: ${app.qualification}` : ''} ${app.experience ? ` Exp: ${app.experience}` : ''} ${(app.currentTitle || app.currentCompany) ? ` Current Role: ${app.currentTitle || 'N/A'} ${app.currentCompany ? `at ${app.currentCompany}` : ''}` : ''} ${app.expectedSalary ? ` Expected: ${app.expectedSalary}` : ''} ${app.noticePeriod ? ` Notice: ${app.noticePeriod}` : ''} ${app.prefLocation ? ` Preferred Loc: ${app.prefLocation}` : ''} ${app.linkedinUrl ? ` LinkedIn Profile` : ''} ${app.skills ? ` Skills: ${app.skills}` : ''}
`; } tr.innerHTML = `
${app.photoUrl ? ` ${app.name} ` : `
${app.name.charAt(0).toUpperCase()}
`}
${app.name} ${detailsHtml}
${app.email}
${app.phone} ${app.whatsapp ? ` ${app.whatsapp} ` : ''}
${app.jobTitle}
ID: ${app.jobId} ${date} ${statusLabel}
Resume ${coverLetterBtn}
`; tbody.appendChild(tr); }); } window.updateEmployerApplicantStatus = async function(docId, newStatus) { try { if (typeof firebase !== 'undefined' && window.db) { await window.db.collection("applicants").doc(docId).update({ status: newStatus }); showToast(`Applicant status successfully updated to ${newStatus}!`, "success"); // Trigger automated status update email asynchronously const app = currentApplicantsList.find(a => a.docId === docId); if (app) { triggerCandidateStatusUpdateEmail(app, newStatus).catch(e => console.warn("Status update email trigger failed:", e)); } } else { const app = currentApplicantsList.find(a => a.docId === docId); if (app) app.status = newStatus; showToast(`Simulated: Status updated to ${newStatus}`, "success"); renderApplicantsTable(); } } catch (err) { showToast("Update Failed: " + err.message, "danger"); } }; window.viewCoverLetter = function(candidateName, letterText) { const modal = document.getElementById("cover-letter-modal"); const nameEl = document.getElementById("cover-letter-candidate-name"); const contentEl = document.getElementById("cover-letter-content"); if (modal && nameEl && contentEl) { nameEl.innerText = candidateName; contentEl.innerText = letterText || "No message/cover letter provided by the candidate."; modal.style.display = "flex"; modal.classList.add("active-modal"); } }; async function sendResendEmailClient(to, subject, htmlBody) { try { if (!window.db) return false; const settingsDoc = await window.db.collection("admin_settings").doc("global").get(); const settings = settingsDoc.exists ? settingsDoc.data() : {}; const resendKey = settings.resendKey; const resendFromEmail = settings.resendFromEmail || "Career ASOM "; if (!resendKey || resendKey === "re_developer_mock_key_CS2026") { console.log("%c[Resend Simulation]", "color: #7c3aed; font-weight: bold;", { to, from: resendFromEmail, subject, htmlLength: htmlBody.length }); return true; } const targetUrl = "https://careerstream-zoho-proxy.vercel.app/api/resend"; const response = await fetch(targetUrl, { method: "POST", headers: { "Authorization": `Bearer ${resendKey}`, "Content-Type": "application/json" }, body: JSON.stringify({ from: resendFromEmail, to: to, subject: subject, html: htmlBody }) }); if (response.ok) { console.log(`[Resend Email] Dispatched to ${to}`); return true; } else { const errText = await response.text(); console.error(`[Resend Email] API error: ${errText}`); return false; } } catch (e) { console.error("[Resend Email] Failed to send email:", e); return false; } } async function triggerCandidateStatusUpdateEmail(app, newStatus) { const { name, email, jobTitle, employerName, phone, whatsapp } = app; let subject = ""; let headerColor = ""; let statusTitle = ""; let messageHtml = ""; let actionInstructions = ""; if (newStatus === "Shortlisted") { subject = `🎉 Congratulations! You have been Shortlisted for ${jobTitle || 'Job Role'} | Career ASOM`; headerColor = "linear-gradient(135deg, #7c3aed, #0d9488)"; // Purple/Teal statusTitle = "Application Shortlisted!"; messageHtml = `

We have exciting news! The hiring manager at ${employerName || 'Employer'} has reviewed your credentials for the ${jobTitle || 'Job Role'} position and has SHORTLISTED your application!

This means your background, qualifications, and experience have stood out, and the employer is interested in moving forward to the next steps.

`; actionInstructions = `

👉 Required Actions & Next Steps:

`; } else if (newStatus === "Hired") { subject = `🥳 Outstanding News! You are Hired for ${jobTitle || 'Job Role'}!`; headerColor = "linear-gradient(135deg, #eab308, #7c3aed)"; // Gold/Purple statusTitle = "Congratulations! You are Hired!"; messageHtml = `

This is absolutely fantastic! We are thrilled to congratulate you on being **HIRED** for the ${jobTitle || 'Job Role'} position at ${employerName || 'Employer'}!

The employer was extremely impressed with your profile, capability, and performance. We are honored to have played a part in connecting you with this incredible opportunity.

`; actionInstructions = `

👉 What happens now:

The Human Resources / Onboarding team from ${employerName || 'Employer'} will contact you directly within 24 to 48 hours to share your official joining date, salary package components, and offer letter instructions.

Should you have any immediate inquiries, feel free to reach out to them directly.

`; } else if (newStatus === "Rejected") { subject = `Update on your application for ${jobTitle || 'Job Role'} at ${employerName || 'Employer'}`; headerColor = "linear-gradient(135deg, #64748b, #334155)"; // Slate/Dark Slate statusTitle = "Application Status Update"; messageHtml = `

Thank you for your interest in the ${jobTitle || 'Job Role'} position at ${employerName || 'Employer'} and for taking the time to submit your application.

We want to let you know that the employer has reviewed your application. Unfortunately, they have decided to proceed with other candidates whose profiles more closely align with their immediate operational needs at this time.

Although this particular opportunity did not work out, please do not be discouraged. Your profile remains active in our database, and new job opportunities are posted on Career ASOM daily.

`; actionInstructions = `

👉 Recommended Next Steps:

We highly encourage you to browse our portal for other active recruitment vacancies. Your next big career opportunity is waiting!

`; } else { subject = `Application Status Update: ${jobTitle || 'Job Role'} | Career ASOM`; headerColor = "linear-gradient(135deg, #0d9488, #0ea5e9)"; // Teal/Blue statusTitle = "Application Status: " + newStatus; messageHtml = `

This is to inform you that your application status for the ${jobTitle || 'Job Role'} position at ${employerName || 'Employer'} has been updated to ${newStatus}.

`; actionInstructions = ""; } const htmlBody = `

Career ASOM

Assam's Premium Job & Recruitment Portal

${statusTitle}

Hello ${name || 'Applicant'},

${messageHtml}
Job Posting ${jobTitle || 'N/A'}
Employer ${employerName || 'N/A'}
Current Status ${newStatus}
${actionInstructions}
${newStatus === 'Rejected' ? 'Find More Vacancies' : 'Go to Career ASOM'}

This is an automated notification from Career ASOM. Please do not reply directly to this email.

Need help? Contact us at help@careerasom.in

© 2026 Career ASOM. All rights reserved.

`; await sendResendEmailClient(email, subject, htmlBody); } window.closeCoverLetterModal = function() { const modal = document.getElementById("cover-letter-modal"); if (modal) { modal.style.display = "none"; modal.classList.remove("active-modal"); } }; window.showJobLinksModal = function() { const modal = document.getElementById("share-forms-modal"); const listEl = document.getElementById("share-forms-list"); if (!modal || !listEl) return; const approvedJobs = currentSubmissionsList.filter(s => s.status === "Approved" && s.approvedJobId); listEl.innerHTML = ""; if (approvedJobs.length === 0) { listEl.innerHTML = `
No approved live job postings found. Postings must be approved by moderator first.
`; } else { approvedJobs.forEach(job => { const directUrl = window.location.origin + "/apply.html?jobId=" + job.approvedJobId; const row = document.createElement("div"); row.style.background = "rgba(255, 255, 255, 0.02)"; row.style.border = "1px solid var(--border-color)"; row.style.borderRadius = "12px"; row.style.padding = "12px"; row.style.display = "flex"; row.style.justifyContent = "space-between"; row.style.alignItems = "center"; row.style.gap = "10px"; row.style.marginBottom = "8px"; row.innerHTML = `
${job.jobTitle}
ID: ${job.approvedJobId}
`; listEl.appendChild(row); }); } modal.style.display = "flex"; modal.classList.add("active-modal"); }; window.closeShareFormsModal = function() { const modal = document.getElementById("share-forms-modal"); if (modal) { modal.style.display = "none"; modal.classList.remove("active-modal"); } }; window.copyApplyLink = function(approvedJobId) { const directUrl = window.location.origin + "/apply.html?jobId=" + approvedJobId; navigator.clipboard.writeText(directUrl).then(() => { showToast("Form apply URL copied to clipboard!", "success"); }).catch(err => { console.error("Failed to copy:", err); showToast("Failed to copy URL. Please copy manually: " + directUrl, "danger"); }); }; window.viewFullApplication = function(docId) { const modal = document.getElementById("full-app-modal"); const loadingEl = document.getElementById("full-app-loading"); const bodyEl = document.getElementById("full-app-body"); if (!modal || !loadingEl || !bodyEl) return; modal.style.display = "flex"; modal.classList.add("active-modal"); loadingEl.style.display = "block"; bodyEl.style.display = "none"; const app = currentApplicantsList.find(a => a.docId === docId); if (!app) { loadingEl.innerHTML = `
Candidate profile not found.
`; return; } document.getElementById("full-app-name").innerText = app.name; document.getElementById("full-app-job-role").innerText = `${app.jobTitle} (ID: ${app.jobId})`; const date = app.appliedAt ? (app.appliedAt.seconds ? new Date(app.appliedAt.seconds * 1000).toLocaleDateString() : new Date(app.appliedAt).toLocaleDateString()) : "Recent"; document.getElementById("full-app-applied-date").innerText = `Applied Date: ${date}`; const avatarContainer = document.getElementById("full-app-avatar-container"); if (avatarContainer) { if (app.photoUrl) { avatarContainer.innerHTML = `${app.name}`; } else { avatarContainer.innerHTML = `
${app.name.charAt(0).toUpperCase()}
`; } } document.getElementById("full-app-email").innerText = app.email; document.getElementById("full-app-phone").innerText = app.phone; const whatsappEl = document.getElementById("full-app-whatsapp"); if (app.whatsapp) { whatsappEl.innerHTML = `${app.whatsapp} `; } else { whatsappEl.innerText = "N/A"; } document.getElementById("full-app-education").innerText = app.qualification || "Graduate"; document.getElementById("full-app-experience").innerText = app.experience || "Fresher"; document.getElementById("full-app-pref-location").innerText = app.prefLocation || "Anywhere in Assam"; document.getElementById("full-app-current-role").innerText = app.currentTitle || "N/A"; document.getElementById("full-app-current-company").innerText = app.currentCompany || "N/A"; document.getElementById("full-app-expected-salary").innerText = app.expectedSalary || "N/A"; document.getElementById("full-app-notice-period").innerText = app.noticePeriod || "N/A"; const skillsContainer = document.getElementById("full-app-skills"); if (skillsContainer) { skillsContainer.innerHTML = ""; if (app.skills) { app.skills.split(",").forEach(skill => { const span = document.createElement("span"); span.style.background = "rgba(171, 64, 255, 0.12)"; span.style.color = "var(--accent-indigo)"; span.style.padding = "4px 10px"; span.style.borderRadius = "6px"; span.style.fontWeight = "600"; span.innerText = skill.trim(); skillsContainer.appendChild(span); }); } else { skillsContainer.innerHTML = `None specified`; } } const linkedinEl = document.getElementById("full-app-linkedin"); if (app.linkedinUrl) { linkedinEl.innerHTML = `View LinkedIn Profile `; } else { linkedinEl.innerText = "N/A"; } document.getElementById("full-app-cover-letter").innerText = app.coverLetter || "No message provided."; const resumeBtn = document.getElementById("full-app-resume-btn"); if (resumeBtn) { resumeBtn.setAttribute("href", app.resumeUrl || "#"); } const statusSelect = document.getElementById("full-app-status-select"); if (statusSelect) { statusSelect.value = app.status || "Applied"; statusSelect.onchange = async function() { await window.updateEmployerApplicantStatus(app.docId, this.value); }; } loadingEl.style.display = "none"; bodyEl.style.display = "block"; }; window.closeFullAppModal = function() { const modal = document.getElementById("full-app-modal"); if (modal) { modal.style.display = "none"; modal.classList.remove("active-modal"); } }; // Search and filter event listeners document.getElementById("emp-applicant-search")?.addEventListener("input", renderApplicantsTable); document.getElementById("emp-applicant-status-filter")?.addEventListener("change", renderApplicantsTable); // Skill tags selection toggle document.querySelectorAll(".skill-tag").forEach(tag => { tag.addEventListener("click", () => { tag.classList.toggle("active"); if (tag.classList.contains("active")) { tag.style.background = "rgba(16, 185, 129, 0.15)"; tag.style.borderColor = "var(--accent-teal)"; tag.style.color = "var(--accent-teal)"; tag.style.boxShadow = "0 0 10px rgba(16, 185, 129, 0.2)"; } else { tag.style.background = "rgba(255, 255, 255, 0.03)"; tag.style.borderColor = "var(--border-color)"; tag.style.color = "var(--text-secondary)"; tag.style.boxShadow = "none"; } const selected = Array.from(document.querySelectorAll(".skill-tag.active")).map(t => t.getAttribute("data-skill")); const hiddenInput = document.getElementById("job-skills-selected"); if (hiddenInput) { hiddenInput.value = selected.join(","); } }); });
Menu