Dim4eBeBrat

Систем за банкарско работење

Oct 25th, 2020
978
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import java.util.*;
  2. import java.util.stream.Collectors;
  3.  
  4. import static java.lang.String.format;
  5.  
  6. public class BankTester {
  7.  
  8.     public static void main(String[] args) {
  9.         Scanner jin = new Scanner(System.in);
  10.         String test_type = jin.nextLine();
  11.         switch (test_type) {
  12.             case "typical_usage":
  13.                 testTypicalUsage(jin);
  14.                 break;
  15.             case "equals":
  16.                 testEquals();
  17.                 break;
  18.         }
  19.         jin.close();
  20.     }
  21.  
  22.     private static void testEquals() {
  23.         Account a1 = new Account("Andrej", "20.00$");
  24.         Account a2 = new Account("Andrej", "20.00$");
  25.         Account a3 = new Account("Andrej", "30.00$");
  26.         Account a4 = new Account("Gajduk", "20.00$");
  27.         List<Account> all = Arrays.asList(a1, a2, a3, a4);
  28.         if (!(a1.equals(a1)&&!a1.equals(a2)&&!a2.equals(a1) && !a3.equals(a1)
  29.                 && !a4.equals(a1)
  30.                 && !a1.equals(null))) {
  31.             System.out.println("Your account equals method does not work properly.");
  32.             return;
  33.         }
  34.         Set<Long> ids = all.stream().map(Account::getId).collect(Collectors.toSet());
  35.         if (ids.size() != all.size()) {
  36.             System.out.println("Different accounts have the same IDS. This is not allowed");
  37.             return;
  38.         }
  39.         FlatAmountProvisionTransaction fa1 = new FlatAmountProvisionTransaction(10, 20, "20.00$", "10.00$");
  40.         FlatAmountProvisionTransaction fa2 = new FlatAmountProvisionTransaction(20, 20, "20.00$", "10.00$");
  41.         FlatAmountProvisionTransaction fa3 = new FlatAmountProvisionTransaction(20, 10, "20.00$", "10.00$");
  42.         FlatAmountProvisionTransaction fa4 = new FlatAmountProvisionTransaction(10, 20, "50.00$", "50.00$");
  43.         FlatAmountProvisionTransaction fa5 = new FlatAmountProvisionTransaction(30, 40, "20.00$", "10.00$");
  44.         FlatPercentProvisionTransaction fp1 = new FlatPercentProvisionTransaction(10, 20, "20.00$", 10);
  45.         FlatPercentProvisionTransaction fp2 = new FlatPercentProvisionTransaction(10, 20, "20.00$", 10);
  46.         FlatPercentProvisionTransaction fp3 = new FlatPercentProvisionTransaction(10, 10, "20.00$", 10);
  47.         FlatPercentProvisionTransaction fp4 = new FlatPercentProvisionTransaction(10, 20, "50.00$", 10);
  48.         FlatPercentProvisionTransaction fp5 = new FlatPercentProvisionTransaction(10, 20, "20.00$", 30);
  49.         FlatPercentProvisionTransaction fp6 = new FlatPercentProvisionTransaction(30, 40, "20.00$", 10);
  50.         if (fa1.equals(fa1) &&
  51.                 !fa2.equals(null) &&
  52.                 fa2.equals(fa1) &&
  53.                 fa1.equals(fa2) &&
  54.                 fa1.equals(fa3) &&
  55.                 !fa1.equals(fa4) &&
  56.                 !fa1.equals(fa5) &&
  57.                 !fa1.equals(fp1) &&
  58.                 fp1.equals(fp1) &&
  59.                 !fp2.equals(null) &&
  60.                 fp2.equals(fp1) &&
  61.                 fp1.equals(fp2) &&
  62.                 fp1.equals(fp3) &&
  63.                 !fp1.equals(fp4) &&
  64.                 !fp1.equals(fp5) &&
  65.                 !fp1.equals(fp6)) {
  66.             System.out.println("Your transactions equals methods do not work properly.");
  67.             return;
  68.         }
  69.         Account accounts[] = new Account[]{a1, a2, a3, a4};
  70.         Account accounts1[] = new Account[]{a2, a1, a3, a4};
  71.         Account accounts2[] = new Account[]{a1, a2, a3};
  72.         Account accounts3[] = new Account[]{a1, a2, a3, a4};
  73.  
  74.         Bank b1 = new Bank("Test", accounts);
  75.         Bank b2 = new Bank("Test", accounts1);
  76.         Bank b3 = new Bank("Test", accounts2);
  77.         Bank b4 = new Bank("Sample", accounts);
  78.         Bank b5 = new Bank("Test", accounts3);
  79.  
  80.         if (!(b1.equals(b1) &&
  81.                 !b1.equals(null) &&
  82.                 !b1.equals(b2) &&
  83.                 !b2.equals(b1) &&
  84.                 !b1.equals(b3) &&
  85.                 !b3.equals(b1) &&
  86.                 !b1.equals(b4) &&
  87.                 b1.equals(b5))) {
  88.             System.out.println("Your bank equals method do not work properly.");
  89.             return;
  90.         }
  91.         accounts[2] = a1;
  92.         if (!b1.equals(b5)) {
  93.             System.out.println("Your bank equals method do not work properly.");
  94.             return;
  95.         }
  96.         long from_id = a2.getId();
  97.         long to_id = a3.getId();
  98.         Transaction t = new FlatAmountProvisionTransaction(from_id, to_id, "3.00$", "3.00$");
  99.         b1.makeTransaction(t);
  100.         if (b1.equals(b5)) {
  101.             System.out.println("Your bank equals method do not work properly.");
  102.             return;
  103.         }
  104.         b5.makeTransaction(t);
  105.         if (!b1.equals(b5)) {
  106.             System.out.println("Your bank equals method do not work properly.");
  107.             return;
  108.         }
  109.         System.out.println("All your equals methods work properly.");
  110.     }
  111.  
  112.     private static void testTypicalUsage(Scanner jin) {
  113.         String bank_name = jin.nextLine();
  114.         int num_accounts = jin.nextInt();
  115.         jin.nextLine();
  116.         Account accounts[] = new Account[num_accounts];
  117.         for (int i = 0; i < num_accounts; ++i)
  118.             accounts[i] = new Account(jin.nextLine(), jin.nextLine());
  119.         Bank bank = new Bank(bank_name, accounts);
  120.         while (true) {
  121.             String line = jin.nextLine();
  122.             switch (line) {
  123.                 case "stop":
  124.                     return;
  125.                 case "transaction":
  126.                     String descrption = jin.nextLine();
  127.                     String amount = jin.nextLine();
  128.                     String parameter = jin.nextLine();
  129.                     int from_idx = jin.nextInt();
  130.                     int to_idx = jin.nextInt();
  131.                     jin.nextLine();
  132.                     Transaction t = getTransaction(descrption, from_idx, to_idx, amount, parameter, bank);
  133.                     System.out.println("Transaction amount: " + t.getAmount());
  134.                     System.out.println("Transaction description: " + t.getDescription());
  135.                     System.out.println("Transaction successful? " + bank.makeTransaction(t));
  136.                     break;
  137.                 case "print":
  138.                     System.out.println(bank.toString());
  139.                     System.out.println("Total provisions: " + bank.totalProvision());
  140.                     System.out.println("Total transfers: " + bank.totalTransfers());
  141.                     System.out.println();
  142.                     break;
  143.             }
  144.         }
  145.     }
  146.  
  147.     private static Transaction getTransaction(String description, int from_idx, int to_idx, String amount, String o, Bank bank) {
  148.         switch (description) {
  149.             case "FlatAmount":
  150.                 return new FlatAmountProvisionTransaction(bank.getAccounts()[from_idx].getId(),
  151.                         bank.getAccounts()[to_idx].getId(), amount, o);
  152.             case "FlatPercent":
  153.                 return new FlatPercentProvisionTransaction(bank.getAccounts()[from_idx].getId(),
  154.                         bank.getAccounts()[to_idx].getId(), amount, Integer.parseInt(o));
  155.         }
  156.         return null;
  157.     }
  158.  
  159.  
  160. }
  161.  
  162. class Account{
  163.     private String imeKorisnik;
  164.     private long ID;
  165.     private String saldo;
  166.  
  167.     public Account(String name, String balance){
  168.         imeKorisnik = name;
  169.         saldo = balance;
  170.         ID = new Random().nextLong();
  171.     }
  172.  
  173.     public String getBalance(){
  174.         return saldo;
  175.     }
  176.  
  177.     public String getName(){
  178.         return imeKorisnik;
  179.     }
  180.  
  181.     public long getId(){
  182.         return ID;
  183.     }
  184.  
  185.     public void setBalance(String balance){
  186.         saldo = balance;
  187.     }
  188.  
  189.     public String toString(){
  190.         String sb = "Name: " +
  191.                 this.getName() +
  192.                 '\n' +
  193.                 "Balance: " +
  194.                 this.getBalance() +
  195.                 '\n';
  196.         return sb;
  197.     }
  198.  
  199.     @Override
  200.     public int hashCode() {
  201.         int a = 31;
  202.         int b = 7;
  203.         return a*b + imeKorisnik.hashCode();
  204.     }
  205.  
  206.     @Override
  207.     public boolean equals(Object o) {
  208.         if (this == o) return true;
  209.         if (o == null || getClass() != o.getClass()) return false;
  210.         Account account = (Account) o;
  211.         return ID == account.ID &&
  212.                 imeKorisnik.equals(account.imeKorisnik) &&
  213.                 saldo.equals(account.saldo);
  214.     }
  215. }
  216.  
  217. abstract class Transaction{
  218.     final long idOd;
  219.     final long idDo;
  220.     String opis = "";
  221.     final String suma;
  222.  
  223.     public Transaction(long fromId, long toId, String description, String amount){
  224.         this.idOd = fromId;
  225.         this.idDo = toId;
  226.         this.opis = description;
  227.         this.suma = amount;
  228.     }
  229.  
  230.     public Transaction(long fromId, long toId, String amount){
  231.         this.idOd = fromId;
  232.         this.idDo = toId;
  233.         this.suma = amount;
  234.     }
  235.  
  236.     public String getAmount(){
  237.         return this.suma;
  238.     }
  239.  
  240.     public String getDescription() {
  241.         return this.opis;
  242.     }
  243. }
  244.  
  245. class FlatAmountProvisionTransaction extends Transaction{
  246.     private String provizija;
  247.  
  248.     public FlatAmountProvisionTransaction(long fromId, long toId,String amount, String flatProvision){
  249.         super(fromId,toId,amount);
  250.         this.opis = "FlatAmount";
  251.         provizija = flatProvision;
  252.     }
  253.  
  254.     public String getFlatAmount(){
  255.         return this.provizija;
  256.     }
  257.  
  258.     @Override
  259.     public boolean equals(Object o) {
  260.         if (this == o) return true;
  261.         if (o == null || getClass() != o.getClass()) return false;
  262.         if (this.idDo != ((FlatAmountProvisionTransaction) o).idDo) return false;
  263.         if (this.idOd != ((FlatAmountProvisionTransaction) o).idOd) return false;
  264.         if (!this.suma.equals(((FlatAmountProvisionTransaction) o).suma)) return false;
  265.         FlatAmountProvisionTransaction that = (FlatAmountProvisionTransaction) o;
  266.         return provizija.equals(that.provizija);
  267.     }
  268.  
  269.     @Override
  270.     public int hashCode() {
  271.         return Objects.hash(provizija);
  272.     }
  273.  
  274.     /*
  275.     @Override
  276.     public boolean equals(Object o){
  277.         if(o == null) return false;
  278.         if(o == this) return true;
  279.         if(((FlatAmountProvisionTransaction) o).getFlatAmount() != this.provizija) return false;
  280.         if (this.idDo != ((FlatAmountProvisionTransaction) o).idDo) return false;
  281.         if (this.idOd != ((FlatAmountProvisionTransaction) o).idOd) return false;
  282.         if (this.suma != ((FlatAmountProvisionTransaction) o).suma) return false;
  283.         return this.opis.equals(((FlatAmountProvisionTransaction) o).suma);
  284.     }
  285.  
  286.     @Override
  287.     public int hashCode() {
  288.         int a = 31;
  289.         int b = 7;
  290.         return a*b + this.opis.hashCode() + this.provizija.hashCode();
  291.     }
  292.     */
  293. }
  294.  
  295. class FlatPercentProvisionTransaction extends Transaction{
  296.     private int procent;
  297.  
  298.     public FlatPercentProvisionTransaction (long fromId, long toId, String amount, int centsPerDolar){
  299.         super(fromId,toId,amount);
  300.         opis = "FlatPercent";
  301.         procent = centsPerDolar;
  302.     }
  303.  
  304.     public int getPercent(){
  305.         return this.procent;
  306.     }
  307.  
  308.     @Override
  309.     public boolean equals(Object o) {
  310.         if (this == o) return true;
  311.         if (o == null || getClass() != o.getClass()) return false;
  312.         if (this.idDo != ((FlatPercentProvisionTransaction) o).idDo) return false;
  313.         if (this.idOd != ((FlatPercentProvisionTransaction) o).idOd) return false;
  314.         if (!this.suma.equals(((FlatPercentProvisionTransaction) o).suma)) return false;
  315.         FlatPercentProvisionTransaction that = (FlatPercentProvisionTransaction) o;
  316.         return procent == that.procent;
  317.     }
  318.  
  319.     @Override
  320.     public int hashCode() {
  321.         return Objects.hash(procent);
  322.     }
  323.  
  324.     /*
  325.     @Override
  326.     public boolean equals(Object o){
  327.         if(o == null) return false;
  328.         if(o == this) return true;
  329.         if(((FlatPercentProvisionTransaction) o).getPercent() != this.procent) return false;
  330.         if (this.idDo != ((FlatPercentProvisionTransaction) o).idDo) return false;
  331.         if (this.idOd != ((FlatPercentProvisionTransaction) o).idOd) return false;
  332.         if (this.suma != ((FlatPercentProvisionTransaction) o).suma) return false;
  333.         return this.opis.equals(((FlatPercentProvisionTransaction) o).suma);
  334.     }
  335.  
  336.     @Override
  337.     public int hashCode() {
  338.         int a = 31;
  339.         int b = 7;
  340.         return a*b + this.opis.hashCode() + this.procent;
  341.     }
  342.      */
  343. }
  344.  
  345. class Bank{
  346.     private String ime;
  347.     private Account[] korisnici;
  348.     private ArrayList<Transaction> transakcii = new ArrayList<>();
  349.     private Double provizija = 0.00;
  350.     private Double vkupnoTransferi = 0.00;
  351.  
  352.     public Bank(String name, Account[] accounts){
  353.         ime = name;
  354.         korisnici = new Account[accounts.length];
  355.         System.arraycopy(accounts, 0, korisnici, 0, accounts.length);
  356.     }
  357.  
  358.     public boolean makeTransaction(Transaction t) {
  359.         FlatAmountProvisionTransaction fapt = new FlatAmountProvisionTransaction(1, 2, "23$", "10$");
  360.         FlatPercentProvisionTransaction fppt = new FlatPercentProvisionTransaction(1, 2, "23$", 10);
  361.  
  362.         if (t.getClass() == fapt.getClass()) {
  363.  
  364.             FlatAmountProvisionTransaction transakcija = (FlatAmountProvisionTransaction) t;
  365.  
  366.             Account korisnikPrakja = null;
  367.             Account korisnikPrima = null;
  368.  
  369.             for (Account account : this.korisnici) {
  370.                 if (account.getId() == (transakcija.idOd)) {
  371.                     korisnikPrakja = account;
  372.                 }
  373.                 if (account.getId() == (transakcija.idDo)) {
  374.                     korisnikPrima = account;
  375.                 }
  376.             }
  377.  
  378.             if (korisnikPrakja == null || korisnikPrima == null) return false;
  379.  
  380.             String iznos = transakcija.getAmount();
  381.             String provizija = transakcija.getFlatAmount();
  382.             String balansPrakjach = korisnikPrakja.getBalance();
  383.             String balansPrimach = korisnikPrima.getBalance();
  384.  
  385.             iznos = iznos.substring(0, iznos.length() - 1);
  386.             provizija = provizija.substring(0, provizija.length() - 1);
  387.             balansPrakjach = balansPrakjach.substring(0, balansPrakjach.length() - 1);
  388.             balansPrimach = balansPrimach.substring(0, balansPrimach.length() - 1);
  389.  
  390.             Double iznoss = Double.parseDouble(iznos);
  391.             Double provizijaa = Double.parseDouble(provizija);
  392.             double balanssPrakjach = Double.parseDouble(balansPrakjach);
  393.             Double balanssPrimach = Double.parseDouble(balansPrimach);
  394.  
  395.             if ((iznoss + provizijaa) > balanssPrakjach) return false;
  396.             else {
  397.                 Double novaSostojbaK1 = balanssPrakjach - (iznoss + provizijaa);
  398.                 Double novaSostojbaK2 = balanssPrimach + iznoss;
  399.  
  400.                 balansPrakjach = format("%.2f", novaSostojbaK1);
  401.                 balansPrimach = format("%.2f", novaSostojbaK2);
  402.  
  403.                 balansPrakjach += "$";
  404.                 balansPrimach += "$";
  405.  
  406.                 korisnikPrakja.setBalance(balansPrakjach);
  407.                 korisnikPrima.setBalance(balansPrimach);
  408.  
  409.                 this.provizija += provizijaa;
  410.                 this.vkupnoTransferi += iznoss;
  411.                 return true;
  412.             }
  413.         }
  414.  
  415.         if(t.getClass() == fppt.getClass()){
  416.  
  417.             FlatPercentProvisionTransaction transakcija = (FlatPercentProvisionTransaction) t;
  418.  
  419.             Account korisnikPrakja = null;
  420.             Account korisnikPrima = null;
  421.  
  422.             for (Account account : this.korisnici) {
  423.                 if (account.getId() == (transakcija.idOd)) {
  424.                     korisnikPrakja = account;
  425.                 }
  426.                 if (account.getId() == (transakcija.idDo)) {
  427.                     korisnikPrima = account;
  428.                 }
  429.             }
  430.  
  431.             if (korisnikPrakja == null || korisnikPrima == null) return false;
  432.  
  433.             String iznos = transakcija.suma;
  434.             int procentProvizija = transakcija.getPercent();
  435.             String balansPrakjach = korisnikPrakja.getBalance();
  436.             String balansPrimach = korisnikPrima.getBalance();
  437.  
  438.             iznos = iznos.substring(0, iznos.length() - 1);
  439.             balansPrakjach = balansPrakjach.substring(0, balansPrakjach.length() - 1);
  440.             balansPrimach = balansPrimach.substring(0, balansPrimach.length() - 1);
  441.  
  442.             Double iznoss = Double.parseDouble(iznos);
  443.             double balanssPrakjach = Double.parseDouble(balansPrakjach);
  444.             Double balanssPrimach = Double.parseDouble(balansPrimach);
  445.  
  446.             Double provizija = Math.floor(iznoss) * (procentProvizija/100.0);
  447.  
  448.             if((iznoss + provizija) > balanssPrakjach) return false;
  449.             else{
  450.                 Double novaSostojbaK1 = balanssPrakjach - (iznoss + provizija);
  451.                 Double novaSostojbaK2 = balanssPrimach + iznoss;
  452.  
  453.                 balansPrakjach = format("%.2f", novaSostojbaK1);
  454.                 balansPrimach = format("%.2f", novaSostojbaK2);
  455.  
  456.                 balansPrakjach += "$";
  457.                 balansPrimach += "$";
  458.  
  459.                 korisnikPrakja.setBalance(balansPrakjach);
  460.                 korisnikPrima.setBalance(balansPrimach);
  461.  
  462.                 this.provizija += provizija;
  463.                 this.vkupnoTransferi += iznoss;
  464.                 return true;
  465.             }
  466.         }
  467.         return false;
  468.     }
  469.  
  470.     public String totalTransfers(){
  471.         String s = format("%.2f",vkupnoTransferi);
  472.         s += "$";
  473.         return s;
  474.     }
  475.  
  476.     public String totalProvision(){
  477.         return format("%.2f",provizija) + "$";
  478.     }
  479.  
  480.     public String toString(){
  481.         StringBuilder res = new StringBuilder("Name: " + this.ime + "\r\n" + "\r\n");
  482.         for (Account account : korisnici) {
  483.             res.append(account.toString());
  484.         }
  485.         return res.toString();
  486.     }
  487.  
  488.     public Account[] getAccounts() {
  489.         return korisnici;
  490.     }
  491.  
  492.     @Override
  493.     public boolean equals(Object o) {
  494.         if (this == o) return true;
  495.         if (o == null || getClass() != o.getClass()) return false;
  496.         Bank bank = (Bank) o;
  497.         return ime.equals(bank.ime) &&
  498.                 Arrays.equals(korisnici, bank.korisnici) &&
  499.                 Objects.equals(transakcii, bank.transakcii) &&
  500.                 Objects.equals(provizija, bank.provizija) &&
  501.                 Objects.equals(vkupnoTransferi, bank.vkupnoTransferi);
  502.     }
  503.  
  504.     @Override
  505.     public int hashCode() {
  506.         int result = Objects.hash(ime, transakcii, provizija, vkupnoTransferi);
  507.         result = 31 * result + Arrays.hashCode(korisnici);
  508.         return result;
  509.     }
  510. }
RAW Paste Data