public async Task <OrganizationPersonResult> AddExistingPerson(IAgencyOwner agencyOwner, AddExistingPersonInput input)
        {
            _logger.LogInformation(GetLogMessage("Organization: {0}; Email: {1}"), agencyOwner.OrganizationId, input.EmailAddress);

            var retVal = new OrganizationPersonResult()
            {
                OrganizationId = agencyOwner.OrganizationId
            };
            var foundPerson = await _accountManager.FindByEmailAsync(input.EmailAddress);

            if (foundPerson != null)
            {
                _logger.LogDebug(GetLogMessage("Person Found: {0}"), foundPerson.Id);

                var orgPersonInput = new OrganizationPersonInput()
                {
                    PersonId = foundPerson.Id
                }.InjectFrom(input) as OrganizationPersonInput;

                retVal = await Create(orgPersonInput, agencyOwner.OrganizationId);

                _logger.LogDebug(GetLogMessage("Person Result: {@result}"), retVal);
            }
            else
            {
                _logger.LogWarning(GetLogMessage("User does not exist"));
            }

            return(retVal);
        }
        public async Task <OrganizationPersonResult> Update(OrganizationPersonInput input, Guid organizationId)
        {
            _logger.LogInformation(GetLogMessage($@"For Person: {input.PersonId}, For Organization: {organizationId}"));

            var retVal = new OrganizationPersonResult()
            {
                PersonId       = input.PersonId,
                OrganizationId = organizationId
            };

            return(await Task.FromResult(retVal));
        }
        public async Task <OrganizationPersonResult> Create(CreateOrganizationPersonInput input, Guid organizationId, Guid?affiliateOrganizationId, bool checkValidation = true)
        {
            _logger.LogInformation(GetLogMessage("Organization Id: {0}"), organizationId);

            var isNotValid = CheckValidation(input, out OrganizationPersonResult retVal);

            if (isNotValid)
            {
                return(retVal);
            }

            var result = await _personService
                         .CreatePerson(input, input.RecruiterId, input.MarketerId, affiliateOrganizationId);

            _logger.LogDebug(GetLogMessage("Person: {@result}"), result);

            if (result.Succeeded)
            {
                if (result.PersonId != null)
                {
                    var orgPersonInput = new OrganizationPersonInput()
                    {
                        RecruiterBonus = input.RecruiterBonus,
                        MarketerBonus  = input.MarketerBonus,
                        PersonId       = result.PersonId.Value,
                    }.InjectFrom(input) as OrganizationPersonInput;

                    retVal = await Create(orgPersonInput, organizationId);
                }
                else
                {
                    _logger.LogWarning(GetLogMessage("Person result is in an invalid state"));
                }
            }
            else
            {
                retVal.ErrorMessage = result.ErrorMessage;
                _logger.LogWarning(GetLogMessage(retVal.ErrorMessage));
                _logger.LogWarning(GetLogMessage("Unable to promote candidate"));
            }

            return(retVal);
        }
        public static OrganizationPerson CreateOrgPerson(this IRepositoryAsync <OrganizationPerson> repo, OrganizationPersonInput input, Guid organizationId)
        {
            var entity = new OrganizationPerson
            {
                Created             = DateTimeOffset.UtcNow,
                Updated             = DateTimeOffset.UtcNow,
                PersonId            = input.PersonId,
                OrganizationId      = organizationId,
                IsOrganizationOwner = input.IsCustomer,
                IsDefault           = true,
                IsDeleted           = false,
                Status        = PersonStatus.Active,
                ObjectState   = ObjectState.Added,
                AffiliateCode = Guid.NewGuid()
                                .ToString()
                                .Substring(0, 5)
                                .ToUpper(),
                Customer = input.IsCustomer ? new OrganizationCustomer()
                {
                    CustomerId     = input.PersonId,
                    OrganizationId = organizationId,
                    IsDefault      = input.IsCustomer,
                    ObjectState    = ObjectState.Added
                } : null,
                Contractor = input.IsContractor ? new OrganizationContractor()
                {
                    ContractorId     = input.PersonId,
                    ContractorStream = input.ContractorStream.GetValueOrDefault(),
                    OrganizationId   = organizationId,
                    ObjectState      = ObjectState.Added
                } : null,
                AccountManager = input.IsAccountManager ? new OrganizationAccountManager()
                {
                    AccountManagerId     = input.PersonId,
                    AccountManagerStream = input.AccountManagerStream.GetValueOrDefault(),
                    OrganizationId       = organizationId,
                    ObjectState          = ObjectState.Added
                } : null,
                ProjectManager = input.IsProjectManager ? new OrganizationProjectManager()
                {
                    ProjectManagerId     = input.PersonId,
                    OrganizationId       = organizationId,
                    ProjectManagerStream = input.ProjectManagerStream.GetValueOrDefault(),
                    ObjectState          = ObjectState.Added
                } : null,
                Recruiter = input.IsRecruiter ? new OrganizationRecruiter()
                {
                    RecruiterId     = input.PersonId,
                    OrganizationId  = organizationId,
                    RecruiterStream = input.RecruiterStream.GetValueOrDefault(),
                    RecruiterBonus  = input.RecruiterBonus.GetValueOrDefault(),
                    ObjectState     = ObjectState.Added
                } : null,
                Marketer = input.IsMarketer ? new OrganizationMarketer()
                {
                    MarketerId     = input.PersonId,
                    OrganizationId = organizationId,
                    Created        = DateTimeOffset.UtcNow,
                    MarketerStream = input.MarketerStream.GetValueOrDefault(),
                    MarketerBonus  = input.MarketerBonus.GetValueOrDefault(),
                    ObjectState    = ObjectState.Added
                } : null
            }.InjectFrom(input) as OrganizationPerson;

            repo.Insert(entity);
            return(entity);
        }
        public async Task <OrganizationPersonResult> Create(OrganizationPersonInput input, Guid organizationId)
        {
            _logger.LogTrace(GetLogMessage($@"For Person: {input.PersonId}, For Organization: {organizationId}"));

            var retVal = new OrganizationPersonResult()
            {
                OrganizationId = organizationId,
                PersonId       = input.PersonId
            };

            var person = _personService.Get(input.PersonId);

            var organization = _organizationRepository.Queryable()
                               .FirstOrDefaultAsync(x => x.Id == organizationId);

            await Task.WhenAll(person, organization);

            if (person.Result == null || organization.Result == null)
            {
                retVal.ErrorMessage = "Person or Organization is invalid";
                return(retVal);
            }

            var organizationPerson = await Repository.Queryable()
                                     .IgnoreQueryFilters()
                                     .FirstOrDefaultAsync(x => x.PersonId == input.PersonId && x.OrganizationId == organizationId);

            var records = 0;

            if (organizationPerson != null)
            {
                if (organizationPerson.IsDeleted)
                {
                    organizationPerson.IsDeleted   = false;
                    organizationPerson.UpdatedById = _userInfo.UserId;
                    organizationPerson.CreatedById = _userInfo.UserId;
                    Repository.Update(organizationPerson);
                    records = Repository.Commit();
                }
            }
            else
            {
                organizationPerson = Repository.CreateOrgPerson(input, organizationId);
                records            = Repository.Commit();
            }

            _logger.LogDebug(GetLogMessage("{0} records updated"), records);

            if (records > 0)
            {
                retVal.Succeeded = true;
                retVal.PersonId  = organizationPerson.PersonId;

                await Task.Run(() =>
                {
                    RaiseEvent(new OrganizationPersonCreatedEvent
                    {
                        OrganizationId = organizationPerson.OrganizationId,
                        PersonId       = organizationPerson.PersonId
                    });
                });
            }
            else
            {
                _logger.LogWarning(GetLogMessage("Unable to create organization person"));
            }

            return(retVal);
        }