Ejemplo n.º 1
0
        /// <summary>
        /// Gives money in credit or returns deposit, if possible.
        /// Gives whole sum or gives nothing.
        /// Checks inside. Return false if didn't give credit.
        /// </summary>
        public bool GiveCredit(Agent taker, MoneyView desiredCredit) // todo check
        {
            if (taker.deposits.isNotZero())                          // has deposit (meaning, has no loans)
            {
                if (desiredCredit.isBiggerThan(taker.deposits))      // loan is bigger than this deposit
                {
                    MoneyView returnedDeposit = ReturnDeposit(taker, taker.deposits);
                    if (returnedDeposit.isSmallerThan(taker.deposits))
                    {
                        return(false);// if can't return deposit than can't give credit for sure
                    }
                    //returnedMoney = new ReadOnlyValue(0f);

                    MoneyView restOfTheSum = desiredCredit.Copy().Subtract(returnedDeposit);
                    if (CanGiveCredit(taker, restOfTheSum))
                    {
                        taker.loans.Set(restOfTheSum);//important
                        givenCredits.Add(restOfTheSum);
                        PayWithoutRecord(taker, restOfTheSum, Register.Account.BankOperation);
                        return(true);
                    }
                    else
                    {
                        return(false);
                    }
                }
                else // no need for credit, just return deposit
                {
                    // if can't return deposit than can't give credit for sure
                    if (CanReturnDeposit(taker, desiredCredit))
                    {
                        ReturnDeposit(taker, desiredCredit);
                        return(true);
                    }
                    else
                    {
                        return(false);
                    }
                }
            }
            else
            {
                if (CanGiveCredit(taker, desiredCredit))
                {
                    taker.loans.Add(desiredCredit);
                    givenCredits.Add(desiredCredit);
                    PayWithoutRecord(taker, desiredCredit, Register.Account.BankOperation);
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
        }