public async Task <ClaimCheckInValidationResult> PrepareClaimFoCheckIn([FromUri] int projectId, [FromUri] int claimId) { var claim = await ClaimsRepository.GetClaim(projectId, claimId); if (claim == null) { throw new HttpResponseException(HttpStatusCode.NotFound); } var validator = new ClaimCheckInValidator(claim); return (new ClaimCheckInValidationResult { ClaimId = claim.ClaimId, CheckedIn = !validator.NotCheckedInAlready, Approved = validator.IsApproved, CheckInPossible = validator.CanCheckInInPrinciple, EverythingFilled = !validator.NotFilledFields.Any(), ClaimFeeBalance = validator.FeeDue, Handouts = new[] //TODO FIX ME { new HandoutItem { Label = "Хайратник" }, new HandoutItem { Label = "Ленточка" }, }, }); }
public CheckInClaimModel([NotNull] Claim claim, [NotNull] User currentUser, [CanBeNull] IReadOnlyCollection <PlotElement> plotElements) { if (claim == null) { throw new ArgumentNullException(nameof(claim)); } if (currentUser == null) { throw new ArgumentNullException(nameof(currentUser)); } Validator = new ClaimCheckInValidator(claim); CheckInTime = claim.CheckInDate; ClaimStatus = (ClaimStatusView)claim.ClaimStatus; PlayerDetails = new UserProfileDetailsViewModel(claim.Player, (AccessReason)claim.Player.GetProfileAccess(currentUser)); Navigation = CharacterNavigationViewModel.FromClaim(claim, currentUser.UserId, CharacterNavigationPage.None); CanAcceptFee = claim.Project.CanAcceptCash(currentUser); ClaimId = claim.ClaimId; ProjectId = claim.ProjectId; Master = claim.ResponsibleMasterUser; Handouts = plotElements?.Where(e => e.ElementType == PlotElementType.Handout && e.IsActive) .Select(e => e.PublishedVersion()) .Where(e => e != null) .Select(e => new HandoutListItemViewModel(e.Content.ToPlainText(), e.AuthorUser)) .ToArray() ?? new HandoutListItemViewModel [] {}; NotFilledFields = Validator.NotFilledFields .Select(frp => new NotFilledFieldViewModel( frp.Field.CanPlayerEdit ? NotFilledFieldViewModel.WhoWllFillEnum.Player : NotFilledFieldViewModel.WhoWllFillEnum.Master, frp.Field.FieldName)).ToList(); CurrentUserFullName = currentUser.FullName; }
public async Task CheckInClaim(int projectId, int claimId, int money) { var claim = (await ClaimsRepository.GetClaim(projectId, claimId)).RequestAccess(CurrentUserId); //TODO Specific right claim.EnsureCanChangeStatus(Claim.Status.CheckedIn); var validator = new ClaimCheckInValidator(claim); if (!validator.CanCheckInInPrinciple) { throw new ClaimWrongStatusException(claim); } FinanceOperationEmail financeEmail = null; if (money > 0) { var paymentType = claim.Project.GetCashPaymentType(CurrentUserId); if (paymentType == null) { throw new JoinRpgInvalidUserException(); } financeEmail = await AcceptFeeImpl(".", Now, 0, money, paymentType, claim); } else if (money < 0) { throw new InvalidOperationException(); } if (!validator.CanCheckInNow) { throw new ClaimWrongStatusException(claim); } claim.ClaimStatus = Claim.Status.CheckedIn; claim.CheckInDate = Now; Debug.Assert(claim.Character != null, "claim.Character != null"); MarkChanged(claim.Character); claim.Character.InGame = true; AddCommentImpl(claim, null, ".", true, CommentExtraAction.CheckedIn); await UnitOfWork.SaveChangesAsync(); await EmailService.Email( await CreateClaimEmail <CheckedInEmal>(claim, ".", s => s.ClaimStatusChange, CommentExtraAction.ApproveByMaster)); if (financeEmail != null) { await EmailService.Email(financeEmail); } }
public ClaimViewModel(User currentUser, Claim claim, IEnumerable <PluginOperationData <IPrintCardPluginOperation> > pluginOperationDatas, IReadOnlyCollection <PlotElement> plotElements, IUriService uriService, IEnumerable <ProjectAccommodationType> availableAccommodationTypes = null, IEnumerable <AccommodationRequest> accommodationRequests = null, IEnumerable <AccommodationPotentialNeighbors> potentialNeighbors = null, IEnumerable <AccommodationInvite> incomingInvite = null, IEnumerable <AccommodationInvite> outgoingInvite = null) { ClaimId = claim.ClaimId; CommentDiscussionId = claim.CommentDiscussionId; RootComments = claim.CommentDiscussion.ToCommentTreeViewModel(currentUser.UserId); HasMasterAccess = claim.HasMasterAccess(currentUser.UserId); CanManageThisClaim = claim.HasAccess(currentUser.UserId, acl => acl.CanManageClaims, ExtraAccessReason.ResponsibleMaster); CanChangeRooms = claim.HasAccess(currentUser.UserId, acl => acl.CanSetPlayersAccommodations, ExtraAccessReason.PlayerOrResponsible); IsMyClaim = claim.PlayerUserId == currentUser.UserId; Player = claim.Player; ProjectId = claim.ProjectId; ProjectName = claim.Project.ProjectName; Status = new ClaimFullStatusView(claim, new AccessArguments(claim, currentUser.UserId)); CharacterGroupId = claim.CharacterGroupId; GroupName = claim.Group?.CharacterGroupName; CharacterId = claim.CharacterId; CharacterActive = claim.Character?.IsActive; CharacterAutoCreated = claim.Character?.AutoCreated; AvailableAccommodationTypes = availableAccommodationTypes?.Where(a => a.IsPlayerSelectable || a.Id == claim.AccommodationRequest?.AccommodationTypeId || claim.HasMasterAccess(currentUser.UserId)).ToList(); PotentialNeighbors = potentialNeighbors; AccommodationRequest = claim.AccommodationRequest; IncomingInvite = incomingInvite; OutgoingInvite = outgoingInvite; OtherClaimsForThisCharacterCount = claim.IsApproved ? 0 : claim.OtherClaimsForThisCharacter().Count(); HasOtherApprovedClaim = !claim.IsApproved && claim.OtherClaimsForThisCharacter().Any(c => c.IsApproved); Data = new CharacterTreeBuilder(claim.Project.RootGroup, currentUser.UserId).Generate(); OtherClaimsFromThisPlayerCount = OtherClaimsFromThisPlayerCount = claim.IsApproved || claim.Project.Details.EnableManyCharacters ? 0 : claim.OtherPendingClaimsForThisPlayer().Count(); Masters = claim.Project.GetMasterListViewModel() .Union(new MasterListItemViewModel() { Id = "-1", Name = "Нет" }); ResponsibleMasterId = claim.ResponsibleMasterUserId ?? -1; ResponsibleMaster = claim.ResponsibleMasterUser; Fields = new CustomFieldsViewModel(currentUser.UserId, claim); Navigation = CharacterNavigationViewModel.FromClaim(claim, currentUser.UserId, CharacterNavigationPage.Claim); ClaimFee = new ClaimFeeViewModel(claim, this, currentUser.UserId); Problems = claim.GetProblems().Select(p => new ProblemViewModel(p)).ToList(); PlayerDetails = new UserProfileDetailsViewModel(claim.Player, (AccessReason)claim.Player.GetProfileAccess(currentUser)); PrintPlugins = pluginOperationDatas.Select(PluginOperationDescriptionViewModel.Create); ProjectActive = claim.Project.Active; CheckInStarted = claim.Project.Details.CheckInProgress; CheckInModuleEnabled = claim.Project.Details.EnableCheckInModule; Validator = new ClaimCheckInValidator(claim); AccommodationEnabled = claim.Project.Details.EnableAccommodation; if (claim.HasAccess(currentUser.UserId, acl => acl.CanManageMoney, ExtraAccessReason.Player)) { //Finance admins can create any payment. User also can create any payment, but it will be moderated PaymentTypes = claim.Project.ActivePaymentTypes; } else { //All other master can create only payment from user to himself. PaymentTypes = claim.Project.ActivePaymentTypes.Where(pt => pt.UserId == currentUser.UserId); } if (claim.Character != null) { ParentGroups = new CharacterParentGroupsViewModel(claim.Character, claim.HasMasterAccess(currentUser.UserId)); } if (claim.IsApproved && claim.Character != null) { var readOnlyList = claim.Character.GetOrderedPlots(plotElements); Plot = PlotDisplayViewModel.Published(readOnlyList, currentUser.UserId, claim.Character, uriService); } else { Plot = PlotDisplayViewModel.Empty(); } }
public ClaimViewModel(User currentUser, Claim claim, IEnumerable <PluginOperationData <IPrintCardPluginOperation> > pluginOperationDatas, IReadOnlyCollection <PlotElement> plotElements) { ClaimId = claim.ClaimId; CommentDiscussionId = claim.CommentDiscussionId; RootComments = claim.CommentDiscussion.ToCommentTreeViewModel(currentUser.UserId); HasMasterAccess = claim.HasMasterAccess(currentUser.UserId); CanManageThisClaim = claim.CanManageClaim(currentUser.UserId); IsMyClaim = claim.PlayerUserId == currentUser.UserId; Player = claim.Player; ProjectId = claim.ProjectId; Status = (ClaimStatusView)claim.ClaimStatus; CharacterGroupId = claim.CharacterGroupId; GroupName = claim.Group?.CharacterGroupName; CharacterId = claim.CharacterId; CharacterActive = claim.Character?.IsActive; OtherClaimsForThisCharacterCount = claim.IsApproved ? 0 : claim.OtherClaimsForThisCharacter().Count(); HasOtherApprovedClaim = !claim.IsApproved && claim.OtherClaimsForThisCharacter().Any(c => c.IsApproved); Data = new CharacterTreeBuilder(claim.Project.RootGroup, currentUser.UserId).Generate(); OtherClaimsFromThisPlayerCount = OtherClaimsFromThisPlayerCount = claim.IsApproved || claim.Project.Details.EnableManyCharacters ? 0 : claim.OtherPendingClaimsForThisPlayer().Count(); Description = claim.Character?.Description.ToHtmlString(); Masters = claim.Project.GetMasterListViewModel() .Union(new MasterListItemViewModel() { Id = "-1", Name = "Нет" }); ResponsibleMasterId = claim.ResponsibleMasterUserId ?? -1; ResponsibleMaster = claim.ResponsibleMasterUser; Fields = new CustomFieldsViewModel(currentUser.UserId, claim); Navigation = CharacterNavigationViewModel.FromClaim(claim, currentUser.UserId, CharacterNavigationPage.Claim); ClaimFee = new ClaimFeeViewModel(claim, currentUser.UserId); Problems = claim.GetProblems().Select(p => new ProblemViewModel(p)).ToList(); PlayerDetails = new UserProfileDetailsViewModel(claim.Player, (AccessReason)claim.Player.GetProfileAccess(currentUser)); PrintPlugins = pluginOperationDatas.Select(PluginOperationDescriptionViewModel.Create); ProjectActive = claim.Project.Active; CheckInStarted = claim.Project.Details.CheckInProgress; CheckInModuleEnabled = claim.Project.Details.EnableCheckInModule; Validator = new ClaimCheckInValidator(claim); if (claim.PlayerUserId == currentUser.UserId || claim.HasMasterAccess(currentUser.UserId, acl => acl.CanManageMoney)) { //Finance admins can create any payment. User also can create any payment, but it will be moderated PaymentTypes = claim.Project.ActivePaymentTypes; } else { //All other master can create only payment from user to himself. PaymentTypes = claim.Project.ActivePaymentTypes.Where(pt => pt.UserId == currentUser.UserId); } if (claim.Character != null) { ParentGroups = new CharacterParentGroupsViewModel(claim.Character, claim.HasMasterAccess(currentUser.UserId)); } if (claim.IsApproved && claim.Character != null) { var readOnlyList = claim.Character.GetOrderedPlots(plotElements); Plot = PlotDisplayViewModel.Published(readOnlyList, currentUser.UserId, claim.Character); } else { Plot = PlotDisplayViewModel.Empty(); } }