Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"semi": true,
"singleQuote": true,
"trailingComma": "es5",
"printWidth": 80,
"tabWidth": 2
}
57 changes: 57 additions & 0 deletions finance-tracker/app.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,60 @@
// This is the entrypoint for your application.
// node app.js
import {
addTransaction,
calculateAverageExpensesPerCategory,
findConsecutiveExpensiveMonth,
getTransactionsByCategory,
groupTransactionByMonth,
printGeneralReport,
removeTransactions,
searchTransactionsByDateRange,
} from './finance.js';
import transactions from './data.js';

const newTransaction = addTransaction(
'expense',
'groceries',
98,
'Weekly supermarket shopping',
'2026-01-25'
);

const transactionByCategory = getTransactionsByCategory(
transactions,
'groceries'
);

const financeReport = printGeneralReport(transactions);

console.log(newTransaction, transactionByCategory, financeReport);

//Bonus Challenges output
const transactionsByDateRange = searchTransactionsByDateRange(
transactions,
'2025-01-22',
'2025-02-24'
);

// Node.js collapses nested objects inside arrays and prints them as [Object]. To see the full structure, I use JSON.stringify(). The second argument (null)means no custom replacer, and the third argument (2) adds indentation for readability.

const transactionsGroupByMonth = JSON.stringify(
groupTransactionByMonth(transactions),
null,
2
);

const averageExpensesPerCategory =
calculateAverageExpensesPerCategory(transactions);

const arrayWithoutRemoveTransaction = removeTransactions(transactions, 3);

const consecutiveExpensiveMonths = findConsecutiveExpensiveMonth(transactions);

console.log(
transactionsByDateRange,
transactionsGroupByMonth,
averageExpensesPerCategory,
arrayWithoutRemoveTransaction,
consecutiveExpensiveMonths
);
205 changes: 204 additions & 1 deletion finance-tracker/data.js
Original file line number Diff line number Diff line change
@@ -1,2 +1,205 @@
// Place here the transaction data array. Use it in your application as needed.
const transactions = [];
const transactions = [
{
id: 1,
type: 'income',
category: 'salary',
amount: 3000,
description: 'Monthly salary',
date: '2025-01-15',
},
{
id: 2,
type: 'expense',
category: 'groceries',
amount: 120,
description: 'Weekly supermarket shopping',
date: '2025-01-16',
},
{
id: 3,
type: 'expense',
category: 'transport',
amount: 45,
description: 'Monthly public transport pass',
date: '2025-01-17',
},
{
id: 4,
type: 'income',
category: 'freelance',
amount: 600,
description: 'Freelance web project',
date: '2025-01-20',
},
{
id: 5,
type: 'expense',
category: 'entertainment',
amount: 75,
description: 'Concert tickets',
date: '2025-01-21',
},
{
id: 6,
type: 'expense',
category: 'utilities',
amount: 150,
description: 'Electricity and water bill',
date: '2025-01-22',
},
{
id: 7,
type: 'income',
category: 'gift',
amount: 200,
description: 'Birthday gift from family',
date: '2025-01-23',
},
{
id: 8,
type: 'expense',
category: 'health',
amount: 90,
description: 'Doctor appointment',
date: '2025-02-24',
},
{
id: 9,
type: 'expense',
category: 'education',
amount: 300,
description: 'Online course fee',
date: '2025-03-15',
},
{
id: 10,
type: 'expense',
category: 'education',
amount: 135,
description: 'Online course fee',
date: '2025-03-25',
},
{
id: 11,
type: 'expense',
category: 'groceries',
amount: 95,
description: 'Weekly supermarket shopping',
date: '2025-02-02',
},
{
id: 12,
type: 'expense',
category: 'transport',
amount: 45,
description: 'Monthly public transport pass',
date: '2025-02-10',
},
{
id: 13,
type: 'income',
category: 'salary',
amount: 3000,
description: 'Monthly salary',
date: '2025-02-15',
},
{
id: 14,
type: 'expense',
category: 'entertainment',
amount: 60,
description: 'Cinema tickets',
date: '2025-02-18',
},
{
id: 15,
type: 'expense',
category: 'utilities',
amount: 155,
description: 'Electricity and water bill',
date: '2025-02-22',
},
{
id: 16,
type: 'income',
category: 'freelance',
amount: 400,
description: 'Small freelance task',
date: '2025-03-05',
},
{
id: 17,
type: 'expense',
category: 'health',
amount: 120,
description: 'Pharmacy purchase',
date: '2025-03-12',
},
{
id: 18,
type: 'expense',
category: 'groceries',
amount: 130,
description: 'Weekly supermarket shopping',
date: '2025-03-20',
},
{
id: 19,
type: 'expense',
category: 'transport',
amount: 50,
description: 'Taxi ride',
date: '2025-03-28',
},
{
id: 20,
type: 'income',
category: 'bonus',
amount: 500,
description: 'Quarterly bonus',
date: '2025-04-01',
},
{
id: 21,
type: 'expense',
category: 'education',
amount: 200,
description: 'Books and materials',
date: '2025-04-03',
},
{
id: 22,
type: 'expense',
category: 'entertainment',
amount: 90,
description: 'Theatre tickets',
date: '2025-04-10',
},
{
id: 23,
type: 'expense',
category: 'utilities',
amount: 160,
description: 'Electricity and water bill',
date: '2025-04-15',
},
{
id: 24,
type: 'expense',
category: 'health',
amount: 80,
description: 'Dentist visit',
date: '2025-04-20',
},
{
id: 25,
type: 'income',
category: 'salary',
amount: 3100,
description: 'Monthly salary',
date: '2025-03-15',
},
];

export default transactions;
Loading