Advertisement
Alx09

Untitled

May 21st, 2024
646
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 26.99 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <time.h>
  6. #include <windows.h>
  7.  
  8. typedef enum {
  9.     ADMIN,
  10.     USER
  11. } UserType;
  12.  
  13. typedef enum {
  14.     DEPOSIT,
  15.     WITHDRAW,
  16.     TRANSFER
  17. } OperationType;
  18.  
  19. typedef enum {
  20.     INITIATED,
  21.     PROCESSING,
  22.     CANCELED,
  23.     BLOCKED,
  24.     SUCCESFUL
  25. } OperationResult;
  26.  
  27. //Structura pentru un cont bancar
  28. typedef struct Cont {
  29.     char IBAN[25];
  30.     double sold;
  31.     char CNP_proprietar[14];
  32.     char valuta[4];
  33.     struct Cont* next;
  34.     struct Extrase* extraseLista;
  35. } Cont;
  36.  
  37. //Structura pentru utilizator
  38. typedef struct User {
  39.     char username[50];
  40.     char password[50];
  41.     char CNP[14];
  42.     char nume[50];
  43.     char prenume[50];
  44.     UserType type;
  45.     struct User* next;
  46.     Cont* headAccount;
  47.     Cont* tailAccount;
  48. } User;
  49.  
  50. //Structura pentru un extras de cont;
  51. typedef struct Extrase {
  52.     OperationType type;
  53.     OperationResult result;
  54.     char reason[100];
  55.     struct Extrase* next;
  56. } Extrase;
  57.  
  58. User *usersList = NULL;
  59. User *currentUser = NULL;
  60. Cont *accountsList = NULL;
  61. Cont* currentAccount = NULL;
  62. Extrase *listaExtrase = NULL;
  63. int delogat;
  64. const char* USERS_FILE = "users.txt";
  65. const char* ACCOUNTS_FILE = "accounts.txt";
  66.  
  67.  
  68. const char* operationToStrng(OperationType operation) {
  69.     switch (operation)
  70.     {
  71.     case DEPOSIT: return "DEPOSIT"; break;
  72.     case WITHDRAW: return "WITHDRAW"; break;
  73.     case TRANSFER: return "TRANSFER"; break;
  74.     default: return "nedefinit";
  75.         break;
  76.     }
  77. }
  78.  
  79. enum OperationType typeToEnum(const char* type) {
  80.     if (strcmp("DEPOSIT", type) == 0) return DEPOSIT;
  81.     if (strcmp("WITHDRAW", type) == 0) return WITHDRAW;
  82.     if (strcmp("TRANSFER", type) == 0) return TRANSFER;
  83. }
  84.  
  85. enum OperationResult resultToEnum(const char* result) {
  86.     if (strcmp("INITIATED", result) == 0) return INITIATED;
  87.     if (strcmp("PROCESSING", result) == 0) return PROCESSING;
  88.     if (strcmp("CANCELED", result) == 0) return CANCELED;
  89.     if (strcmp("BLOCKED", result) == 0) return BLOCKED;
  90.     if (strcmp("SUCCESFUL", result) == 0) return SUCCESFUL;
  91. }
  92.  
  93.  
  94.  
  95. const char* resultToString(OperationResult result) {
  96.     switch (result)
  97.     {
  98.     case INITIATED: return "INITIATED"; break;
  99.     case PROCESSING: return "PROCESSING"; break;
  100.     case CANCELED: return "CANCELED"; break;
  101.     case BLOCKED: return "BLOCKED"; break;
  102.     case SUCCESFUL: return "SUCCESFUL"; break;
  103.     default: return "nedefinit";
  104.         break;
  105.     }
  106. }
  107.  
  108. //Functie pentru a adauga un nou cont la sfarsit
  109. User* addAccount(User* user, Cont* cont) {
  110.     if (user->headAccount == NULL) {
  111.         user->headAccount = cont;
  112.         user->tailAccount = cont;
  113.     }
  114.     else {
  115.         user->tailAccount->next = cont;
  116.         user->tailAccount = cont;
  117.     }
  118.     return user;
  119. }
  120.  
  121.  
  122. void addAccountToUser(User* user, Cont* newAccount) {
  123.     if (user->headAccount == NULL) {
  124.         user->headAccount = newAccount;
  125.     }
  126.     else {
  127.         Cont* current = user->headAccount;
  128.         while (current->next != NULL) {
  129.             current = current->next;
  130.         }
  131.         current->next = newAccount;
  132.     }
  133. }
  134.  
  135. //Adaugare utilizator
  136. User* addSorted(struct User* head, struct User* p) {
  137.     User* q = head;
  138.     if (head == NULL) {
  139.         head = p;
  140.     }
  141.     else if (strcmp(head->username, p->username) > 0) {
  142.         p->next = head;
  143.         head = p;
  144.         return head;
  145.     }
  146.     else {
  147.         while (q->next != NULL && strcmp(q->next->username, p->username) < 0) {
  148.             q = q->next;
  149.         }
  150.         p->next = q->next;
  151.         q->next = p;
  152.     }
  153.     return head;
  154. }
  155.  
  156. void saveUsersToFile() {
  157.     FILE* file = fopen(USERS_FILE, "w");
  158.     if (file == NULL) {
  159.         printf("Eroare la deschiderea fisierului.\n");
  160.         return;
  161.     }
  162.  
  163.     User* current = usersList;
  164.     while (current != NULL) {
  165.         fprintf(file, "%s %s %s %s %s %d\n", current->username, current->password, current->CNP,
  166.             current->nume, current->prenume, current->type);
  167.         current = current->next;
  168.  
  169.     }
  170.  
  171.     fclose(file);
  172. }
  173.  
  174. void saveAccountsToFile() {
  175.     FILE* file = fopen(ACCOUNTS_FILE, "w");
  176.     if (file == NULL) {
  177.         printf("Eroare la deschiderea fisierului conturilor.\n");
  178.         return;
  179.     }
  180.  
  181.     User* currentUser = usersList;
  182.     while (currentUser != NULL) {
  183.         Cont* currentAccount = currentUser->headAccount;
  184.         while (currentAccount != NULL) {
  185.             fprintf(file, "%s %s %s %lf\n", currentAccount->IBAN, currentAccount->CNP_proprietar, currentAccount->valuta, currentAccount->sold);
  186.             currentAccount = currentAccount->next;
  187.         }
  188.         currentUser = currentUser->next;
  189.     }
  190.  
  191.     fclose(file);
  192. }
  193.  
  194. void saveExtraseToFile(Cont* cont) {
  195.     char fileName[50];
  196.     sprintf(fileName, "%s_extrase.txt", cont->IBAN);
  197.  
  198.     FILE* file = fopen(fileName, "w");
  199.     if (file == NULL) {
  200.         printf("Eroare la deschiderea fișierului de extrase.\n");
  201.         return;
  202.     }
  203.     Extrase* current = cont->extraseLista;
  204.     while (current != NULL) {
  205.         const char* type = operationToStrng(current->type);
  206.         const char* result = resultToString(current->result);
  207.         fprintf(file, "%s %s %s %s\n", cont->IBAN, type, result, current->reason);
  208.         current = current->next;
  209.     }
  210.     fclose(file);
  211. }
  212.  
  213. void loadExtraseFromFile(Cont* cont) {
  214.     char fileName[50];
  215.     sprintf(fileName, "%s_extrase.txt", cont->IBAN);
  216.     FILE* file = fopen(fileName, "r");
  217.     if (file == NULL) {
  218.         return;
  219.     }
  220.     char iban[25], type[20], reason[100], timestamp[20], result[20];
  221.     int rezultat,tip;
  222.     char line[100];
  223.     while (fgets(line, sizeof(line), file)) {
  224.         if (sscanf(line, "%s %s %s", iban, type, result) == 3) {
  225.             if (strcmp(result, "SUCCESFUL") == 0) {
  226.                 if (strcmp(cont->IBAN, iban) == 0) {
  227.                     Extrase* newExtrase = (Extrase*)malloc(sizeof(Extrase));
  228.                     if (newExtrase != NULL) {
  229.                         tip = typeToEnum(type);
  230.                         rezultat = resultToEnum(result);
  231.                         newExtrase->type = tip;
  232.                         newExtrase->result = rezultat;
  233.                         reason[0] = '\0';
  234.                         strcpy(newExtrase->reason, reason);
  235.                         newExtrase->next = cont->extraseLista;
  236.                         cont->extraseLista = newExtrase;
  237.                     }
  238.                 }
  239.             }
  240.             else {
  241.                 sscanf(line, "%*s %*s %*s %s", reason);
  242.                 if (strcmp(cont->IBAN, iban) == 0) {
  243.                     Extrase* newExtrase = (Extrase*)malloc(sizeof(Extrase));
  244.                     if (newExtrase != NULL) {
  245.                         tip = typeToEnum(type);
  246.                         rezultat = resultToEnum(result);
  247.                         newExtrase->type = tip;
  248.                         newExtrase->result = rezultat;
  249.                         reason[0] = '\0';
  250.                         strcpy(newExtrase->reason, reason);
  251.                         newExtrase->next = cont->extraseLista;
  252.                         cont->extraseLista = newExtrase;
  253.                     }
  254.                 }
  255.             }
  256.         }
  257.     }
  258.  
  259.     fclose(file);
  260. }
  261.  
  262. void addExtrase(Cont* cont, OperationType type, OperationResult result, const char* reason) {
  263.     Extrase* newExtrase = (Extrase*)malloc(sizeof(Extrase));
  264.     if (newExtrase == NULL) {
  265.         printf("Eroare la alocarea memoriei pentru extrase.\n");
  266.         return;
  267.     }
  268.  
  269.     newExtrase->type = type;
  270.     newExtrase->result = result;
  271.     strcpy(newExtrase->reason, reason);
  272.  
  273.     newExtrase->next = cont->extraseLista;
  274.     cont->extraseLista = newExtrase;
  275. }
  276.  
  277. //Functie pentru schimbarea parolei
  278. void changePassword(User* user, const char* newPassword) {
  279.     if (user == NULL) {
  280.         printf("Eroare contul nu exista.\n");
  281.         return;
  282.     }
  283.  
  284.     strcpy(user->password, newPassword);
  285.     printf("Parola utilizatorului a fost actualizata cu succes.\n");
  286.  
  287.     saveUsersToFile();
  288. }
  289.  
  290. void printExtrase(Cont* cont) {
  291.     printf("Extrasele pentru contul cu IBAN-ul %s:\n", cont->IBAN);
  292.     Extrase* current = cont->extraseLista;
  293.     while (current != NULL) {
  294.         printf("Tip operatie: %s\n", operationToStrng(current->type));
  295.         printf("Rezultat operatie: %s\n", resultToString(current->result));
  296.         if(strcmp(resultToString(current->result),"SUCCESFUL")!=0)
  297.             printf("Motiv esuare: %s\n", current->reason);
  298.         printf("-------------------------\n");
  299.         current = current->next;
  300.     }
  301. }
  302.  
  303. void loadAllExtrase() {
  304.     currentUser = usersList;
  305.     while (currentUser != NULL) {
  306.         currentAccount = currentUser->headAccount;
  307.         while (currentAccount != NULL) {  
  308.             loadExtraseFromFile(currentAccount);
  309.             currentAccount = currentAccount->next;
  310.         }
  311.         currentUser = currentUser->next;
  312.     }
  313. }
  314.  
  315. //Incarca conturile IBAN existente
  316. void loadAccountsFromFile() {
  317.     FILE* file = fopen(ACCOUNTS_FILE, "r");
  318.     if (file == NULL) {
  319.         printf("Eroare la deschiderea fisierului conturilor.\n");
  320.         return;
  321.     }
  322.  
  323.     double sold;
  324.     char iban[50], CNP[14], valuta[50];
  325.     while (fscanf(file, "%s %s %s %lf\n", iban, CNP, valuta, &sold) != EOF) {
  326.         Cont* newAccount = (Cont*)malloc(sizeof(Cont));
  327.         if (newAccount != NULL) {
  328.             strcpy(newAccount->IBAN, iban);
  329.             strcpy(newAccount->CNP_proprietar, CNP);
  330.             strcpy(newAccount->valuta, valuta);
  331.             newAccount->sold = sold;
  332.             newAccount->next = NULL;
  333.             newAccount->extraseLista = NULL;
  334.  
  335.             User* currentUser = usersList;
  336.             while (currentUser != NULL) {
  337.                 if (strcmp(currentUser->CNP, CNP) == 0) {
  338.                     addAccountToUser(currentUser, newAccount);
  339.                     break;
  340.                 }
  341.                 currentUser = currentUser->next;
  342.             }
  343.  
  344.            
  345.         }
  346.     }
  347.  
  348.     fclose(file);
  349. }
  350. //Incarca conturile existente
  351. void loadUsersFromFile() {
  352.     FILE* file = fopen(USERS_FILE, "r");
  353.     if (file == NULL) {
  354.         printf("Eroare la deschiderea fisierului utilizatorilor.\n");
  355.         return;
  356.     }
  357.  
  358.     char username[50], password[50], CNP[14], nume[50], prenume[50];
  359.     int type;
  360.     while (fscanf(file, "%s %s %s %s %s %d\n", username, password, CNP, nume, prenume, &type) != EOF) {
  361.         User* newUser = (User*)malloc(sizeof(User));
  362.         if (newUser != NULL) {
  363.             strcpy(newUser->username, username);
  364.             strcpy(newUser->password, password);
  365.             strcpy(newUser->CNP, CNP);
  366.             strcpy(newUser->nume, nume);
  367.             strcpy(newUser->prenume, prenume);
  368.             newUser->type = type;
  369.             newUser->next = NULL;
  370.             newUser->headAccount = NULL;
  371.  
  372.             // Adaugă noul utilizator la lista de utilizatori
  373.             usersList = addSorted(usersList, newUser);
  374.         }
  375.     }
  376.  
  377.     fclose(file);
  378. }
  379.  
  380. //Meniu principal
  381. void meniu_principal() {
  382.     printf("Bine ati venit!\n");
  383.     printf("1. Autentificare\n");
  384.     printf("2. Inregistrare\n");
  385.     printf("3. Iesire\n");
  386. }
  387.  
  388. User* readUser() {
  389.     User* newUser = (User*)malloc(sizeof(User));
  390.     if (newUser == NULL) {
  391.         printf("Eroare la alocarea memoriei pentru utilizator!\n");
  392.         return NULL;
  393.     }
  394.     printf("Introduceti numele de utilizator: ");
  395.     scanf("%s", newUser->username);
  396.  
  397.     printf("Introduceti parola: ");
  398.     scanf("%s", newUser->password);
  399.  
  400.     printf("Introduceti CNP-ul: ");
  401.     scanf("%s", newUser->CNP);
  402.  
  403.     printf("Introduceti numele: ");
  404.     scanf("%s", newUser->nume);
  405.  
  406.     printf("Introduceti prenumele: ");
  407.     scanf("%s", newUser->prenume);
  408.  
  409.     int userType;
  410.     printf("Alegeti tipul de utilizator (0 - Admin, 1 - Utilizator): ");
  411.     scanf("%d", &userType);
  412.     newUser->type = userType == 0 ? ADMIN : USER;
  413.  
  414.     newUser->next = NULL;
  415.     newUser->headAccount = NULL;
  416.  
  417.     return newUser;
  418. }
  419.  
  420. int delogare(User** utilizator_curent) {
  421.     *utilizator_curent = NULL;
  422.     printf("Delogare efectuata cu succes.\n");
  423.     return 1;
  424. }
  425.  
  426. //Functie pentru a afisa conturile
  427. void ShowAccounts(User* user) {
  428.     if (user->headAccount == NULL) {
  429.         printf("Utilizatorul nu are nici un cont.\n");
  430.         return;
  431.     }
  432.     Cont* currentAccount = user->headAccount;
  433.  
  434.     printf("Conturile asociate utilizatorului %s sunt:\n", user->username);
  435.     while (currentAccount != NULL) {
  436.         printf("IBAN: %s | Sold: %.2f %s\n", currentAccount->IBAN, currentAccount->sold, currentAccount->valuta);
  437.         printExtrase(currentAccount);
  438.         currentAccount = currentAccount->next;
  439.     }
  440. }
  441.  
  442. //Functie pentru a afisa utilizatorii si conturile lor
  443. void showUsers(User* head) {
  444.     User* current = usersList;
  445.     while (current != NULL) {
  446.         printf("Utilizator: %s\nCNP: %s\n", current->username, current->CNP);
  447.         ShowAccounts(current);
  448.         current = current->next;
  449.     }
  450. }
  451.  
  452. void showUsersWithoutAccounts(User* head) {
  453.     User* current = usersList;
  454.     while (current != NULL) {
  455.         printf("Utilizator: %s\nCNP: %s\n", current->username, current -> CNP);
  456.         current = current->next;
  457.     }
  458. }
  459.  
  460. Cont* selectAccount(User* user) {
  461.     char iban[25];
  462.     printf("Introduceti IBAN-ul contului pe care doriti sa-l selectati: ");
  463.     scanf("%s", iban);
  464.  
  465.     Cont* currentAccount = user->headAccount;
  466.     while (currentAccount != NULL) {
  467.         if (strcmp(currentAccount->IBAN, iban) == 0) {
  468.             return currentAccount;
  469.         }
  470.         currentAccount = currentAccount->next;
  471.     }
  472.  
  473.     printf("Contul cu IBAN-ul %s nu a fost gasit.\n", iban);
  474.     return NULL;
  475. }
  476.  
  477. void deleteAccountByIban(User* head, const char* ibanToDelete) {
  478.     User* currentUser = head;
  479.     while (currentUser != NULL) {
  480.         Cont** headAccountPtr = &currentUser->headAccount;
  481.         Cont* currentAccount = *headAccountPtr;
  482.  
  483.         if (currentAccount == NULL) {
  484.             currentUser = currentUser->next;
  485.             continue;
  486.         }
  487.  
  488.         if (strcmp(currentAccount->IBAN, ibanToDelete) == 0) {
  489.             *headAccountPtr = currentAccount->next;
  490.             free(currentAccount);
  491.             printf("Contul cu IBAN-ul %s a fost sters cu succes din lista utilizatorului %s.\n", ibanToDelete, currentUser->username);
  492.             saveAccountsToFile();
  493.         }
  494.         else {
  495.             while (currentAccount->next != NULL) {
  496.                 if (strcmp(currentAccount->next->IBAN, ibanToDelete) == 0) {
  497.                     Cont* temp = currentAccount->next;
  498.                     currentAccount->next = temp->next;
  499.                     free(temp);
  500.                     printf("Contul cu IBAN-ul %s a fost sters cu succes din lista utilizatorului %s.\n", ibanToDelete, currentUser->username);
  501.                     saveAccountsToFile();
  502.                     break;
  503.                 }
  504.                 currentAccount = currentAccount->next;
  505.             }
  506.         }
  507.         currentUser = currentUser->next;
  508.     }
  509. }
  510.  
  511. void editUserByCNP(const char* CNP, const char* newNume, const char* newPrenume) {
  512.     currentUser = usersList;
  513.     while (currentUser != NULL) {
  514.         if (strcmp(currentUser->CNP, CNP) == 0) {
  515.             strcpy(currentUser->nume, newNume);
  516.             strcpy(currentUser->prenume, newPrenume);
  517.  
  518.             saveUsersToFile();
  519.             printf("Datele utilizatorului cu CNP-ul %s au fost actualizate cu succes.\n", CNP);
  520.             return;
  521.         }
  522.         currentUser = currentUser->next;
  523.     }
  524.     printf("Utilizatorul cu CNP-ul %s nu a fost gasit.\n", CNP);
  525. }
  526.  
  527. Cont* findAccountByIBAN(User* head, const char* iban) {
  528.     User* current = head;
  529.     while (current != NULL) {
  530.         Cont* currentAcc = current->headAccount;
  531.         while (currentAcc != NULL) {
  532.             if (strcmp(currentAcc->IBAN, iban) == 0) {
  533.                 return currentAcc;
  534.             }
  535.             currentAcc = currentAcc->next;
  536.         }
  537.         current = current->next;
  538.     }
  539.     return NULL;
  540. }
  541.  
  542. void transferMoney(Cont *cont, const char* ibanDestinatie, double suma) {
  543.     //Cont* contSursa = findAccountByIBAN(accountsList, ibanSursa);
  544.     Cont* contDestinatie = findAccountByIBAN(usersList, ibanDestinatie);
  545.    
  546.     if (cont == NULL || contDestinatie == NULL) {
  547.         printf("Unul dintre conturi nu exista.\n");
  548.         addExtrase(cont, TRANSFER, CANCELED, "Unul dintre conturi nu exista.");
  549.  
  550.         return;
  551.     }
  552.  
  553.     if (strcmp(cont->valuta, contDestinatie->valuta) != 0) {
  554.         printf("Conturile nu au aceasi valuta, transferul nu este posibil.\n");
  555.         addExtrase(cont, TRANSFER, CANCELED, "Conturile nu au aceeasi valuta.");
  556.         return;
  557.     }
  558.  
  559.     if (cont->sold < suma) {
  560.         printf("Nu exista sold suficient in contul sursa pentru a efectua transferul.\n");
  561.         addExtrase(cont, TRANSFER, CANCELED, "Nu exista sold suficient in contul sursa pentru a efectua transferul.");
  562.         return;
  563.     }
  564.  
  565.     cont->sold -= suma;
  566.     contDestinatie->sold += suma;
  567.  
  568.     saveAccountsToFile();
  569.  
  570.     printf("Transferul de %.2f %s de la contul %s la contul %s s-a efectuat cu succes.\n", suma, cont->valuta, cont->valuta, ibanDestinatie);
  571.     addExtrase(cont, TRANSFER, SUCCESFUL, "");
  572. }
  573.  
  574.  
  575. //Meniul pentru Admin
  576. int adminMenu() {
  577.     int opt;
  578.     do {
  579.         printf("\n----- Meniu Admin -----\n");
  580.         printf("1. Adaugare utilizator\n");
  581.         printf("2. Adaugare cont IBAN\n");
  582.         printf("3. Afisare utilizatori si extrase\n");
  583.         printf("4. Stergere IBAN\n");
  584.         printf("5. Editare date utilizator dupa CNP\n");
  585.         printf("6. Schimbare parola\n");
  586.         printf("7. Delogare\n");
  587.         printf("0. Iesire\n");
  588.         printf("Alegeti optiunea: ");
  589.         scanf("%d", &opt);
  590.         getchar();
  591.         switch (opt)
  592.         {
  593.         case 1:
  594.         {
  595.             User* newUser = readUser();
  596.             usersList = addSorted(usersList, newUser);
  597.             saveUsersToFile();
  598.             break;
  599.         }
  600.         case 2:
  601.         {
  602.             printf("Utilizatori disponibili:\n");
  603.             showUsersWithoutAccounts(usersList);
  604.  
  605.             char username[50];
  606.             printf("Introduceti numele de utilizator al destinatarului: ");
  607.             scanf("%s", username);
  608.  
  609.             User* selectedUser = usersList;
  610.             while (selectedUser != NULL) {
  611.                 if (strcmp(selectedUser->username, username) == 0) {
  612.                     break;
  613.                 }
  614.                 selectedUser = selectedUser->next;
  615.             }
  616.             if (selectedUser == NULL) {
  617.                 printf("Utilizatorul nu a fost gasit.\n");
  618.                 break;
  619.             }
  620.  
  621.             Cont* newAccount = (Cont*)malloc(sizeof(Cont));
  622.             if (newAccount == NULL) {
  623.                 printf("Eroare la alocarea memoriei.\n");
  624.                 break;
  625.             }
  626.             printf("Introduceti IBAN-ul contului: ");
  627.             scanf("%s", newAccount->IBAN);
  628.             printf("Introduceti valuta contului: ");
  629.             scanf("%s", newAccount->valuta);
  630.             printf("Introduceti soldul contului: ");
  631.             scanf("%lf", &newAccount->sold);
  632.             strcpy(newAccount->CNP_proprietar, selectedUser->CNP);
  633.             newAccount->next = NULL;
  634.             addAccountToUser(selectedUser, newAccount);
  635.             saveAccountsToFile();
  636.             printf("Cont salvat cu succes");
  637.             break;
  638.         }
  639.         case 3:
  640.             showUsers(usersList);
  641.             break;
  642.         case 4:
  643.             showUsers(usersList);
  644.             char iban[25];
  645.             printf("Introduceti IBAN-ul contului pe care doriti sa il stergeti: ");
  646.             scanf("%s", iban);
  647.             deleteAccountByIban(usersList, iban);
  648.             break;
  649.         case 5:
  650.             showUsersWithoutAccounts(usersList);
  651.             char cnp[14], newNume[20], newPrenume[20];
  652.             printf("Introduceti CNP-ul persoanei careia doriti sa modificati datele: ");
  653.             scanf("%s", cnp);
  654.             printf("Introduceti noul nume: ");
  655.             scanf("%s", newNume);
  656.             printf("Introduceti noul prenume: ");
  657.             scanf("%s", newPrenume);
  658.             editUserByCNP(cnp, newNume, newPrenume);
  659.             break;
  660.         case 6:
  661.         {
  662.             char newPass[50];
  663.             printf("Introduceti parola noua: ");
  664.             scanf("%s", newPass);
  665.             changePassword(currentUser, newPass);
  666.             break;
  667.         }
  668.         case 7:
  669.             return delogat = delogare(&currentUser);
  670.             break;
  671.         case 0:
  672.             exit(0);
  673.         default:
  674.             break;
  675.         }
  676.     } while (opt != 0);
  677. }
  678.  
  679. //Submeniu pentru user:
  680. void submenu() {
  681.     printf("1. Adaugare bani in cont\n");
  682.     printf("2. Retragere bani din cont\n");
  683.     printf("3. Transfer bani catre alt cont\n");
  684.     printf("4. Afisare extrase de cont\n");
  685.     printf("5. Iesire\n");
  686. }
  687.  
  688. void addMoneyToAccount(User* user, Cont* account) {
  689.     double amountToAdd;
  690.     printf("Introduceti suma pe care doriti sa o adaugati in contul cu IBAN-ul %s: ", account->IBAN);
  691.     scanf("%lf", &amountToAdd);
  692.     if (amountToAdd <= 0) {
  693.         printf("Suma introdusa trebuie sa fie mai mare decat 0.\n");
  694.         addExtrase(account, DEPOSIT, CANCELED, "Suma introdusa trebuie sa fie mai mare decat 0.");
  695.         return;
  696.     }
  697.  
  698.     account->sold += amountToAdd;
  699.  
  700.     saveAccountsToFile();
  701.  
  702.     printf("Suma de %.2f a fost adaugata cu succes in contul cu IBAN-ul %s.\n", amountToAdd, account->IBAN);
  703.     addExtrase(account, DEPOSIT, SUCCESFUL, "");
  704. }
  705.  
  706. void removeMoneyFromAccount(User* user, Cont* account) {
  707.     double amountToTake;
  708.     printf("Introduceti suma pe care doriti sa o retrageti din contul cu IBAN-ul %s: ", account->IBAN);
  709.     scanf("%lf", &amountToTake);
  710.     if (amountToTake >= account->sold) {
  711.         printf("Suma introdusa este mai mare decat sold-ul disponibil.\n");
  712.         addExtrase(account, WITHDRAW, CANCELED, "Suma introdusa este mai mare decat sold-ul disponibil.");
  713.         return;
  714.     }
  715.  
  716.     account->sold -= amountToTake;
  717.  
  718.     saveAccountsToFile();
  719.     printf("Suma de %.2f a fost retrasa cu succes din contul cu IBAN-ul %s.\n", amountToTake, account->IBAN);
  720.     addExtrase(account, WITHDRAW, SUCCESFUL, "");
  721. }
  722.  
  723. //Meniul pentru User
  724. int userMenu() {
  725.     int opt,opt2;
  726.     do {
  727.         printf("\n----- Meniu Utilizator -----\n");
  728.         printf("1. Selectare cont pentru operatii\n");
  729.         printf("2. Schimbare parola\n");
  730.         printf("3. Delogare\n");
  731.         printf("0. Iesire\n");
  732.         printf("Alegeti optiunea: ");
  733.         scanf("%d", &opt);
  734.         getchar();
  735.        
  736.         switch (opt)
  737.         {
  738.         case 1:
  739.             ShowAccounts(currentUser);
  740.             currentAccount = selectAccount(currentUser);
  741.             submenu();
  742.             printf("Alegeti optiunea: ");
  743.             scanf("%d", &opt2);
  744.             switch (opt2)
  745.             {
  746.             case 1:
  747.                 addMoneyToAccount(currentUser, currentAccount);
  748.                 saveExtraseToFile(currentAccount);
  749.                 break;
  750.             case 2:
  751.                 removeMoneyFromAccount(currentUser, currentAccount);
  752.                 saveExtraseToFile(currentAccount);
  753.                 break;
  754.             case 3:
  755.             {
  756.                 double s;
  757.                 char iban[25];
  758.                 showUsers(usersList);
  759.                 printf("Introduceti IBAN-ul contului catre care doriti sa transferati: ");
  760.                 scanf("%s", iban);
  761.                 printf("Introduceti suma pe care doriti sa o transferati: ");
  762.                 scanf("%lf", &s);
  763.                 transferMoney(currentAccount, iban, s);
  764.                 saveExtraseToFile(currentAccount);
  765.                 break;
  766.             }  
  767.             case 4:
  768.                 printExtrase(currentAccount);
  769.             default:
  770.                 break;
  771.             }
  772.             break;
  773.         case 3:
  774.             return delogat = delogare(&currentUser);
  775.             break;
  776.         case 0:
  777.             exit(0);
  778.         default:
  779.             break;
  780.         }
  781.     } while (opt != 0);
  782. }
  783.  
  784. //Autentificare
  785. User *autentification(char username[], char password[], UserType* userType) {
  786.     currentUser = usersList;
  787.     while (currentUser != NULL) {
  788.         if (strcmp(currentUser->username, username) == 0 && strcmp(currentUser->password, password) == 0) {
  789.             *userType = currentUser->type;
  790.             return currentUser;
  791.         }
  792.         currentUser = currentUser->next;
  793.     }
  794.     return NULL;
  795. }
  796.  
  797. //Utilizator admin de baza
  798. void addBaseAdminAccount() {
  799.     // Creăm un utilizator admin de bază
  800.     User* adminUtil = (User*)malloc(sizeof(User));
  801.     if (adminUtil == NULL) {
  802.         printf("Eroare la alocarea memoriei pentru utilizator.\n");
  803.         return;
  804.     }
  805.  
  806.     // Inițializăm valorile utilizatorului admin de bază
  807.     strcpy(adminUtil->username, "admin");
  808.     strcpy(adminUtil->password, "adminpass");
  809.     strcpy(adminUtil->CNP, "1234567890123");
  810.     strcpy(adminUtil->nume, "Admin");
  811.     strcpy(adminUtil->prenume, "Administrator");
  812.     adminUtil->type = ADMIN;
  813.     adminUtil->next = NULL;
  814.  
  815.     usersList = addSorted(usersList, adminUtil);
  816. }
  817.  
  818. //Proces autentificare
  819. void autentificationProcess() {
  820.     if (usersList == NULL) {
  821.         addBaseAdminAccount();
  822.         printf("Utilizator admin de baza creat. Foloseste numele de utilizator 'admin' si parola 'adminpass' pentru a te autentifica.\n");
  823.     }
  824.     char username[50];
  825.     char password[50];
  826.     printf("Introduceti numele de utilizator: ");
  827.     scanf("%s", username);
  828.     printf("Introduceti parola: ");
  829.     scanf("%s", password);
  830.  
  831.     UserType userType;
  832.     currentUser = autentification(username, password, &userType);
  833.     if (currentUser != NULL) {
  834.         if (userType == ADMIN) {
  835.             adminMenu(currentUser);
  836.         }
  837.         else if (userType == USER) {
  838.             userMenu(currentUser);
  839.         }
  840.         else {
  841.             printf("Nume de utilizator sau parola incorecta!\n");
  842.         }
  843.     }
  844. }
  845.  
  846. void registrationProcess() {
  847.     User* newUser = readUser();
  848.     if (newUser != NULL) {
  849.         usersList = addSorted(usersList, newUser);
  850.         saveUsersToFile();
  851.         printf("Utilizator inregistrat cu succes!\n");
  852.     }
  853. }
  854.  
  855. int main() {
  856.     loadUsersFromFile();
  857.     loadAccountsFromFile();
  858.     loadAllExtrase();
  859.     int opt;
  860.     do {
  861.         if (delogat) {
  862.             delogat = 0;
  863.             meniu_principal();
  864.         }
  865.         else meniu_principal();
  866.         printf("Introduceti optiunea: ");
  867.         scanf("%d", &opt);
  868.         getchar();
  869.         system("cls");
  870.         switch (opt) {
  871.         case 1:
  872.             autentificationProcess();
  873.             break;
  874.         case 2:
  875.             registrationProcess();
  876.             break;
  877.         case 3:
  878.             printf("Iesire din program. La revedere!\n");
  879.             exit(0);
  880.         default:
  881.             printf("Optiune invalida. Va rugam sa selectati o optiune valida.\n");
  882.         }
  883.  
  884.     } while (1);
  885.  
  886.     return 0;
  887. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement