Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- SYSTEM KREDYTOWY
- AUTOR: Kacper Pawelec
- INDEKS: kp332436
- Wymaga istnienia bazy danych, ale może utworzyć tabele sam.
- */
- #include <iostream>
- #include <pqxx/pqxx>
- #include <string>
- #include <sstream>
- #include <cmath>
- using namespace std;
- using namespace pqxx;
- class SQLInjectionWarningException: public exception{
- virtual const char* what() const throw(){
- return "Wykryto niedozwolone znaki: \' lub \"!\n";
- }
- };
- class BadOptionException: public exception{
- virtual const char* what() const throw(){
- return "Została wybrana nieobsługiwana opcja!\n";
- }
- };
- bool input_OK(string in){
- for (int i = 0; i < in.length(); i++){
- if (in[i] == '\"' || in[i] == '\'')
- throw SQLInjectionWarningException();
- }
- return true;
- }
- const string skloop("SKLOOP");
- const string dzial_kredytow("kredyty");
- const string dzial_obslugi("obsługa");
- void addClient(connection& X){
- cout << "Podaj teraz dane klienta, którego konto chcesz utworzyć:\n 1. Imię:\n";
- string imie , nazwisko, haslo1, haslo2, mail1, mail2;
- cin >> imie;
- input_OK(imie);
- cout << " 2. Nazwisko:\n";
- cin >> nazwisko;
- input_OK(nazwisko);
- cout << " 3. Haslo:\n";
- cin >> haslo1;
- input_OK(haslo1);
- cout << " Powtorz haslo:\n";
- cin >> haslo2;
- input_OK(haslo2);
- if (haslo1 != haslo2){
- cout << " BŁĄD: Podane hasła się różnią!\n\n";
- return;
- }
- cout << " 4. Email:\n";
- cin >> mail1;
- input_OK(mail1);
- cout << " Powtórz email:\n";
- cin >> mail2;
- input_OK(mail2);
- if (mail1 != mail2){
- cout << " BŁĄD: Podane adresy email różnią się!\n\n";
- return;
- }
- work action(X, "addKl");
- action.prepared("addKlient")(imie)(nazwisko)(haslo1)(mail1).exec();
- action.commit();
- cout << "\nUtworzono nowe konto klienta!:\n" << imie << ' ' << nazwisko;
- cout << endl << mail1 << endl << haslo1 << endl << endl;
- }
- void addLoan(connection& X){
- cout << "Podaj teraz dane kredytu, którego chcesz udzielić:\n 1. ID Klienta:\n";
- int id, typ;
- double kwota;
- cin >> id;
- cout << " 2. Typ kredytu:\n";
- cin >> typ;
- cout << " 3. Kwota:\n";
- cin >> kwota;
- if (kwota <= 0){
- cout << " BŁĄD: Kwota <= 0!\n\n";
- return;
- }
- work action(X, "addLoan");
- action.prepared("addLoan")(id)(typ)(kwota).exec();
- action.commit();
- cout << "\nUdzielono kredytu!:\nKlient: " << id << endl;
- cout << "Kwota: " << kwota << endl << "Typ: " << typ << endl << endl;
- }
- void addWplata(connection& X){
- cout << "Podaj teraz dane wpłaty, którą chcesz zaksięgować:\n 1. ID Klienta:\n";
- int id, id_k;
- double kwota;
- cin >> id;
- cout << " 2. ID kredytu:\n";
- cin >> id_k;
- cout << " 3. Kwota:\n";
- cin >> kwota;
- if (kwota <= 0){
- cout << " BŁĄD: Kwota <= 0!\n\n";
- return;
- }
- work action(X, "addWplata");
- action.prepared("addWplata")(id)(id_k)(kwota).exec();
- action.commit();
- cout << "\nZaksięgowano wpłatę!!:\nKlient: " << id << endl;
- cout << "Kwota: " << kwota << endl << "Na kredyt: " << id_k << endl << endl;
- }
- void addWorker(connection& X){
- cout << "Podaj teraz dane pracownika, którego konto chcesz utworzyć:\n 1. Imię:\n";
- string imie , nazwisko, haslo1, haslo2, mail1, mail2, stanowisko;
- cin >> imie;
- input_OK(imie);
- cout << " 2. Nazwisko:\n";
- cin >> nazwisko;
- input_OK(nazwisko);
- cout << " 3. Haslo:\n";
- cin >> haslo1;
- input_OK(haslo1);
- cout << " Powtorz haslo:\n";
- cin >> haslo2;
- input_OK(haslo2);
- if (haslo1 != haslo2){
- cout << " BŁĄD: Podane hasła się różnią!\n\n";
- return;
- }
- cout << " 4. Email:\n";
- cin >> mail1;
- input_OK(mail1);
- cout << " Powtórz email:\n";
- cin >> mail2;
- input_OK(mail2);
- if (mail1 != mail2){
- cout << " BŁĄD: Podane adresy email różnią się!\n\n";
- return;
- }
- cout << " 5. Podaj stanowisko[" << dzial_obslugi << '/' << dzial_kredytow << "]:\n";
- cin >> stanowisko;
- input_OK(stanowisko);
- if (stanowisko != dzial_obslugi && stanowisko != dzial_kredytow ){
- cout << " BŁĄD: Stanowisko nie istnieje!\n\n";
- return;
- }
- work action(X, "addWr");
- action.prepared("addWorker")(imie)(nazwisko)(haslo1)(mail1)(stanowisko).exec();
- action.commit();
- cout << "\nUtworzono nowe konto pracownika!:\n" << imie << ' ' << nazwisko;
- cout << endl << mail1 << endl << haslo1 << endl << stanowisko << endl << endl;
- }
- void listClientLoan(connection& X, int id){
- work action(X, "listLoans");
- result R = action.prepared("clGetData")(id).exec();
- cout << "Kredyty użytkownika: " << R.begin()["Imie"] << ' ';
- cout << R.begin()["Nazwisko"] << ", " << R.begin()["Mail"] << endl << endl;
- R = action.prepared("clGetLoans")(id).exec();
- for (auto iter = R.begin(); iter != R.end(); iter++){
- cout << "ID: " << iter["ID"].c_str() << endl;
- cout << "Kwota: " << iter["Wartosc"].c_str() << endl;
- cout << "Typ: " << iter["Typ"].c_str() << endl;
- cout << "Data ostatniej wpłaty: " << iter["Ostatnia_rata_data"].c_str() << endl;
- cout << "Termin następnej raty: " << iter["Nastepna_rata_data"].c_str()<< endl;
- cout << "Kwota następnej raty: " << iter["Nastepna_rata"].c_str()<< endl << endl;
- }
- action.commit();
- }
- void listClientTrans(connection& X, int id){
- work action(X, "listLoans");
- result R = action.prepared("clGetData")(id).exec();
- cout << "Wpłaty użytkownika: " << R.begin()["Imie"] << ' ';
- cout << R.begin()["Nazwisko"] << ", " << R.begin()["Mail"] << endl << endl;
- R = action.prepared("clGetTrans")(id).exec();
- for (auto iter = R.begin(); iter != R.end(); iter++){
- cout << "ID: " << iter["ID"].c_str() << endl;
- cout << "Kwota: " << iter["Kwota"].c_str() << endl;
- cout << "Data: " << iter["Data"].c_str() << endl << endl;
- }
- action.commit();
- }
- void simLoan(connection& X, int id){
- work action(X, "simLoan");
- cout << "Wpisz teraz ID kredytu do zasymulowania: \n\n";
- int id_k;
- cin >> id_k;
- result R = action.prepared("crCount")(id_k)(id).exec();
- int i = 1;
- while((R.begin()[0].c_str()[0] != '0')){
- cout << " Nr. raty: " << i << endl;
- R = action.prepared("crVal")(id_k)(id).exec();
- cout << " Stara kwota kredytu: " << R.begin()["Wartosc"].c_str() << endl;
- R = action.prepared("crRata")(id_k)(id).exec();
- cout << " Kwota raty: " <<R.begin()["Nastepna_rata"].c_str() << endl;
- action.prepared("addWplata")(id)(id_k)(R.begin()[0].c_str()).exec();
- R = action.prepared("crVal")(id_k)(id).exec();
- cout << " Nowa kwota kredytu: " << R.begin()["Wartosc"].c_str() << endl << endl;
- R = action.prepared("crCount")(id_k)(id).exec();
- ++i;
- }
- action.abort();
- }
- void clientMenu(connection& X, int id){
- work action(X, "clData");
- result R = action.prepared("clGetData")(id).exec();
- // Nie sprawdzam poprawności, sprawdziłem już w sumie wcześniej
- cout << "\nUżytkownik: " << R.begin()["Imie"] << ' ';
- cout << R.begin()["Nazwisko"] << ", " << R.begin()["Mail"] << endl;
- action.commit();
- bool cont = true;
- while (cont){
- cout << "Witamy w menu klienta!\n";
- cout << "Co chcesz teraz zrobić?\n";
- cout << " 1. Zobacz kredyty\n";
- cout << " 2. Zobacz historię wpłat\n";
- cout << " 3. Zasymuluj spłacanie kredytu\n";
- cout << " 4. Logoff\n\n";
- int option;
- cin >> option;
- switch(option){
- case 1:
- listClientLoan(X, id);
- break;
- case 2:
- listClientTrans(X, id);
- break;
- case 3:
- simLoan(X, id);
- break;
- case 4:
- cout << "Do widzenia!\n\n";
- cont = false;
- break;
- default:
- throw BadOptionException();
- }
- }
- }
- void clientSession(connection& X){
- int id;
- string haslo;
- string podaneHaslo;
- work action(X, "cSession");
- cout << "Podaj ID klienta:\n";
- cin >> id;
- result R = action.prepared("clGetPass")(id).exec();
- if (R.begin() == R.end()){
- cout << " BŁĄD: Podano błędne ID!\n\n";
- return;
- }
- haslo = string(R.begin()[0].c_str());
- cout << "Podaj hasło:\n";
- cin >> podaneHaslo;
- if (haslo != podaneHaslo){
- cout << " BŁĄD: Podano błędne hasło!\n\n";
- return;
- }
- action.commit();
- clientMenu(X, id);
- }
- void listClients(connection& X){
- work action(X, "listClients");
- result R = action.exec("SELECT ID, Imie, Nazwisko, Mail FROM Klient;");
- cout << "Lista Klientów:\n\n";
- for (auto iter = R.begin(); iter != R.end(); iter++){
- cout << "ID: " << iter["ID"].c_str() << endl;
- cout << iter["Imie"].c_str() << ' ' << iter["Nazwisko"].c_str() << endl;
- cout << iter["Mail"].c_str() << endl << endl;
- }
- action.commit();
- }
- void listTrans(connection& X){
- work action(X, "listTrans");
- result R = action.exec("SELECT ID, Kwota, Data, ID_Kredytu, ID_Klienta FROM Wplata;");
- cout << "Lista Wpłat:\n\n";
- for (auto iter = R.begin(); iter != R.end(); iter++){
- cout << "ID: " << iter["ID"].c_str() << endl;
- cout << "Kwota: " << iter["Kwota"].c_str() << endl;
- cout << "Data przelewu: " << iter["Data"].c_str() << endl;
- cout << "Nr. kredytu: " << iter["ID_Kredytu"].c_str() << endl;
- cout << "Nr. klienta: " << iter["ID_Klienta"].c_str() << endl << endl;
- }
- action.commit();
- }
- void listLoans(connection& X){
- work action(X, "listLoans");
- result R = action.exec("SELECT ID, Wartosc, Typ, Ostatnia_rata_data, Nastepna_rata, Nastepna_rata_data, ID_Klienta FROM Kredyt;");
- cout << "Lista Kredytów:\n\n";
- for (auto iter = R.begin(); iter != R.end(); iter++){
- cout << "ID: " << iter["ID"].c_str() << endl;
- cout << "Kwota: " << iter["Wartosc"].c_str() << endl;
- cout << "Typ kredytu: " << iter["Typ"].c_str() << endl;
- cout << "Nr. klienta: " << iter["ID_Klienta"].c_str() << endl;
- cout << "Data ostatniej wpłaty: " << iter["Ostatnia_rata_data"].c_str() << endl;
- cout << "Termin następnej raty: " << iter["Nastepna_rata_data"].c_str() << endl;
- cout << "Kwota następnej raty: " << iter["Nastepna_rata"].c_str() << endl << endl;
- }
- action.commit();
- }
- void wrKredytMenu(connection& X, int id){
- work action(X, "wrData");
- result R = action.prepared("wrGetData")(id).exec();
- // Nie sprawdzam poprawności, sprawdziłem już w sumie wcześniej
- cout << "\nUżytkownik: " << R.begin()["Imie"] << ' ';
- cout << R.begin()["Nazwisko"] << ", " << R.begin()["Mail"];
- cout << ", dział: " << R.begin()["Stanowisko"] << endl;
- action.commit();
- bool cont = true;
- while (cont){
- cout << "Dział kredytów.\n";
- cout << "Co chcesz teraz zrobić?\n";
- cout << " 1. Zobacz listę klientów\n";
- cout << " 2. Zobacz listę wpłat\n";
- cout << " 3. Zobacz listę kredytów\n";
- cout << " 4. Udziel kredytu\n";
- cout << " 5. Logoff\n\n";
- int option;
- cin >> option;
- switch(option){
- case 1:
- listClients(X);
- break;
- case 2:
- listTrans(X);
- break;
- case 3:
- listLoans(X);
- break;
- case 4:
- addLoan(X);
- break;
- case 5:
- cout << "Do widzenia!\n\n";
- cont = false;
- break;
- default:
- throw BadOptionException();
- }
- }
- }
- void wrObslugaMenu(connection& X, int id){
- work action(X, "wrData");
- result R = action.prepared("wrGetData")(id).exec();
- // Nie sprawdzam poprawności, sprawdziłem już w sumie wcześniej
- cout << "\nUżytkownik: " << R.begin()["Imie"] << ' ';
- cout << R.begin()["Nazwisko"] << ", " << R.begin()["Mail"];
- cout << ", dział: " << R.begin()["Stanowisko"] << endl;
- action.commit();
- bool cont = true;
- while (cont){
- cout << "Dział obsługi.\n";
- cout << "Co chcesz teraz zrobić?\n";
- cout << " 1. Zobacz listę klientów\n";
- cout << " 2. Zobacz listę wpłat\n";
- cout << " 3. Zobacz listę kredytów\n";
- cout << " 4. Zaksięguj wpłatę\n";
- cout << " 5. Logoff\n\n";
- int option;
- cin >> option;
- switch(option){
- case 1:
- listClients(X);
- break;
- case 2:
- listTrans(X);
- break;
- case 3:
- listLoans(X);
- break;
- case 4:
- addWplata(X);
- break;
- case 5:
- cout << "Do widzenia!\n\n";
- cont = false;
- break;
- default:
- throw BadOptionException();
- }
- }
- }
- void workerSession(connection& X){
- int id;
- string haslo;
- string podaneHaslo;
- work action(X, "wSession");
- cout << "Podaj ID pracownika:\n";
- cin >> id;
- result R = action.prepared("wrGetPass")(id).exec();
- if (R.begin() == R.end()){
- cout << " BŁĄD: Podano błędne ID!\n\n";
- return;
- }
- haslo = string(R.begin()[0].c_str());
- cout << "Podaj hasło:\n";
- cin >> podaneHaslo;
- if (haslo != podaneHaslo){
- cout << " BŁĄD: Podano błędne hasło!\n\n";
- return;
- }
- R = action.prepared("wrGetWplace")(id).exec();
- string wplace(R.begin()["Stanowisko"].c_str());
- action.commit();
- if (wplace == dzial_kredytow){
- wrKredytMenu(X, id);
- } else if (wplace == dzial_obslugi){
- wrObslugaMenu(X, id);
- } else {
- cout << " BŁĄD: Nieznany dział: \"" << wplace << "\"\n";
- return;
- }
- }
- void listWorkers(connection& X){
- work action(X, "listWorkers");
- result R = action.exec("SELECT ID, Imie, Nazwisko, Mail, Stanowisko FROM Pracownik;");
- cout << "Lista Pracowników:\n\n";
- for (auto iter = R.begin(); iter != R.end(); iter++){
- cout << "ID: " << iter["ID"].c_str() << endl;
- cout << iter["Imie"].c_str() << ' ' << iter["Nazwisko"].c_str() << endl;
- cout << "Dział: " << iter["Stanowisko"].c_str() << endl;
- cout << iter["Mail"].c_str() << endl << endl;
- }
- action.commit();
- }
- void listLoanTypes(connection& X){
- work action(X, "listLoanTypes");
- result R = action.exec("SELECT ID, Podst_rata, Procent, Odsetki FROM Typ_Kredytu;");
- cout << "Typy kredytów:\n\n";
- for (auto iter = R.begin(); iter != R.end(); iter++){
- cout << "ID: " << iter["ID"].c_str() << endl;
- cout << "Baza raty: " << iter["Podst_rata"].c_str() << endl;
- cout << "Procent na ratę: " << iter["Procent"].c_str() << endl;
- cout << "Odsetki karne: " << iter["Odsetki"].c_str() << endl << endl;
- }
- action.commit();
- }
- void addLoanType(connection& X){
- cout << "Podaj teraz parametry typu konta:\n 1. Podstawowa rata:\n";
- double rata;
- double odsetki, procent;
- cin >> rata;
- if (rata < 0.01){
- cout << " BŁĄD: Kwota raty <= 0.01!\n\n";
- return;
- }
- cout << " 2. Procent kredytu na ratę:\n";
- cin >> procent;
- if (procent < 0){
- cout << " BŁĄD: Procent < 0!\n\n";
- return;
- }
- cout << " 3. Odsetki:\n";
- cin >> odsetki;
- if (odsetki < 0){
- cout << " BŁĄD: Odsetki < 0!\n\n";
- return;
- }
- work action(X, "addLoanType");
- action.prepared("addLoanType")(rata)(procent)(odsetki).exec();
- action.commit();
- cout << "\nUtworzono nowy typ kredytu!:\n";
- cout << "Baza raty: " << rata << endl;
- cout << "Procent na ratę: " << procent << endl;
- cout << "Odsetki karne: " << odsetki << endl << endl;
- }
- int main(){
- // Rzecz jasna łączenie z bazą danych
- cout << "\nSYSTEM KREDYTOWY KP332436\n";
- string db;
- string host;
- cout << "Proszę podać nazwę bazy danych\n";
- cin >> db;
- cout << "Proszę podać nazwę hosta\n";
- cin >> host;
- cout << "Proszę podać port (domyślnie 5432)\n";
- string port;
- cin >> port;
- cout << "Proszę podać nazwę admina\n";
- string adm;
- cin >> adm;
- cout << "Proszę podać hasło\n";
- string pass;
- cin >> pass;
- input_OK(db);
- input_OK(host);
- input_OK(port);
- input_OK(adm);
- input_OK(pass);
- connection kp332436("dbname=\'" + db + "\' host=\'" + host + "\' port=\'" + port + "\' user=\'" + adm + "\' password=\'" + pass + "\'");
- cout << "Nawiązano połączenie\n\n";
- // Doprowadź bazę danych do stanu używalności, jeżeli w nim nie jest
- work action(kp332436, skloop);
- {
- cout << "Czy chcesz usunąć stare tabele? [y/n][UŻYWAĆ TYLKO JEŚLI ISTNIEJĄ]\n";
- char c;
- cin >> c;
- if (c != 'n' && c != 'N' && c != 'y' && c != 'Y'){
- throw BadOptionException();
- }
- if (c == 'y' || c == 'Y'){
- action.exec("DROP TRIGGER process_wplata ON Wplata");
- action.exec("DROP TRIGGER process_kredyt ON Kredyt");
- action.exec("DROP FUNCTION process_wpłata()");
- action.exec("DROP FUNCTION process_kredyt()");
- action.exec("DROP TABLE Klient");
- action.exec("DROP TABLE Pracownik");
- action.exec("DROP TABLE Wplata");
- action.exec("DROP TABLE Kredyt");
- action.exec("DROP TABLE Typ_Kredytu");
- }
- }
- {
- cout << "Czy chcesz utworzyć czyste tabele? [y/n][UŻYWAĆ TYLKO JEŚLI NIE ISTNIEJĄ]\n";
- char c;
- cin >> c;
- if (c != 'n' && c != 'N' && c != 'y' && c != 'Y'){
- throw BadOptionException();
- }
- if (c == 'y' || c == 'Y'){
- action.exec("CREATE TABLE Klient (ID SERIAL PRIMARY KEY, Imie TEXT, Nazwisko TEXT, Haslo TEXT, Mail TEXT)");
- action.exec("CREATE TABLE Pracownik (ID SERIAL PRIMARY KEY, Imie TEXT, Nazwisko TEXT, Haslo TEXT, Mail TEXT, Stanowisko TEXT)");
- action.exec("CREATE TABLE Wplata (ID SERIAL PRIMARY KEY, Kwota NUMERIC(99,2), ID_Kredytu INTEGER, ID_Klienta INTEGER, Data DATE)");
- 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)");
- action.exec("CREATE TABLE Typ_Kredytu (ID SERIAL PRIMARY KEY, Podst_rata NUMERIC(99,2), Procent FLOAT, Odsetki FLOAT)");
- string process_wplata = "CREATE FUNCTION process_wpłata()\n";
- process_wplata += "RETURNS trigger AS $process_wpłata$\n";
- process_wplata += "BEGIN\n";
- // Istnienie kreduty
- process_wplata += "IF NOT (SELECT COUNT(*) FROM Kredyt WHERE Kredyt.ID = NEW.ID_Kredytu) >= 1 THEN\n";
- process_wplata += "RAISE EXCEPTION 'Kredyt nie istnieje!';\n";
- process_wplata += "END IF;\n";
- // Istnienie klienta
- process_wplata += "IF NOT NEW.ID_Klienta = (SELECT ID_Klienta FROM Kredyt WHERE Kredyt.ID = NEW.ID_Kredytu) THEN\n";
- process_wplata += "RAISE EXCEPTION 'Klient spłaca nie swój kredyt?!';\n";
- process_wplata += "END IF;\n";
- // Dobra kwota
- process_wplata += "IF NOT NEW.Kwota = (SELECT Nastepna_rata FROM Kredyt WHERE (Kredyt.ID = NEW.ID_Kredytu)) THEN\n";
- process_wplata += "RAISE EXCEPTION 'Zła kwota wpłaty!, % != %', (SELECT Nastepna_rata FROM Kredyt WHERE (Kredyt.ID = NEW.ID_Kredytu)), NEW.Kwota;\n";
- process_wplata += "END IF;\n";
- // Data
- process_wplata += "NEW.Data = current_date;\n";
- // Wpłać ratę
- process_wplata += "UPDATE Kredyt SET Wartosc = Wartosc - NEW.Kwota WHERE Kredyt.ID = NEW.ID_Kredytu;\n";
- // Termin nastpnej raty
- process_wplata += "UPDATE Kredyt SET Nastepna_rata_data = Nastepna_rata_data + interval '1 month' WHERE Kredyt.ID = NEW.ID_Kredytu;\n";
- // Terin osttaniej wpłaty
- process_wplata += "UPDATE Kredyt SET Ostatnia_rata_data = current_date WHERE Kredyt.ID = NEW.ID_Kredytu;\n";
- // Kwota następnej raty
- 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)) + ";
- process_wplata += "(SELECT Procent FROM Typ_Kredytu WHERE Typ_Kredytu.ID = (SELECT Typ FROM Kredyt WHERE Kredyt.ID = NEW.ID_Kredytu)) * ";
- process_wplata += "((SELECT Wartosc FROM Kredyt WHERE Kredyt.ID = NEW.ID_Kredytu) - ";
- process_wplata += "(SELECT Podst_rata FROM Typ_Kredytu WHERE Typ_Kredytu.ID = (SELECT Typ FROM Kredyt WHERE Kredyt.ID = NEW.ID_Kredytu))) ";
- process_wplata += "WHERE Kredyt.ID = NEW.ID_Kredytu;\n";
- // Popraw kwotę raty jeśli trzeba
- 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";
- process_wplata += "UPDATE Kredyt SET Nastepna_rata = Wartosc WHERE Kredyt.ID = NEW.ID_Kredytu;\n";
- process_wplata += "END IF;\n";
- // Kredyt spłacony, usun z bazy
- process_wplata += "IF (SELECT Wartosc FROM Kredyt WHERE Kredyt.ID = NEW.ID_Kredytu) <= 0 THEN\n";
- process_wplata += "DELETE FROM Kredyt WHERE Kredyt.ID = NEW.ID_Kredytu;\n";
- process_wplata += "END IF;\n";
- process_wplata += "RETURN NEW;\n";
- process_wplata += "END\n";
- process_wplata += "$process_wpłata$ LANGUAGE plpgsql;\n";
- action.exec(process_wplata);
- //TRIGGER
- string wyz_wplata = "CREATE TRIGGER process_wplata\nBEFORE INSERT ON Wplata\nFOR EACH ROW\nEXECUTE PROCEDURE process_wpłata();\n";
- action.exec(wyz_wplata);
- // Wyzwalacz kredytu
- string process_kredyt = "CREATE FUNCTION process_kredyt()\n";
- process_kredyt += "RETURNS trigger AS $process_kredyt$\n";
- process_kredyt += "BEGIN\n";
- // Czy typ kredytu istnieje
- process_kredyt += "IF NOT (SELECT COUNT(*) FROM Typ_Kredytu WHERE Typ_Kredytu.ID = NEW.Typ) >= 1 THEN\n";
- process_kredyt += "RAISE EXCEPTION 'Typ kredytu nie istnieje!';\n";
- process_kredyt += "END IF;\n";
- // Czy klient istnieje
- process_kredyt += "IF NOT (SELECT COUNT(*) FROM Klient WHERE klient.ID = NEW.ID_Klienta) >= 1 THEN\n";
- process_kredyt += "RAISE EXCEPTION 'Nie ma klienta nie ma kredytu!';\n";
- process_kredyt += "END IF;\n";
- // Czy klient nie ma już kredytu tego typu
- process_kredyt += "IF NOT (SELECT COUNT(*) FROM Kredyt WHERE Kredyt.Typ = NEW.Typ AND Kredyt.ID_Klienta = NEW.ID_Klienta) = 0 THEN\n";
- process_kredyt += "RAISE EXCEPTION 'Klient już ma kredyt tego typu!';\n";
- process_kredyt += "END IF;\n";
- process_kredyt += "NEW.Nastepna_rata_data = current_date + interval '1 month';\n";
- process_kredyt += "NEW.Nastepna_rata = (SELECT Podst_rata FROM Typ_Kredytu WHERE Typ_Kredytu.ID = NEW.Typ) + ";
- process_kredyt += "(SELECT Procent FROM Typ_Kredytu WHERE Typ_Kredytu.ID = NEW.Typ) * ";
- process_kredyt += "(NEW.Wartosc - (SELECT Podst_rata FROM Typ_Kredytu WHERE Typ_Kredytu.ID = NEW.Typ));\n";
- process_kredyt += "IF NEW.Nastepna_rata > NEW.Wartosc THEN\n";
- process_kredyt += "NEW.Nastepna_rata = NEW.Wartosc;\n";
- process_kredyt += "END IF;\n";
- process_kredyt += "RETURN NEW;\n";
- process_kredyt += "END\n";
- process_kredyt += "$process_kredyt$ LANGUAGE plpgsql;\n";
- action.exec(process_kredyt);
- //TRIGGER
- string wyz_kredyt = "CREATE TRIGGER process_kredyt\nBEFORE INSERT ON Kredyt\nFOR EACH ROW\nEXECUTE PROCEDURE process_kredyt();\n";
- action.exec(wyz_kredyt);
- }
- }
- action.commit();
- // Przgotowywanie procedur, zapytań etc.
- {
- // DOdawanie klienta
- string addKl("INSERT INTO Klient (Imie, Nazwisko, Haslo, Mail) VALUES ($1, $2, $3, $4);");
- kp332436.prepare("addKlient", addKl);
- // Wyciąganie hasła klienta
- string clGetPass("SELECT haslo FROM Klient WHERE ID = $1;");
- kp332436.prepare("clGetPass", clGetPass);
- // Wyciąganie danych klienta
- string clGetData("SELECT Imie, Nazwisko, Mail FROM Klient WHERE ID = $1;");
- kp332436.prepare("clGetData", clGetData);
- // Wyciąganie kredytów klienta
- string clGetLoans("SELECT ID, Wartosc, Typ, Ostatnia_rata_data, Nastepna_rata_data, Nastepna_rata FROM Kredyt WHERE ID_Klienta = $1;");
- kp332436.prepare("clGetLoans", clGetLoans);
- // Wyciąganie wpłat klienta
- string clGetTrans("SELECT ID, Kwota, Data FROM Wplata WHERE ID_Klienta = $1;");
- kp332436.prepare("clGetTrans", clGetTrans);
- // Dodawanie pracownika
- string addWr("INSERT INTO Pracownik (Imie, Nazwisko, Haslo, Mail, Stanowisko) VALUES ($1, $2, $3, $4, $5);");
- kp332436.prepare("addWorker", addWr);
- // Wyciąganie hasła pracownika
- string wrGetPass("SELECT haslo FROM Pracownik WHERE ID = $1;");
- kp332436.prepare("wrGetPass", wrGetPass);
- // Wyciąganie działu pracownika
- string wrGetWplace("SELECT Stanowisko FROM Pracownik WHERE ID = $1;");
- kp332436.prepare("wrGetWplace", wrGetWplace);
- // Wyciąganie danych klienta
- string wrGetData("SELECT Imie, Nazwisko, Mail, Stanowisko FROM Pracownik WHERE ID = $1;");
- kp332436.prepare("wrGetData", wrGetData);
- // Dodawanie typu kredytu
- string addLoanT("INSERT INTO Typ_Kredytu (Podst_rata, Procent, Odsetki) VALUES ($1, $2, $3);");
- kp332436.prepare("addLoanType", addLoanT);
- // Dodawanie kredytu
- string addLoan("INSERT INTO Kredyt (ID_Klienta, Typ, Wartosc) VALUES ($1, $2, $3);");
- kp332436.prepare("addLoan", addLoan);
- // Dodawanie wpłaty
- string addWplata("INSERT INTO Wplata (ID_Klienta, ID_Kredytu, Kwota) VALUES ($1, $2, $3);");
- kp332436.prepare("addWplata", addWplata);
- // Wyciąganie kredytu danego klienta
- string crCount("SELECT COUNT(*) FROM Kredyt WHERE ID = $1 AND ID_Klienta = $2;");
- kp332436.prepare("crCount", crCount);
- // Wyciąganie następnej raty kredytu danego klienta
- string crRata("SELECT Nastepna_rata FROM Kredyt WHERE ID = $1 AND ID_Klienta = $2;");
- kp332436.prepare("crRata", crRata);
- // Wyciąganie kwoty kredytu klienta
- string crVal("SELECT Wartosc FROM Kredyt WHERE ID = $1 AND ID_Klienta = $2;");
- kp332436.prepare("crVal", crVal);
- }
- cout << "Witamy w systemie kredytowym kp332436!\n";
- bool cont = true;
- // Pętla programu
- while (cont){
- cout << "\nMenu Główne\nCo chcesz teraz zrobić? Wpisz numer opcji:\n";
- cout << " 1. Shutdown\n";
- cout << " 2. Utwórz konto klienta\n";
- cout << " 3. Utwórz konto pracownika\n";
- cout << " 4. Zaloguj klienta\n";
- cout << " 5. Zaloguj pracownika\n";
- cout << " 6. Pokaż listę klientów\n";
- cout << " 7. Pokaż listę pracowników\n";
- cout << " 8. Dodaj typ kredytu\n";
- cout << " 9. Pokaż typy kredytów\n\n";
- int opt;
- cin >> opt;
- switch(opt){
- case 1:
- cont = false;
- cout << "Shutting down\n";
- break;
- case 2:
- addClient(kp332436);
- break;
- case 3:
- addWorker(kp332436);
- break;
- case 4:
- clientSession(kp332436);
- break;
- case 5:
- workerSession(kp332436);
- break;
- case 6:
- listClients(kp332436);
- break;
- case 7:
- listWorkers(kp332436);
- break;
- case 8:
- addLoanType(kp332436);
- break;
- case 9:
- listLoanTypes(kp332436);
- break;
- default:
- throw BadOptionException();
- break;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement