public async Task <Result> Update(int agencyId, int discountId, EditDiscountRequest editDiscountRequest)
        {
            return(await Get(agencyId, discountId)
                   .Check(_ => ValidatePercent(editDiscountRequest.DiscountPercent))
                   .Check(DiscountDoesntExceedMarkups)
                   .BindWithTransaction(_context, discount => Result.Success(discount)
                                        .Tap(Update)
                                        .Bind(WriteAuditLog)));


            async Task <Result> DiscountDoesntExceedMarkups(Discount discount)
            {
                var markupPolicy = await _context.MarkupPolicies.SingleOrDefaultAsync(x => x.Id == discount.TargetPolicyId);

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

                var allDiscounts = await _context.Discounts
                                   .Where(x => x.TargetPolicyId == markupPolicy.Id)
                                   .Where(d => d.TargetAgencyId == agencyId)
                                   .Where(d => d.IsActive)
                                   .Where(d => d.Id != discountId) // excluding discount we want to edit
                                   .Select(d => d.DiscountPercent)
                                   .ToListAsync();

                allDiscounts.Add(editDiscountRequest.DiscountPercent);

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

            Task Update(Discount discount)
            => this.Update(discount, d =>
            {
                d.DiscountPercent = editDiscountRequest.DiscountPercent;
                d.Description     = editDiscountRequest.Description;
            });


            Task <Result> WriteAuditLog(Discount _)
            => _managementAuditService.Write(ManagementEventType.DiscountEdit, new DiscountEditEventData(agencyId, editDiscountRequest));
        }
예제 #2
0
        public async Task <IActionResult> UpdateDiscount(int agencyId, int discountId, [FromBody] EditDiscountRequest editDiscountRequest)
        {
            var(_, isFailure, error) = await _discountManagementService.Update(agencyId, discountId, editDiscountRequest);

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

            return(NoContent());
        }
예제 #3
0
 public DiscountEditEventData(int agencyId, EditDiscountRequest editDiscountRequest)
 {
     AgencyId            = agencyId;
     EditDiscountRequest = editDiscountRequest;
 }