diff --git a/server/routes/mail.coffee b/server/routes/mail.coffee index 784f4c099..dd09a5d02 100644 --- a/server/routes/mail.coffee +++ b/server/routes/mail.coffee @@ -23,7 +23,7 @@ module.exports.setup = (app) -> setupScheduledEmails = -> testForLockManager() mailTaskMap = - "test_mail_task": candidateUpdateProfileTask + "test_mail_task": employerNewCandidatesAvailableTask MailTask.find({}).lean().exec (err, mailTasks) -> if err? then throw "Failed to schedule mailTasks! #{err}" @@ -50,6 +50,7 @@ findAllCandidatesWithinTimeRange = (cb) -> "jobProfile.updated": $gt: @timeRange.start $lte: @timeRange.end + "jobProfileApproved": true selection = "_id email jobProfile.name jobProfile.updated" User.find(findParameters).select(selection).lean().exec cb @@ -109,7 +110,7 @@ candidateUpdateProfileTask = -> lockManager.setLock mailTaskName, lockDurationMs, (err, lockResult) -> if err? then return log.error "Error getting a task lock!" async.each timeRanges, emailTimeRange.bind(mailTaskName: mailTaskName), (err) -> - if err then return log.error JSON.stringify err else log.info "Sent candidate update reminders!" + if err then log.error JSON.stringify err else log.info "Sent candidate update reminders!" lockManager.releaseLock mailTaskName, (err, result) -> if err? then return log.error err ### End Candidate Update Reminder Task ### @@ -125,18 +126,19 @@ emailInternalCandidateUpdateReminder = (cb) -> "mailTaskName": @mailTaskName async.waterfall [ - findCandidatesWhoUpdatedJobProfileToday.bind(asyncContext) + findNonApprovedCandidatesWhoUpdatedJobProfileToday.bind(asyncContext) (unfilteredCandidates, cb) -> async.reject unfilteredCandidates, candidatesUpdatedTodayFilter.bind(asyncContext), cb.bind(null,null) (filteredCandidates, cb) -> async.each filteredCandidates, sendInternalCandidateUpdateReminder.bind(asyncContext), cb ], cb -findCandidatesWhoUpdatedJobProfileToday = (cb) -> +findNonApprovedCandidatesWhoUpdatedJobProfileToday = (cb) -> findParameters = "jobProfile.updated": $lte: @currentTime.toISOString() gt: @beginningOfUTCDay.toISOString() + "jobProfileApproved": false User.find(findParameters).select("_id jobProfile.name jobProfile.updated").lean().exec cb candidatesUpdatedTodayFilter = (candidate, cb) -> @@ -174,17 +176,69 @@ internalCandidateUpdateTask = -> lockManager.setLock mailTaskName, lockDurationMs, (err, lockResult) -> if err? then return log.error "Error getting a task lock!" emailInternalCandidateUpdateReminder.apply {"mailTaskName":mailTaskName}, (err) -> - if err? then return log.error "There was an error sending the internal candidate update reminder." + if err? then log.error "There was an error sending the internal candidate update reminder." lockManager.releaseLock mailTaskName, (err, result) -> if err? then return log.error err ### End Internal Candidate Update Reminder Email ### ### Employer New Candidates Available Email ### + +emailEmployerNewCandidatesAvailableEmail = (cb) -> + currentTime = new Date() + asyncContext = + "currentTime": currentTime + "mailTaskName": @mailTaskName + + async.waterfall [ + findAllEmployers + makeEmployerNamesEasilyAccessible + (allEmployers, cb) -> + console.log "Found #{allEmployers.length} employers to email about new candidates available" + async.reject allEmployers, employersEmailedDigestMoreThanWeekAgoFilter.bind(asyncContext), cb.bind(null,null) + (employersToEmail, cb) -> + async.each employersToEmail, sendEmployerNewCandidatesAvailableEmail.bind(asyncContext), cb + ], cb + +findAllEmployers = (cb) -> + findParameters = + "employerAt": + $exists: true + permissions: "employer" + User.find(findParameters).select("_id email employerAt signedEmployerAgreement.data.firstName signedEmployerAgreement.data.lastName").lean().exec cb + +makeEmployerNamesEasilyAccessible = (allEmployers, cb) -> + #Make names easily accessible + for employer, index in allEmployers + if employer.signedEmployerAgreement?.data?.firstName + employer.name = employer.signedEmployerAgreement.data.firstName + " " + employer.signedEmployerAgreement.data.lastName + delete employer.signedEmployerAgreement + allEmployers[index] = employer + cb null, allEmployers + +employersEmailedDigestMoreThanWeekAgoFilter = (employer, cb) -> + findParameters = + "user": employer._id + "mailTask": @mailTaskName + "sent": + $lte: new Date(@currentTime.getTime() - 7 * 24 * 60 * 60 * 1000) + MailSent.find(findParameters).lean().exec (err, sentMail) -> + if err? then return errors.serverError("Error fetching sent mail in #{@mailTaskName}") + cb Boolean(sentMail.length) + +sendEmployerNewCandidatesAvailableEmail = (employer, cb) -> + cb null + + employerNewCandidatesAvailableTask = -> # tem_CCcHKr95Nvu5bT7c7iHCtm #initialize featuredDate to job profile updated mailTaskName = "employerNewCandidatesAvailableTask" lockDurationMs = 6000 lockManager.setLock mailTaskName, lockDurationMs, (err, lockResult) -> + if err? then return log.error "There was an error getting a task lock!" + emailEmployerNewCandidatesAvailableEmail.apply {"mailTaskName":mailTaskName}, (err) -> + if err? then return log.error "There was an error performing the #{mailTaskName} email task." + lockManager.releaseLock mailTaskName, (err, result) -> if err? then return log.error err + ### End Employer New Candidates Available Email ###