Skip to content

Commit 47b6660

Browse files
gikfnaomi-lgbt
andauthored
fix: improve cash register precision (#602)
* chore: add no-unused-vars ignored patterns * fix: improve cash register precision * fix: clean destructuring Co-authored-by: Naomi the Technomancer <accounts+github@nhcarrigan.com> --------- Co-authored-by: Naomi the Technomancer <accounts+github@nhcarrigan.com>
1 parent a7e71ad commit 47b6660

File tree

2 files changed

+48
-31
lines changed

2 files changed

+48
-31
lines changed

.eslintrc.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,13 @@
1414
"router": true
1515
},
1616
"extends": ["eslint:recommended", "prettier"],
17+
"rules": {
18+
"no-unused-vars": ["warn", {
19+
"argsIgnorePattern": "^_",
20+
"varsIgnorePattern": "^_",
21+
"caughtErrorsIgnorePattern": "^_"
22+
}]
23+
},
1724
"overrides": [
1825
{
1926
"files": [

apps/cash-register/public/script.js

Lines changed: 41 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -19,39 +19,43 @@ const cashDrawerDisplay = document.getElementById('cash-drawer-display');
1919

2020
const formatResults = (status, change) => {
2121
displayChangeDue.innerHTML = `<p>Status: ${status}</p>`;
22-
change.map(
23-
money => (displayChangeDue.innerHTML += `<p>${money[0]}: $${money[1]}</p>`)
24-
);
25-
return;
22+
displayChangeDue.innerHTML += change
23+
.map(
24+
([denominationName, amount]) => `<p>${denominationName}: $${amount}</p>`
25+
)
26+
.join('');
2627
};
2728

2829
const checkCashRegister = () => {
29-
if (Number(cash.value) < price) {
30+
const cashInCents = Math.round(Number(cash.value) * 100);
31+
const priceInCents = Math.round(price * 100);
32+
if (cashInCents < priceInCents) {
3033
alert('Customer does not have enough money to purchase the item');
3134
cash.value = '';
3235
return;
3336
}
3437

35-
if (Number(cash.value) === price) {
38+
if (cashInCents === priceInCents) {
3639
displayChangeDue.innerHTML =
3740
'<p>No change due - customer paid with exact cash</p>';
3841
cash.value = '';
3942
return;
4043
}
4144

42-
let changeDue = Number(cash.value) - price;
43-
let reversedCid = [...cid].reverse();
44-
let denominations = [100, 20, 10, 5, 1, 0.25, 0.1, 0.05, 0.01];
45-
let result = { status: 'OPEN', change: [] };
46-
let totalCID = parseFloat(
47-
cid
48-
.map(total => total[1])
49-
.reduce((prev, curr) => prev + curr)
50-
.toFixed(2)
51-
);
45+
let changeDue = cashInCents - priceInCents;
46+
const reversedCid = [...cid]
47+
.reverse()
48+
.map(([denominationName, amount]) => [
49+
denominationName,
50+
Math.round(amount * 100)
51+
]);
52+
const denominations = [10000, 2000, 1000, 500, 100, 25, 10, 5, 1];
53+
const result = { status: 'OPEN', change: [] };
54+
const totalCID = reversedCid.reduce((prev, [_, amount]) => prev + amount, 0);
5255

5356
if (totalCID < changeDue) {
54-
return (displayChangeDue.innerHTML = '<p>Status: INSUFFICIENT_FUNDS</p>');
57+
displayChangeDue.innerHTML = '<p>Status: INSUFFICIENT_FUNDS</p>';
58+
return;
5559
}
5660

5761
if (totalCID === changeDue) {
@@ -60,20 +64,20 @@ const checkCashRegister = () => {
6064

6165
for (let i = 0; i <= reversedCid.length; i++) {
6266
if (changeDue >= denominations[i] && changeDue > 0) {
63-
let count = 0;
64-
let total = reversedCid[i][1];
65-
while (total > 0 && changeDue >= denominations[i]) {
66-
total -= denominations[i];
67-
changeDue = parseFloat((changeDue -= denominations[i]).toFixed(2));
68-
count++;
69-
}
67+
const [denominationName, total] = reversedCid[i];
68+
const possibleChange = Math.min(total, changeDue);
69+
const count = Math.floor(possibleChange / denominations[i]);
70+
const amountInChange = count * denominations[i];
71+
changeDue -= amountInChange;
72+
7073
if (count > 0) {
71-
result.change.push([reversedCid[i][0], count * denominations[i]]);
74+
result.change.push([denominationName, amountInChange / 100]);
7275
}
7376
}
7477
}
7578
if (changeDue > 0) {
76-
return (displayChangeDue.innerHTML = '<p>Status: INSUFFICIENT_FUNDS</p>');
79+
displayChangeDue.innerHTML = '<p>Status: INSUFFICIENT_FUNDS</p>';
80+
return;
7781
}
7882

7983
formatResults(result.status, result.change);
@@ -101,18 +105,24 @@ const updateUI = change => {
101105
};
102106
// Update cid if change is passed in
103107
if (change) {
104-
change.forEach(changeArr => {
105-
const targetArr = cid.find(cidArr => cidArr[0] === changeArr[0]);
106-
targetArr[1] = parseFloat((targetArr[1] - changeArr[1]).toFixed(2));
108+
change.forEach(([changeDenomination, changeAmount]) => {
109+
const targetArr = cid.find(
110+
([denominationName]) => denominationName === changeDenomination
111+
);
112+
targetArr[1] =
113+
(Math.round(targetArr[1] * 100) - Math.round(changeAmount * 100)) / 100;
107114
});
108115
}
109116

110117
cash.value = '';
111118
priceScreen.textContent = `Total: $${price}`;
112119
cashDrawerDisplay.innerHTML = `<p><strong>Change in drawer:</strong></p>
113120
${cid
114-
.map(money => `<p>${currencyNameMap[money[0]]}: $${money[1]}</p>`)
115-
.join('')}
121+
.map(
122+
([denominationName, amount]) =>
123+
`<p>${currencyNameMap[denominationName]}: $${amount}</p>`
124+
)
125+
.join('')}
116126
`;
117127
};
118128

0 commit comments

Comments
 (0)