Esempio n. 1
0
        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;
                }
            }
        }
Esempio n. 2
0
        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;
            }
        }
Esempio n. 3
0
        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>());
            }
        }
Esempio n. 4
0
 public IHttpActionResult States()
 {
     return(Ok(ResumeFilterHelper.GetStates()));
 }
Esempio n. 5
0
        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);
            }
        }