Пример #1
0
        public async Task <Result> Modify(int policyId, MarkupPolicySettings settings)
        {
            var policy = await _context.MarkupPolicies.SingleOrDefaultAsync(p => p.Id == policyId);

            if (policy == null)
            {
                return(Result.Failure("Could not find policy"));
            }

            return(await Result.Success()
                   .Bind(UpdatePolicy));


            async Task <Result> UpdatePolicy()
            {
                policy.Description      = settings.Description;
                policy.Order            = settings.Order;
                policy.TemplateId       = settings.TemplateId;
                policy.TemplateSettings = settings.TemplateSettings;
                policy.Currency         = settings.Currency;
                policy.Modified         = _dateTimeProvider.UtcNow();

                var validateResult = await ValidatePolicy(GetPolicyData(policy));

                if (validateResult.IsFailure)
                {
                    return(validateResult);
                }

                _context.Update(policy);
                await _context.SaveChangesAsync();

                return(Result.Success());
            }
        }
Пример #2
0
        public async Task <IActionResult> ModifyPolicy(int id, [FromBody] MarkupPolicySettings policySettings)
        {
            var(_, isFailure, error) = await _policyManager.Modify(id, policySettings);

            if (isFailure)
            {
                return(BadRequest(ProblemDetailsBuilder.Build(error)));
            }

            return(NoContent());
        }
Пример #3
0
        public async Task <IActionResult> AddPolicy([FromBody] MarkupPolicySettings settings)
        {
            var(_, isFailure, error) = await _policyManager.AddGlobalPolicy(settings);

            if (isFailure)
            {
                return(BadRequest(ProblemDetailsBuilder.Build(error)));
            }

            return(NoContent());
        }
Пример #4
0
        public async Task <Result> ModifyForAgency(int agencyId, int policyId, MarkupPolicySettings settings)
        {
            var policy = await _context.MarkupPolicies
                         .FirstOrDefaultAsync(p => p.Id == policyId &&
                                              p.SubjectScopeType == SubjectMarkupScopeTypes.Agency &&
                                              p.SubjectScopeId == agencyId.ToString());

            return(policy is null
                ? Result.Failure($"Policy '{policyId}' not found")
                : await Modify(policyId, settings));
        }
Пример #5
0
        public async Task <Result> ModifyGlobalPolicy(int policyId, MarkupPolicySettings settings)
        {
            var isGlobalPolicy = await _context.MarkupPolicies
                                 .AnyAsync(p =>
                                           p.SubjectScopeType == SubjectMarkupScopeTypes.Global &&
                                           p.Id == policyId);

            return(isGlobalPolicy
                ? await Modify(policyId, settings)
                : Result.Failure($"Policy '{policyId}' not found or not global"));
        }
Пример #6
0
        public async Task <Result> AddLocationPolicy(MarkupPolicySettings settings)
        {
            var(_, isFailure, agentMarkupScopeType, error) = await GetAgentMarkupScopeType(settings.LocationScopeId);

            if (isFailure)
            {
                return(Result.Failure(error));
            }

            return(await Add(new MarkupPolicyData(MarkupPolicyTarget.AccommodationAvailability, settings,
                                                  new MarkupPolicyScope(agentMarkupScopeType, locationId: settings.LocationScopeId))));
        }
Пример #7
0
        public async Task <IActionResult> AddPolicy([FromRoute] int agentId, [FromBody] MarkupPolicySettings settings)
        {
            var agent = await _agentContext.GetAgent();

            var(_, isFailure, error) = await _policyManager.Add(agentId, settings, agent);

            if (isFailure)
            {
                return(BadRequest(ProblemDetailsBuilder.Build(error)));
            }

            return(NoContent());
        }
Пример #8
0
        public Task <Result> Add(int agentId, MarkupPolicySettings settings, AgentContext agent)
        {
            return(ValidateSettings(agentId, agent.AgencyId, settings)
                   .Bind(() => GetAgentAgencyRelation(agentId, agent.AgencyId))
                   .Bind(SavePolicy)
                   .Tap(WriteAuditLog)
                   .Bind(UpdateDisplayedMarkupFormula));


            async Task <Result <MarkupPolicy> > SavePolicy(AgentAgencyRelation agentAgencyRelation)
            {
                var(_, isFailure, destinationScopeType, error) = await GetDestinationScopeType(settings.DestinationScopeId);

                if (isFailure)
                {
                    return(Result.Failure <MarkupPolicy>(error));
                }

                var now             = _dateTimeProvider.UtcNow();
                var agentInAgencyId = AgentInAgencyId.Create(agentAgencyRelation.AgentId, agentAgencyRelation.AgencyId);

                var policy = new MarkupPolicy
                {
                    Description          = settings.Description,
                    Order                = settings.Order,
                    Target               = MarkupPolicyTarget.AccommodationAvailability,
                    SubjectScopeType     = SubjectMarkupScopeTypes.Agent,
                    SubjectScopeId       = agentInAgencyId.ToString(),
                    DestinationScopeType = destinationScopeType,
                    DestinationScopeId   = settings.DestinationScopeId,
                    TemplateSettings     = settings.TemplateSettings,
                    Currency             = settings.Currency,
                    Created              = now,
                    Modified             = now,
                    TemplateId           = settings.TemplateId
                };

                _context.MarkupPolicies.Add(policy);
                await _context.SaveChangesAsync();

                return(policy);
            }

            Task WriteAuditLog(MarkupPolicy policy)
            => _markupPolicyAuditService.Write(MarkupPolicyEventType.AgentMarkupCreated,
                                               new AgentMarkupPolicyData(policy.Id, agentId, agent.AgencyId),
                                               agent.ToApiCaller());
        }
Пример #9
0
        private Task <Result> ValidateSettings(int agentId, int agencyId, MarkupPolicySettings settings, int?policyId = null)
        {
            return(ValidateTemplate()
                   .Ensure(PolicyOrderIsUniqueForScope, "Policy with same order is already defined"));


            Result ValidateTemplate() => _templateService.Validate(settings.TemplateId, settings.TemplateSettings);


            async Task <bool> PolicyOrderIsUniqueForScope()
            {
                var isSameOrderPolicyExist = (await GetAgentPolicies(agentId, agencyId))
                                             .Any(p => p.Order == settings.Order && p.Id != policyId);

                return(!isSameOrderPolicyExist);
            }
        }
Пример #10
0
        public async Task <Result> Modify(int policyId, MarkupPolicySettings settings, AgentContext agent)
        {
            var policy = await _context.MarkupPolicies.SingleOrDefaultAsync(p => p.Id == policyId);

            if (policy == null)
            {
                return(Result.Failure("Could not find policy"));
            }

            return(await Result.Success()
                   .Bind(CheckPermissions)
                   .Bind(UpdatePolicy));


            Task <Result> CheckPermissions()
            {
                var scopeData = new MarkupPolicyScope(policy.ScopeType,
                                                      policy.CounterpartyId ?? policy.AgencyId ?? policy.AgentId);

                return(CheckUserManagePermissions(scopeData, agent));
            }

            async Task <Result> UpdatePolicy()
            {
                policy.Description      = settings.Description;
                policy.Order            = settings.Order;
                policy.TemplateId       = settings.TemplateId;
                policy.TemplateSettings = settings.TemplateSettings;
                policy.Currency         = settings.Currency;
                policy.Modified         = _dateTimeProvider.UtcNow();

                var validateResult = await ValidatePolicy(GetPolicyData(policy));

                if (validateResult.IsFailure)
                {
                    return(validateResult);
                }

                _context.Update(policy);
                await _context.SaveChangesAsync();

                return(Result.Success());
            }
        }
Пример #11
0
        public async Task <Result> Modify(int agentId, int policyId, MarkupPolicySettings settings, AgentContext agent)
        {
            return(await GetAgentAgencyRelation(agentId, agent.AgencyId)
                   .Bind(GetPolicy)
                   .Check(_ => ValidateSettings(agentId, agent.AgencyId, settings, policyId))
                   .Check(UpdatePolicy)
                   .Tap(WriteAuditLog)
                   .Bind(UpdateDisplayedMarkupFormula));


            Task <Result <MarkupPolicy> > GetPolicy(AgentAgencyRelation relation) => GetAgentPolicy(relation, policyId);


            async Task <Result> UpdatePolicy(MarkupPolicy policy)
            {
                var(_, isFailure, destinationScopeType, error) = await GetDestinationScopeType(settings.DestinationScopeId);

                if (isFailure)
                {
                    return(Result.Failure(error));
                }

                policy.DestinationScopeId   = settings.DestinationScopeId;
                policy.DestinationScopeType = destinationScopeType;
                policy.Description          = settings.Description;
                policy.Order            = settings.Order;
                policy.TemplateId       = settings.TemplateId;
                policy.TemplateSettings = settings.TemplateSettings;
                policy.Currency         = settings.Currency;
                policy.Modified         = _dateTimeProvider.UtcNow();

                _context.Update(policy);
                await _context.SaveChangesAsync();

                return(Result.Success());
            }

            Task WriteAuditLog(MarkupPolicy policy)
            => _markupPolicyAuditService.Write(MarkupPolicyEventType.AgentMarkupUpdated,
                                               new AgentMarkupPolicyData(policy.Id, agentId, agent.AgencyId),
                                               agent.ToApiCaller());
        }
Пример #12
0
        public async Task <Result> ModifyLocationPolicy(int policyId, MarkupPolicySettings settings)
        {
            var policy = await _context.MarkupPolicies
                         .FirstOrDefaultAsync(p => p.Id == policyId);

            if (policy.SubjectScopeType is not(SubjectMarkupScopeTypes.Country or SubjectMarkupScopeTypes.Locality))
            {
                return(Result.Failure($"Policy '{policyId}' not found or not local"));
            }

            var(_, isFailure, agentMarkupScopeType, error) = await GetAgentMarkupScopeType(settings.LocationScopeId);

            if (isFailure)
            {
                return(Result.Failure(error));
            }

            if (policy.SubjectScopeType != agentMarkupScopeType)
            {
                return(Result.Failure($"It is not allowed change location to a new type"));
            }

            return(await Modify(policyId, settings));
        }
Пример #13
0
 public Task <Result> AddAgencyPolicy(int agencyId, MarkupPolicySettings settings)
 => Add(new MarkupPolicyData(MarkupPolicyTarget.AccommodationAvailability, settings, new MarkupPolicyScope(SubjectMarkupScopeTypes.Agency, agencyId)));
Пример #14
0
 public Task <Result> AddGlobalPolicy(MarkupPolicySettings settings)
 => Add(new MarkupPolicyData(MarkupPolicyTarget.AccommodationAvailability, settings, new MarkupPolicyScope(SubjectMarkupScopeTypes.Global)));
Пример #15
0
        public async Task <Result> Modify(int policyId, MarkupPolicySettings settings)
        {
            var destinationScopeType = await GetDestinationScopeType(settings.DestinationScopeId);

            if (destinationScopeType.IsFailure)
            {
                return(Result.Failure(destinationScopeType.Error));
            }

            var policy = await _context.MarkupPolicies.SingleOrDefaultAsync(p => p.Id == policyId);

            if (policy == null)
            {
                return(Result.Failure("Could not find policy"));
            }

            var(_, isFailure, markupPolicy, error) = await ValidateSettings()
                                                     .Bind(DiscountsDontExceedMarkups)
                                                     .Bind(UpdatePolicy)
                                                     .Tap(p => WriteAuditLog(p, MarkupPolicyEventOperationType.Modified));

            if (isFailure)
            {
                return(Result.Failure(error));
            }

            return(await UpdateDisplayedMarkupFormula(markupPolicy));


            Result ValidateSettings() => _templateService.Validate(settings.TemplateId, settings.TemplateSettings);


            async Task <Result> DiscountsDontExceedMarkups()
            {
                // This check is only applicable to agency scope markups
                if (policy.SubjectScopeType != SubjectMarkupScopeTypes.Agency)
                {
                    return(Result.Success());
                }

                var agencyId = int.Parse(policy.SubjectScopeId);

                var allDiscounts = await _context.Discounts
                                   .Where(x => x.IsActive)
                                   .Where(x => x.TargetAgencyId == agencyId)
                                   .Where(x => x.TargetPolicyId == policy.Id)
                                   .Select(x => x.DiscountPercent)
                                   .ToListAsync();

                var markupFunction = _templateService.CreateFunction(policy.TemplateId, policy.TemplateSettings);

                return(DiscountsValidator.DiscountsDontExceedMarkups(allDiscounts, markupFunction));
            }

            async Task <Result <MarkupPolicy> > UpdatePolicy()
            {
                policy.Description      = settings.Description;
                policy.Order            = settings.Order;
                policy.TemplateId       = settings.TemplateId;
                policy.TemplateSettings = settings.TemplateSettings;
                policy.Currency         = settings.Currency;
                policy.Modified         = _dateTimeProvider.UtcNow();
                policy.SubjectScopeId   = settings.LocationScopeId;
                // No SubjectScopeType here because changing its type is not allowed
                policy.DestinationScopeId   = settings.DestinationScopeId;
                policy.DestinationScopeType = destinationScopeType.Value;

                var policyData = GetPolicyData(policy);

                if (policyData.IsFailure)
                {
                    return(Result.Failure <MarkupPolicy>(policyData.Error));
                }

                var(_, isFailure, error) = await ValidatePolicy(policyData.Value, policy);

                if (isFailure)
                {
                    return(Result.Failure <MarkupPolicy>(error));
                }

                _context.Update(policy);
                await _context.SaveChangesAsync();

                return(policy);
            }
        }