public async Task UpdateAsync(Guid packageId, CarePackageReclaimUpdateDomain requestedReclaim) { var package = await _carePackageGateway .GetPackageAsync(packageId, PackageFields.Details | PackageFields.Reclaims | PackageFields.Resources, true) .EnsureExists($"Care Package {packageId} not found"); var existingReclaim = package.Reclaims .SingleOrDefault(r => r.Id == requestedReclaim.Id) .EnsureExists($"Care package reclaim {requestedReclaim.Id} not found"); ValidateRequest(existingReclaim, package); if (ShouldReplaceReclaim(existingReclaim, requestedReclaim)) { var newReclaim = requestedReclaim.ToEntity(); newReclaim.Id = Guid.Empty; newReclaim.Type = existingReclaim.Type; newReclaim.SubType = existingReclaim.SubType; newReclaim.Subjective = existingReclaim.Subjective; newReclaim.Status = newReclaim.Status; // persist calculated value for new record package.Reclaims.Add(newReclaim); existingReclaim.Status = ReclaimStatus.Cancelled; } else { _mapper.Map(requestedReclaim, existingReclaim); } ReclaimCostValidator.Validate(package); await _dbManager.SaveAsync("Could not update care package reclaim"); }
private static bool ShouldReplaceReclaim(CarePackageReclaim existingReclaim, CarePackageReclaimUpdateDomain requestedReclaim) { return(existingReclaim.StartDate != requestedReclaim.StartDate || existingReclaim.EndDate != requestedReclaim.EndDate || existingReclaim.Cost != requestedReclaim.Cost || existingReclaim.ClaimCollector != requestedReclaim.ClaimCollector); }
public async Task UpdateAsync(CarePackageReclaimUpdateDomain requestedReclaim, Guid packageId) { var package = await _carePackageGateway .GetPackageAsync(packageId, PackageFields.Resources | PackageFields.Details | PackageFields.Reclaims, true) .EnsureExistsAsync($"Care package {packageId} not found"); var reclaims = package.Reclaims .Where(reclaim => reclaim.Status != ReclaimStatus.Cancelled && reclaim.Type == ReclaimType.Fnc).ToList(); var fncPayment = reclaims.SingleOrDefault(r => r.SubType is ReclaimSubType.FncPayment); var fncReclaim = reclaims.SingleOrDefault(r => r.SubType is ReclaimSubType.FncReclaim); if (fncPayment is null || fncReclaim is null) { throw new ApiException($"No FNC defined for package {packageId}", HttpStatusCode.NotFound); } if (requestedReclaim.HasAssessmentBeenCarried) { var fncReclaimId = fncReclaim.Id; _mapper.Map(requestedReclaim, fncPayment); _mapper.Map(requestedReclaim, fncReclaim); fncReclaim.Id = fncReclaimId; fncReclaim.Cost = Decimal.Negate(fncPayment.Cost); fncPayment.Subjective = SubjectiveConstants.FncPaymentSubjectiveCode; fncReclaim.Subjective = SubjectiveConstants.FncReclaimSubjectiveCode; ReclaimCostValidator.Validate(package); await using (var transaction = await _dbManager.BeginTransactionAsync()) { if (requestedReclaim.AssessmentFileId.IsEmpty() && requestedReclaim.AssessmentFile != null) { await _createPackageResourceUseCase.CreateFileAsync( package.Id, PackageResourceType.FncAssessmentFile, requestedReclaim.AssessmentFile); } await _dbManager.SaveAsync(); await transaction.CommitAsync(); } } else { fncPayment.Status = ReclaimStatus.Cancelled; fncReclaim.Status = ReclaimStatus.Cancelled; await _dbManager.SaveAsync(); } }
public static CarePackageReclaim ToEntity(this CarePackageReclaimUpdateDomain input) { return(_mapper.Map <CarePackageReclaim>(input)); }