# I passed some tests and some not. JavaScript Algorithms and Data Structures Projects: Cash Register

** I passed some tests and some not, The cases that I passed are: Return {status: “INSUFFICIENT_FUNDS”, change: } if cash-in-drawer is less than the change due, and Return {status: “CLOSED”, change: […]} with cash-in-drawer as the value for the key change if it is equal to the change due.

But
when I tried to return {status: “OPEN”, change: […]}, with the change due in coins and bills, sorted in highest to lowest order, as the value of the change key.
It’s wrong to push the whole [“TWENTY”, cidLookup.TWENTY] number into returnedObject.change array but I don’t know what I should do here??

I’m stuck with this case and I don’t know is I should rewrite the whole function that takes the change, and cid as input and changes the returnedObject value or not.
**

``````
// Solution
// get the change amount and save it in change variable (change = cash - price)
// here we have different cases to calculate the change from cid

// if change > 20 subtract 20 from the change and add+ what subtracted to the returned object
// it must be a recursive to make the process automatically
// if change > 10 subtract 10 from the change and add+ what subtracted to the returned object
// and so on change > 0.25, 0.1, 0.05, and 0.01

// if we have 0 difference at the end we can make it and return what added to the object
// if it is 0 so it'll be the open state

// from the beginng Return {status: "INSUFFICIENT_FUNDS", change: []} if cash-in-drawer is less than the change due,
// or if you cannot return the exact change.
// Return {status: "CLOSED", change: [...]} with cash-in-drawer as the value for the key change
// if it is equal to the change due.
// Otherwise, return {status: "OPEN", change: [...]}, with the change due in coins and bills,
// to make it easy create a lookup object the holds the penny, nickel, dime, one, five, ten, Twenty, 100
function checkCashRegister(price, cash, cid) {
var change = cash - price;
// cash in drawer lookup
// cidLookup1 variable refactored below into cidLookup
// let cidLookup1 = {
//   penny: cid[0][1],
//   nickel: cid[1][1],
//   dime: cid[2][1],
//   quarter: cid[3][1],
//   one: cid[4][1],
//   five: cid[5][1],
//   ten: cid[6][1],
//   twenty: cid[7][1],
//   oneHundred: cid[8][1],
// };

// cidLookup1 refactoring
let cidLookup = cid.reduce((lookup, x) => {
lookup[x[0]] = x[1];
return lookup;
}, {});
// console.log(cidLookup); // { PENNY: 1.01, NICKEL: 2.05, ..., 'ONE HUNDRED': 100 }

// total cash in drawer
const totalCashInDrawer = cid.reduce((sum, x) => sum + x[1], 0);

//  The object that will be returned
let returnedObject = { status: "", change: [] };

// a function that takes change, and cid as input and changes the returnedObject value.
// must return open with the change array or INSUFFICIENT_FUNDS

// logical error
// let getReturnedObjectValue = (change, cidLookup) => {
//   change > 20 && cidLookup.TWENTY > 20
//     ? returnedObject.change.push(["TWENTY", cidLookup.TWENTY]) &&
//       (change = change - cidLookup.TWENTY)
//     : 2;
//   return returnedObject;
// };
// logical error
let getReturnedObjectValue = (change, cidLookup) => {
change > 20 && cidLookup.TWENTY > 20
? returnedObject.change.push(["TWENTY", cidLookup.TWENTY]) &&
getReturnedObjectValue(
change - cidLookup.TWENTY,
cidLookup.TWENTY - cidLookup.TWENTY
)
: change > 10 && cidLookup.TEN > 10
? returnedObject.change.push(["TEN", cidLookup.TEN]) &&
getReturnedObjectValue(
change - cidLookup.TEN,
cidLookup.TEN - cidLookup.TEN
)
: change > 5 && cidLookup.FIVE > 5
? returnedObject.change.push(["FIVE", cidLookup.FIVE]) &&
getReturnedObjectValue(
change - cidLookup.FIVE,
cidLookup.FIVE - cidLookup.FIVE
)
: change > 1 && cidLookup.FIVE > 1
? returnedObject.change.push(["ONE", cidLookup.ONE]) &&
getReturnedObjectValue(
change - cidLookup.ONE,
cidLookup.ONE - cidLookup.ONE
)
: change > 0.25 && cidLookup.QUARTER > 0.25
? returnedObject.change.push(["QUARTER", cidLookup.QUARTER]) &&
getReturnedObjectValue(
change - cidLookup.QUARTER,
cidLookup.QUARTER - cidLookup.QUARTER
)
: change > 0.1 && cidLookup.DIME > 0.1
? returnedObject.change.push(["DIME", cidLookup.DIME]) &&
getReturnedObjectValue(
change - cidLookup.DIME,
cidLookup.DIME - cidLookup.DIME
)
: change > 0.05 && cidLookup.NICKEL > 0.05
? returnedObject.change.push(["NICKEL", cidLookup.NICKEL]) &&
getReturnedObjectValue(
change - cidLookup.NICKEL,
cidLookup.NICKEL - cidLookup.NICKEL
)
: change > 0.01 && cidLookup.PENNY > 0.01
? returnedObject.change.push(["PENNY", cidLookup.PENNY]) &&
getReturnedObjectValue(
change - cidLookup.PENNY,
cidLookup.PENNY - cidLookup.PENNY
)
: 1;
// if must be written to check if the change is >0 || ? then return open or INSUFFICIENT_FUNDS
return cidLookup;
};

totalCashInDrawer < change
? (returnedObject.status = "INSUFFICIENT_FUNDS") // or if you cannot return the exact change.
: totalCashInDrawer == change
? (returnedObject.status = "CLOSED") && (returnedObject.change = cid)
: getReturnedObjectValue(change, cidLookup); // must return open with the change array or INSUFFICIENT_FUNDS
return returnedObject;
}
``````

User Agent is: `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36`.