@@ -19,39 +19,43 @@ const cashDrawerDisplay = document.getElementById('cash-drawer-display');
1919
2020const 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
2829const 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