public override Hash ProposeDevelopersAudition(ProposeAuditionInput input) { var projectInfo = State.Projects[input.ProjectId].Clone(); if (projectInfo == null) { throw new AssertionException("Project not found."); } Assert(projectInfo.Status == ProjectStatus.Taken, "Project needs to be taken."); var developerOrganizationAddress = State.DeveloperOrganizationAddress[input.ProjectId]; // ReSharper disable once PossibleNullReferenceException var targetBudgetPlan = projectInfo.BudgetPlans.Single(p => p.Index == input.BudgetPlanIndex); targetBudgetPlan.IsApprovedByDevelopers = true; var newProjectInfo = new ProjectInfo { PullRequestUrl = projectInfo.PullRequestUrl, CommitId = projectInfo.CommitId, CurrentBudgetPlanIndex = projectInfo.CurrentBudgetPlanIndex, PreAuditionHash = projectInfo.PreAuditionHash, Status = ProjectStatus.Taken, BudgetPlans = { targetBudgetPlan } }; var proposalId = CreateProposalToDeveloperOrganization(developerOrganizationAddress, nameof(UpdateBountyProject), newProjectInfo.ToByteString()); return(proposalId); }
public override Hash ProposeDeliver(ProposeAuditionInput input) { var projectInfo = State.Projects[input.ProjectId]; if (projectInfo == null) { throw new AssertionException("Project not found."); } if (projectInfo.ProjectType == ProjectType.Grant) { Assert(projectInfo.Status == ProjectStatus.Ready, "Project not ready."); } if (projectInfo.ProjectType == ProjectType.Bounty) { Assert(projectInfo.Status == ProjectStatus.Taken, "Project not taken."); } Assert(projectInfo.CurrentBudgetPlanIndex == input.BudgetPlanIndex, "Incorrect budget plan index."); var newProjectInfo = new ProjectInfo { PullRequestUrl = projectInfo.PullRequestUrl, CommitId = projectInfo.CommitId, CurrentBudgetPlanIndex = input.BudgetPlanIndex.Add(1), Status = projectInfo.BudgetPlans.Select(p => p.Index).OrderBy(p => p).Last() == input.BudgetPlanIndex ? ProjectStatus.Delivered : projectInfo.ProjectType == ProjectType.Grant ? ProjectStatus.Ready : ProjectStatus.Taken, BudgetPlans = { projectInfo.BudgetPlans.Single(p => p.Index == input.BudgetPlanIndex) } }; if (projectInfo.ProjectType == ProjectType.Bounty && projectInfo.IsDevelopersAuditionRequired) { Assert(projectInfo.BudgetPlans.All(p => p.IsApprovedByDevelopers), "Project budget plans need to approved by developers before deliver."); } var budgetPlan = newProjectInfo.BudgetPlans.SingleOrDefault(p => p.Index == input.BudgetPlanIndex); Assert(budgetPlan != null, "Budget Plan not found."); // ReSharper disable once PossibleNullReferenceException budgetPlan.DeliverPullRequestUrl = input.DeliverPullRequestUrl; budgetPlan.DeliverCommitId = input.DeliverCommitId; var proposalId = CreateProposalToSelf( projectInfo.ProjectType == ProjectType.Grant ? nameof(UpdateGrantProject) : nameof(UpdateBountyProject), newProjectInfo.ToByteString()); return(proposalId); }