Created
June 22, 2015 11:47
-
-
Save kayaelle/b324976998bb179a92f0 to your computer and use it in GitHub Desktop.
Process ledger to return final balance by name or balance on specified date for name
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var ledgerDateMap = {}; | |
/* | |
Parses ledger data into JSON obj and sorts by date | |
*/ | |
function parseLedger(ledgerData) { | |
var preArr=ledgerData.split(' '), ledgerArr = []; | |
function sortByDate(a,b) { | |
return a.date-b.date; | |
} | |
for (var i in preArr) { | |
var entry = preArr[i].split(','); | |
ledgerArr.push({ | |
date: Date.parse(entry[0]), | |
payor: entry[1], | |
payee: entry[2], | |
amount: parseFloat(entry[3]) | |
}); | |
} | |
return ledgerArr.sort(sortByDate); | |
} | |
/* | |
Generates balance data obj for requested name by date. | |
*/ | |
function calcBalanceForName(data,name) { | |
var balanceData = [], | |
balance = 0; | |
function balancePush(date,balance) { | |
var lookupDateIndex = ledgerDateMap[date]; | |
if (lookupDateIndex >= 0) | |
balanceData[lookupDateIndex].balance = balance; | |
balanceData.push({ | |
date: date, | |
balance: balance | |
}); | |
ledgerDateMap[date] = balanceData.length-1; | |
} | |
for (var i in data) { | |
var date = data[i].date; | |
if (data[i].payor == name) { | |
balance -= data[i].amount; | |
balancePush(date,balance); | |
} | |
else if (data[i].payee == name) { | |
balance += data[i].amount; | |
balancePush(date,balance); | |
} | |
} | |
return balanceData; | |
} | |
/* | |
Finds latest balance for date provided | |
*/ | |
function findByDate(data, lookUpDate) { | |
var date = Date.parse(lookUpDate); | |
var lookupDateIndex = ledgerDateMap[date]; | |
function findClosestDate(data,date){ | |
var dates = []; | |
for (var i in data) { | |
if (data[i].date < date) | |
dates.push(data[i].date); | |
} | |
return dates[dates.length-1]; | |
} | |
if (lookupDateIndex >= 0) | |
return data[lookupDateIndex].balance; | |
var closesDate = findClosestDate(data,date); | |
lookupDateIndex = ledgerDateMap[closesDate]; | |
if (lookupDateIndex >= 0) | |
return data[lookupDateIndex].balance; | |
return 0; | |
} | |
/* | |
Function to run via console to return final balance by name | |
*/ | |
function finalBalanceByName(ledgerData,name) { | |
var ledgerArr = parseLedger(ledgerData); | |
var balanceData = calcBalanceForName(ledgerArr,name); | |
return balanceData[balanceData.length-1].balance; | |
} | |
/* | |
Function to run via console to return final balance by name and specified date | |
*/ | |
function balanceByNameDate(ledgerData,name,date) { | |
var ledgerArr = parseLedger(ledgerData); | |
var balanceData = calcBalanceForName(ledgerArr,name); | |
var balanceByDate = findByDate(balanceData,date); | |
return balanceByDate; | |
} | |
//console.log(finalBalanceByName("2015-01-17,john,mary,125.25 2015-01-17,john,supermarket,20.00 2015-01-17,mary,insurance,100.25","supermarket")); | |
console.log(balanceByNameDate("2015-01-16,john,mary,125.25 2015-01-17,john,supermarket,20.00 2015-01-19,mary,supermarket,-50.00 2015-01-17,mary,insurance,100.25","supermarket","2015-01-17")); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment