Tell us what’s happening:
Hello guys, I need some help ![]()
I’m stuck on the last two steps of my JS cash register project:
Step 18:
Price = 19.5
#cash value = 20
cid = [[“PENNY”, 0.5], [“NICKEL”, 0], [“DIME”, 0], [“QUARTER”, 0], [“ONE”, 0], [“FIVE”, 0], [“TEN”, 0], [“TWENTY”, 0], [“ONE HUNDRED”, 0]]
When I click #purchase-btn, #change-due should show: “Status: CLOSED PENNY: $0.5”
Step 19:
Price < cash
Total cash in drawer equals the change due
When I click #purchase-btn, #change-due should show “Status: CLOSED”
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>
<h1>Cash Register</h1>
<label for="cash">Customer Cash: </label>
<input type="number" id="cash" step="0.01" placeholder="Enter cash amount">
<button id="purchase-btn">Purchase</button>
<p id="change-due"></p>
<script src="script.js"></script>
</body>
</html>
/* file: styles.css */
body {
font-family: Arial, sans-serif;
background-color: #f8f0e3;
padding: 30px;
}
input, button {
padding: 10px;
margin: 10px 0;
font-size: 16px;
}
#change-due {
margin-top: 20px;
font-weight: bold;
}
/* file: script.js */
let price = 19.5;
let cid = [
["PENNY", 1.01],
["NICKEL", 2.05],
["DIME", 3.1],
["QUARTER", 4.25],
["ONE", 90],
["FIVE", 55],
["TEN", 20],
["TWENTY", 60],
["ONE HUNDRED", 100]
];
const currencyUnits = [
{ name: "ONE HUNDRED", value: 100 },
{ name: "TWENTY", value: 20 },
{ name: "TEN", value: 10 },
{ name: "FIVE", value: 5 },
{ name: "ONE", value: 1 },
{ name: "QUARTER", value: 0.25 },
{ name: "DIME", value: 0.1 },
{ name: "NICKEL", value: 0.05 },
{ name: "PENNY", value: 0.01 }
];
document.getElementById("purchase-btn").addEventListener("click", function() {
let cash = parseFloat(document.getElementById("cash").value);
const changeDueElem = document.getElementById("change-due");
if (cash < price) {
alert("Customer does not have enough money to purchase the item");
changeDueElem.textContent = "";
return;
}
if (cash === price) {
changeDueElem.textContent = "No change due - customer paid with exact cash";
return;
}
let changeDue = +(cash - price).toFixed(2);
let totalCid = cid.reduce((sum, [_, amount]) => sum + amount, 0).toFixed(2);
let changeArray = [];
if (changeDue > totalCid) {
changeDueElem.textContent = "Status: INSUFFICIENT_FUNDS";
return;
}
for (let unit of currencyUnits) {
let [name, _] = cid.find(c => c[0] === unit.name);
let available = cid.find(c => c[0] === unit.name)[1];
let amountToReturn = 0;
while (changeDue >= unit.value && available >= unit.value) {
changeDue -= unit.value;
changeDue = Math.round(changeDue * 100) / 100;
available -= unit.value;
amountToReturn += unit.value;
}
if (amountToReturn > 0) {
changeArray.push([unit.name, amountToReturn]);
}
}
if (changeDue > 0) {
changeDueElem.textContent = "Status: INSUFFICIENT_FUNDS";
return;
}
const remainingCash = cid.reduce((sum, [name, amount]) => {
const used = changeArray.find(c => c[0] === name)?.[1] || 0;
return sum + (amount - used);
}, 0).toFixed(2);
if (remainingCash == 0) {
let statusClosed = changeArray.map(c => `${c[0]}: $${c[1]}`).join(" ");
changeDueElem.textContent = `Status: CLOSED ${statusClosed}`;
} else {
let statusOpen = changeArray.map(c => `${c[0]}: $${c[1]}`).join(" ");
changeDueElem.textContent = `Status: OPEN ${statusOpen}`;
}
});
Your browser information:
User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0
Challenge Information:
Build a Cash Register Project - Build a Cash Register