# Build a Cash Register Project

**URL:** <https://forum.freecodecamp.org/t/build-a-cash-register-project/706395>\
**Category:** Curriculum Help\
**Tags:** javascript\
**Created:** [August 15, 2024, 1:33am UTC](https://forum.freecodecamp.org/t/build-a-cash-register-project/706395 "2024-08-15T01:33:37Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![s3nnin](https://sea3.discourse-cdn.com/freecodecamp/user_avatar/forum.freecodecamp.org/s3nnin/32/371290_2.png) [@s3nnin](https://forum.freecodecamp.org/u/s3nnin)\
**Post date:** [August 15, 2024, 1:33am UTC](https://forum.freecodecamp.org/t/build-a-cash-register-project/706395/1 "2024-08-15T01:33:37Z")

</div>

```auto
const input = document.getElementById('cash');
const purchaseBtn = document.getElementById('purchase-btn');
const changeDue = document.getElementById('change-due');
const cashInDrawer = document.getElementById('cash-in-drawer');

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

let denominations = [
  ['PENNY', 0.01],
  ['NICKEL', 0.05],
  ['DIME', 0.10],
  ['QUARTER', 0.25],
  ['ONE', 1],
  ['FIVE', 5],
  ['TEN', 10],
  ['TWENTY', 20],
  ['ONE HUNDRED', 100]
];

let totalCashEnCaja = cid.reduce((acc, el) => acc + el[1], 0);
totalCashEnCaja = Math.round(totalCashEnCaja * 100) / 100;

let cambioParaDar = 0;
let monedasUsadas = {};

const ticket = () => {
  const monedas = Object.keys(monedasUsadas);
  const cantidadDeMonedas = Object.values(monedasUsadas);
  let ticketHTML = "Status: OPEN";

  cantidadDeMonedas.forEach((cantidad, index) => {
    const x = denominations.findIndex(el => el[0] === monedas[index]);
    if (cantidad) {
      ticketHTML += ` ${monedas[index]}: $${denominations[x][1] * cantidad}`;
    };
  });
  changeDue.textContent = ticketHTML;
}

const darCambio = (cashDeCliente, cajero, monedas) => {
  let cambioCorrespondiente = cashDeCliente - price;
  cajero.reverse();
  monedas.reverse();

  for (let i= 0; i < monedas.length; i++) {
    if (monedas[i][1] < cambioCorrespondiente) {
      while(cajero[i][1] > 0 && parseFloat(cambioParaDar.toFixed(2)) < cambioCorrespondiente) {
        cambioParaDar += monedas[i][1];
        cajero[i][1] -= monedas[i][1];
        monedasUsadas[monedas[i][0]] = (monedasUsadas[monedas[i][0]] || 0) + 1;
        console.log(monedasUsadas)
        console.log(parseFloat(cambioParaDar.toFixed(2)))
      }
      while(parseFloat(cambioParaDar.toFixed(2)) > cambioCorrespondiente) {
        cambioParaDar -= monedas[i][1];
        cajero[i][1] += monedas[i][1];
        monedasUsadas[monedas[i][0]] = monedasUsadas[monedas[i][0]] - 1;
        console.log(monedasUsadas)
        console.log(parseFloat(cambioParaDar.toFixed(2)))
      }
     if (parseFloat(cambioParaDar.toFixed(2)) === cambioCorrespondiente) {
      return ticket();
    }
    }
  }
}

const actualizarCaja = () => {
  const cashElement = cid.map(el => `<p>${el[0]} : $${el[1]}</p>`).join("");
  cashInDrawer.innerHTML = cashElement;
}
actualizarCaja()

const validarInput = (cashCliente) => {
  if (cashCliente < price) {
    alert('Customer does not have enough money to purchase the item');
    return;
  } else if (cashCliente === price) {
    changeDue.textContent = 'No change due - customer paid with exact cash';
    return;
  }
}

purchaseBtn.addEventListener('click', () => {
  validarInput(Number(input.value));
  darCambio(Number(input.value), cid, denominations);
});

```

la funcion ‘ticket()’ cumple con mostrar en changeDue las monedas o billetes usados, incluso cuando el precio es 3.26 como lo indica la instruccion numero 7 del proyecto. Funciona correctamente, sin embargo el curso me lo marca como error. Pueden decirme que podria estar pasando? tambien intente agregar varias etiquetas ‘p’ con el debido contenido pero aun asi me marca error.

---

<div class="post-metadata">

**Author:** ![hbar1st](https://sea3.discourse-cdn.com/freecodecamp/user_avatar/forum.freecodecamp.org/hbar1st/32/372649_2.png) [@hbar1st](https://forum.freecodecamp.org/u/hbar1st)\
**Post date:** [August 15, 2024, 1:39am UTC](https://forum.freecodecamp.org/t/build-a-cash-register-project/706395/2 "2024-08-15T01:39:23Z")

</div>

I’ve edited your code for readability. When you enter a code block into a forum post, please precede it with a separate line of three backticks and follow it with a separate line of three backticks to make it easier to read.

You can also use the “preformatted text” tool in the editor (`</>`) to add backticks around text.

 ![Pre-formatted-text](https://global.discourse-cdn.com/freecodecamp/original/3X/1/b/1b18854f1059217f29370444396145cc3a0cd8ae.gif)

See [this post](https://forum.freecodecamp.org/t/forum-code-formatting/25574) to find the backtick on your keyboard.  
**Note:** Backticks (`) are not single quotes (').

---

<div class="post-metadata">

**Author:** ![hbar1st](https://sea3.discourse-cdn.com/freecodecamp/user_avatar/forum.freecodecamp.org/hbar1st/32/372649_2.png) [@hbar1st](https://forum.freecodecamp.org/u/hbar1st)\
**Post date:** [August 15, 2024, 1:40am UTC](https://forum.freecodecamp.org/t/build-a-cash-register-project/706395/3 "2024-08-15T01:40:47Z")

</div>

> [@s3nnin](#):
>
> ```auto
> let totalCashEnCaja = cid.reduce((acc, el) => acc + el[1], 0);
> totalCashEnCaja = Math.round(totalCashEnCaja * 100) / 100;
> 
> let cambioParaDar = 0;
> let monedasUsadas = {};
> 
> ```

the code above is in the global scope.  
This code will only run once and never again during the testcase run.  
This can cause your code to fail the tests.

Move the code inside the local function scope of the function that runs when the purchase button is clicked instead.

---

<div class="post-metadata">

**Author:** ![s3nnin](https://sea3.discourse-cdn.com/freecodecamp/user_avatar/forum.freecodecamp.org/s3nnin/32/371290_2.png) [@s3nnin](https://forum.freecodecamp.org/u/s3nnin)\
**Post date:** [August 15, 2024, 7:57pm UTC](https://forum.freecodecamp.org/t/build-a-cash-register-project/706395/4 "2024-08-15T19:57:09Z")

</div>

````auto
const input = document.getElementById('cash');
const purchaseBtn = document.getElementById('purchase-btn');
const changeDue = document.getElementById('change-due');
const cashInDrawer = document.getElementById('cash-in-drawer');

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

let denominations = [
  ['PENNY', 0.01],
  ['NICKEL', 0.05],
  ['DIME', 0.10],
  ['QUARTER', 0.25],
  ['ONE', 1],
  ['FIVE', 5],
  ['TEN', 10],
  ['TWENTY', 20],
  ['ONE HUNDRED', 100]
];

cid.reverse();
denominations.reverse();

const actualizarCaja = (cajero) => {
  const cashElement = cajero.map(el => `<p>${el[0]} : $${parseFloat(el[1].toFixed(2))}</p>`).join("");
  cashInDrawer.innerHTML = cashElement;
}

const ticket = (infoDeCambio) => {
  const monedas = Object.keys(infoDeCambio);
  const cantidadDeMonedas = Object.values(infoDeCambio);
  changeDue.textContent = "Status: OPEN";

  cantidadDeMonedas.forEach((cantidad, index) => {
    const x = denominations.findIndex(el => el[0] === monedas[index]);
    if (cantidad) {
      changeDue.textContent += ` ${monedas[index]}: $${denominations[x][1] * cantidad}`;
    };
  });
}

const darCambio = (cashDeCliente, cajero, monedas) => {
  let totalCashEnCaja = cid.reduce((acc, el) => acc + el[1], 0);
  totalCashEnCaja = Math.round(totalCashEnCaja * 100) / 100;

  let cambioCorrespondiente = cashDeCliente - price;

  let cambioParaDar = 0;
  let monedasUsadas = {};

  for (let i= 0; i < monedas.length; i++) {
    if (monedas[i][1] < cambioCorrespondiente) {
        while(cajero[i][1] > 0 && parseFloat(cambioParaDar.toFixed(2)) < cambioCorrespondiente) {
          cambioParaDar += monedas[i][1];
          cajero[i][1] -= monedas[i][1];
          monedasUsadas[monedas[i][0]] = (monedasUsadas[monedas[i][0]] || 0) + 1;
        };
        
        while(parseFloat(cambioParaDar.toFixed(2)) > cambioCorrespondiente) {
           cambioParaDar -= monedas[i][1];
           cajero[i][1] += monedas[i][1];
           monedasUsadas[monedas[i][0]] = monedasUsadas[monedas[i][0]] - 1;
        };

      
    }
    if (Math.abs(parseFloat(cambioParaDar.toFixed(2)) - cambioCorrespondiente) < 0.01) {
      ticket(monedasUsadas);
      return
    }
  }
}

const validarInput = (cashCliente) => {
  if (cashCliente < price) {
    alert('Customer does not have enough money to purchase the item');
    return;
  } else if (cashCliente === price) {
    changeDue.textContent = 'No change due - customer paid with exact cash';
    return;
  }
}

purchaseBtn.addEventListener('click', () => {
  validarInput(Number(input.value));
  darCambio(Number(input.value), cid, denominations);
  actualizarCaja(cid);
  input.value = "";
});
``` puede corroborrar que funciona.
````

---

<div class="post-metadata">

**Author:** ![hbar1st](https://sea3.discourse-cdn.com/freecodecamp/user_avatar/forum.freecodecamp.org/hbar1st/32/372649_2.png) [@hbar1st](https://forum.freecodecamp.org/u/hbar1st)\
**Post date:** [August 15, 2024, 8:39pm UTC](https://forum.freecodecamp.org/t/build-a-cash-register-project/706395/5 "2024-08-15T20:39:07Z")

</div>

did you have a question?  
I noticed the new code you posted still has code in the global scope.

---

<div class="post-metadata">

**Author:** ![s3nnin](https://sea3.discourse-cdn.com/freecodecamp/user_avatar/forum.freecodecamp.org/s3nnin/32/371290_2.png) [@s3nnin](https://forum.freecodecamp.org/u/s3nnin)\
**Post date:** [August 15, 2024, 9:08pm UTC](https://forum.freecodecamp.org/t/build-a-cash-register-project/706395/6 "2024-08-15T21:08:54Z")

</div>

Globals are just ‘denominations’ and the price.  
Should I put them inside the function?

---

<div class="post-metadata">

**Author:** ![hbar1st](https://sea3.discourse-cdn.com/freecodecamp/user_avatar/forum.freecodecamp.org/hbar1st/32/372649_2.png) [@hbar1st](https://forum.freecodecamp.org/u/hbar1st)\
**Post date:** [August 15, 2024, 9:16pm UTC](https://forum.freecodecamp.org/t/build-a-cash-register-project/706395/7 "2024-08-15T21:16:41Z")

</div>

> [@s3nnin](#):
>
> ```auto
> cid.reverse();
> 
> ```

This is running in the global scope so for the test cases, only the first testcase will run this.

---

<div class="post-metadata">

**Author:** ![ILM](https://sea3.discourse-cdn.com/freecodecamp/user_avatar/forum.freecodecamp.org/ilm/32/363239_2.png) [@ILM](https://forum.freecodecamp.org/u/ILM)\
**Post date:** [January 8, 2025, 3:40pm UTC](https://forum.freecodecamp.org/t/build-a-cash-register-project/706395/8 "2025-01-08T15:40:38Z")

</div>

Closed on January 8, 2025, 3:40pm UTC


