Cash Register Tests

The tests without values do not work, although I think the code covers pretty much everything that is required. Maybe someone can help me where the error could be, for example, why the tests don’t work.

If the price is 20 and the value in the #cash element is 10, a warning should appear with the text “Customer does not have enough money to buy the item” - works

If the value in the #cash element is less than the price, a warning with the text “Customer does not have enough money to buy the item” should appear - does not work

aswell if i go for cash < price

const cashInput = document.getElementById('cash');
const purchaseBtn = document.getElementById('purchase-btn');
const changeDueDiv = document.getElementById('change-due');
const cashDrawerDiv = document.getElementById('cash-drawer')
let paragraphs = cashDrawerDiv.getElementsByTagName('p');
let statusParagraph = document.createElement('p');


let reverseHelper = 0;

let nameMapping = {
    "PENNY": "Pennies",
    "NICKEL": "Nickels",
    "DIME": "Dimes",
    "QUARTER": "Quarters",
    "ONE": "Ones",
    "FIVE": "Fives",
    "TEN": "Tens",
    "TWENTY": "Twenties",
    "ONE HUNDRED": "Hundreds"
};

function checkCashRegister(price, cash, cid) {

    let change = parseFloat((cash - price).toFixed(2));
    let sumCid = parseFloat(cid.reduce((acc, currentVal) => acc + currentVal[1], 0));

    let changeMoney = [
        ["ONE HUNDRED", 0],
        ["TWENTY", 0],
        ["TEN", 0],
        ["FIVE", 0],
        ["ONE", 0],
        ["QUARTER", 0],
        ["DIME", 0],
        ["NICKEL", 0],
        ["PENNY", 0]
    ]

    if (change > sumCid) {
        changeDueDiv.innerHTML = '';
        statusParagraph.innerText = "Status: INSUFFICIENT_FUNDS"
        changeDueDiv.appendChild(statusParagraph);
        return { status: "INSUFFICIENT_FUNDS", change: [] };

    } else if (change === sumCid) {
        changeDueDiv.innerHTML = '';
        statusParagraph.innerText = "Status: CLOSED"
        changeDueDiv.appendChild(statusParagraph);
        cid.forEach(item => {
            if (item[1] !== 0) {
                let paragraph = document.createElement("p");
                paragraph.innerText = `${item[0]}: $${item[1]}`;
                changeDueDiv.appendChild(paragraph);
            }
        });
        return { status: "CLOSED", change: cid };

    } else {
        let result = [];
        cid = cid.reverse(); //highest to lowest order
        if (reverseHelper > 0) {
            cid = cid.reverse();
        }
        reverseHelper += 1;
        let currency = [
            ["ONE HUNDRED", 100],
            ["TWENTY", 20],
            ["TEN", 10],
            ["FIVE", 5],
            ["ONE", 1],
            ["QUARTER", 0.25],
            ["DIME", 0.10],
            ["NICKEL", 0.05],
            ["PENNY", 0.01]
        ];
        for (let i = 0; i < cid.length; i++) {
            while (change >= currency[i][1] && cid[i][1] > 0) {
                change -= currency[i][1];
                change = parseFloat(change.toFixed(2))
                // console.log(`change ${change}`)
                cid[i][1] -= currency[i][1];
                cid[i][1] = parseFloat(cid[i][1].toFixed(2))
                // console.log(`cid ${cid[i][1]}`)
                changeMoney[i][1] += currency[i][1];
                changeMoney[i][1] = parseFloat(changeMoney[i][1].toFixed(2))
                // console.log(`changeMoney[i][1] ${changeMoney[i][1]}`)
            }
            if (changeMoney[i][1] > 0) {
                result.push(changeMoney);
            }
        }

        if (change > 0) {
            changeDueDiv.innerHTML = '';
            statusParagraph.innerText = "Status: INSUFFICIENT_FUNDS";
            changeDueDiv.appendChild(statusParagraph);
            return { status: "INSUFFICIENT_FUNDS", change: [] };

        }
        changeDueDiv.innerHTML = '';
        statusParagraph.innerText = "Status: OPEN";
        changeDueDiv.appendChild(statusParagraph);
        changeMoney.forEach(item => {
            if (item[1] !== 0) {
                let paragraph = document.createElement("p");
                paragraph.innerText = `${item[0]}: $${item[1]}`;
                changeDueDiv.appendChild(paragraph);
            }
        });
        return { status: "OPEN", change: result };

    }
}


purchaseBtn.addEventListener('click', function () {

    let test = ''
    for (let j = 0; j < cashInput.value.length; j++) {
        test += cashInput.value[j]
        if (cashInput.value[j] === '.') {
            test += cashInput.value[j + 1]
            test += cashInput.value[j + 2]
            break;
        }
    }

    let cash = parseFloat(cashInput.value);
    cash = parseFloat(cash.toFixed(2))

    if (isNaN(cash)) {
        return;
    } else if (parseFloat(test) < price) {
        alert("Customer does not have enough money to purchase the item");
        return;
    }
    else if (cash === price) {
        changeDueDiv.innerHTML = `<p>No change due - customer paid with exact cash</p>`
        return;
    } else {
        console.log(checkCashRegister(price, cash, cid))
    }



    for (let i = 0; i < paragraphs.length; i++) {
        let p = paragraphs[i];
        let pText = p.innerText.split(':')[0]; // Text vor dem Doppelpunkt

        // Finde den entsprechenden Wert im cid Array
        for (let j = 0; j < cid.length; j++) {
            let [name, value] = cid[j];
            if (nameMapping[name] === pText) {
                p.innerText = `${pText}: $${value}`;
                break;
            }
        }
    }

});

let price = 3.26;
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]
];


for (let i = 0; i < paragraphs.length; i++) {
    let p = paragraphs[i];
    let pText = p.innerText.split(':')[0]; // Text vor dem Doppelpunkt

    // Finde den entsprechenden Wert im cid Array
    for (let j = 0; j < cid.length; j++) {
        let [name, value] = cid[j];
        if (nameMapping[name] === pText) {
            p.innerText = `${pText}: $${value}`;
            break;
        }
    }
}

please provide your html too

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Cash Register Project</title>
    <link rel="stylesheet" href="styles.css">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
</head>

<body>
    <h1 class="text-center mb-5">Cash Register Project</h1>
    <div class="container">
        <div class="row justify-content-around">

            <div class="col-md-4 d-flex mt-5 justify-content-center align-items-center">
                <table class="table table-dark">
                    <thead>
                        <tr>
                            <th scope="col">Currency Unit</th>
                            <th scope="col">Amount</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                            <td>Penny</td>
                            <td>$0.01 (PENNY)</td>
                        </tr>
                        <tr>
                            <td>Nickel</td>
                            <td>$0.05 (NICKEL)</td>
                        </tr>
                        <tr>
                            <td>Dime</td>
                            <td>$0.1 (DIME)</td>
                        </tr>
                        <tr>
                            <td>Quarter</td>
                            <td>$0.25 (QUARTER)</td>
                        </tr>
                        <tr>
                            <td>Dollar</td>
                            <td>$1 (ONE)</td>
                        </tr>
                        <tr>
                            <td>Five Dollars</td>
                            <td>$5 (FIVE)</td>
                        </tr>
                        <tr>
                            <td>Ten Dollars</td>
                            <td>$10 (TEN)</td>
                        </tr>
                        <tr>
                            <td>Twenty Dollars</td>
                            <td>$20 (TWENTY)</td>
                        </tr>
                        <tr>
                            <td>One Hundred Dollars</td>
                            <td>$100 (ONE HUNDRED)</td>
                        </tr>
                    </tbody>
                </table>
            </div>

            <div class="col-md-4 d-flex flex-column align-items-center">
                <div id="change-due"></div>
                <div class="d-flex justify-content-center align-items-center flex-column">
                    <label for="cash" class="m-2">Enter cash from customer:</label>
                    <input type="number" class="m-2" id="cash">
                    <button class="btn btn-warning mb-4 mt-3" id="purchase-btn">Purchase</button>
                </div>

                <div class="cash-register">
                    <div class="price-screen d-flex justify-content-center align-items-center">
                        <div class="text-center" id="total">Total: $3.26</div>
                    </div>
                    <div class="connector"></div>
                    <div class="top-register d-flex justify-content-around">
                        <div class="buttons">
                            <button class="register-btn"></button>
                            <button class="register-btn"></button>
                            <button class="register-btn"></button>
                            <button class="register-btn"></button>
                            <button class="register-btn"></button>
                            <button class="register-btn"></button>
                            <button class="register-btn"></button>
                            <button class="register-btn"></button>
                            <button class="register-btn"></button>
                        </div>
                        <div class="cash-drawer d-flex flex-column justify-content-around flex-wrap" id="cash-drawer">
                            <strong> Change in drawer:</strong>
                            <p>Pennies: </p>
                            <p>Nickels: </p>
                            <p>Dimes: </p>
                            <p>Quarters: </p>
                            <p>Ones: </p>
                            <p>Fives: </p>
                            <p>Tens: </p>
                            <p>Twenties: </p>
                            <p>Hundreds: </p>
                        </div>
                    </div>
                    <div class="bottom-register d-flex justify-content-center align-items-center">
                        <div class="bottem-register-point"></div>
                    </div>

                </div>
            </div>
        </div>
    </div>

    <script src="script.js"></script>
</body>

</html>

You are victim of this bug:

Wait for the issue to be resovled and shipped, then try again

So do I understand correctly that my code is possibly correct and the error is on the part of FreeCodeCamp?

same here, if you look in freeCodeCamp’s console you will see
[TypeError: _randomNumber is not a function] so all we can do is just wait

Same problem here also, i have the random number issue

This topic was automatically closed 182 days after the last reply. New replies are no longer allowed.