Skip to content

Instantly share code, notes, and snippets.

@kayaelle
Created June 22, 2015 11:47
Show Gist options
  • Save kayaelle/b324976998bb179a92f0 to your computer and use it in GitHub Desktop.
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
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