예제 #1
0
        public async Task <IActionResult> AcceptCandidate([FromRoute] Guid organizationId, [FromRoute] Guid candidateId,
                                                          [FromBody] CandidateAcceptInput model)
        {
            var co = await _candidateService.Promote(_projectManager,
                                                     candidateId, model);

            return(Ok(co));
        }
        public async Task <CandidatePromotionResult> Promote(
            IOrganizationProjectManager pm,
            Guid candidateId,
            CandidateAcceptInput model)
        {
            _logger.LogInformation(GetLogMessage("PM: {0}; Promoting Candidate: {1}"), pm.OrganizationId, candidateId);

            var candidate = await Repository.Queryable().ForOrganizationProjectManager(pm)
                            .Where(x => x.Id == candidateId).FirstAsync();

            var isNotValid = CheckValidation(candidateId, candidate, out var retVal);

            if (isNotValid)
            {
                return(retVal);
            }

            if (candidate.Status != CandidateStatus.Qualified && candidate.Status != CandidateStatus.Promoted)
            {
                retVal.ErrorMessage = "Candidate can only be promoted in the qualified state";
                return(retVal);
            }

            _logger.LogDebug(GetLogMessage("Candidate is able to be promoted"));

            var orgPerson = await _organizationPersonService.Create(new CreateOrganizationPersonInput()
            {
                Iso2                    = candidate.Iso2,
                ProvinceState           = candidate.ProvinceState,
                FirstName               = candidate.FirstName,
                LastName                = candidate.LastName,
                EmailAddress            = candidate.EmailAddress,
                PhoneNumber             = candidate.PhoneNumber,
                SendEmail               = false,
                ContractorStream        = model.Rate,
                RecruiterId             = candidate.RecruiterId,
                AffiliateOrganizationId = candidate.RecruiterOrganizationId,
                IsContractor            = true
            }, pm.OrganizationId, candidate.RecruiterOrganizationId, false);

            if (orgPerson.Succeeded)
            {
                _logger.LogDebug(GetLogMessage("New person added {0}"), orgPerson.PersonId);
                candidate.Status = CandidateStatus.Promoted;

                candidate.StatusTransitions.Add(new CandidateStatusTransition()
                {
                    ObjectState = ObjectState.Added,
                    Status      = CandidateStatus.Promoted
                });

                candidate.UpdatedById = _userInfo.UserId;
                candidate.ObjectState = ObjectState.Modified;

                candidate.Updated = DateTimeOffset.UtcNow;

                var result = Repository.Update(candidate, true);

                _logger.LogDebug(GetLogMessage("{0} results added"), result);


                if (result > 0)
                {
                    retVal.Succeeded   = true;
                    retVal.CandidateId = candidateId;
                    retVal.PersonId    = orgPerson.PersonId;

                    await Task.Run(() =>
                    {
                        RaiseEvent(new CandidatePromotedEvent()
                        {
                            CandidateId = candidateId
                        });
                    });
                }
            }
            else
            {
                _logger.LogWarning(GetLogMessage("Unable to create org person"));
            }


            return(retVal);
        }