Advertisement
Guest User

kp332436_BD_ZAL.cpp

a guest
Feb 2nd, 2016
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 25.54 KB | None | 0 0
  1. /*
  2.     SYSTEM KREDYTOWY
  3.     AUTOR: Kacper Pawelec
  4.     INDEKS: kp332436
  5.     Wymaga istnienia bazy danych, ale może utworzyć tabele sam.
  6. */
  7. #include <iostream>
  8. #include <pqxx/pqxx>
  9. #include <string>
  10. #include <sstream>
  11. #include <cmath>
  12.  
  13. using namespace std;
  14. using namespace pqxx;
  15.  
  16. class SQLInjectionWarningException: public exception{
  17.     virtual const char* what() const throw(){
  18.         return "Wykryto niedozwolone znaki: \' lub \"!\n";
  19.     }
  20. };
  21.  
  22. class BadOptionException: public exception{
  23.     virtual const char* what() const throw(){
  24.         return "Została wybrana nieobsługiwana opcja!\n";
  25.     }
  26. };
  27.  
  28. bool input_OK(string in){
  29.     for (int i = 0; i < in.length(); i++){
  30.         if (in[i] == '\"' || in[i] == '\'')
  31.             throw SQLInjectionWarningException();
  32.     }
  33.     return true;
  34. }
  35.  
  36. const string skloop("SKLOOP");
  37. const string dzial_kredytow("kredyty");
  38. const string dzial_obslugi("obsługa");
  39.  
  40. void addClient(connection& X){
  41.     cout << "Podaj teraz dane klienta, którego konto chcesz utworzyć:\n  1. Imię:\n";
  42.     string imie , nazwisko, haslo1, haslo2, mail1, mail2;
  43.     cin >> imie;
  44.     input_OK(imie);
  45.     cout << "  2. Nazwisko:\n";
  46.     cin >> nazwisko;
  47.     input_OK(nazwisko);
  48.     cout << "  3. Haslo:\n";
  49.     cin >> haslo1;
  50.     input_OK(haslo1);
  51.     cout << "  Powtorz haslo:\n";
  52.     cin >> haslo2;
  53.     input_OK(haslo2);
  54.     if (haslo1 != haslo2){
  55.         cout << "  BŁĄD: Podane hasła się różnią!\n\n";
  56.         return;
  57.     }
  58.     cout << "  4. Email:\n";
  59.     cin >> mail1;
  60.     input_OK(mail1);
  61.     cout << "  Powtórz email:\n";
  62.     cin >> mail2;
  63.     input_OK(mail2);
  64.     if (mail1 != mail2){
  65.         cout << "  BŁĄD: Podane adresy email różnią się!\n\n";
  66.         return;
  67.     }
  68.    
  69.     work action(X, "addKl");
  70.     action.prepared("addKlient")(imie)(nazwisko)(haslo1)(mail1).exec();
  71.     action.commit();
  72.    
  73.     cout << "\nUtworzono nowe konto klienta!:\n" << imie << ' ' << nazwisko;
  74.     cout << endl << mail1 << endl << haslo1 << endl << endl;
  75. }
  76.  
  77. void addLoan(connection& X){
  78.     cout << "Podaj teraz dane kredytu, którego chcesz udzielić:\n  1. ID Klienta:\n";
  79.     int id, typ;
  80.     double kwota;
  81.     cin >> id;
  82.     cout << "  2. Typ kredytu:\n";
  83.     cin >> typ;
  84.     cout << "  3. Kwota:\n";
  85.     cin >> kwota;
  86.     if (kwota <= 0){
  87.         cout << "  BŁĄD: Kwota <= 0!\n\n";
  88.         return;
  89.     }
  90.     work action(X, "addLoan");
  91.     action.prepared("addLoan")(id)(typ)(kwota).exec();
  92.     action.commit();
  93.    
  94.     cout << "\nUdzielono kredytu!:\nKlient: " << id << endl;
  95.     cout << "Kwota: " << kwota << endl << "Typ: " << typ << endl << endl;
  96. }
  97.  
  98. void addWplata(connection& X){
  99.     cout << "Podaj teraz dane wpłaty, którą chcesz zaksięgować:\n  1. ID Klienta:\n";
  100.     int id, id_k;
  101.     double kwota;
  102.     cin >> id;
  103.     cout << "  2. ID kredytu:\n";
  104.     cin >> id_k;
  105.     cout << "  3. Kwota:\n";
  106.     cin >> kwota;
  107.     if (kwota <= 0){
  108.         cout << "  BŁĄD: Kwota <= 0!\n\n";
  109.         return;
  110.     }
  111.    
  112.     work action(X, "addWplata");
  113.     action.prepared("addWplata")(id)(id_k)(kwota).exec();
  114.     action.commit();
  115.    
  116.     cout << "\nZaksięgowano wpłatę!!:\nKlient: " << id << endl;
  117.     cout << "Kwota: " << kwota << endl << "Na kredyt: " << id_k << endl << endl;
  118. }
  119.  
  120. void addWorker(connection& X){
  121.     cout << "Podaj teraz dane pracownika, którego konto chcesz utworzyć:\n  1. Imię:\n";
  122.     string imie , nazwisko, haslo1, haslo2, mail1, mail2, stanowisko;
  123.     cin >> imie;
  124.     input_OK(imie);
  125.     cout << "  2. Nazwisko:\n";
  126.     cin >> nazwisko;
  127.     input_OK(nazwisko);
  128.     cout << "  3. Haslo:\n";
  129.     cin >> haslo1;
  130.     input_OK(haslo1);
  131.     cout << "  Powtorz haslo:\n";
  132.     cin >> haslo2;
  133.     input_OK(haslo2);
  134.     if (haslo1 != haslo2){
  135.         cout << "  BŁĄD: Podane hasła się różnią!\n\n";
  136.         return;
  137.     }
  138.     cout << "  4. Email:\n";
  139.     cin >> mail1;
  140.     input_OK(mail1);
  141.     cout << "  Powtórz email:\n";
  142.     cin >> mail2;
  143.     input_OK(mail2);
  144.     if (mail1 != mail2){
  145.         cout << "  BŁĄD: Podane adresy email różnią się!\n\n";
  146.         return;
  147.     }
  148.     cout << "  5. Podaj stanowisko[" << dzial_obslugi << '/' << dzial_kredytow << "]:\n";
  149.     cin >> stanowisko;
  150.     input_OK(stanowisko);
  151.     if (stanowisko != dzial_obslugi && stanowisko != dzial_kredytow ){
  152.         cout << "  BŁĄD: Stanowisko nie istnieje!\n\n";
  153.         return;
  154.     }
  155.    
  156.     work action(X, "addWr");
  157.     action.prepared("addWorker")(imie)(nazwisko)(haslo1)(mail1)(stanowisko).exec();
  158.     action.commit();
  159.    
  160.     cout << "\nUtworzono nowe konto pracownika!:\n" << imie << ' ' << nazwisko;
  161.     cout << endl << mail1 << endl << haslo1 << endl << stanowisko << endl << endl;
  162. }
  163.  
  164. void listClientLoan(connection& X, int id){
  165.     work action(X, "listLoans");
  166.     result R = action.prepared("clGetData")(id).exec();
  167.     cout << "Kredyty użytkownika: " << R.begin()["Imie"] << ' ';
  168.     cout << R.begin()["Nazwisko"] << ", " << R.begin()["Mail"] << endl << endl;
  169.     R = action.prepared("clGetLoans")(id).exec();
  170.     for (auto iter = R.begin(); iter != R.end(); iter++){
  171.         cout << "ID: " << iter["ID"].c_str() << endl;
  172.         cout << "Kwota: " << iter["Wartosc"].c_str() << endl;
  173.         cout << "Typ: " << iter["Typ"].c_str() << endl;
  174.         cout << "Data ostatniej wpłaty: " << iter["Ostatnia_rata_data"].c_str() << endl;
  175.         cout << "Termin następnej raty: " << iter["Nastepna_rata_data"].c_str()<< endl;
  176.         cout << "Kwota następnej raty: " << iter["Nastepna_rata"].c_str()<< endl << endl;
  177.     }
  178.     action.commit();
  179. }
  180.  
  181. void listClientTrans(connection& X, int id){
  182.     work action(X, "listLoans");
  183.     result R = action.prepared("clGetData")(id).exec();
  184.     cout << "Wpłaty użytkownika: " << R.begin()["Imie"] << ' ';
  185.     cout << R.begin()["Nazwisko"] << ", " << R.begin()["Mail"] << endl << endl;
  186.     R = action.prepared("clGetTrans")(id).exec();
  187.     for (auto iter = R.begin(); iter != R.end(); iter++){
  188.         cout << "ID: " << iter["ID"].c_str() << endl;
  189.         cout << "Kwota: " << iter["Kwota"].c_str() << endl;
  190.         cout << "Data: " << iter["Data"].c_str() << endl << endl;
  191.     }
  192.     action.commit();
  193. }
  194.  
  195. void simLoan(connection& X, int id){
  196.     work action(X, "simLoan");
  197.     cout << "Wpisz teraz ID kredytu do zasymulowania: \n\n";
  198.     int id_k;
  199.     cin >> id_k;
  200.     result R = action.prepared("crCount")(id_k)(id).exec();
  201.     int i = 1;
  202.     while((R.begin()[0].c_str()[0] != '0')){
  203.         cout << "  Nr. raty: " << i << endl;
  204.         R = action.prepared("crVal")(id_k)(id).exec();
  205.         cout << "  Stara kwota kredytu: " << R.begin()["Wartosc"].c_str() << endl;
  206.         R = action.prepared("crRata")(id_k)(id).exec();
  207.         cout << "  Kwota raty: " <<R.begin()["Nastepna_rata"].c_str() << endl;
  208.         action.prepared("addWplata")(id)(id_k)(R.begin()[0].c_str()).exec();
  209.         R = action.prepared("crVal")(id_k)(id).exec();
  210.         cout << "  Nowa kwota kredytu: " << R.begin()["Wartosc"].c_str() << endl << endl;
  211.         R = action.prepared("crCount")(id_k)(id).exec();
  212.         ++i;
  213.     }
  214.     action.abort();
  215. }
  216.  
  217. void clientMenu(connection& X, int id){
  218.     work action(X, "clData");
  219.     result R = action.prepared("clGetData")(id).exec();
  220.     // Nie sprawdzam poprawności, sprawdziłem już w sumie wcześniej
  221.     cout << "\nUżytkownik: " << R.begin()["Imie"] << ' ';
  222.     cout << R.begin()["Nazwisko"] << ", " << R.begin()["Mail"] << endl;
  223.     action.commit();
  224.     bool cont = true;
  225.     while (cont){
  226.         cout << "Witamy w menu klienta!\n";
  227.         cout << "Co chcesz teraz zrobić?\n";
  228.         cout << "  1. Zobacz kredyty\n";
  229.         cout << "  2. Zobacz historię wpłat\n";
  230.         cout << "  3. Zasymuluj spłacanie kredytu\n";
  231.         cout << "  4. Logoff\n\n";
  232.  
  233.         int option;
  234.         cin >> option;
  235.         switch(option){
  236.             case 1:
  237.                 listClientLoan(X, id);
  238.                 break;
  239.             case 2:
  240.                 listClientTrans(X, id);
  241.                 break;
  242.             case 3:
  243.                 simLoan(X, id);
  244.                 break;
  245.             case 4:
  246.                 cout << "Do widzenia!\n\n";
  247.                 cont = false;
  248.                 break;
  249.             default:
  250.                 throw BadOptionException();
  251.         }
  252.     }
  253. }
  254.  
  255. void clientSession(connection& X){
  256.     int id;
  257.     string haslo;
  258.     string podaneHaslo;
  259.    
  260.     work action(X, "cSession");
  261.     cout << "Podaj ID klienta:\n";
  262.     cin >> id;
  263.    
  264.     result R = action.prepared("clGetPass")(id).exec();
  265.     if (R.begin() == R.end()){
  266.         cout << "  BŁĄD: Podano błędne ID!\n\n";
  267.         return;
  268.     }
  269.     haslo = string(R.begin()[0].c_str());
  270.     cout << "Podaj hasło:\n";
  271.     cin >> podaneHaslo;
  272.    
  273.     if (haslo != podaneHaslo){
  274.         cout << "  BŁĄD: Podano błędne hasło!\n\n";
  275.         return;
  276.     }
  277.     action.commit();
  278.     clientMenu(X, id);
  279. }
  280.  
  281. void listClients(connection& X){
  282.     work action(X, "listClients");
  283.     result R = action.exec("SELECT ID, Imie, Nazwisko, Mail FROM Klient;");
  284.     cout << "Lista Klientów:\n\n";
  285.     for (auto iter = R.begin(); iter != R.end(); iter++){
  286.         cout << "ID: " << iter["ID"].c_str() << endl;
  287.         cout << iter["Imie"].c_str() << ' ' << iter["Nazwisko"].c_str() << endl;
  288.         cout << iter["Mail"].c_str() << endl << endl;
  289.     }
  290.     action.commit();
  291. }
  292.  
  293. void listTrans(connection& X){
  294.     work action(X, "listTrans");
  295.     result R = action.exec("SELECT ID, Kwota, Data, ID_Kredytu, ID_Klienta FROM Wplata;");
  296.     cout << "Lista Wpłat:\n\n";
  297.     for (auto iter = R.begin(); iter != R.end(); iter++){
  298.         cout << "ID: " << iter["ID"].c_str() << endl;
  299.         cout << "Kwota: " << iter["Kwota"].c_str() << endl;
  300.         cout << "Data przelewu: " << iter["Data"].c_str() << endl;
  301.         cout << "Nr. kredytu: " << iter["ID_Kredytu"].c_str() << endl;
  302.         cout << "Nr. klienta: " << iter["ID_Klienta"].c_str() << endl << endl;
  303.     }
  304.     action.commit();
  305. }
  306.  
  307. void listLoans(connection& X){
  308.     work action(X, "listLoans");
  309.     result R = action.exec("SELECT ID, Wartosc, Typ, Ostatnia_rata_data, Nastepna_rata, Nastepna_rata_data, ID_Klienta FROM Kredyt;");
  310.     cout << "Lista Kredytów:\n\n";
  311.     for (auto iter = R.begin(); iter != R.end(); iter++){
  312.         cout << "ID: " << iter["ID"].c_str() << endl;
  313.         cout << "Kwota: " << iter["Wartosc"].c_str() << endl;
  314.         cout << "Typ kredytu: " << iter["Typ"].c_str() << endl;
  315.         cout << "Nr. klienta: " << iter["ID_Klienta"].c_str() << endl;
  316.         cout << "Data ostatniej wpłaty: " << iter["Ostatnia_rata_data"].c_str() << endl;
  317.         cout << "Termin następnej raty: " << iter["Nastepna_rata_data"].c_str() << endl;
  318.         cout << "Kwota następnej raty: " << iter["Nastepna_rata"].c_str() << endl << endl;
  319.     }
  320.     action.commit();
  321. }
  322.  
  323. void wrKredytMenu(connection& X, int id){
  324.     work action(X, "wrData");
  325.     result R = action.prepared("wrGetData")(id).exec();
  326.     // Nie sprawdzam poprawności, sprawdziłem już w sumie wcześniej
  327.     cout << "\nUżytkownik: " << R.begin()["Imie"] << ' ';
  328.     cout << R.begin()["Nazwisko"] << ", " << R.begin()["Mail"];
  329.     cout << ", dział: " << R.begin()["Stanowisko"] << endl;
  330.     action.commit();
  331.     bool cont = true;
  332.     while (cont){
  333.         cout << "Dział kredytów.\n";
  334.         cout << "Co chcesz teraz zrobić?\n";
  335.         cout << "  1. Zobacz listę klientów\n";
  336.         cout << "  2. Zobacz listę wpłat\n";
  337.         cout << "  3. Zobacz listę kredytów\n";
  338.         cout << "  4. Udziel kredytu\n";
  339.         cout << "  5. Logoff\n\n";
  340.  
  341.         int option;
  342.         cin >> option;
  343.         switch(option){
  344.             case 1:
  345.                 listClients(X);
  346.                 break;
  347.             case 2:
  348.                 listTrans(X);
  349.                 break;
  350.             case 3:
  351.                 listLoans(X);
  352.                 break;
  353.             case 4:
  354.                 addLoan(X);
  355.                 break;
  356.             case 5:
  357.                 cout << "Do widzenia!\n\n";
  358.                 cont = false;
  359.                 break;
  360.             default:
  361.                 throw BadOptionException();
  362.         }
  363.     }
  364. }
  365.  
  366. void wrObslugaMenu(connection& X, int id){
  367.     work action(X, "wrData");
  368.     result R = action.prepared("wrGetData")(id).exec();
  369.     // Nie sprawdzam poprawności, sprawdziłem już w sumie wcześniej
  370.     cout << "\nUżytkownik: " << R.begin()["Imie"] << ' ';
  371.     cout << R.begin()["Nazwisko"] << ", " << R.begin()["Mail"];
  372.     cout << ", dział: " << R.begin()["Stanowisko"] << endl;
  373.     action.commit();
  374.     bool cont = true;
  375.     while (cont){
  376.         cout << "Dział obsługi.\n";
  377.         cout << "Co chcesz teraz zrobić?\n";
  378.         cout << "  1. Zobacz listę klientów\n";
  379.         cout << "  2. Zobacz listę wpłat\n";
  380.         cout << "  3. Zobacz listę kredytów\n";
  381.         cout << "  4. Zaksięguj wpłatę\n";
  382.         cout << "  5. Logoff\n\n";
  383.  
  384.         int option;
  385.         cin >> option;
  386.         switch(option){
  387.             case 1:
  388.                 listClients(X);
  389.                 break;
  390.             case 2:
  391.                 listTrans(X);
  392.                 break;
  393.             case 3:
  394.                 listLoans(X);
  395.                 break;
  396.             case 4:
  397.                 addWplata(X);
  398.                 break;
  399.             case 5:
  400.                 cout << "Do widzenia!\n\n";
  401.                 cont = false;
  402.                 break;
  403.             default:
  404.                 throw BadOptionException();
  405.         }
  406.     }
  407. }
  408.  
  409. void workerSession(connection& X){
  410.     int id;
  411.     string haslo;
  412.     string podaneHaslo;
  413.    
  414.     work action(X, "wSession");
  415.     cout << "Podaj ID pracownika:\n";
  416.     cin >> id;
  417.    
  418.     result R = action.prepared("wrGetPass")(id).exec();
  419.     if (R.begin() == R.end()){
  420.         cout << "  BŁĄD: Podano błędne ID!\n\n";
  421.         return;
  422.     }
  423.     haslo = string(R.begin()[0].c_str());
  424.     cout << "Podaj hasło:\n";
  425.     cin >> podaneHaslo;
  426.    
  427.     if (haslo != podaneHaslo){
  428.         cout << "  BŁĄD: Podano błędne hasło!\n\n";
  429.         return;
  430.     }
  431.    
  432.     R = action.prepared("wrGetWplace")(id).exec();
  433.     string wplace(R.begin()["Stanowisko"].c_str());
  434.     action.commit();
  435.     if (wplace == dzial_kredytow){
  436.         wrKredytMenu(X, id);
  437.     } else if (wplace == dzial_obslugi){
  438.         wrObslugaMenu(X, id);
  439.     } else {
  440.         cout << "  BŁĄD: Nieznany dział: \"" << wplace << "\"\n";
  441.         return;
  442.     }
  443. }
  444.  
  445. void listWorkers(connection& X){
  446.     work action(X, "listWorkers");
  447.     result R = action.exec("SELECT ID, Imie, Nazwisko, Mail, Stanowisko FROM Pracownik;");
  448.     cout << "Lista Pracowników:\n\n";
  449.     for (auto iter = R.begin(); iter != R.end(); iter++){
  450.         cout << "ID: " << iter["ID"].c_str() << endl;
  451.         cout << iter["Imie"].c_str() << ' ' << iter["Nazwisko"].c_str() << endl;
  452.         cout << "Dział: " << iter["Stanowisko"].c_str() << endl;
  453.         cout << iter["Mail"].c_str() << endl << endl;
  454.     }
  455.     action.commit();
  456. }
  457.  
  458. void listLoanTypes(connection& X){
  459.     work action(X, "listLoanTypes");
  460.     result R = action.exec("SELECT ID, Podst_rata, Procent, Odsetki FROM Typ_Kredytu;");
  461.     cout << "Typy kredytów:\n\n";
  462.     for (auto iter = R.begin(); iter != R.end(); iter++){
  463.         cout << "ID: " << iter["ID"].c_str() << endl;
  464.         cout << "Baza raty: " << iter["Podst_rata"].c_str() << endl;
  465.         cout << "Procent na ratę: " << iter["Procent"].c_str() << endl;
  466.         cout << "Odsetki karne: " << iter["Odsetki"].c_str() << endl << endl;
  467.     }
  468.     action.commit();
  469. }
  470.  
  471. void addLoanType(connection& X){
  472.         cout << "Podaj teraz parametry typu konta:\n  1. Podstawowa rata:\n";
  473.     double rata;
  474.     double odsetki, procent;
  475.     cin >> rata;
  476.     if (rata < 0.01){
  477.         cout << "  BŁĄD: Kwota raty <= 0.01!\n\n";
  478.         return;
  479.     }
  480.     cout << "  2. Procent kredytu na ratę:\n";
  481.     cin >> procent;
  482.     if (procent < 0){
  483.         cout << "  BŁĄD: Procent < 0!\n\n";
  484.         return;
  485.     }
  486.     cout << "  3. Odsetki:\n";
  487.     cin >> odsetki;
  488.     if (odsetki < 0){
  489.         cout << "  BŁĄD: Odsetki < 0!\n\n";
  490.         return;
  491.     }
  492.    
  493.     work action(X, "addLoanType");
  494.     action.prepared("addLoanType")(rata)(procent)(odsetki).exec();
  495.     action.commit();
  496.    
  497.     cout << "\nUtworzono nowy typ kredytu!:\n";
  498.     cout << "Baza raty: " << rata << endl;
  499.     cout << "Procent na ratę: " << procent << endl;
  500.     cout << "Odsetki karne: " << odsetki << endl << endl;
  501. }
  502.  
  503. int main(){
  504.     // Rzecz jasna łączenie z bazą danych
  505.     cout << "\nSYSTEM KREDYTOWY KP332436\n";
  506.     string db;
  507.     string host;
  508.     cout << "Proszę podać nazwę bazy danych\n";
  509.     cin >> db;
  510.     cout << "Proszę podać nazwę hosta\n";
  511.     cin >> host;
  512.     cout << "Proszę podać port (domyślnie 5432)\n";
  513.     string port;
  514.     cin >> port;
  515.     cout << "Proszę podać nazwę admina\n";
  516.     string adm;
  517.     cin >> adm;
  518.     cout << "Proszę podać hasło\n";
  519.     string pass;
  520.     cin >> pass;
  521.     input_OK(db);
  522.     input_OK(host);
  523.     input_OK(port);
  524.     input_OK(adm);
  525.     input_OK(pass);
  526.     connection kp332436("dbname=\'" + db + "\' host=\'" + host + "\' port=\'" + port + "\' user=\'" + adm + "\' password=\'" + pass + "\'");
  527.     cout << "Nawiązano połączenie\n\n";
  528.    
  529.     // Doprowadź bazę danych do stanu używalności, jeżeli w nim nie jest
  530.     work action(kp332436, skloop);
  531.    
  532.     {
  533.         cout << "Czy chcesz usunąć stare tabele? [y/n][UŻYWAĆ TYLKO JEŚLI ISTNIEJĄ]\n";
  534.         char c;
  535.         cin >> c;
  536.         if (c != 'n' && c != 'N' && c != 'y' && c != 'Y'){
  537.             throw BadOptionException();
  538.         }
  539.         if (c == 'y' || c == 'Y'){
  540.             action.exec("DROP TRIGGER process_wplata ON Wplata");
  541.             action.exec("DROP TRIGGER process_kredyt ON Kredyt");
  542.             action.exec("DROP FUNCTION process_wpłata()");
  543.             action.exec("DROP FUNCTION process_kredyt()");
  544.             action.exec("DROP TABLE Klient");
  545.             action.exec("DROP TABLE Pracownik");
  546.             action.exec("DROP TABLE Wplata");
  547.             action.exec("DROP TABLE Kredyt");
  548.             action.exec("DROP TABLE Typ_Kredytu");
  549.         }
  550.     }
  551.    
  552.     {
  553.         cout << "Czy chcesz utworzyć czyste tabele? [y/n][UŻYWAĆ TYLKO JEŚLI NIE ISTNIEJĄ]\n";
  554.         char c;
  555.         cin >> c;
  556.         if (c != 'n' && c != 'N' && c != 'y' && c != 'Y'){
  557.             throw BadOptionException();
  558.         }
  559.         if (c == 'y' || c == 'Y'){
  560.             action.exec("CREATE TABLE Klient (ID SERIAL PRIMARY KEY, Imie TEXT, Nazwisko TEXT, Haslo TEXT, Mail TEXT)");
  561.             action.exec("CREATE TABLE Pracownik (ID SERIAL PRIMARY KEY, Imie TEXT, Nazwisko TEXT, Haslo TEXT, Mail TEXT, Stanowisko TEXT)");
  562.             action.exec("CREATE TABLE Wplata (ID SERIAL PRIMARY KEY, Kwota NUMERIC(99,2), ID_Kredytu INTEGER, ID_Klienta INTEGER, Data DATE)");
  563.             action.exec("CREATE TABLE Kredyt (ID SERIAL PRIMARY KEY, Wartosc NUMERIC(99,2), Typ INTEGER, Ostatnia_rata_data DATE, Nastepna_rata NUMERIC(99,2), Nastepna_rata_data DATE, ID_Klienta INTEGER)");
  564.             action.exec("CREATE TABLE Typ_Kredytu (ID SERIAL PRIMARY KEY, Podst_rata NUMERIC(99,2), Procent FLOAT, Odsetki FLOAT)");
  565.            
  566.             string process_wplata = "CREATE FUNCTION process_wpłata()\n";
  567.             process_wplata += "RETURNS trigger AS $process_wpłata$\n";
  568.             process_wplata += "BEGIN\n";
  569.                                 // Istnienie kreduty
  570.             process_wplata += "IF NOT (SELECT COUNT(*) FROM Kredyt WHERE Kredyt.ID = NEW.ID_Kredytu) >= 1 THEN\n";
  571.             process_wplata +=   "RAISE EXCEPTION 'Kredyt nie istnieje!';\n";
  572.             process_wplata += "END IF;\n";
  573.                                 // Istnienie klienta
  574.             process_wplata += "IF NOT NEW.ID_Klienta = (SELECT ID_Klienta FROM Kredyt WHERE Kredyt.ID = NEW.ID_Kredytu) THEN\n";
  575.             process_wplata +=   "RAISE EXCEPTION 'Klient spłaca nie swój kredyt?!';\n";
  576.             process_wplata += "END IF;\n";
  577.                                 // Dobra kwota
  578.             process_wplata += "IF NOT NEW.Kwota = (SELECT Nastepna_rata FROM Kredyt WHERE (Kredyt.ID = NEW.ID_Kredytu)) THEN\n";
  579.             process_wplata +=   "RAISE EXCEPTION 'Zła kwota wpłaty!, % != %', (SELECT Nastepna_rata FROM Kredyt WHERE (Kredyt.ID = NEW.ID_Kredytu)), NEW.Kwota;\n";
  580.             process_wplata += "END IF;\n";
  581.                                 // Data
  582.             process_wplata += "NEW.Data = current_date;\n";
  583.                                 // Wpłać ratę
  584.             process_wplata += "UPDATE Kredyt SET Wartosc = Wartosc - NEW.Kwota WHERE Kredyt.ID = NEW.ID_Kredytu;\n";
  585.                                 // Termin nastpnej raty
  586.             process_wplata += "UPDATE Kredyt SET Nastepna_rata_data = Nastepna_rata_data + interval '1 month' WHERE Kredyt.ID = NEW.ID_Kredytu;\n";
  587.                                 // Terin osttaniej wpłaty
  588.             process_wplata += "UPDATE Kredyt SET Ostatnia_rata_data = current_date WHERE Kredyt.ID = NEW.ID_Kredytu;\n";
  589.                                 // Kwota następnej raty
  590.             process_wplata += "UPDATE Kredyt SET Nastepna_rata = (SELECT Podst_rata FROM Typ_Kredytu WHERE Typ_Kredytu.ID = (SELECT Typ FROM Kredyt WHERE Kredyt.ID = NEW.ID_Kredytu)) + ";
  591.             process_wplata += "(SELECT Procent FROM Typ_Kredytu WHERE Typ_Kredytu.ID = (SELECT Typ FROM Kredyt WHERE Kredyt.ID = NEW.ID_Kredytu)) * ";
  592.             process_wplata += "((SELECT Wartosc FROM Kredyt WHERE Kredyt.ID = NEW.ID_Kredytu) - ";
  593.             process_wplata += "(SELECT Podst_rata FROM Typ_Kredytu WHERE Typ_Kredytu.ID = (SELECT Typ FROM Kredyt WHERE Kredyt.ID = NEW.ID_Kredytu))) ";
  594.             process_wplata += "WHERE Kredyt.ID = NEW.ID_Kredytu;\n";
  595.                                 // Popraw kwotę raty jeśli trzeba
  596.             process_wplata += "IF (SELECT Nastepna_rata FROM Kredyt WHERE Kredyt.ID = NEW.ID_Kredytu) > (SELECT Wartosc FROM Kredyt WHERE Kredyt.ID = NEW.ID_Kredytu) THEN\n";
  597.             process_wplata +=   "UPDATE Kredyt SET Nastepna_rata = Wartosc WHERE Kredyt.ID = NEW.ID_Kredytu;\n";
  598.             process_wplata += "END IF;\n";
  599.                                 // Kredyt spłacony, usun z bazy
  600.             process_wplata += "IF (SELECT Wartosc FROM Kredyt WHERE Kredyt.ID = NEW.ID_Kredytu) <= 0 THEN\n";
  601.             process_wplata +=   "DELETE FROM Kredyt WHERE Kredyt.ID = NEW.ID_Kredytu;\n";
  602.             process_wplata += "END IF;\n";
  603.             process_wplata += "RETURN NEW;\n";
  604.             process_wplata += "END\n";
  605.             process_wplata += "$process_wpłata$ LANGUAGE plpgsql;\n";
  606.             action.exec(process_wplata);
  607.                                 //TRIGGER
  608.             string wyz_wplata = "CREATE TRIGGER process_wplata\nBEFORE INSERT ON Wplata\nFOR EACH ROW\nEXECUTE PROCEDURE process_wpłata();\n";
  609.             action.exec(wyz_wplata);
  610.            
  611.                                 // Wyzwalacz kredytu
  612.             string process_kredyt = "CREATE FUNCTION process_kredyt()\n";
  613.             process_kredyt += "RETURNS trigger AS $process_kredyt$\n";
  614.             process_kredyt += "BEGIN\n";
  615.                                 // Czy typ kredytu istnieje
  616.             process_kredyt += "IF NOT (SELECT COUNT(*) FROM Typ_Kredytu WHERE Typ_Kredytu.ID = NEW.Typ) >= 1 THEN\n";
  617.             process_kredyt +=   "RAISE EXCEPTION 'Typ kredytu nie istnieje!';\n";
  618.             process_kredyt += "END IF;\n";
  619.                                 // Czy klient istnieje
  620.             process_kredyt += "IF NOT (SELECT COUNT(*) FROM Klient WHERE klient.ID = NEW.ID_Klienta) >= 1 THEN\n";
  621.             process_kredyt +=   "RAISE EXCEPTION 'Nie ma klienta nie ma kredytu!';\n";
  622.             process_kredyt += "END IF;\n";
  623.                                 // Czy klient nie ma już kredytu tego typu
  624.             process_kredyt += "IF NOT (SELECT COUNT(*) FROM Kredyt WHERE Kredyt.Typ = NEW.Typ AND Kredyt.ID_Klienta = NEW.ID_Klienta) = 0 THEN\n";
  625.             process_kredyt +=   "RAISE EXCEPTION 'Klient już ma kredyt tego typu!';\n";
  626.             process_kredyt += "END IF;\n";
  627.             process_kredyt += "NEW.Nastepna_rata_data = current_date + interval '1 month';\n";
  628.             process_kredyt += "NEW.Nastepna_rata = (SELECT Podst_rata FROM Typ_Kredytu WHERE Typ_Kredytu.ID = NEW.Typ) + ";
  629.             process_kredyt += "(SELECT Procent FROM Typ_Kredytu WHERE Typ_Kredytu.ID = NEW.Typ) * ";
  630.             process_kredyt += "(NEW.Wartosc - (SELECT Podst_rata FROM Typ_Kredytu WHERE Typ_Kredytu.ID = NEW.Typ));\n";
  631.             process_kredyt += "IF NEW.Nastepna_rata > NEW.Wartosc THEN\n";
  632.             process_kredyt +=   "NEW.Nastepna_rata = NEW.Wartosc;\n";
  633.             process_kredyt += "END IF;\n";
  634.             process_kredyt += "RETURN NEW;\n";
  635.             process_kredyt += "END\n";
  636.             process_kredyt += "$process_kredyt$ LANGUAGE plpgsql;\n";
  637.             action.exec(process_kredyt);
  638.                                 //TRIGGER
  639.             string wyz_kredyt = "CREATE TRIGGER process_kredyt\nBEFORE INSERT ON Kredyt\nFOR EACH ROW\nEXECUTE PROCEDURE process_kredyt();\n";
  640.             action.exec(wyz_kredyt);
  641.         }
  642.     }
  643.    
  644.     action.commit();
  645.     // Przgotowywanie procedur, zapytań etc.
  646.     {
  647.         // DOdawanie klienta
  648.         string addKl("INSERT INTO Klient (Imie, Nazwisko, Haslo, Mail) VALUES ($1, $2, $3, $4);");
  649.         kp332436.prepare("addKlient", addKl);
  650.        
  651.         // Wyciąganie hasła klienta
  652.         string clGetPass("SELECT haslo FROM Klient WHERE ID = $1;");
  653.         kp332436.prepare("clGetPass", clGetPass);
  654.        
  655.         // Wyciąganie danych klienta
  656.         string clGetData("SELECT Imie, Nazwisko, Mail FROM Klient WHERE ID = $1;");
  657.         kp332436.prepare("clGetData", clGetData);
  658.        
  659.         // Wyciąganie kredytów klienta
  660.         string clGetLoans("SELECT ID, Wartosc, Typ, Ostatnia_rata_data, Nastepna_rata_data, Nastepna_rata FROM Kredyt WHERE ID_Klienta = $1;");
  661.         kp332436.prepare("clGetLoans", clGetLoans);
  662.        
  663.         // Wyciąganie wpłat klienta
  664.         string clGetTrans("SELECT ID, Kwota, Data FROM Wplata WHERE ID_Klienta = $1;");
  665.         kp332436.prepare("clGetTrans", clGetTrans);
  666.        
  667.         // Dodawanie pracownika
  668.         string addWr("INSERT INTO Pracownik (Imie, Nazwisko, Haslo, Mail, Stanowisko) VALUES ($1, $2, $3, $4, $5);");
  669.         kp332436.prepare("addWorker", addWr);
  670.        
  671.         // Wyciąganie hasła pracownika
  672.         string wrGetPass("SELECT haslo FROM Pracownik WHERE ID = $1;");
  673.         kp332436.prepare("wrGetPass", wrGetPass);
  674.        
  675.         // Wyciąganie działu pracownika
  676.         string wrGetWplace("SELECT Stanowisko FROM Pracownik WHERE ID = $1;");
  677.         kp332436.prepare("wrGetWplace", wrGetWplace);
  678.        
  679.         // Wyciąganie danych klienta
  680.         string wrGetData("SELECT Imie, Nazwisko, Mail, Stanowisko FROM Pracownik WHERE ID = $1;");
  681.         kp332436.prepare("wrGetData", wrGetData);
  682.        
  683.         // Dodawanie typu kredytu
  684.         string addLoanT("INSERT INTO Typ_Kredytu (Podst_rata, Procent, Odsetki) VALUES ($1, $2, $3);");
  685.         kp332436.prepare("addLoanType", addLoanT);
  686.        
  687.         // Dodawanie kredytu
  688.         string addLoan("INSERT INTO Kredyt (ID_Klienta, Typ, Wartosc) VALUES ($1, $2, $3);");
  689.         kp332436.prepare("addLoan", addLoan);
  690.        
  691.         // Dodawanie wpłaty
  692.         string addWplata("INSERT INTO Wplata (ID_Klienta, ID_Kredytu, Kwota) VALUES ($1, $2, $3);");
  693.         kp332436.prepare("addWplata", addWplata);
  694.        
  695.         // Wyciąganie kredytu danego klienta
  696.         string crCount("SELECT COUNT(*) FROM Kredyt WHERE ID = $1 AND ID_Klienta = $2;");
  697.         kp332436.prepare("crCount", crCount);
  698.        
  699.         // Wyciąganie następnej raty kredytu danego klienta
  700.         string crRata("SELECT Nastepna_rata FROM Kredyt WHERE ID = $1 AND ID_Klienta = $2;");
  701.         kp332436.prepare("crRata", crRata);
  702.        
  703.         // Wyciąganie kwoty kredytu klienta
  704.         string crVal("SELECT Wartosc FROM Kredyt WHERE ID = $1 AND ID_Klienta = $2;");
  705.         kp332436.prepare("crVal", crVal);
  706.     }
  707.    
  708.     cout << "Witamy w systemie kredytowym kp332436!\n";
  709.     bool cont = true;
  710.     // Pętla programu
  711.     while (cont){
  712.         cout << "\nMenu Główne\nCo chcesz teraz zrobić? Wpisz numer opcji:\n";
  713.         cout << "  1. Shutdown\n";
  714.         cout << "  2. Utwórz konto klienta\n";
  715.         cout << "  3. Utwórz konto pracownika\n";
  716.         cout << "  4. Zaloguj klienta\n";
  717.         cout << "  5. Zaloguj pracownika\n";
  718.         cout << "  6. Pokaż listę klientów\n";
  719.         cout << "  7. Pokaż listę pracowników\n";
  720.         cout << "  8. Dodaj typ kredytu\n";
  721.         cout << "  9. Pokaż typy kredytów\n\n";
  722.         int opt;
  723.         cin >> opt;
  724.         switch(opt){
  725.             case 1:
  726.                 cont = false;
  727.                 cout << "Shutting down\n";
  728.                 break;
  729.             case 2:
  730.                 addClient(kp332436);
  731.                 break;
  732.             case 3:
  733.                 addWorker(kp332436);
  734.                 break;
  735.             case 4:
  736.                 clientSession(kp332436);
  737.                 break;
  738.             case 5:
  739.                 workerSession(kp332436);
  740.                 break;
  741.             case 6:
  742.                 listClients(kp332436);
  743.                 break;
  744.             case 7:
  745.                 listWorkers(kp332436);
  746.                 break;
  747.             case 8:
  748.                 addLoanType(kp332436);
  749.                 break;
  750.             case 9:
  751.                 listLoanTypes(kp332436);
  752.                 break;
  753.             default:
  754.                 throw BadOptionException();
  755.                 break;
  756.         }
  757.     }
  758.    
  759.     return 0;
  760. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement