Problem Cash Register

Tell us what’s happening:
Hi there,
Could someone tell me why it should return “INSUFFICIENT_FUNDS” while there are $1.01 in the cash register

checkCashRegister(19.5, 20, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 1], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]) should return {status: "INSUFFICIENT_FUNDS", change: []} .

Your code so far


const REGISTER_STATUS = {closed:"CLOSED", insufficientFunds: "INSUFFICIENT_FUNDS", open:"OPEN"}
const currencyDitionary = {
    'PENNY' : 0.01,
    'NICKEL': 0.05,
    'DIME':0.10,
    'QUARTER':0.25,
    'ONE': 1.00,
    'FIVE': 5.00,
    'TEN': 10.00,
    'TWENTY': 20.00,
    'ONE HUNDRED':100.00
};

function checkCashRegister(price, cash, cid){
    let cashRegister = {status:"",change:[...cid]};
    const changeNeeded = cash - price;
    const changeAvailable = getTotalCashRegisterChange(cid);
    console.log(changeNeeded);
    console.log(changeAvailable);
    cashRegister.status = getTotalCashRegisterStatus(changeNeeded,changeAvailable);
    console.log(cashRegister.status);

    if(cashRegister.status === REGISTER_STATUS.insufficientFunds){
        cashRegister.change = [];
        return cashRegister;
    }

    cashRegister.change = getCustomerChange(changeNeeded,cid);
    console.log(cashRegister.change,getTotalCashRegisterChange(cashRegister.change));


    if(changeNeeded === REGISTER_STATUS.open){
        cashRegister.change = cashRegister.change;
    }

    if(cashRegister.status === REGISTER_STATUS.closed){
        cashRegister.change = [...cid];
    }

    return cashRegister;
}

function getCustomerChange(changeNeeded,changeInDrawer){
    let change = [];

    for(let i=changeInDrawer.length-1; i>=0; i--){
        const coinName = changeInDrawer[i][0];
        const coinTotal = changeInDrawer[i][1];
        const coinValue = currencyDitionary[coinName];
        let coinAmount = (coinTotal/coinValue).toFixed(2);
        let coinToReturn = 0;


        while(changeNeeded >= coinValue && coinAmount>0){
            changeNeeded -= coinValue;
            coinAmount--;
            coinToReturn++;
        }

        if(coinToReturn > 0){
            change.push([coinName, coinToReturn * coinValue]);
        }
    }

    return change;
}

function getTotalCashRegisterChange(changeInDrawer){
    let total = 0;

    for(let change of changeInDrawer){
        let changeValue = change[1];
        total += changeValue;
    }
    return total.toFixed(2);
}

function getTotalCashRegisterStatus(changeNeeded,changeAvailable){
    if(changeNeeded > changeAvailable){
        return REGISTER_STATUS.insufficientFunds;
    }
    if(changeNeeded < changeAvailable){
        return REGISTER_STATUS.open;
    }
    return REGISTER_STATUS.closed;
}

Your browser information:

User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36.

Link to the challenge:
https://learn.freecodecamp.org/javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/cash-register

1 Like

I was going through your code, thinking your question was about THAT. I am a doofus.

So, there are two possible cases where you should return “INSUFFICIENT_FUNDS”: First, when the money due for change exceeds that in the drawer. And second, when the change in the drawer can in no way make the exact change. If you lack the proper denominations to make correct change, then your drawer lacks sufficient funds.

To debug this, throw a console.log just before the end of getCustomerChange:

if(changeNeeded > 0) console.log("After making change, the drawer is still "+changeNeeded+" short.");

Thanks!!! That helps a lot.

Kinda hoped it would… :wink: