Filip_Markoski

Bank Again

Dec 21st, 2017
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.78 KB | None | 0 0
  1. import java.util.*;
  2. import java.util.stream.Collectors;
  3. import java.util.Arrays;
  4. import java.util.stream.IntStream;
  5.  
  6. class Account {
  7.     private String name;
  8.     private String balance;
  9.     private long id;
  10.  
  11.     Account(String n, String b) {
  12.         Random rand = new Random();
  13.         this.name = n;
  14.         this.balance = b;
  15.         this.id = rand.nextLong();
  16.     }
  17.  
  18.     public String getName() {
  19.         return name;
  20.     }
  21.  
  22.     public void setName(String name) {
  23.         this.name = name;
  24.     }
  25.  
  26.     public String getBalance() {
  27.         return balance;
  28.     }
  29.  
  30.     public void setBalance(String balance) {
  31.         this.balance = balance;
  32.     }
  33.  
  34.     public long getId() {
  35.         return id;
  36.     }
  37.  
  38.     public void setId(long id) {
  39.         this.id = id;
  40.     }
  41.  
  42.     @Override
  43.     public String toString() {
  44.         // TODO Auto-generated method stub
  45.         return "Name: " + name + "\nBalance: " + balance + "\n";
  46.     }
  47. }
  48.  
  49. abstract class Transaction {
  50.     protected final long fromId, toId;
  51.     protected final String description;
  52.     protected final String amount;
  53.  
  54.     public Transaction(long fromId, long toId, String description, String amount) {
  55.         this.fromId = fromId;
  56.         this.toId = toId;
  57.         this.description = description;
  58.         this.amount = amount;
  59.     }
  60.  
  61.     public String getAmount() {
  62.         return amount;
  63.     }
  64.  
  65.     public double getAmountAsDouble() {
  66.         return Money.toDouble(amount);
  67.     }
  68.  
  69.     public long getFromId() {
  70.         return fromId;
  71.     }
  72.  
  73.     public long getToId() {
  74.         return toId;
  75.     }
  76.  
  77.     public String getDescription() {
  78.         return description;
  79.     }
  80.  
  81.     public abstract double getProvision();
  82.  
  83.  
  84. }
  85.  
  86. class Money {
  87.      static double toDouble(String string) {
  88.         String temp = string.substring(0, string.length() - 1);
  89.         return Double.parseDouble(temp);
  90.     }
  91. }
  92.  
  93. class FlatAmountProvisionTransaction extends Transaction{
  94.     private String flatAmount;
  95.  
  96.     FlatAmountProvisionTransaction(long fromId, long toId, String amount, String flatProvision) {
  97.         super(fromId, toId, "FlatAmount", amount);
  98.         this.flatAmount = flatProvision;
  99.     }
  100.  
  101.     public String getFlatAmount() {
  102.         return amount;
  103.     }
  104.  
  105.     public String getFlatProvision() {
  106.         return flatAmount;
  107.     }
  108.  
  109.     public double getProvision() {
  110.         return Money.toDouble(flatAmount);
  111.     }
  112. }
  113.  
  114. class FlatPercentProvisionTransaction extends Transaction {
  115.     private int FlatPercent;
  116.  
  117.     FlatPercentProvisionTransaction(long fromId, long toId, String amount, int centsPerDolar) {
  118.         super(fromId, toId, "FlatPercent", amount);
  119.         this.FlatPercent = centsPerDolar;
  120.     }
  121.  
  122.     public int getFlatPercent() {
  123.         return FlatPercent;
  124.     }
  125.  
  126.     @Override
  127.     public double getProvision() {
  128.         return FlatPercent / 100.0 * (int) super.getAmountAsDouble();
  129.  
  130.     }
  131.  
  132. }
  133.  
  134. class Bank {
  135.     private String name;
  136.     private Account accounts[];
  137.     private int totalTransfers;
  138.     private int totalProvision;
  139.  
  140.     public Bank(String name, Account[] accounts) {
  141.         super();
  142.         totalTransfers = 0;
  143.         totalProvision = 0;
  144.         this.name = name;
  145.         this.accounts = Arrays.copyOf(accounts, accounts.length);
  146.     }
  147.  
  148.     public String getName() {
  149.         return name;
  150.     }
  151.  
  152.     public String totalProvision() {
  153.         return moneyAsString(totalProvision);
  154.     }
  155.  
  156.     public String totalTransfers() {
  157.         return moneyAsString(totalTransfers);
  158.     }
  159.  
  160.     public Account[] getAccounts() {
  161.         return accounts;
  162.     }
  163.  
  164.     public static long moneyAsLong(String strBalance) {
  165.         long lngBalance = 0;
  166.         lngBalance += Integer.parseInt(strBalance.substring(strBalance.length() - 3, strBalance.length() - 1)); // cents
  167.         lngBalance += 100 * Long.parseLong(strBalance.substring(0, strBalance.length() - 4)); // dollars
  168.         return lngBalance;
  169.     }
  170.  
  171.     public static String moneyAsString(long value) {
  172.         return (value / 100) + "." + String.format("%2d", value % 100) + "$";
  173.     }
  174.  
  175.     public int getIndex(long id) {
  176.         return IntStream.range(0, accounts.length)
  177.                 .filter(i -> accounts[i].getId() == id)
  178.                 .findFirst()
  179.                 .orElse(-1);
  180.     }
  181.  
  182.     public boolean makeTransaction(Transaction t) {
  183.         int fromIndex = getIndex(t.getFromId());
  184.         int toIndex = getIndex(t.getToId());
  185.  
  186.         // check if Sender and Receiver have accounts in the bank
  187.         if (fromIndex == -1 || toIndex == -1) {
  188.             return false;
  189.         }
  190.  
  191.         // check if Sender has enough money in his balance
  192.         if (moneyAsLong(accounts[fromIndex].getBalance()) < moneyAsLong(t.getAmount())) {
  193.             return false;
  194.         }
  195.  
  196.         long provision = (long) t.getProvision();
  197.  
  198.         // taking money from sender (amount sent + provision)
  199.         accounts[fromIndex].setBalance(
  200.                 moneyAsString(
  201.                         moneyAsLong(accounts[fromIndex].getBalance()) - moneyAsLong(t.getAmount()) - provision
  202.                 )
  203.         );
  204.  
  205.         // adding money to receiver (amount sent only)
  206.         accounts[toIndex].setBalance(
  207.                 moneyAsString(
  208.                         moneyAsLong(accounts[toIndex].getBalance()) + moneyAsLong(t.getAmount())
  209.                 )
  210.         );
  211.  
  212.         // incrementing provision and transfers
  213.         totalProvision += provision;
  214.         totalTransfers += moneyAsLong(t.getAmount());
  215.         return true;
  216.     }
  217.  
  218.  
  219.     @Override
  220.     public String toString() {
  221.         StringBuffer sb = new StringBuffer("");
  222.         sb.append("Name: " + name + "\n\n");
  223.         for (Account account : accounts) {
  224.             sb.append(account.toString());
  225.         }
  226.         return sb.toString();
  227.     }
  228. }
Add Comment
Please, Sign In to add comment