Build a Cash Register Project - Build a Cash Register

Tell us what’s happening:

I’m not sure why my code is failing the last 2 tests.

Your code so far

<!-- file: index.html -->
<!DOCTYPE html>
<html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Cash Register</title>
    <link rel="stylesheet" href="./styles.css">
  </head>
  <body>
    <main>
      <h1>Cash Register</h1>
     <input id="cash">
     <div id="change-due"></div>
        <button id="purchase-btn">Purchase</button>
     </main>
    <script src="./script.js"></script>
  </body>
  </html>
/* file: script.js */
let price = 19.5;
let cid = [["PENNY", 0.5], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]];

const cash = document.getElementById("cash");
const change = document.getElementById("change-due");
const purchase = document.getElementById("purchase-btn");

let currencyUnits = [
  ['PENNY', .01],
  ['NICKEL', .05],
  ['DIME', .1],
  ['QUARTER', .25],
  ['ONE', 1],
  ['FIVE', 5],
  ['TEN', 10],
  ['TWENTY', 20],
  ['ONE HUNDRED', 100]
];

purchase.addEventListener("click", () => {
  const cashValue = parseFloat(cash.value);
  const changeDue = cashValue - price;

  if (cashValue < price) {
    alert("Customer does not have enough money to purchase the item");
    return;
  } 
  
  if (cashValue === price) {
    change.innerText = "No change due - customer paid with exact cash";
    return;
  }

  const changeResult = getChange(changeDue, cid);

  if (changeResult.status === "INSUFFICIENT_FUNDS" || changeResult.status === "CLOSED") {
    change.innerText = `Status: ${changeResult.status} ${formatChange(changeResult.change)}`
  } else {
    let changeText = `Status: OPEN ${formatChange(changeResult.change)}`;
    change.innerText = changeText.trim();
  }

});

const getChange = (changeDue, cid) => {
   let totalCid = parseFloat(cid.reduce((sum, [_,amount]) => sum + amount, 0).toFixed(2));
   if (totalCid < changeDue) {
     return { status: "INSUFFICIENT_FUNDS", change: [], }
   }

     let changeArray = [];
     let remainingChange = changeDue;

     for (let i = currencyUnits.length - 1; i >=0; i--) {
       let unit = currencyUnits[i][0];
       let unitValue = currencyUnits[i][1];
       let unitInDrawer = cid[i][1];

       if (unitValue <= remainingChange && unitInDrawer > 0) {
         let amountFromUnit = 0;

        while (remainingChange >= unitValue && unitInDrawer > 0) {
         remainingChange = (remainingChange - unitValue).toFixed(2);
         unitInDrawer -= unitValue;
         amountFromUnit += unitValue;
        }

        if (amountFromUnit > 0) {
          changeArray.push([unit, amountFromUnit]);
        }
       }
     }

     if (remainingChange > 0) {
       return { status: "INSUFFICIENT_FUNDS", change: [] }
     }

     if (changeDue === totalCid) {
       return { status: "CLOSED", change: cid }
     }

     return { status: "OPEN", change: changeArray }
     
};

const formatChange = changeArray => changeArray.map(([unit, amount]) => `${unit}: $${amount.toFixed(2)}`).join(" ");


/* file: styles.css */

Your browser information:

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

Challenge Information:

Build a Cash Register Project - Build a Cash Register

have you tried to see what your app returns in that situation?

It returns this:
Status: CLOSED PENNY: $0.50 NICKEL: $0.00 DIME: $0.00 QUARTER: $0.00 ONE: $0.00 FIVE: $0.00 TEN: $0.00 TWENTY: $0.00 ONE HUNDRED: $0.00

isn’t that a bit more than what you are asked to return?

Yeah, thanks, I’ve managed to make step 18 work