// 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]);
}
Got 80%......
– SIG Automação
@Sigautomation What’s wrong that you’d like better? I can edit the answer until it’s legal.
– Victor Stafusa
"Varia":[{"idPV":"3","idD":"2","idP":"9","descri":"Sabores","eMin":"2","eMax":"3","tpCal":"1"},{"idPV":"5","idD":"2","idP":"9","descri":"Adicionais","eMin":"0","eMax":"1","tpCal":"3"},{"idPV":"6","idD":"2","idP":"9","descri":"Tamanho","eMin":"1","eMax":"1","tpCal":"3"}]
. I have this array which are product variations!– SIG Automação
"ItensVaria":[{"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"}]
. And this array here are the items of each variation.– SIG Automação
@Sigautomation Okay, I’m already reviewing the answer.
– Victor Stafusa
When the user makes selections of variations of the product that in the case is the pizza generates this array.
(4) [{…}, {…}, {…}, {…}]
0
:
{idPVI: "10", idPV: "3", descri: "Portuguesa", preco: "32"}
1
:
{idPVI: "13", idPV: "3", descri: "Calabresa", preco: "35"}
2
:
{idPVI: "11", idPV: "5", descri: "Borda Recheada", preco: "5"}
3
:
{idPVI: "12", idPV: "6", descri: "GG", preco: "39.99"}
. So when for example: an item in the array of selected variations (which is this above) has "idPV" = 3 and "tpCal" = 1 the function takes the highest value and when "tpCal" is 3 normal sum.– SIG Automação
@Sigautomation I edited the answer, tell me what you think of it now. I recommend you edit your question to put additional information because reading JSON in the comments is kind of hard.
– Victor Stafusa
It was perfect @Victor Stafusa. now I wanted you to help me elsewhere! Work with angular and use an ngFor to generate the buttons "-" and "+" which are the buttons that give the user choice. So when it comes to choosing options such as the flavor of the pizza I wanted when it clicked on some flavor that "+" button would disappear.. understand ?
– SIG Automação