<script>
// Variables iniciales: precio del artículo y efectivo en caja (CID)
let price = 19.5; // Puedes cambiar este valor para probar diferentes escenarios
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]
]; // Array bidimensional de la moneda disponible en la caja
// Objeto para mapear los nombres de las monedas a sus valores numéricos
const currencyValues = {
"PENNY": 0.01,
"NICKEL": 0.05,
"DIME": 0.1,
"QUARTER": 0.25,
"ONE": 1,
"FIVE": 5,
"TEN": 10,
"TWENTY": 20,
"ONE HUNDRED": 100
};
// Referencias a los elementos del DOM
const cashInput = document.getElementById("cash");
const purchaseBtn = document.getElementById("purchase-btn");
const changeDueDiv = document.getElementById("change-due");
const itemPriceSpan = document.getElementById("item-price");
// Muestra el precio inicial del artículo al cargar la página
itemPriceSpan.textContent = `$${price}`;
// Agrega un "event listener" al botón de compra
purchaseBtn.addEventListener("click", () => {
const cash = parseFloat(cashInput.value); // Obtiene el efectivo proporcionado por el cliente
// Comprueba si el cliente no tiene suficiente dinero
if (cash < price) {
alert("Customer does not have enough money to purchase the item");
return; // Detiene la ejecución si el efectivo es insuficiente
}
// Comprueba si el cliente pagó con la cantidad exacta
if (cash === price) {
changeDueDiv.textContent = "No change due - customer paid with exact cash";
return; // Detiene la ejecución si no hay cambio que devolver
}
// Si hay cambio que devolver, llama a la función para calcularlo
calculateChange(cash);
});
/**
* Calcula el cambio a devolver al cliente.
* @param {number} cashProvided - La cantidad de efectivo entregada por el cliente.
*/
function calculateChange(cashProvided) {
let changeDue = cashProvided - price; // Calcula la cantidad de cambio adeudado
let totalCID = cid.reduce((sum, [, amount]) => sum + amount, 0); // Suma el total de efectivo en la caja
// Redondea los valores a dos decimales para evitar problemas de precisión con coma flotante
changeDue = Math.round(changeDue * 100) / 100;
totalCID = Math.round(totalCID * 100) / 100;
const change = []; // Array para almacenar las denominaciones de cambio a devolver
let status = ""; // Variable para el estado de la caja registradora
// Determina el estado inicial de la caja
if (totalCID < changeDue) {
status = "Status: INSUFFICIENT_FUNDS";
} else if (totalCID === changeDue) {
status = "Status: CLOSED";
} else {
status = "Status: OPEN";
}
// Si los fondos son insuficientes desde el inicio, muestra el mensaje y sale
if (status === "Status: INSUFFICIENT_FUNDS") {
changeDueDiv.textContent = status;
return;
}
// Intenta devolver el cambio, iterando desde las denominaciones más grandes a las más pequeñas
const cidReversed = [...cid].reverse(); // Crea una copia y la revierte
for (let i = 0; i < cidReversed.length; i++) {
let [currencyName, availableAmount] = cidReversed[i]; // Obtiene el nombre y la cantidad disponible de la moneda
const currencyValue = currencyValues[currencyName]; // Obtiene el valor de la denominación
let amountToReturn = 0; // Cantidad de esta denominación que se va a devolver
// Mientras haya cambio por devolver y haya suficiente de esta denominación en caja
while (changeDue >= currencyValue && availableAmount >= currencyValue) {
amountToReturn += currencyValue; // Añade el valor de la moneda al total a devolver
changeDue = Math.round((changeDue - currencyValue) * 100) / 100; // Reduce el cambio adeudado
availableAmount = Math.round((availableAmount - currencyValue) * 100) / 100; // Reduce la cantidad disponible en caja
}
// Si se devolvió algo de esta denominación, la añade al array de cambio
if (amountToReturn > 0) {
change.push([currencyName, amountToReturn]);
}
}
// Después de intentar dar el cambio, si aún queda cambio por devolver, significa que no se pudo dar el cambio exacto
if (changeDue > 0) {
status = "Status: INSUFFICIENT_FUNDS";
changeDueDiv.textContent = status;
return;
}
// Construye la cadena de texto con las denominaciones del cambio
const changeString = change.map(([name, amount]) => `${name}: $${amount}`).join(" ");
// Actualiza el elemento change-due con el estado y el detalle del cambio
if (status === "Status: CLOSED") {
changeDueDiv.textContent = `${status} ${changeString}`;
} else { // Status: OPEN
changeDueDiv.textContent = `${status} ${changeString}`;
}
}
</script>
a mi ese codigo tambien me tira error, pero nose que me estaria faltando?..