Exemple #1
0
        public async Task <IActionResult> Upgrade([FromRoute] Guid organizationId,
                                                  [FromBody] ProviderOrganizationUpgradeInput input)
        {
            _logger.LogInformation(GetLogMessage("Provider"));


            if (_agencyOwner.IsProviderOwner)
            {
                throw new ApplicationException("Agency is already a provider agency");
            }

            var result = await _organizationService
                         .UpgradeOrganization(_agencyOwner, input);

            if (result.Succeeded)
            {
                return(await Get(organizationId));
            }

            return(Ok(result));
        }
        public async Task <OrganizationResult> UpgradeOrganization(IAgencyOwner agencyOwner, ProviderOrganizationUpgradeInput input)
        {
            _logger.LogInformation(GetLogMessage("{@input}"), input);

            var retVal = new OrganizationResult()
            {
                OrganizationId = agencyOwner.OrganizationId
            };

            var organization = await Repository.Queryable()
                               .Include(x => x.ProviderOrganization)
                               .Include(x => x.OrganizationPeople)
                               .ThenInclude(x => x.Marketer)
                               .Include(x => x.OrganizationPeople)
                               .ThenInclude(x => x.Customer)
                               .Include(x => x.OrganizationPeople)
                               .ThenInclude(x => x.Contractor)
                               .Include(x => x.OrganizationPeople)
                               .ThenInclude(x => x.ProjectManager)
                               .Include(x => x.OrganizationPeople)
                               .ThenInclude(x => x.AccountManager)
                               .Include(x => x.OrganizationPeople)
                               .ThenInclude(x => x.Recruiter)
                               .Where(x => x.Id == agencyOwner.OrganizationId && x.ProviderOrganization == null)
                               .FirstOrDefaultAsync();

            if (organization == null)
            {
                retVal.ErrorMessage = "unable to upgrade organization, possibly because it's already upgraded";
                return(retVal);
            }

            var orgPerson = organization
                            .OrganizationPeople
                            .First(x => x.PersonId == agencyOwner.CustomerId);

            _logger.LogDebug(GetLogMessage("Person Found {0}"), orgPerson.PersonId);

            retVal = UpgradeToProviderOrganization(input, organization, orgPerson, true);

            return(retVal);
        }
        private OrganizationResult UpgradeToProviderOrganization(ProviderOrganizationUpgradeInput input,
                                                                 Organization organization, OrganizationPerson person, bool saveChanges = true)
        {
            _logger.LogInformation(GetLogMessage("{Organization}, Saving Changes: {saveChanges}"), organization.Name, saveChanges);

            var retVal = new OrganizationResult()
            {
                OrganizationId = organization.Id
            };

            person.AccountManager = new OrganizationAccountManager()
            {
                AccountManagerId     = person.PersonId,
                OrganizationId       = person.OrganizationId,
                AccountManagerStream = input.AccountManagerStream,
                ObjectState          = ObjectState.Added
            };

            person.ProjectManager = new OrganizationProjectManager()
            {
                OrganizationId       = person.OrganizationId,
                ProjectManagerId     = person.PersonId,
                ProjectManagerStream = input.ProjectManagerStream,
                ObjectState          = ObjectState.Added
            };

            person.Contractor = new OrganizationContractor()
            {
                ContractorId     = person.PersonId,
                OrganizationId   = person.OrganizationId,
                ContractorStream = input.ContractorStream,
                ObjectState      = ObjectState.Added
            };
            person.ObjectState = ObjectState.Modified;

            var records = _organizationPersonRepo.InsertOrUpdateGraph(person, true);

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

            if (records == 0)
            {
                retVal.Succeeded    = false;
                retVal.ErrorMessage = "Unable to add user to provider roles";
                return(retVal);
            }

            organization.ProviderOrganization = new ProviderOrganization()
            {
                ContractorStream        = input.ContractorStream,
                ProjectManagerStream    = input.ProjectManagerStream,
                AccountManagerStream    = input.AccountManagerStream,
                AgencyStream            = input.AgencyStream,
                Discoverable            = input.Discoverable,
                ObjectState             = ObjectState.Added,
                SystemStream            = SystemStream,
                DefaultAccountManagerId = person.PersonId,
                DefaultContractorId     = person.PersonId,
                DefaultProjectManagerId = person.PersonId
            }.InjectFrom(input) as ProviderOrganization;
            organization.ObjectState      = ObjectState.Modified;
            organization.OrganizationType = organization.OrganizationType.Add(OrganizationType.Provider);

            _logger.LogDebug(GetLogMessage("new org type {0}"), organization.OrganizationType);

            var orgRecords = Repository.InsertOrUpdateGraph(organization, saveChanges);

            _logger.LogDebug(GetLogMessage("{0} Organization Records updated"), orgRecords);

            if (orgRecords == 0)
            {
                retVal.ErrorMessage = "Unable to update organization";
                return(retVal);
            }

            var stripeResult = _subscriptionService.PushSubscription(organization.Id, saveChanges).Result;

            _logger.LogDebug(GetLogMessage("{StripeChanges} stripe records updated"), stripeResult);

            if (stripeResult > 0)
            {
                retVal.Succeeded = true;
            }

            return(retVal);
        }