# JavaScript Algorithms and Data Structures Projects - Cash Register

Tell us what’s happening:
Asking for someone to point out the problem.
Not getting the expected output of { status: OPEN, change: [[“QUARTER”, 0.5]] }

``````function checkCashRegister(price, cash, cid) {
const change = cash - price;
//changeDue is the amount of money to be given to the customer
let changeDue = [["PENNY", 0], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]];

//cashReg is cid and the representation of the cash register
let cashReg =  [...cid];

//moneyUnit is the denomination of each bill contained in the cash register. It is arranged in accordance of order in the cash register
let moneyUnit = [0.01, 0.05, 0.1, 0.25, 1, 5, 10, 20, 100];

//Declare two variables denoting status of cash register and changeDue respectively
let _status, _change;

//Create an IIFE that will check the amount of the cash register to decide whether to call another function or not
( function() {
//Check the amount of the cash register
let cashRegContent = cashReg.reduce( ((total,entry) => total + entry[1]),0);
cashRegContent = cashRegContent.toFixed(2);
cashRegContent = parseFloat(cashRegContent);

//When the total amount of the cash register is equal to the chnange
if ( cashRegContent === change ) {_status = "CLOSED"; _change = cid}
//When the total amount of the cash register is less than the change
else if ( cashRegContent < change ) {_status = "INSUFFICIENT FUNDS"; _change = []}
//Call a function when the total amount of the cash register is more than the change
else if ( cashRegContent > change) { processChange(); }
}) ();

// Function processChange will check if the given denomination of bill can provide for the change
function processChange() {
//For each denomination, bal is the amount of the preceeding denominations in the ChangeDue
//Iteration starts from the end of the array
for (let j = cashReg.length - 1 ; j<0 ; j--) {
let bal = changeDue.slice(j+1).reduce( ((total,entry) => total + entry[1]),0);
bal = bal.toFixed(2);
bal = parseFloat(bal);
//partial is the amount to take from cashReg before putting it to the ChangeDue
let partial = 0;
while ( (bal + partial + moneyUnit[j]) <= change && cashReg[j][1] > 0) {
partial += moneyUnit[j];
cashReg[j][1] -= moneyUnit[j];
}
changeDue[j][1] = partial;
}
}

let balance = changeDue.reduce( ((total,entry) => total + entry[1]),0);
balance = balance.toFixed(2);
balance = parseFloat(balance);
//console.log(balance);
//console.log(changeDue);

//Depending on the value of balance, call a function and set the corresponding values to variables _status and _change
if (balance === change) { trim(); _status = "OPEN" ; _change = changeDue}
else if (balance < change) {_status = "INSUFFICIENT FUNDS"; _change = [] }

function trim() { changeDue = changeDue.filter(entry => {return entry[1] !== 0} )}

let regStat = {status: _status, change: _change};
return regStat;

}

checkCashRegister(19.5, 20, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]]);

With your code right now im getting `{ status: 'INSUFFICIENT FUNDS', change: [] }`. I would recommend tossing some console.logs around where you are changing your `_status` and `_change` to those values and see if you can back track all the way to the problem. I got it to return `{ status: OPEN, change: [[“QUARTER”, 0.5]] }` by changing one character in your code, but it was still failing all the other tests.