public static async Task <OrganizationMarketer> GetMarketerOrDefault(this IRepositoryAsync <OrganizationMarketer> repo, Guid?organizationId, Guid?marketerId, string referralCode)
        {
            OrganizationMarketer ma = null;

            if (!string.IsNullOrWhiteSpace(referralCode))
            {
                // no recruiter referral codes yet
            }

            if (organizationId.HasValue && marketerId.HasValue)
            {
                ma = await repo.Queryable().Where(x => x.OrganizationId == organizationId && x.MarketerId == marketerId)
                     .FirstOrDefaultAsync();
            }

            if (ma == null)
            {
                if (organizationId.HasValue)
                {
                    ma = await repo.Queryable()
                         .Include(x => x.OrganizationDefaults)
                         .Where(x => x.OrganizationId == organizationId.Value && x.OrganizationDefaults.Any())
                         .FirstOrDefaultAsync();
                }

                if (ma == null)
                {
                    ma = await repo.Queryable().Where(x => x.IsSystemDefault)
                         .FirstAsync();
                }
            }

            return(ma);
        }
        public async Task <T> Create <T>(OrganizationMarketerInput model)
            where T : OrganizationMarketerOutput
        {
            _logger.LogInformation(GetLogMessage($@"Marketer: {model.MarketerId}, Organization: {model.OrganizationId}"));

            var entity = await Repository.Queryable().IgnoreQueryFilters()
                         .FirstOrDefaultAsync(x =>
                                              x.MarketerId == model.MarketerId &&
                                              x.OrganizationId == model.OrganizationId);

            if (entity != null)
            {
                _logger.LogDebug(GetLogMessage("Existing marketer found, deleted: {0}"), entity.IsDeleted);

                if (entity.IsDeleted)
                {
                    _logger.LogDebug(GetLogMessage("un-deleting org_marketer"));

                    entity.IsDeleted      = false;
                    entity.UpdatedById    = _userInfo.UserId;
                    entity.Updated        = DateTimeOffset.UtcNow;
                    entity.MarketerStream = model.MarketerStream;
                    entity.MarketerBonus  = model.MarketerBonus;

                    entity.InjectFrom(model);

                    var marketerOutput = await Repository.UpdateAsync(entity, true);

                    _logger.LogDebug(GetLogMessage("{0} records updated in database"), marketerOutput);
                }
            }
            else
            {
                _logger.LogDebug(GetLogMessage("No marketer found, creating..."));

                entity = new OrganizationMarketer()
                {
                    UpdatedById = _userInfo.UserId,
                    CreatedById = _userInfo.UserId,
                }.InjectFrom(model) as OrganizationMarketer;

                var marketerOutput = await Repository.InsertAsync(entity, true);

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

            var output = await GetById <T>(model.MarketerId, model.OrganizationId);

            await Task.Run(() =>
            {
                RaiseEvent(new OrganizationMarketerCreatedEvent <T>
                {
                    OrganizationMarketerOutput = output
                });
            });

            return(output);
        }
Exemplo n.º 3
0
        public async Task <PersonResult> CreatePerson(
            PersonInput input, Guid?recruiterId, Guid?marketerId, Guid?affiliateOrganizationId, string password = "******"
            )
        {
            _logger.LogInformation(GetLogMessage("Recruiter:{0};Marketer:{1};AffiliateOrg:{2}"), recruiterId, marketerId, affiliateOrganizationId);

            var user = await _userAccountManager
                       .FindByEmailAsync(input.EmailAddress);

            var retVal = new PersonResult();

            if (user == null)
            {
                OrganizationRecruiter re = null;
                OrganizationMarketer  ma = null;

                if (affiliateOrganizationId.HasValue)
                {
                    if (marketerId.HasValue)
                    {
                        ma = await _orgMarketerRepository.Queryable()
                             .Where(x => x.OrganizationId == affiliateOrganizationId.Value && x.MarketerId == marketerId.Value)
                             .FirstOrDefaultAsync();
                    }
                    else
                    {
                        ma = await _orgMarketerRepository.Queryable()
                             .Include(x => x.OrganizationDefaults)
                             .Where(x => x.OrganizationId == affiliateOrganizationId.Value &&
                                    x.OrganizationDefaults.Any())
                             .FirstOrDefaultAsync();
                    }

                    if (recruiterId.HasValue)
                    {
                        re = await _orgRecruiterRepository.Queryable()
                             .Where(x => x.OrganizationId == affiliateOrganizationId.Value && x.RecruiterId == recruiterId.Value)
                             .FirstOrDefaultAsync();
                    }
                    else
                    {
                        re = await _orgRecruiterRepository.Queryable()
                             .Include(x => x.RecruitingOrganizationDefaults)
                             .Where(x => x.OrganizationId == affiliateOrganizationId.Value && x.RecruitingOrganizationDefaults.Any())
                             .FirstOrDefaultAsync();
                    }
                }

                if (ma == null)
                {
                    ma = await _orgMarketerRepository.Queryable().Where(x => x.IsSystemDefault).FirstAsync();
                }

                if (re == null)
                {
                    re = await _orgRecruiterRepository.Queryable().Where(x => x.IsSystemDefault).FirstAsync();
                }

                user = new ApplicationUser
                {
                    UserName       = input.EmailAddress,
                    Email          = input.EmailAddress,
                    EmailConfirmed = false,
                    Created        = DateTimeOffset.UtcNow,
                    PhoneNumber    = input.PhoneNumber
                };

                var result = await _userAccountManager.CreateAsync(user, password);

                if (!result.Succeeded)
                {
                    retVal.ErrorMessage = result.ToString();
                    return(retVal);
                }

                var person = new Person
                {
                    ImageUrl       = "https://www.dropbox.com/s/icxbbieztc2rrwd/default-avatar.png?raw=1",
                    Id             = user.Id,
                    FirstName      = input.FirstName,
                    LastName       = input.LastName,
                    Iso2           = input.Iso2,
                    ProvinceState  = input.ProvinceState,
                    ReferralCode   = ma.ReferralCode,
                    AccountManager = new AccountManager()
                    {
                        Id          = user.Id,
                        Created     = DateTimeOffset.UtcNow,
                        Updated     = DateTimeOffset.UtcNow,
                        ObjectState = ObjectState.Added
                    },
                    ProjectManager = new ProjectManager()
                    {
                        Id          = user.Id,
                        Created     = DateTimeOffset.UtcNow,
                        Updated     = DateTimeOffset.UtcNow,
                        ObjectState = ObjectState.Added
                    },
                    Marketer = new Marketer()
                    {
                        Id          = user.Id,
                        Created     = DateTimeOffset.UtcNow,
                        Updated     = DateTimeOffset.UtcNow,
                        ObjectState = ObjectState.Added
                    },
                    Recruiter = new Recruiter()
                    {
                        Id          = user.Id,
                        Created     = DateTimeOffset.UtcNow,
                        Updated     = DateTimeOffset.UtcNow,
                        ObjectState = ObjectState.Added
                    },
                    Contractor = new Contractor()
                    {
                        RecruiterOrganizationId = re.OrganizationId,
                        RecruiterId             = re.RecruiterId,
                        IsAvailable             = false,
                        ObjectState             = ObjectState.Added,
                        Created = DateTimeOffset.UtcNow,
                        Updated = DateTimeOffset.UtcNow,
                    },
                    Customer = new Customer()
                    {
                        MarketerId             = ma.MarketerId,
                        MarketerOrganizationId = ma.OrganizationId,
                        ObjectState            = ObjectState.Added,
                        Created = DateTimeOffset.UtcNow,
                        Updated = DateTimeOffset.UtcNow,
                    },
                    ObjectState = ObjectState.Added,
                    Created     = DateTimeOffset.UtcNow,
                    Updated     = DateTimeOffset.UtcNow
                };

                var theResult = Repository.InsertOrUpdateGraph(person, true);

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

                if (theResult > 0)
                {
                    retVal.Succeeded = true;
                    retVal.PersonId  = person.Id;

                    await Task.Run(() =>
                    {
                        RaiseEvent(new PersonCreatedEvent
                        {
                            PersonId = person.Id
                        });
                    });
                }
            }
            else
            {
                _logger.LogInformation(GetLogMessage("Email address:{0};"), input.EmailAddress);
                retVal.ErrorMessage = "Email address already exists";
            }

            return(retVal);
        }