public void Validate(Candidate candidate, List <string> dataRows, IRegexCompiler regexCompiler) { var fileLineNameRegex = regexCompiler.Compile(RegexOptionHelper.FirstLineContainingNameRegex); var candidateNameRegex = regexCompiler.Compile(RegexOptionHelper.CandidateNameRegex); var phrasesToIgnore = ResumeFilterHelper.GetPhrasesNotNames(); foreach (var dataRow in dataRows) { if (fileLineNameRegex.IsMatch(dataRow)) { var firstValidText = fileLineNameRegex.Match(dataRow).Value; var possibleNameTokens = Regex.Replace(firstValidText, @"[^a-z- ]", string.Empty, RegexOptions.IgnoreCase) .Split(new [] { ' ', '\'', '-' }, StringSplitOptions.RemoveEmptyEntries); if (possibleNameTokens.Length > 0 && !possibleNameTokens.Any(name => phrasesToIgnore.Contains(name, new CaseInsensitiveStringComparer()))) { MakeCandidateName(candidate, firstValidText.Trim(), true); break; } continue; } if (candidateNameRegex.IsMatch(dataRow)) { var matchedName = candidateNameRegex.Match(dataRow).Groups[1].Value; MakeCandidateName(candidate, matchedName.Trim()); break; } } }
public void Validate(Candidate candidate, List <string> dataRows, IRegexCompiler regexCompiler) { var states = ResumeFilterHelper.GetStates(); var stateOfOriginRegex = regexCompiler.Compile(RegexOptionHelper.StatOfOriginRegex); var wordsToIgnore = ResumeFilterHelper.GetStopWords(); foreach (var dataRow in dataRows) { if (stateOfOriginRegex.IsMatch(dataRow)) { var stateRow = dataRow.Trim().ToLower(); var possibleStateTokens = Regex.Replace(stateRow, @"[^a-z-,: ]", string.Empty, RegexOptions.IgnoreCase) .Split(new[] { ' ', '-', ',' }, StringSplitOptions.RemoveEmptyEntries); if (possibleStateTokens.All(state => !wordsToIgnore.Contains(state, new StateComparer()))) { var foundState = possibleStateTokens.FirstOrDefault(state => states.Contains(state, new StateComparer())); if (!string.IsNullOrEmpty(foundState)) { candidate.StateOfOrigin = states.First(state => state.ToLower().Contains(foundState)); return; } } } var trimmedStateRow = dataRow.Trim().ToLower(); if (trimmedStateRow.Contains("origin") || trimmedStateRow.Contains("state") && trimmedStateRow.Contains("origin") || trimmedStateRow.Contains("nationality")) { var possibleStateTokens = Regex.Replace(trimmedStateRow, @"[^a-z-,: ]", string.Empty, RegexOptions.IgnoreCase) .Split(new[] { ' ', '-', ',' }, StringSplitOptions.RemoveEmptyEntries); var foundState = possibleStateTokens.FirstOrDefault(state => states.Contains(state, new StateComparer())); if (!string.IsNullOrEmpty(foundState)) { candidate.StateOfOrigin = states.First(state => state.ToLower().Contains(foundState)); return; } } } HashSet <string> wordsInRow = new HashSet <string>(dataRows.SelectMany(row => row.ToLower().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries))); var candidateState = states.FirstOrDefault(state => wordsInRow.Contains(state.ToLower())); if (candidateState != null) { candidate.StateOfOrigin = candidateState; } }
private void SendIncompleteDetailsNotification(Candidate candidate, IEnumerable <string> unavailableDetails) { var messageBody = string.Format(ResumeFilterHelper.GetNotificationTemplate(), candidate.FirstName ?? "X", candidate.LastName ?? "X", candidate.Age > 0 ? candidate.Age.ToString() : "X", candidate.Email ?? "X", candidate.PhoneNumber ?? "X", candidate.StateOfOrigin ?? "X", unavailableDetails.Aggregate(string.Empty, (current, row) => current + (!string.IsNullOrEmpty(current) ? ", " : "") + row) ); var admins = _dataRepositoryFactory.Create <IOperationsAdminRepository>().GetOperationsAdminEmails(); if (admins.Count > 0) { _emailManager.Send("ATS Service", admins, "ATS Applicant Notification", messageBody, true, new List <string>()); } }
public IHttpActionResult States() { return(Ok(ResumeFilterHelper.GetStates())); }
public void Execute() { int batchCount = Convert.ToInt32(ConfigurationManager.AppSettings["UnprocessedEmailBatchCount"]); var emails = _dataRepositoryFactory.Create <IInboundEmailRepository>() .GetUnprocessedInboundEmails(batchCount); foreach (var email in emails) { foreach (var attachment in email.InboundAttachments.TryGetValidCvsOrDefault(email.SenderName)) { var documentExtractor = _documentExtractorFactory.GetExtractor(attachment.FileType); var parsedRows = documentExtractor.GetRows(attachment.FilePath, ResumeFilterHelper.GetStopWords(), ResumeFilterHelper.GetSkipWords()); if (parsedRows.Count <= 0) { continue; } var candidate = _candidateBuilder.BuildFrom(parsedRows); if (candidate.IsValidCandidate()) { ValidateSenderDetails(candidate, parsedRows, email.SenderName, email.Sender); candidate.InboundEmailId = email.InboundEmailId; candidate.InboundAttachmentId = attachment.InboundAttachmentId; _dataRepositoryFactory.Create <ICandidateRepository>().Save(candidate); var incompleteCandidateDetails = candidate.GetIncompleteCandidateDetails(); if (incompleteCandidateDetails.Count > 0) { SendIncompleteDetailsNotification(candidate, incompleteCandidateDetails); } } } email.Processed = 1; _dataRepositoryFactory.Create <IInboundEmailRepository>() .DetachAndUpdate(email.InboundEmailId, email); } }