FairSplit

A bill-splitting application to track shared expenses in a group, developed with
Node and React.
Explanation of Transaction Minimisation Algorithm
We implemented a greedy algorithm to minimise the number of transactions
required to settle the debts between all members of a group when the user
toggles 'Smart Split'. The algorithm runs in O(n log n), where n is the number
of users – this means that it scales well with the number of users.
A simple example of this algorithm is shown below. In this example, Alice owes
Bob £10 and Bob owes Charlie £10 for a total of two transactions. The algorithm
will suggest that Alice pays Charlie £10 directly, meaning only one transaction
is required to settle the debts.
This may seem like a trivial problem to solve, but it becomes more complex as
the number of users increases. The following diagram shows a more complex
example when there are six users with six transactions between them. This is
reduced to only four transactions by the algorithm.
Screenshots
Installation and Usage
Setting up the MongoDB Database
- Create a file in the
server
directory with the name: .env
- Open the file in a text editor (such as Notepad or TextEdit).
- Add the following line to the file, replacing
<uri>
with the URI of your
MongoDB database:
- Save the file.
Running the Server
- Open a terminal window.
- Ensure that you're in the root directory:
fairsplit
- Navigate to the server directory:
cd server
- Install dependencies:
npm install
- Run the server:
node app
Running the Client
- Open a new terminal window (separate to the previous one).
- Ensure that you're in the root directory:
fairsplit
- Navigate to the server directory:
cd client
- Install dependencies:
npm install
- Run the client:
npm start
- Browse to the URL provided in the terminal window.
Running Tests
Running Tests on the Server
- Open a terminal window.
- Ensure that you're in the root directory:
fairsplit
- Navigate to the server directory:
cd server
- Install dependencies:
npm install
- Run the unit tests:
npm test
Contributing
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.
For more information, please see the Contributing Guide.