Пример #1
0
        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 = "Ленточка"
                    },
                },
            });
        }
Пример #2
0
        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;
        }
Пример #3
0
        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);
            }
        }
Пример #4
0
        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();
            }
        }
Пример #5
0
        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();
            }
        }