X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=src%2Fserver%2Fdispense.c;h=01b53c8338f712c43e54374740fad9fffc83fb6b;hb=4fef498619ca05876568c6bc5114fadd7c2496ee;hp=3fb565248567d106570f652f746a1c894944cc12;hpb=a78e3c7b6ac2ad0fb3f89036459cf7053dbe8496;p=tpg%2Fopendispense2.git diff --git a/src/server/dispense.c b/src/server/dispense.c index 3fb5652..01b53c8 100644 --- a/src/server/dispense.c +++ b/src/server/dispense.c @@ -73,6 +73,39 @@ int DispenseItem(int ActualUser, int User, tItem *Item) return 0; // 0: EOK } +/** + * \brief Refund a dispense + */ +int DispenseRefund(int ActualUser, int DestUser, tItem *Item, int OverridePrice) +{ + int ret; + int src_acct, price; + char *username, *actualUsername; + + src_acct = Bank_GetAcctByName(COKEBANK_SALES_ACCT); + + if( OverridePrice > 0 ) + price = OverridePrice; + else + price = Item->Price; + + ret = _Transfer( src_acct, DestUser, price, "Refund"); + if(ret) return ret; + + username = Bank_GetAcctName(DestUser); + actualUsername = Bank_GetAcctName(ActualUser); + + Log_Info("refund '%s' (%s:%i) to %s by %s [cost %i, balance %i]", + Item->Name, Item->Handler->Name, Item->ID, + username, actualUsername, price, Bank_GetBalance(DestUser) + ); + + free(username); + free(actualUsername); + + return 0; +} + /** * \brief Give money from one user to another */ @@ -105,6 +138,39 @@ int DispenseGive(int ActualUser, int SrcUser, int DestUser, int Ammount, const c return 0; } +/** + * \brief Move money from one user to another (Admin Only) + */ +int DispenseTransfer(int ActualUser, int SrcUser, int DestUser, int Ammount, const char *ReasonGiven) +{ + int ret; + char *actualUsername; + char *srcName, *dstName; + + // Make sure the user is an admin + if( !(Bank_GetFlags(ActualUser) & USER_FLAG_ADMIN) ) + return 1; + + ret = _Transfer( SrcUser, DestUser, Ammount, ReasonGiven ); + if(ret) return 2; // No Balance + + + actualUsername = Bank_GetAcctName(ActualUser); + srcName = Bank_GetAcctName(SrcUser); + dstName = Bank_GetAcctName(DestUser); + + Log_Info("move %i to %s from %s by %s [balances %i, %i] - %s", + Ammount, dstName, srcName, actualUsername, + Bank_GetBalance(SrcUser), Bank_GetBalance(DestUser), + ReasonGiven + ); + + free(srcName); + free(dstName); + free(actualUsername); + + return 0; +} /** * \brief Add money to an account */ @@ -113,7 +179,11 @@ int DispenseAdd(int ActualUser, int User, int Ammount, const char *ReasonGiven) int ret; char *dstName, *byName; +#if DISPENSE_ADD_BELOW_MIN ret = _Transfer( Bank_GetAcctByName(COKEBANK_DEBT_ACCT), User, Ammount, ReasonGiven ); +#else + ret = Bank_Transfer( Bank_GetAcctByName(COKEBANK_DEBT_ACCT), User, Ammount, ReasonGiven ); +#endif if(ret) return 2; byName = Bank_GetAcctName(ActualUser); @@ -196,11 +266,11 @@ int _GetMinBalance(int Account) // - Internal accounts have no lower bound if( flags & USER_FLAG_INTERNAL ) return INT_MIN; - // Admin to -$10 - //if( flags & USER_FLAG_ADMIN ) return -1000; + // Admin to -$50 +// if( flags & USER_FLAG_ADMIN ) return -5000; - // Coke to -$5 - //if( flags & USER_FLAG_COKE ) return -500; + // Coke to -$20 +// if( flags & USER_FLAG_COKE ) return -2000; // Anyone else, non-negative return 0; @@ -213,12 +283,12 @@ int _CanTransfer(int Source, int Destination, int Ammount) { if( Ammount > 0 ) { - if( Bank_GetBalance(Source) + Ammount < _GetMinBalance(Source) ) + if( Bank_GetBalance(Source) - Ammount < _GetMinBalance(Source) ) return 0; } else { - if( Bank_GetBalance(Destination) - Ammount < _GetMinBalance(Destination) ) + if( Bank_GetBalance(Destination) + Ammount < _GetMinBalance(Destination) ) return 0; } return 1;