Skip to content
This repository was archived by the owner on May 18, 2022. It is now read-only.
Open
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
3 changes: 3 additions & 0 deletions .idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions .idea/runConfigurations.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions mock-machine-coding-2.iml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
61 changes: 61 additions & 0 deletions src/com/gaurparas/Driver.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package com.gaurparas;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Driver {
public static void main(String... args){
ExpenseManager expenseManager = new ExpenseManager();

expenseManager.addUser(new User("u1","User1","paras@gmail.com","+91-00000"));
expenseManager.addUser(new User("u2","User2","pushpendra@gmail.com","+91-00001"));
expenseManager.addUser(new User("u3","User3","abhinav@gmail.com","+91-00002"));
expenseManager.addUser(new User("u4","User4","jancy@gmail.com","+91-00003"));

Scanner scanner = new Scanner(System.in);
while (true) {
String command = scanner.nextLine();
String[] commands = command.split(" ");
String commandType = commands[0];

switch (commandType){
case "SHOW":
if (commands.length == 1) {
expenseManager.showBalances();
} else {
expenseManager.showBalance(commands[1]);
}
break;
case "EXPENSE":
String paidBy = commands[1];
Double amount = Double.parseDouble(commands[2]);
int noOfUsers = Integer.parseInt(commands[3]);
String expenseType = commands[4 + noOfUsers];
List<Split> splits = new ArrayList<>();
switch (expenseType){
case "EXACT":
for(int i=0;i<noOfUsers;i++){
splits.add(new ExactSplit(expenseManager.userMap.get(commands[4+i]),
Double.parseDouble(commands[5+noOfUsers+i])));
}
expenseManager.addExpense(ExpenseType.EXACT, amount, paidBy, splits, null);
break;
case "EQUAL":
for(int i=0;i<noOfUsers;i++){
splits.add(new EqualSplit(expenseManager.userMap.get(commands[4+i])));
}
expenseManager.addExpense(ExpenseType.EQUAL, amount, paidBy, splits, null);
break;
case "PERCENT":
for (int i = 0; i < noOfUsers; i++) {
splits.add(new PercentSplit(expenseManager.userMap.get(commands[4 + i]), Double.parseDouble(commands[5 + noOfUsers + i])));
}
expenseManager.addExpense(ExpenseType.PERCENT, amount, paidBy, splits, null);
break;
}
break;
}
}
}
}
23 changes: 23 additions & 0 deletions src/com/gaurparas/EqualExpense.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.gaurparas;

import java.util.List;

public class EqualExpense extends Expense{

public EqualExpense(double amount, User paidBy, List<Split> splits, ExpenseMetaData metaData) {
super(amount, paidBy, splits, metaData);
}

@Override
public boolean validate() {
List<Split> splits = getSplits();

for(Split split:splits) {
if (!(split instanceof EqualSplit)){
return false;
}
}

return true;
}
}
8 changes: 8 additions & 0 deletions src/com/gaurparas/EqualSplit.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.gaurparas;

public class EqualSplit extends Split {

public EqualSplit(User user) {
super(user);
}
}
25 changes: 25 additions & 0 deletions src/com/gaurparas/ExactExpense.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.gaurparas;

import java.util.List;

public class ExactExpense extends Expense {

public ExactExpense(double amount, User paidBy, List<Split> splits, ExpenseMetaData metaData) {
super(amount, paidBy, splits, metaData);
}

@Override
public boolean validate() {
List<Split> splits = getSplits();
double splitsAmount = 0;

for(Split split:splits) {
if (!(split instanceof EqualSplit)){
return false;
}
splitsAmount+=split.getAmount();
}

return splitsAmount == getAmount();
}
}
9 changes: 9 additions & 0 deletions src/com/gaurparas/ExactSplit.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.gaurparas;

public class ExactSplit extends Split {

public ExactSplit(User user, double amount) {
super(user);
this.amount = amount;
}
}
60 changes: 60 additions & 0 deletions src/com/gaurparas/Expense.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.gaurparas;

import java.util.List;

public abstract class Expense {
private String id;
private List<Split> splits;
private User paidBy;
private double amount;
private ExpenseMetaData metaData;

public Expense(double amount, User paidBy, List<Split> splits, ExpenseMetaData metaData) {
this.amount = amount;
this.paidBy = paidBy;
this.splits = splits;
this.metaData = metaData;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public double getAmount() {
return amount;
}

public void setAmount(double amount) {
this.amount = amount;
}

public User getPaidBy() {
return paidBy;
}

public void setPaidBy(User paidBy) {
this.paidBy = paidBy;
}

public List<Split> getSplits() {
return splits;
}

public void setSplits(List<Split> splits) {
this.splits = splits;
}

public ExpenseMetaData getMetadata() {
return metaData;
}

public void setMetadata(ExpenseMetaData metaData) {
this.metaData = metaData;
}

public abstract boolean validate();
}
83 changes: 83 additions & 0 deletions src/com/gaurparas/ExpenseManager.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package com.gaurparas;

import com.sun.deploy.cache.BaseLocalApplicationProperties;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ExpenseManager {

List<Expense> expenses;
Map<String, User> userMap;
Map<String, Map<String, Double>> balanceSheet;

public ExpenseManager() {
expenses = new ArrayList<Expense>();
userMap = new HashMap<String, User>();
balanceSheet = new HashMap<String, Map<String, Double>>();
}

public void addUser(User user) {
userMap.put(user.getId(), user);
balanceSheet.put(user.getId(), new HashMap<String, Double>());
}

public void showBalances() {
boolean isEmpty = true;
for(Map.Entry<String, Map<String, Double>> allBalance : balanceSheet.entrySet()) {
for (Map.Entry<String, Double> userBalance : allBalance.getValue().entrySet()) {
if (userBalance.getValue() > 0) {
isEmpty = false;
printBalance(allBalance.getKey(), userBalance.getKey(), userBalance.getValue());
}
}
}
if (isEmpty) {
System.out.println("No balances");
}
}

public void showBalance(String userId) {
boolean isEmpty = true;
for(Map.Entry<String, Double> userBalance : balanceSheet.get(userId).entrySet()) {
if(userBalance.getValue() != 0){
isEmpty = false;
printBalance(userId, userBalance.getKey(), userBalance.getValue());
}
}
if (isEmpty) {
System.out.println("No balances");
}
}

private void printBalance(String user1, String user2, Double amount) {
String user1Name = userMap.get(user1).getName();
String user2Name = userMap.get(user2).getName();
if (amount < 0) {
System.out.println(user1Name + " owes " + user2Name + ": " + Math.abs(amount));
} else if (amount > 0) {
System.out.println(user2Name + " owes " + user1Name + ": " + Math.abs(amount));
}
}

public void addExpense(ExpenseType expenseType, Double amount, String paidBy,
List<Split> splits, ExpenseMetaData metaData) {
Expense expense = ExpenseService.createExpense(expenseType, amount, userMap.get(paidBy),
splits, metaData);
expenses.add(expense);

Map<String, Double> userBalances = balanceSheet.get(paidBy);
for(Split split:splits) {
String oweUser = split.getUser().getId();
double prevAmount = userBalances.getOrDefault(oweUser,0.0);
double currentAmount = split.getAmount();
userBalances.put(oweUser,prevAmount + currentAmount);

Map<String, Double> OweUserBalances = balanceSheet.get(oweUser);
prevAmount = OweUserBalances.getOrDefault(paidBy,0.0);
OweUserBalances.put(paidBy,prevAmount - currentAmount);
}
}
}
37 changes: 37 additions & 0 deletions src/com/gaurparas/ExpenseMetaData.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.gaurparas;

public class ExpenseMetaData {
private String name;
private String imgUrl;
private String notes;

public ExpenseMetaData(String name, String imgUrl, String notes) {
this.name = name;
this.imgUrl = imgUrl;
this.notes = notes;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getImgUrl() {
return imgUrl;
}

public void setImgUrl(String imgUrl) {
this.imgUrl = imgUrl;
}

public String getNotes() {
return notes;
}

public void setNotes(String notes) {
this.notes = notes;
}
}
29 changes: 29 additions & 0 deletions src/com/gaurparas/ExpenseService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.gaurparas;

import java.util.List;

public class ExpenseService {
public static Expense createExpense(ExpenseType expenseType, double amount, User paidBy,
List<Split> splits, ExpenseMetaData metaData) {
switch (expenseType) {
case EXACT:
return new ExactExpense(amount, paidBy, splits, metaData);
case EQUAL:
int totalSplits = splits.size();
double splitAmount = ((double) Math.round(amount*100/totalSplits))/100.0;
for(Split split:splits){
split.setAmount(splitAmount);
}
splits.get(0).setAmount(splitAmount + (amount-splitAmount*totalSplits));
return new EqualExpense(amount, paidBy, splits, metaData);
case PERCENT:
for(Split split:splits){
double percentSplit = ((PercentSplit)split).getPercent();
split.setAmount(amount*percentSplit/100);
}
return new PercentExpense(amount, paidBy, splits, metaData);
default:
return null;
}
}
}
Loading