public async Task CreateAndStoreOrderAgreementPayload(OrderAgreementIdentifierModel entity, Func <int, StreamWriter, int?, Task <string> > payloadCreator) { using var memoryStream = new MemoryStream(); using var writer = new StreamWriter(memoryStream, Encoding.UTF8); var previousIndex = (await _tolkDbContext.OrderAgreementPayloads.Where(r => r.RequestId == entity.RequestId).OrderByDescending(p => p.Index).FirstOrDefaultAsync())?.Index; string payloadIdentifier = await payloadCreator(entity.CreateById, writer, previousIndex); memoryStream.Position = 0; byte[] byteArray = new byte[memoryStream.Length]; memoryStream.Read(byteArray, 0, (int)memoryStream.Length); memoryStream.Close(); //Break out to method, to here. Returns a OrderAgreementPayload? var index = previousIndex.HasValue ? previousIndex.Value + 1 : 1; //Save it to db var payload = new OrderAgreementPayload { RequestId = entity.RequestId, Payload = byteArray, RequisitionId = entity.RequisitionId, CreatedAt = _clock.SwedenNow, Index = index, IdentificationNumber = payloadIdentifier }; _tolkDbContext.OrderAgreementPayloads.Add(payload); if (previousIndex.HasValue) { var previous = await _tolkDbContext.OrderAgreementPayloads.SingleAsync(p => p.RequestId == entity.RequestId && p.Index == previousIndex); previous.ReplacedByPayload = payload; } }
internal static OrderAgreementModel GetModelFromOrderAgreement(OrderAgreementPayload payload) { return(new OrderAgreementModel { OrderAgreementPayloadId = payload.OrderAgreementPayloadId, IdentificationNumber = payload.IdentificationNumber, Index = payload.Index, CreatedAt = payload.CreatedAt, OrderNumber = payload.Request.Order.OrderNumber, CreatedBy = payload.CreatedByUser?.FullName ?? "Systemet", BasedOn = payload.RequisitionId.HasValue ? "Genererad från rekvisition" : "Genererad från bekräftelse", IsLatest = !payload.ReplacedById.HasValue }); }
public async Task <IActionResult> Create(int orderId) { var request = await _dbContext.Requests.GetRequestForOrderAgreementCreation(orderId); if (!_cacheService.CustomerSettings.Any(c => c.CustomerOrganisationId == request.Order.CustomerOrganisationId && c.UsedCustomerSettingTypes.Any(cs => cs == CustomerSettingType.UseOrderAgreements))) { return(Forbid()); } request.Requisitions = await _dbContext.Requisitions.GetRequisitionsForRequest(request.RequestId).ToListAsync(); request.OrderAgreementPayloads = await _dbContext.OrderAgreementPayloads.GetOrderAgreementPayloadsForRequest(request.RequestId).ToListAsync(); if (request != null && (await _authorizationService.AuthorizeAsync(User, request, Policies.CreateOrderAgreement)).Succeeded) { if (request.AllowOrderAgreementCreation()) { var requisitionId = (await _dbContext.Requisitions.GetRequisitionsForOrder(orderId).Where(r => r.Status == RequisitionStatus.Approved || r.Status == RequisitionStatus.AutomaticGeneratedFromCancelledOrder || r.Status == RequisitionStatus.Created || r.Status == RequisitionStatus.Reviewed).SingleOrDefaultAsync())?.RequisitionId; var previousIndex = request.OrderAgreementPayloads.Max(p => p.Index as int?); int index = 1; string payloadIdentifier = ""; using var memoryStream = new MemoryStream(); using var writer = new StreamWriter(memoryStream, Encoding.UTF8); if (requisitionId.HasValue) { payloadIdentifier = await _orderAgreementService.CreateOrderAgreementFromRequisition(requisitionId.Value, writer, previousIndex); index = previousIndex.HasValue ? previousIndex.Value + 1 : 1; } else { payloadIdentifier = await _orderAgreementService.CreateOrderAgreementFromRequest(request.RequestId, writer); } memoryStream.Position = 0; byte[] byteArray = new byte[memoryStream.Length]; memoryStream.Read(byteArray, 0, (int)memoryStream.Length); memoryStream.Close(); //Save it to db var payload = new OrderAgreementPayload { CreatedBy = User.GetUserId(), ImpersonatingCreatedBy = User.TryGetImpersonatorId(), Payload = byteArray, RequisitionId = requisitionId, CreatedAt = _clock.SwedenNow, Index = index, IdentificationNumber = payloadIdentifier }; request.OrderAgreementPayloads.Add(payload); if (previousIndex.HasValue) { var previous = request.OrderAgreementPayloads.Single(p => p.Index == previousIndex); previous.ReplacedByPayload = payload; } await _dbContext.SaveChangesAsync(); //return a identifier for the saved agreement, to be able to retrieve it. return(RedirectToAction(nameof(View), new { id = payload.OrderAgreementPayloadId })); } } else { //Handle non-allow } return(Forbid()); }