Cleanup and Implementations
[tpg/opendispense2.git] / src / cokebank_basic / main.c
1 /*
2  * OpenDispense 2 
3  * UCC (University [of WA] Computer Club) Electronic Accounting System
4  *
5  * cokebank.c - Coke-Bank management
6  *
7  * This file is licenced under the 3-clause BSD Licence. See the file COPYING
8  * for full details.
9  */
10 #include <stdlib.h>
11 #include <stdio.h>
12 #include <string.h>
13 #include <openssl/sha.h>
14 #include "common.h"
15
16 // === PROTOTYPES ===
17 void    Init_Cokebank(const char *Argument);
18  int    Transfer(int SourceUser, int DestUser, int Ammount, const char *Reason);
19  int    GetBalance(int User);
20 char    *GetUserName(int User);
21  int    GetUserID(const char *Username); 
22  int    GetUserAuth(const char *Username, const char *Password);
23
24 // === GLOBALS ===
25 FILE    *gBank_LogFile;
26
27 // === CODE ===
28 /**
29  * \brief Load the cokebank database
30  */
31 void Init_Cokebank(const char *Argument)
32 {
33         gBank_File = fopen(Argument, "rb+");
34         if( !gBank_File ) {
35                 gBank_File = fopen(Argument, "wb+");
36         }
37         if( !gBank_File ) {
38                 perror("Opening coke bank");
39         }
40
41         gBank_LogFile = fopen("cokebank.log", "a");
42         if( !gBank_LogFile )    gBank_LogFile = stdout;
43
44         fseek(gBank_File, 0, SEEK_END);
45         giBank_NumUsers = ftell(gBank_File) / sizeof(gaBank_Users[0]);
46         fseek(gBank_File, 0, SEEK_SET);
47         gaBank_Users = malloc( giBank_NumUsers * sizeof(gaBank_Users[0]) );
48         fread(gaBank_Users, sizeof(gaBank_Users[0]), giBank_NumUsers, gBank_File);
49 }
50
51 /**
52  * \brief Transfers money from one user to another
53  * \param SourceUser    Source user
54  * \param DestUser      Destination user
55  * \param Ammount       Ammount of cents to move from \a SourceUser to \a DestUser
56  * \param Reason        Reason for the transfer (essentially a comment)
57  * \return Boolean failure
58  */
59 int Transfer(int SourceUser, int DestUser, int Ammount, const char *Reason)
60 {
61          int    srcBal = Bank_GetUserBalance(SourceUser);
62          int    dstBal = Bank_GetUserBalance(DestUser);
63         
64         if( srcBal - Ammount < Bank_GetMinAllowedBalance(SourceUser) )
65                 return 1;
66         if( dstBal + Ammount < Bank_GetMinAllowedBalance(DestUser) )
67                 return 1;
68         Bank_AlterUserBalance(DestUser, Ammount);
69         Bank_AlterUserBalance(SourceUser, -Ammount);
70         fprintf(gBank_LogFile, "ACCT #%i{%i} -= %ic [to #%i] (%s)\n", SourceUser, srcBal, Ammount, DestUser, Reason);
71         fprintf(gBank_LogFile, "ACCT #%i{%i} += %ic [from #%i] (%s)\n", DestUser, dstBal, Ammount, SourceUser, Reason);
72         return 0;
73 }
74
75 /**
76  * \brief Get the balance of the passed user
77  */
78 int GetBalance(int User)
79 {
80         return Bank_GetUserBalance(User);;
81 }
82
83 /**
84  * \brief Return the name the passed user
85  */
86 char *GetUserName(int User)
87 {
88         return Bank_GetUserName(User);
89 }
90
91 /**
92  * \brief Get the User ID of the named user
93  */
94 int GetUserID(const char *Username)
95 {
96          int    ret;
97
98         // Get internal ID (or create new user)
99         ret = Bank_GetUserByName(Username);
100         if( ret == -1 ) {
101                 ret = Bank_AddUser(Username);
102         }
103
104         return ret;
105 }
106

UCC git Repository :: git.ucc.asn.au