public int getNominalAmount(BILL_TYPE billType) { return(mMoneyStore[billType].getAmount()); }
public int getMaxAmount(BILL_TYPE billType) { return(mMoneyStore[billType].getMaxAmount()); }
public bool tryToGiveAwayMoney(int requesteSum, BILL_TYPE preferedType, ref string outMessage, out Dictionary <BILL_TYPE, int> outputSum) { outputSum = new Dictionary <BILL_TYPE, int> { { BILL_TYPE.TYPE_10, 0 }, { BILL_TYPE.TYPE_50, 0 }, { BILL_TYPE.TYPE_100, 0 }, { BILL_TYPE.TYPE_500, 0 } }; if (requesteSum == 0) { outMessage = "Requested sum is zero"; return(false); } if (requesteSum > getMoneySum()) { outMessage = "Requested sum is not available"; return(false); } int sumNeeded = requesteSum; int sumByPrefered = mMoneyStore[preferedType].getMoneySum(); int sumByOthers = 0; if (sumByPrefered >= sumNeeded) { sumByOthers = sumNeeded - (int)preferedType * (sumNeeded / (int)preferedType); if (sumByOthers == 0) { outputSum[preferedType] = sumNeeded / (int)preferedType; sumNeeded = 0; } } else { sumByOthers = sumNeeded - sumByPrefered; } int sumByPrevBills = 0; int maxBillAmount = 0; BILL_TYPE maxBillType = BILL_TYPE.TYPE_10; SortedSet <BILL_TYPE> mBillsList = new SortedSet <BILL_TYPE>(); mBillsList.Add(preferedType); if (sumByOthers != 0) { foreach (var curPair in mMoneyStore) { if (curPair.Key == preferedType) { continue; } if (sumByOthers > (mMoneyStore[curPair.Key].getMoneySum() + sumByPrevBills)) { sumByPrevBills += mMoneyStore[curPair.Key].getMoneySum(); mBillsList.Add(curPair.Key); } else { int curBillAmount = sumByOthers / (int)curPair.Key; int curResid = sumByOthers % (int)curPair.Key; if (curResid != 0 && curResid > sumByPrevBills) { curBillAmount += 1; } maxBillAmount = curBillAmount; maxBillType = curPair.Key; break; } } if ((int)maxBillType * maxBillAmount <= requesteSum) { sumNeeded = requesteSum; sumNeeded -= maxBillAmount * (int)maxBillType; outputSum[maxBillType] = maxBillAmount; foreach (var curType in mBillsList.Reverse()) { int curBillsNeeded = sumNeeded / (int)curType; int curBillsAvailable = mMoneyStore[curType].getAmount(); int billSpended = 0; if (curBillsNeeded >= curBillsAvailable) { billSpended = curBillsAvailable; } else { billSpended = curBillsNeeded; } sumNeeded -= billSpended * (int)curType; outputSum[curType] = billSpended; } } } if (sumNeeded == 0) { foreach (var curPair in outputSum) { mMoneyStore[curPair.Key].tryDecrAmount(curPair.Value); } } else { outputSum.Clear(); outMessage = "Could not return such sum"; return(false); } outMessage = "Take your money"; if (MoneyChangedEvent != null) { MoneyChangedEvent(); } return(true); }