-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsupportbank.js
More file actions
148 lines (127 loc) · 4.36 KB
/
supportbank.js
File metadata and controls
148 lines (127 loc) · 4.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
const fs = require('fs');
const Papa = require('papaparse');
// const fileUrl = new URL('file:///C:/Work/Training/SupportBank/Transactions2014.csv');
// const fileUrl = new URL ('file:///C:/Work/Training/SupportBank/DodgyTransactions2015.csv');
const fileUrl = new URL ('file:///C:/Work/Training/SupportBank/Transactions2013.json');
const fileExtension = String(fileUrl).replace(/^.*\./, '');
const readline = require('readline-sync');
const moment = require('moment');
const log4js = require('log4js');
log4js.configure({
appenders: {
file: { type: 'fileSync', filename: 'logs/debug.log' }
},
categories: {
default: { appenders: ['file'], level: 'debug'}
}
});
class Account {
constructor(name, balance) {
this.name = name;
this.balance = balance;
}
transaction(to, amount) {
this.balance = this.balance - amount;
to.balance = to.balance + amount;
}
}
class Transaction {
constructor(date, from, to, narrative, amount) {
this.date = date;
this.from = from;
this.to = to;
this.narrative = narrative;
this.amount = amount;
}
}
let logger = log4js.getLogger();
while (true) {
main();
}
function main() {
let [transactions, names]= formatFile(fileUrl);
let accountList = getAccounts(names);
processTransfers(transactions, accountList);
processUserCommand(accountList, transactions);
}
function formatFile() {
let data = fs.readFileSync(fileUrl, {encoding: 'utf8'});
let transfers = parser(data);
parseDates(transfers);
let transactions = getTransactions(transfers);
let names = getNamesOfAllAccounts(transactions);
return [transactions, names];
}
function parser(data) {
if (fileExtension === 'csv') {
return Papa.parse(data, {header: true}).data;
} else if (fileExtension === 'json') {
return JSON.parse(data);
}
}
function parseDates(transfers) {
for (let transfer of transfers) {
if (fileExtension === 'csv') {
let maybeDate = moment(transfer.Date, 'DD/MM/YYYY');
if (!maybeDate.isValid()) {
logger.error('Date is in an incorrect format');
transfer.Date = null;
}
} else if (fileExtension === 'json') {
transfer.Date = moment(transfer.Date).format('DD/MM/YYYY');
// let maybeDate = transfer.Date;
// if (!maybeDate.isValid()) {
// logger.error('Date is in an incorrect format');
// transfer.Date = null;
// }
}
}
}
function getNamesOfAllAccounts(transactions) {
return Array.from(new Set(transactions.map(a => a.from).concat(transactions.map(a => a.to))));
}
function getAccounts(names) {
return names.map((name) => {
return new Account(name, 0);
});
}
function getTransactions(transfers) {
return transfers.map((transfer) => {
if (fileExtension === 'csv') {
return new Transaction(transfer.Date, transfer.From, transfer.To, transfer.Narrative, transfer.Amount);
} else if (fileExtension === 'json') {
return new Transaction(transfer.Date, transfer.FromAccount, transfer.ToAccount, transfer.Narrative, transfer.Amount);
}
});
}
function processTransfers(transactions, accountList) {
transactions.forEach((transaction) => {
let fromPerson = accountList.find((account) => {
return account.name === transaction.from;
});
let toPerson = accountList.find((account) => {
return account.name === transaction.to;
});
if (!isNaN(transaction.amount)) {
fromPerson.transaction(toPerson, parseFloat(transaction.amount));
} else {
logger.debug('transfer amount is not a number');
}
});
}
function getTransfersForPerson(person, transactions) {
return transactions.filter((transaction) => {
return transaction.from === person || transaction.to === person;
});
}
function processUserCommand(accountList, transactions) {
console.log('What would you like to know?');
let command = readline.prompt();
if (command === 'List All') {
console.log(accountList);
} else if (command.substr(0, 4) === 'List') {
let person = command.substr(5);
let personTrans = getTransfersForPerson(person, transactions);
console.log(personTrans);
}
}