private SingeLineInvoice[] InvoicesFor(SingleLineUsageDetails[] usageDetails) { var result = new SingeLineInvoice[usageDetails.Length]; for (int i = 0; i < usageDetails.Length; i++) { Package package = usageDetails[i].Package; double minutes = MinutesWithoutFriends(usageDetails[i], out double?friendsMinuets); int smses = usageDetails[i].SMSes.Length; double minutesDifference = package != null && package.IncludesMinuets ? minutes - package.MaxMinuets.Value : minutes; int smsesDifference = package != null && package.IncludesSMSes ? smses - package.MaxSMSes.Value : smses; PackageUsage packageInfo = GetPackageInfo(package, minutes, minutesDifference, friendsMinuets, smses, smsesDifference); OutOfPackage outOfPackage = GetOutOfPackage(minutesDifference, smsesDifference, usageDetails[i].ClientType); result[i] = new SingeLineInvoice { UsageDetails = usageDetails[i], PackageInfo = packageInfo, OutOfPackage = outOfPackage, TotalPrice = (package?.TotalPrice ?? 0) + outOfPackage.TotalAdditionalPrice }; } return(result); }
private OutOfPackage GetOutOfPackage(double minuetsDifference, int smsesDifference, ClientTypeEnum clientType) { var result = new OutOfPackage(); result.AdditionalMinuets = minuetsDifference > 0 ? minuetsDifference : 0; result.AdditionalSMSes = smsesDifference > 0 ? smsesDifference : 0; result.TotalAdditionalPrice = result.AdditionalMinuets * priceList.GetCallMinuetPrice(clientType) + result.AdditionalSMSes * priceList.GetSMSPrice(clientType); return(result); }