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; } }