public virtual PaymentStatisticIncrement GetPaymentChanges(PaymentStatusChangedMessage paymentChangeMsg)
        {
            if (paymentChangeMsg.StatusHistory.Count == 0)
            {
                return(null);
            }

            var increment = new PaymentStatisticIncrement();

            // Update total count
            PopulatePaymentTotalCounters(increment, paymentChangeMsg);

            //skip message processing if current status is intermediate
            if (!IsCurrentStatusFinal(paymentChangeMsg))
            {
                return(increment);
            }

            var sortedStatusHistories =
                paymentChangeMsg.StatusHistory.OrderByDescending(x => x.PaymentStatusHistoryId).ToList();

            var currentStatus = sortedStatusHistories[0].Status;

            var previousFinalStatusHistory = sortedStatusHistories.Skip(1).FirstOrDefault(x => x.Status.IsFinal());
            var previousStatus             = previousFinalStatusHistory?.Status;

            // Here we work with payments in final status ONLY!
            PopulatePaymentSuccessCounters(increment, paymentChangeMsg, previousStatus, currentStatus);

            return(increment);
        }
        private static void PopulatePaymentSuccessCounters(PaymentStatisticIncrement increment,
                                                           PaymentStatusChangedMessage paymentChangeMsg, string previousStatus, string currentStatus)
        {
            var sign = CalculatePaymentStatusIncrementSign(previousStatus, currentStatus);

            increment.SuccessCount   += sign;
            increment.SuccessSum     += sign * paymentChangeMsg.Payment.PaymentAmount;
            increment.SuccessBaseSum += sign * paymentChangeMsg.Payment.BaseAmount;
        }
 private static void PopulatePaymentTotalCounters(PaymentStatisticIncrement increment, PaymentStatusChangedMessage paymentChangeMsg)
 {
     if (paymentChangeMsg.StatusHistory.Count == 1)
     {
         increment.TotalCount++;
         increment.TotalSum     = paymentChangeMsg.Payment.PaymentAmount;
         increment.TotalBaseSum = paymentChangeMsg.Payment.BaseAmount;
     }
 }