public async Task <RMAWithLineItemStatusByQuantity> ProcessRefund(string rmaNumber, DecodedToken decodedToken) { var me = await _oc.Me.GetAsync(accessToken : decodedToken.AccessToken); RMA rma = await GetRMA(rmaNumber, decodedToken); ValidateRMA(rma, me.Supplier.ID); decimal initialAmountRefunded = rma.TotalCredited; IEnumerable <RMALineItem> rmaLineItemsToUpdate = rma.LineItems .Where(li => !li.IsRefunded && (li.Status == RMALineItemStatus.Approved || li.Status == RMALineItemStatus.PartialQtyApproved)).ToList(); HSOrderWorksheet worksheet = await _oc.IntegrationEvents.GetWorksheetAsync <HSOrderWorksheet>(OrderDirection.Incoming, rma.SourceOrderID); CosmosListPage <RMA> allRMAsOnThisOrder = await ListRMAsByOrderID(worksheet.Order.ID, decodedToken.CommerceRole, me, true); CalculateAndUpdateLineTotalRefund(rmaLineItemsToUpdate, worksheet, allRMAsOnThisOrder, rma.SupplierID); // UPDATE RMA LINE ITEM STATUSES SetRMALineItemStatusesToComplete(rmaLineItemsToUpdate); // UPDATE RMA STATUS UpdateRMAStatus(rma); await HandleRefund(rma, allRMAsOnThisOrder, worksheet, decodedToken); MarkRMALineItemsAsRefunded(rmaLineItemsToUpdate); decimal totalRefundedForThisTransaction = rma.TotalCredited - initialAmountRefunded; RMALog log = new RMALog() { Status = rma.Status, Date = DateTime.Now, AmountRefunded = totalRefundedForThisTransaction, FromUserID = me.ID }; rma.Logs.Insert(0, log); List <LineItemStatusChanges> lineItemStatusChangesList = BuildLineItemStatusChanges(rmaLineItemsToUpdate, worksheet, rma.Type, false); // SAVE RMA ItemResponse <RMA> updatedRMA = await _rmaRepo.ReplaceItemAsync(rma.id, rma); RMAWithLineItemStatusByQuantity rmaWithStatusByQuantityChanges = new RMAWithLineItemStatusByQuantity() { SupplierOrderID = $"{rma.SourceOrderID}-{rma.SupplierID}", RMA = updatedRMA.Resource, LineItemStatusChangesList = lineItemStatusChangesList }; return(rmaWithStatusByQuantityChanges); }
public async Task <RMAWithLineItemStatusByQuantity> ProcessRMA(RMA rma, DecodedToken decodedToken) { // Get the RMA from the last time it was saved. var me = await _oc.Me.GetAsync(accessToken : decodedToken.AccessToken); RMA currentRMA = await GetRMA(rma.RMANumber, decodedToken); if (currentRMA.SupplierID != me.Supplier.ID) { throw new Exception($"You do not have permission to process this RMA."); } // Should the Status and IsResolved proprerties of an RMALineItem change? rma.LineItems = UpdateRMALineItemStatusesAndCheckIfResolved(rma.LineItems); // Should status of RMA change? rma = UpdateRMAStatus(rma); // If the status on the new RMA differs from the old RMA, create an RMALog if (rma.Status != currentRMA.Status) { RMALog log = new RMALog() { Status = rma.Status, Date = DateTime.Now, FromUserID = me.ID }; rma.Logs.Insert(0, log); } HSOrderWorksheet worksheet = await _oc.IntegrationEvents.GetWorksheetAsync <HSOrderWorksheet>(OrderDirection.Incoming, rma.SourceOrderID); IEnumerable <RMALineItem> deniedLineItems = rma.LineItems .Where(li => !li.IsRefunded && li.Status == RMALineItemStatus.Denied) .Where(li => currentRMA.LineItems.FirstOrDefault(currentLi => currentLi.ID == li.ID).Status != RMALineItemStatus.Denied).ToList(); List <LineItemStatusChanges> lineItemStatusChangesList = BuildLineItemStatusChanges(deniedLineItems, worksheet, rma.Type, true); ItemResponse <RMA> updatedRMA = await _rmaRepo.ReplaceItemAsync(currentRMA.id, rma); await HandlePendingApprovalEmails(currentRMA, rma.LineItems, worksheet); RMAWithLineItemStatusByQuantity rmaWithStatusByQuantityChanges = new RMAWithLineItemStatusByQuantity() { SupplierOrderID = $"{rma.SourceOrderID}-{rma.SupplierID}", RMA = updatedRMA.Resource, LineItemStatusChangesList = lineItemStatusChangesList }; return(rmaWithStatusByQuantityChanges); }