Some serious brain power needed!! I have an issue where I am trying to calculate a price overcharge as days from two given date ranges. Basically I have an invoice line as below:
BillID AccountID BilledFrom BillTo Price
34 3456 10/10/2012 10/12/2012 86p
I then have a pricing matrix which can is:
AccountID EffectiveFrom EffectiveTo Price
3456 09/09/2009 10/11/2012 86p
3456 11/11/2012 20/11/2012 56p
3456 21/11/2012 10/12/2013 24p
3456 11/12/2013 null 18p -- null never expires
Currently the initial price is taken where the BillFrom date is between EffectiveFrom and EffectiveTo dates and billed per days. Now I want to work out the overcharging from the bill as you can see that the BillTo date exceeds the EffectiveTo date for the 86p line. So there is a period of 1 month where the customer has been overcharged as line 2 or the pricing should kick in. I need a function either in SQL or C# which will outcome:
OverchargeID type BillID Reason Days Price
1 Credit 34 PriceChange 10 36p (86p-56p)
2 Credit 34 PriceChange 19 64p (86p-24p)
I will be dealing with 56000 records Which could have up to 10 price ranges. I have the below code to work it server side but it is not practical at all and takes around 10 minutes. Any solutions or amendments to this code would be appreciated.
foreach (InvoiceOverchargePriceChange_SelectResult line in result) {
//Get the invoiceLineRecord
InvoiceLine invoiceLine = _dataContext.InvoiceLines.Where(m=>m.InvoiceLineID == line.InvoiceLineID).FirstOrDefault();
// get the prices for each line
List<Pricing_SelectResult> prices = ctrl.Select(line.AccountID, null, null, null, null)
.Where(m=>m.BillingMethodID == line.BillingMethodID)
.OrderByDescending(m=>m.EffectiveFrom).ToList();
// if the price count is greater than 1 then need to check if overcharges occurred
if (prices.Count > 1) {
DateTime date = new DateTime();
int days = 0;
decimal charge = 0; ;
for (int i = 0; i < prices.Count(); i++) {
days = 0;
charge = 0;
//if it goes in we found our price that we used
if (invoiceLine.BillFrom >= prices[i].EffectiveFrom && prices[i].EffectiveTo != null) {
date = invoiceLine.BillTo;
if (prices[i].EffectiveTo == null) break;
//check the Bill to date does not exceed the effective To date, if it does go in
while (date >= prices[i].EffectiveTo) {
if (date == invoiceLine.BillTo) {
//if its first go set the price
charge = prices.Where(m => date >= m.EffectiveFrom).FirstOrDefault().Price;
}
if (charge == prices.Where(m => date >= m.EffectiveFrom).FirstOrDefault().Price) {
//increment the days counter
days++;
date = date.AddDays(-1);
}
else {
//insert the days and price into db here...
//reset the days
days = 0;
charge = prices.Where(m => date >= m.EffectiveFrom).FirstOrDefault().Price;
}
}
}
}
}
}
Thanks in advance
Try this…