public async Task <BaseValueSegmentDto> SaveAsync(int assessmentEventId, BaseValueSegmentDto baseValueSegmentDto) { if (baseValueSegmentDto == null) { throw new BadRequestException("BaseValueSegmentDto is null."); } var assessmentEvents = await _assessmentEventRepository.ListAsync(baseValueSegmentDto.RevenueObjectId, baseValueSegmentDto.AsOf); // 1 based index, NOT 0-based index. var sequenceNumber = assessmentEvents.OrderBy(x => x.Id).Select((item, index) => new { item.Id, Index = index }).Single(x => x.Id == assessmentEventId).Index + 1; if (await IsExist(baseValueSegmentDto, sequenceNumber)) { await _baseValueSegmentRepository.CreateTransactionAsync(baseValueSegmentDto.BaseValueSegmentTransactions.Single(x => x.Id.HasValue && x.Id < 0)); return(baseValueSegmentDto); } baseValueSegmentDto.SequenceNumber = sequenceNumber; baseValueSegmentDto.Id = null; // Remember to null out the Id as we are about to create // a brand new Base Value Segment! // TODO: validate if caller sends multiple creates ie negative number baseValueSegmentDto.BaseValueSegmentTransactions = baseValueSegmentDto.BaseValueSegmentTransactions.Where(t => t.Id < 0).ToList(); return(await _baseValueSegmentRepository.CreateAsync(baseValueSegmentDto)); }
public async Task <BaseValueSegmentDto> CreateAsync(BaseValueSegmentDto baseValueSegmentDto) { if (baseValueSegmentDto.Id.HasValue) { throw new BadRequestException(string.Format("Id {0} is invalid.", baseValueSegmentDto.Id)); } if (baseValueSegmentDto.BaseValueSegmentTransactions.Count == 0) { throw new BadRequestException("No Base Value Segment Transaction defined for the Base Value Segment"); } foreach (var transaction in baseValueSegmentDto.BaseValueSegmentTransactions) { if (transaction.BaseValueSegmentOwners == null || transaction.BaseValueSegmentOwners.Count == 0) { throw new BadRequestException("No Base Value Segment Owners defined for the Base Value Segment Transaction"); } if (transaction.BaseValueSegmentValueHeaders == null || transaction.BaseValueSegmentValueHeaders.Count == 0) { throw new BadRequestException("No Base Value Segment Value Headers defined for the Base Value Segment Transaction"); } } // We are going to create a brand new Base Value Segment. In order for EF to know, // we are going to set all Primary Keys to 0. var eventsCreated = await _grmEventDomain.Create(baseValueSegmentDto); try { var entity = baseValueSegmentDto.ToEntity(); entity.Id = 0; var baseValueSegmentOwnerValues = new List <BaseValueSegmentOwnerValue>(); foreach (var baseValueSegmentTransaction in entity.BaseValueSegmentTransactions) { PrepareTransactionForCreate(baseValueSegmentTransaction, false); } foreach (var assessmentRevisionBaseValueSegmentDto in entity.BaseValueSegmentAssessmentRevisions) { assessmentRevisionBaseValueSegmentDto.Id = 0; assessmentRevisionBaseValueSegmentDto.BaseValueSegmentId = 0; } foreach (var entityBaseValueSegmentTransaction in entity.BaseValueSegmentTransactions) { DiscoverOwnerValuesForSavingInTransaction(() => _bvsRepository.GetUserTransactionType(), () => _bvsRepository.GetUserDeletedTransactionType(), entityBaseValueSegmentTransaction, baseValueSegmentOwnerValues); } foreach (var entityBaseValueSegmentAssessmentRevision in entity.BaseValueSegmentAssessmentRevisions) { var newStatusType = _bvsRepository.GetNewStatusType(); entityBaseValueSegmentAssessmentRevision.BaseValueSegmentStatusType = newStatusType; entityBaseValueSegmentAssessmentRevision.BaseValueSegmentStatusTypeId = newStatusType.Id; } // Client side code does not necessary set this value when passing over, // In the case of when an assessment event does not have any current BVS, then // this issue will be seen. We are thus covering this case on the server side. foreach (var entityBaseValueSegmentTransaction in entity.BaseValueSegmentTransactions) { if (string.IsNullOrEmpty(entityBaseValueSegmentTransaction.EffectiveStatus)) { entityBaseValueSegmentTransaction.EffectiveStatus = "A"; } } await _bvsRepository.CreateAsync(entity, baseValueSegmentOwnerValues); return(entity.ToDomain()); } catch { _grmEventDomain.Delete(eventsCreated); throw; } }