Пример #1
0
        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);
        }
Пример #2
0
        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);
        }