// Função para saber se o pedido da pizza está nos conformes.
function validaPizza(pizza, itensVaria) {
var erros = "";
// Percorre cada uma das regras.
for (var i in itensVaria) {
var regra = itensVaria[i];
// Conta quantos itens da pizza se aplicam à essa regra.
var n = 0;
for (var j in pizza) {
var item = pizza[j];
if (item.idPV === regra.idPV) n++;
}
// Tenta descobrir se há algum erro e se encontrar adiciona-o.
var plural = regra.descriPlural.toLowerCase();
var singular = regra.descriSing.toLowerCase();
if (n === 0 && regra.eMin === 1 && regra.eMax === 1) {
erros += " Escolha o " + singular + ".";
} else if (n < regra.eMin && regra.eMin === 1) {
erros += " Escolha pelo menos um " + singular + ".";
} else if (n < regra.eMin) {
erros += " Escolha pelo menos " + regra.eMin + " " + plural + ".";
} else if (n > regra.eMax && regra.eMax === 1) {
erros += " Você não pode escolher mais do que um " + singular + ".";
} else if (n > regra.eMax) {
erros += " Escolha no máximo " + regra.eMax + " " + plural + ".";
}
}
return erros.trim();
}
// Função para calcular o preço de uma pizza.
function totalizaPreco(pizza, criterios) {
var criterioPorIdpv = {};
var criteriosComPrecos = [];
// Parte 1: Monta um criterioPreco para cada criterio.
for (var i in criterios) {
criteriosComPrecos.push({
tipo: criterios[i].tipo,
idPVs: criterios[i].idPVs,
preco: 0.0
});
}
// Parte 2: Monta uma tabela de idPV para criterioPreco.
for (var i in criteriosComPrecos) {
var criterioPreco = criteriosComPrecos[i];
for (var idPV in criterioPreco.idPVs) {
criterioPorIdpv[criterioPreco.idPVs[idPV]] = criterioPreco;
}
}
// Parte 3: Acessa cada item da pizza, confere o seu valor e
// o coloca no criterioPreco correspondente.
for (var i in pizza) {
var item = pizza[i];
var crit = criterioPorIdpv[item.idPV];
if (crit.tipo === "maior") {
var v = crit.preco;
if (item.preco > v) crit.preco = item.preco;
} else if (crit.tipo === "soma") {
crit.preco += item.preco;
} else {
throw new Error("Tipo inválido: " + crit.tipo);
}
}
// Parte 4: Percorre todos os elementos criterioPreco
// para obter o valor final.
var total = 0;
for (var i in criteriosComPrecos) {
total += criteriosComPrecos[i].preco;
}
return total;
}
// Critérios que definem o que deve ser calculado pela soma e o que é
// pelo maior valor.
var criterios = [
{tipo: "maior", idPVs: [3, 6]},
{tipo: "soma", idPVs: [5]}
];
// Critérios que definem quais são os mínimos e máximos de cada item da pizza.
// Observe que é preciso o nome tanto no plural quanto no singular para as mensagens
// ficarem corretas.
var itensVaria = [
{
"idPV": 3, "idD": 2, "idP": 9, "eMin": 2, "eMax": 3, "tpCal": 1,
"descriSing": "Sabor", "descriPlural": "Sabores"
},
{
"idPV": 5, "idD": 2, "idP": 9, "eMin": 0, "eMax": 1, "tpCal": 3,
"descriSing": "Adicional", "descriPlural": "Adicionais"
},
{
"idPV": 6, "idD": 2, "idP": 9, "eMin": 1, "eMax": 1, "tpCal": 3,
"descriSing": "Tamanho", "descriPlural": "Tamanhos"
}
];
// Função para validar uma pizza, calcular o preço e mostrar o resultado disso.
function testarPizza(pizza) {
var r = "Pizza: ";
var primeiro = true;
for (var t in pizza) {
if (primeiro) {
primeiro = false;
} else {
r += ", ";
}
r += pizza[t].descri;
}
if (primeiro) r += "[nada]";
r += ".<br>";
var v = validaPizza(pizza, itensVaria);
r += (v === "")
? "O preço é " + totalizaPreco(pizza, criterios) + "."
: v;
r += "<br><br>";
document.write(r);
}
// Para ver se está tudo ok, temos aqui um monte de pizzas para avaliar e
// ver se são avaliadas corretamente.
var diversasPizzas = [
[
{idPVI: 10, idPV: 3, descri: "Portuguesa", preco: 32},
{idPVI: 10, idPV: 3, descri: "Portuguesa", preco: 32},
{idPVI: 13, idPV: 3, descri: "Calabresa", preco: 35},
{idPVI: 11, idPV: 5, descri: "Borda Recheada", preco: 5},
{idPVI: 12, idPV: 6, descri: "GG", preco: 39.99}
],
[
{idPVI: 10, idPV: 3, descri: "Portuguesa", preco: 32},
{idPVI: 10, idPV: 3, descri: "Portuguesa", preco: 32},
{idPVI: 13, idPV: 3, descri: "Calabresa", preco: 35},
{idPVI: 11, idPV: 5, descri: "Borda Recheada", preco: 5}
],
[], // Pizza sem informação nenhuma!
[
{idPVI: 10, idPV: 3, descri: "Portuguesa", preco: 32},
{idPVI: 10, idPV: 3, descri: "Portuguesa", preco: 32},
{idPVI: 13, idPV: 3, descri: "Calabresa", preco: 35},
{idPVI: 14, idPV: 6, descri: "Tamanho normal", preco: 0}
],
[
{idPVI: 10, idPV: 3, descri: "Portuguesa", preco: 32},
{idPVI: 10, idPV: 3, descri: "Portuguesa", preco: 32},
{idPVI: 10, idPV: 3, descri: "Portuguesa", preco: 32},
{idPVI: 10, idPV: 3, descri: "Portuguesa", preco: 32},
{idPVI: 13, idPV: 3, descri: "Calabresa", preco: 35},
{idPVI: 11, idPV: 5, descri: "Borda Recheada", preco: 5},
{idPVI: 11, idPV: 5, descri: "Borda Recheada", preco: 5}
],
[
{idPVI: 10, idPV: 3, descri: "Portuguesa", preco: 32},
{idPVI: 14, idPV: 6, descri: "Tamanho normal", preco: 0}
],
];
// Avalia cada uma das pizzas e mostra o resultado na tela.
for (p in diversasPizzas) {
testarPizza(diversasPizzas[p]);
}